Merge "Framework support for Android Dreams."
diff --git a/Android.mk b/Android.mk
index b8a48a4..e3406ea 100644
--- a/Android.mk
+++ b/Android.mk
@@ -71,6 +71,7 @@
 	core/java/android/app/IBackupAgent.aidl \
 	core/java/android/app/IInstrumentationWatcher.aidl \
 	core/java/android/app/INotificationManager.aidl \
+	core/java/android/app/IProcessObserver.aidl \
 	core/java/android/app/ISearchManager.aidl \
 	core/java/android/app/ISearchManagerCallback.aidl \
 	core/java/android/app/IServiceConnection.aidl \
@@ -113,6 +114,7 @@
 	core/java/android/nfc/ILlcpConnectionlessSocket.aidl \
 	core/java/android/nfc/ILlcpServiceSocket.aidl \
 	core/java/android/nfc/ILlcpSocket.aidl \
+	core/java/android/nfc/INdefPushCallback.aidl \
 	core/java/android/nfc/INfcAdapter.aidl \
 	core/java/android/nfc/INfcAdapterExtras.aidl \
 	core/java/android/nfc/INfcTag.aidl \
@@ -160,6 +162,7 @@
 	core/java/com/android/internal/view/IInputMethodSession.aidl \
 	core/java/com/android/internal/widget/IRemoteViewsFactory.aidl \
 	core/java/com/android/internal/widget/IRemoteViewsAdapterConnection.aidl \
+	keystore/java/android/security/IKeyChainAliasResponse.aidl \
 	keystore/java/android/security/IKeyChainService.aidl \
 	location/java/android/location/ICountryDetector.aidl \
 	location/java/android/location/ICountryListener.aidl \
@@ -361,7 +364,7 @@
 		-werror -hide 113 \
 		-overview $(LOCAL_PATH)/core/java/overview.html
 
-framework_docs_LOCAL_ADDITIONAL_JAVA_DIR:= $(call intermediates-dir-for,JAVA_LIBRARIES,framework)
+framework_docs_LOCAL_ADDITIONAL_JAVA_DIR:= $(call intermediates-dir-for,JAVA_LIBRARIES,framework,,COMMON)
 
 framework_docs_LOCAL_ADDITIONAL_DEPENDENCIES := \
     frameworks/base/docs/knowntags.txt
@@ -584,7 +587,7 @@
 LOCAL_MODULE_CLASS:=$(framework_docs_LOCAL_MODULE_CLASS)
 LOCAL_DROIDDOC_SOURCE_PATH:=$(framework_docs_LOCAL_DROIDDOC_SOURCE_PATH)
 LOCAL_DROIDDOC_HTML_DIR:=$(framework_docs_LOCAL_DROIDDOC_HTML_DIR)
-LOCAL_ADDITIONAL_JAVA_DIR:=$(call intermediates-dir-for,JAVA_LIBRARIES,framework)
+LOCAL_ADDITIONAL_JAVA_DIR:=$(framework_docs_LOCAL_ADDITIONAL_JAVA_DIR)
 LOCAL_ADDITIONAL_DEPENDENCIES:=$(framework_docs_LOCAL_ADDITIONAL_DEPENDENCIES)
 
 LOCAL_MODULE := hidden
diff --git a/api/14.txt b/api/14.txt
index ebb4308..b080d25 100644
--- a/api/14.txt
+++ b/api/14.txt
@@ -22002,7 +22002,7 @@
     method public boolean isEnabled();
     method public boolean isFullScreen();
     method public boolean isPassword();
-    method protected static android.view.accessibility.AccessibilityRecord obtain();
+    method public static android.view.accessibility.AccessibilityRecord obtain();
     method public void recycle();
     method public void setAddedCount(int);
     method public void setBeforeText(java.lang.CharSequence);
diff --git a/api/current.txt b/api/current.txt
index b88ef3a..2f5b9b4 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -866,6 +866,7 @@
     field public static final int subtitleTextStyle = 16843513; // 0x10102f9
     field public static final int suggestActionMsg = 16843228; // 0x10101dc
     field public static final int suggestActionMsgColumn = 16843229; // 0x10101dd
+    field public static final int suggestionsEnabled = 16843630; // 0x101036e
     field public static final int summary = 16843241; // 0x10101e9
     field public static final int summaryColumn = 16843426; // 0x10102a2
     field public static final int summaryOff = 16843248; // 0x10101f0
@@ -1977,6 +1978,7 @@
     method public boolean isRunning();
     method public void removeChild(android.view.ViewGroup, android.view.View);
     method public void removeTransitionListener(android.animation.LayoutTransition.TransitionListener);
+    method public void setAnimateParentHierarchy(boolean);
     method public void setAnimator(int, android.animation.Animator);
     method public void setDuration(long);
     method public void setDuration(int, long);
@@ -5400,6 +5402,7 @@
     field public static final int CONFIG_ORIENTATION = 128; // 0x80
     field public static final int CONFIG_SCREEN_LAYOUT = 256; // 0x100
     field public static final int CONFIG_SCREEN_SIZE = 1024; // 0x400
+    field public static final int CONFIG_SMALLEST_SCREEN_SIZE = 2048; // 0x800
     field public static final int CONFIG_TOUCHSCREEN = 8; // 0x8
     field public static final int CONFIG_UI_MODE = 512; // 0x200
     field public static final android.os.Parcelable.Creator CREATOR;
@@ -5989,6 +5992,7 @@
     field public static final int SCREENLAYOUT_SIZE_XLARGE = 4; // 0x4
     field public static final int SCREEN_HEIGHT_DP_UNDEFINED = 0; // 0x0
     field public static final int SCREEN_WIDTH_DP_UNDEFINED = 0; // 0x0
+    field public static final int SMALLEST_SCREEN_WIDTH_DP_UNDEFINED = 0; // 0x0
     field public static final int TOUCHSCREEN_FINGER = 3; // 0x3
     field public static final int TOUCHSCREEN_NOTOUCH = 1; // 0x1
     field public static final int TOUCHSCREEN_STYLUS = 2; // 0x2
@@ -6001,6 +6005,7 @@
     field public static final int UI_MODE_TYPE_DESK = 2; // 0x2
     field public static final int UI_MODE_TYPE_MASK = 15; // 0xf
     field public static final int UI_MODE_TYPE_NORMAL = 1; // 0x1
+    field public static final int UI_MODE_TYPE_TELEVISION = 4; // 0x4
     field public static final int UI_MODE_TYPE_UNDEFINED = 0; // 0x0
     field public float fontScale;
     field public int hardKeyboardHidden;
@@ -6015,6 +6020,7 @@
     field public int screenHeightDp;
     field public int screenLayout;
     field public int screenWidthDp;
+    field public int smallestScreenWidthDp;
     field public int touchscreen;
     field public int uiMode;
   }
@@ -8839,6 +8845,7 @@
     field public static final deprecated int TYPE_ORIENTATION = 3; // 0x3
     field public static final int TYPE_PRESSURE = 6; // 0x6
     field public static final int TYPE_PROXIMITY = 8; // 0x8
+    field public static final int TYPE_RELATIVE_HUMIDITY = 12; // 0xc
     field public static final int TYPE_ROTATION_VECTOR = 11; // 0xb
     field public static final deprecated int TYPE_TEMPERATURE = 7; // 0x7
   }
@@ -9015,6 +9022,7 @@
     method public void close();
     method public int controlTransfer(int, int, int, int, byte[], int, int);
     method public int getFileDescriptor();
+    method public byte[] getRawDescriptors();
     method public java.lang.String getSerial();
     method public boolean releaseInterface(android.hardware.usb.UsbInterface);
     method public android.hardware.usb.UsbRequest requestWait();
@@ -9679,7 +9687,8 @@
     method public void unloadSoundEffects();
     method public void unregisterMediaButtonEventReceiver(android.content.ComponentName);
     field public static final java.lang.String ACTION_AUDIO_BECOMING_NOISY = "android.media.AUDIO_BECOMING_NOISY";
-    field public static final java.lang.String ACTION_SCO_AUDIO_STATE_CHANGED = "android.media.SCO_AUDIO_STATE_CHANGED";
+    field public static final deprecated java.lang.String ACTION_SCO_AUDIO_STATE_CHANGED = "android.media.SCO_AUDIO_STATE_CHANGED";
+    field public static final java.lang.String ACTION_SCO_AUDIO_STATE_UPDATED = "android.media.ACTION_SCO_AUDIO_STATE_UPDATED";
     field public static final int ADJUST_LOWER = -1; // 0xffffffff
     field public static final int ADJUST_RAISE = 1; // 0x1
     field public static final int ADJUST_SAME = 0; // 0x0
@@ -9692,6 +9701,7 @@
     field public static final int AUDIOFOCUS_REQUEST_FAILED = 0; // 0x0
     field public static final int AUDIOFOCUS_REQUEST_GRANTED = 1; // 0x1
     field public static final java.lang.String EXTRA_RINGER_MODE = "android.media.EXTRA_RINGER_MODE";
+    field public static final java.lang.String EXTRA_SCO_AUDIO_PREVIOUS_STATE = "android.media.extra.SCO_AUDIO_PREVIOUS_STATE";
     field public static final java.lang.String EXTRA_SCO_AUDIO_STATE = "android.media.extra.SCO_AUDIO_STATE";
     field public static final java.lang.String EXTRA_VIBRATE_SETTING = "android.media.EXTRA_VIBRATE_SETTING";
     field public static final java.lang.String EXTRA_VIBRATE_TYPE = "android.media.EXTRA_VIBRATE_TYPE";
@@ -9728,6 +9738,7 @@
     field public static final deprecated int ROUTE_HEADSET = 8; // 0x8
     field public static final deprecated int ROUTE_SPEAKER = 2; // 0x2
     field public static final int SCO_AUDIO_STATE_CONNECTED = 1; // 0x1
+    field public static final int SCO_AUDIO_STATE_CONNECTING = 2; // 0x2
     field public static final int SCO_AUDIO_STATE_DISCONNECTED = 0; // 0x0
     field public static final int SCO_AUDIO_STATE_ERROR = -1; // 0xffffffff
     field public static final int STREAM_ALARM = 4; // 0x4
@@ -10053,6 +10064,7 @@
     method public void setOnSeekCompleteListener(android.media.MediaPlayer.OnSeekCompleteListener);
     method public void setOnVideoSizeChangedListener(android.media.MediaPlayer.OnVideoSizeChangedListener);
     method public void setScreenOnWhilePlaying(boolean);
+    method public void setTexture(android.graphics.SurfaceTexture);
     method public void setVolume(float, float);
     method public void setWakeMode(android.content.Context, int);
     method public void start() throws java.lang.IllegalStateException;
@@ -10113,6 +10125,7 @@
     method public void setAuxiliaryOutputFile(java.lang.String);
     method public void setCamera(android.hardware.Camera);
     method public void setCaptureRate(double);
+    method public void setLocation(float, float);
     method public void setMaxDuration(int) throws java.lang.IllegalArgumentException;
     method public void setMaxFileSize(long) throws java.lang.IllegalArgumentException;
     method public void setOnErrorListener(android.media.MediaRecorder.OnErrorListener);
@@ -11634,6 +11647,7 @@
     method public void disableForegroundNdefPush(android.app.Activity);
     method public void enableForegroundDispatch(android.app.Activity, android.app.PendingIntent, android.content.IntentFilter[], java.lang.String[][]);
     method public void enableForegroundNdefPush(android.app.Activity, android.nfc.NdefMessage);
+    method public void enableForegroundNdefPush(android.app.Activity, android.nfc.NfcAdapter.NdefPushCallback);
     method public static android.nfc.NfcAdapter getDefaultAdapter(android.content.Context);
     method public static deprecated android.nfc.NfcAdapter getDefaultAdapter();
     method public boolean isEnabled();
@@ -11645,6 +11659,11 @@
     field public static final java.lang.String EXTRA_TAG = "android.nfc.extra.TAG";
   }
 
+  public static abstract interface NfcAdapter.NdefPushCallback {
+    method public abstract android.nfc.NdefMessage createMessage();
+    method public abstract void onMessagePushed();
+  }
+
   public final class NfcManager {
     method public android.nfc.NfcAdapter getDefaultAdapter();
   }
@@ -13917,12 +13936,14 @@
 
   public class ParcelFileDescriptor implements android.os.Parcelable {
     ctor public ParcelFileDescriptor(android.os.ParcelFileDescriptor);
+    method public static android.os.ParcelFileDescriptor adoptFd(int);
     method public void close() throws java.io.IOException;
     method public static android.os.ParcelFileDescriptor[] createPipe() throws java.io.IOException;
     method public int describeContents();
     method public int detachFd();
     method public static android.os.ParcelFileDescriptor dup(java.io.FileDescriptor) throws java.io.IOException;
     method public static android.os.ParcelFileDescriptor fromDatagramSocket(java.net.DatagramSocket);
+    method public static android.os.ParcelFileDescriptor fromFd(int) throws java.io.IOException;
     method public static android.os.ParcelFileDescriptor fromSocket(java.net.Socket);
     method public int getFd();
     method public java.io.FileDescriptor getFileDescriptor();
@@ -19360,17 +19381,21 @@
   public class SuggestionSpan implements android.text.ParcelableSpan {
     ctor public SuggestionSpan(android.content.Context, java.lang.String[], int);
     ctor public SuggestionSpan(java.util.Locale, java.lang.String[], int);
-    ctor public SuggestionSpan(android.content.Context, java.util.Locale, java.lang.String[], int, java.lang.String);
+    ctor public SuggestionSpan(android.content.Context, java.util.Locale, java.lang.String[], int, java.lang.Class<?>);
     ctor public SuggestionSpan(android.os.Parcel);
     method public int describeContents();
     method public int getFlags();
     method public java.lang.String getLocale();
-    method public java.lang.String getOriginalString();
     method public int getSpanTypeId();
     method public java.lang.String[] getSuggestions();
     method public void writeToParcel(android.os.Parcel, int);
+    field public static final java.lang.String ACTION_SUGGESTION_PICKED = "android.text.style.SUGGESTION_PICKED";
     field public static final android.os.Parcelable.Creator CREATOR;
     field public static final int FLAG_VERBATIM = 1; // 0x1
+    field public static final int SUGGESTIONS_MAX_SIZE = 5; // 0x5
+    field public static final java.lang.String SUGGESTION_SPAN_PICKED_AFTER = "after";
+    field public static final java.lang.String SUGGESTION_SPAN_PICKED_BEFORE = "before";
+    field public static final java.lang.String SUGGESTION_SPAN_PICKED_HASHCODE = "hashcode";
   }
 
   public class SuperscriptSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
@@ -21424,6 +21449,8 @@
     method public void setScaleY(float);
     method public void setScrollBarStyle(int);
     method public void setScrollContainer(boolean);
+    method public void setScrollX(int);
+    method public void setScrollY(int);
     method public void setScrollbarFadingEnabled(boolean);
     method public void setSelected(boolean);
     method public void setSoundEffectsEnabled(boolean);
@@ -21841,6 +21868,9 @@
   public class ViewPropertyAnimator {
     method public android.view.ViewPropertyAnimator alpha(float);
     method public android.view.ViewPropertyAnimator alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public long getStartDelay();
     method public android.view.ViewPropertyAnimator rotation(float);
     method public android.view.ViewPropertyAnimator rotationBy(float);
     method public android.view.ViewPropertyAnimator rotationX(float);
@@ -21854,6 +21884,8 @@
     method public android.view.ViewPropertyAnimator setDuration(long);
     method public android.view.ViewPropertyAnimator setInterpolator(android.animation.TimeInterpolator);
     method public android.view.ViewPropertyAnimator setListener(android.animation.Animator.AnimatorListener);
+    method public android.view.ViewPropertyAnimator setStartDelay(long);
+    method public void start();
     method public android.view.ViewPropertyAnimator translationX(float);
     method public android.view.ViewPropertyAnimator translationXBy(float);
     method public android.view.ViewPropertyAnimator translationY(float);
@@ -22241,7 +22273,7 @@
     method public boolean isEnabled();
     method public boolean isFullScreen();
     method public boolean isPassword();
-    method protected static android.view.accessibility.AccessibilityRecord obtain();
+    method public static android.view.accessibility.AccessibilityRecord obtain();
     method public void recycle();
     method public void setAddedCount(int);
     method public void setBeforeText(java.lang.CharSequence);
@@ -24010,6 +24042,7 @@
     ctor public ExpandableListView(android.content.Context, android.util.AttributeSet, int);
     method public boolean collapseGroup(int);
     method public boolean expandGroup(int);
+    method public boolean expandGroup(int, boolean);
     method public android.widget.ExpandableListAdapter getExpandableListAdapter();
     method public long getExpandableListPosition(int);
     method public int getFlatListPosition(long);
@@ -25197,6 +25230,7 @@
     method public final android.content.res.ColorStateList getLinkTextColors();
     method public final boolean getLinksClickable();
     method public final android.text.method.MovementMethod getMovementMethod();
+    method public int getOffsetForPosition(float, float);
     method public android.text.TextPaint getPaint();
     method public int getPaintFlags();
     method public java.lang.String getPrivateImeOptions();
@@ -25217,6 +25251,7 @@
     method public android.text.style.URLSpan[] getUrls();
     method public boolean hasSelection();
     method public boolean isInputMethodTarget();
+    method public boolean isSuggestionsEnabled();
     method public boolean isTextSelectable();
     method public int length();
     method public boolean moveCursorToVisibleOffset();
@@ -25288,6 +25323,7 @@
     method public void setSingleLine();
     method public void setSingleLine(boolean);
     method public final void setSpannableFactory(android.text.Spannable.Factory);
+    method public void setSuggestionsEnabled(boolean);
     method public final void setText(java.lang.CharSequence);
     method public void setText(java.lang.CharSequence, android.widget.TextView.BufferType);
     method public final void setText(char[], int, int);
diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp
index 371268f..152a7cb 100644
--- a/cmds/app_process/app_main.cpp
+++ b/cmds/app_process/app_main.cpp
@@ -149,10 +149,7 @@
     mArgLen--;
 
     AppRuntime runtime;
-    const char *arg;
-    const char *argv0;
-
-    argv0 = argv[0];
+    const char* argv0 = argv[0];
 
     // Process command line arguments
     // ignore argv[0]
@@ -163,39 +160,53 @@
 
     int i = runtime.addVmArguments(argc, argv);
 
-    // Next arg is parent directory
-    if (i < argc) {
-        runtime.mParentDir = argv[i++];
+    // Parse runtime arguments.  Stop at first unrecognized option.
+    bool zygote = false;
+    bool startSystemServer = false;
+    bool application = false;
+    const char* parentDir = NULL;
+    const char* niceName = NULL;
+    const char* className = NULL;
+    while (i < argc) {
+        const char* arg = argv[i++];
+        if (!parentDir) {
+            parentDir = arg;
+        } else if (strcmp(arg, "--zygote") == 0) {
+            zygote = true;
+            niceName = "zygote";
+        } else if (strcmp(arg, "--start-system-server") == 0) {
+            startSystemServer = true;
+        } else if (strcmp(arg, "--application") == 0) {
+            application = true;
+        } else if (strncmp(arg, "--nice-name=", 12) == 0) {
+            niceName = arg + 12;
+        } else {
+            className = arg;
+            break;
+        }
     }
 
-    // Next arg is startup classname or "--zygote"
-    if (i < argc) {
-        arg = argv[i++];
-        if (0 == strcmp("--zygote", arg)) {
-            bool startSystemServer = (i < argc) ?
-                    strcmp(argv[i], "--start-system-server") == 0 : false;
-            setArgv0(argv0, "zygote");
-            set_process_name("zygote");
-            runtime.start("com.android.internal.os.ZygoteInit",
-                startSystemServer);
-        } else {
-            set_process_name(argv0);
+    if (niceName && *niceName) {
+        setArgv0(argv0, niceName);
+        set_process_name(niceName);
+    }
 
-            runtime.mClassName = arg;
+    runtime.mParentDir = parentDir;
 
-            // Remainder of args get passed to startup class main()
-            runtime.mArgC = argc-i;
-            runtime.mArgV = argv+i;
-
-            LOGV("App process is starting with pid=%d, class=%s.\n",
-                 getpid(), runtime.getClassName());
-            runtime.start();
-        }
+    if (zygote) {
+        runtime.start("com.android.internal.os.ZygoteInit",
+                startSystemServer ? "start-system-server" : "");
+    } else if (className) {
+        // Remainder of args get passed to startup class main()
+        runtime.mClassName = className;
+        runtime.mArgC = argc - i;
+        runtime.mArgV = argv + i;
+        runtime.start("com.android.internal.os.RuntimeInit",
+                application ? "application" : "tool");
     } else {
         fprintf(stderr, "Error: no class name or --zygote supplied.\n");
         app_usage();
         LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
         return 10;
     }
-
 }
diff --git a/cmds/dumpstate/dumpstate.c b/cmds/dumpstate/dumpstate.c
index b0d764f..21bb62e 100644
--- a/cmds/dumpstate/dumpstate.c
+++ b/cmds/dumpstate/dumpstate.c
@@ -133,12 +133,14 @@
             "su", "root", "wlutil", "counters", NULL);
 #endif
 
-    char ril_dumpstate_timeout[PROPERTY_VALUE_MAX] = {0};
+#ifdef BROKEN_VRIL_IS_FIXED_B_4442803
+   char ril_dumpstate_timeout[PROPERTY_VALUE_MAX] = {0};
     property_get("ril.dumpstate.timeout", ril_dumpstate_timeout, "30");
     if (strlen(ril_dumpstate_timeout) > 0) {
         run_command("DUMP VENDOR RIL LOGS", atoi(ril_dumpstate_timeout),
                 "su", "root", "vril-dump", NULL);
     }
+#endif
 
     print_properties();
 
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index 701c7ac..b0e4a86 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -30,11 +30,13 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageItemInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.ParceledListSlice;
 import android.content.pm.PermissionGroupInfo;
 import android.content.pm.PermissionInfo;
 import android.content.res.AssetManager;
 import android.content.res.Resources;
 import android.net.Uri;
+import android.os.Parcel;
 import android.os.Process;
 import android.os.RemoteException;
 import android.os.ServiceManager;
@@ -239,7 +241,7 @@
         String filter = nextArg();
 
         try {
-            List<PackageInfo> packages = mPm.getInstalledPackages(getFlags);
+            final List<PackageInfo> packages = getInstalledPackages(mPm, getFlags);
 
             int count = packages.size();
             for (int p = 0 ; p < count ; p++) {
@@ -267,6 +269,22 @@
         }
     }
 
+    @SuppressWarnings("unchecked")
+    private List<PackageInfo> getInstalledPackages(IPackageManager pm, int flags)
+            throws RemoteException {
+        final List<PackageInfo> packageInfos = new ArrayList<PackageInfo>();
+        PackageInfo lastItem = null;
+        ParceledListSlice<PackageInfo> slice;
+
+        do {
+            final String lastKey = lastItem != null ? lastItem.packageName : null;
+            slice = pm.getInstalledPackages(flags, lastKey);
+            lastItem = slice.populateList(packageInfos, PackageInfo.CREATOR);
+        } while (!slice.isLastSlice());
+
+        return packageInfos;
+    }
+
     /**
      * Lists all of the features supported by the current device.
      *
diff --git a/cmds/runtime/main_runtime.cpp b/cmds/runtime/main_runtime.cpp
index 785e4cc..dbff095 100644
--- a/cmds/runtime/main_runtime.cpp
+++ b/cmds/runtime/main_runtime.cpp
@@ -497,7 +497,7 @@
 #ifndef HAVE_ANDROID_OS
         QuickRuntime* runt = new QuickRuntime();
         runt->start("com/android/server/SystemServer",
-                    false /* spontaneously fork system server from zygote */);
+                    "" /* spontaneously fork system server from zygote */);
 #endif
     }
 
diff --git a/core/java/android/animation/LayoutTransition.java b/core/java/android/animation/LayoutTransition.java
index adfda8e..d25de97 100644
--- a/core/java/android/animation/LayoutTransition.java
+++ b/core/java/android/animation/LayoutTransition.java
@@ -18,6 +18,7 @@
 
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.ViewParent;
 import android.view.ViewTreeObserver;
 import android.view.animation.AccelerateDecelerateInterpolator;
 import android.view.animation.DecelerateInterpolator;
@@ -70,8 +71,9 @@
  * moving as a result of the layout event) as well as the values that are changing (such as the
  * position and size of that object). The actual values that are pushed to each animation
  * depends on what properties are specified for the animation. For example, the default
- * CHANGE_APPEARING animation animates <code>left</code>, <code>top</code>, <code>right</code>,
- * and <code>bottom</code>. Values for these properties are updated with the pre- and post-layout
+ * CHANGE_APPEARING animation animates the <code>left</code>, <code>top</code>, <code>right</code>,
+ * <code>bottom</code>, <code>scrollX</code>, and <code>scrollY</code> properties.
+ * Values for these properties are updated with the pre- and post-layout
  * values when the transition begins. Custom animations will be similarly populated with
  * the target and values being animated, assuming they use ObjectAnimator objects with
  * property names that are known on the target object.</p>
@@ -210,6 +212,14 @@
      */
     private ArrayList<TransitionListener> mListeners;
 
+    /**
+     * Controls whether changing animations automatically animate the parent hierarchy as well.
+     * This behavior prevents artifacts when wrap_content layouts snap to the end state as the
+     * transition begins, causing visual glitches and clipping.
+     * Default value is true.
+     */
+    private boolean mAnimateParentHierarchy = true;
+
 
     /**
      * Constructs a LayoutTransition object. By default, the object will listen to layout
@@ -223,14 +233,17 @@
             PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top", 0, 1);
             PropertyValuesHolder pvhRight = PropertyValuesHolder.ofInt("right", 0, 1);
             PropertyValuesHolder pvhBottom = PropertyValuesHolder.ofInt("bottom", 0, 1);
+            PropertyValuesHolder pvhScrollX = PropertyValuesHolder.ofInt("scrollX", 0, 1);
+            PropertyValuesHolder pvhScrollY = PropertyValuesHolder.ofInt("scrollY", 0, 1);
             defaultChangeIn = ObjectAnimator.ofPropertyValuesHolder(this,
-                    pvhLeft, pvhTop, pvhRight, pvhBottom);
+                    pvhLeft, pvhTop, pvhRight, pvhBottom, pvhScrollX, pvhScrollY);
             defaultChangeIn.setDuration(DEFAULT_DURATION);
             defaultChangeIn.setStartDelay(mChangingAppearingDelay);
             defaultChangeIn.setInterpolator(mChangingAppearingInterpolator);
             defaultChangeOut = defaultChangeIn.clone();
             defaultChangeOut.setStartDelay(mChangingDisappearingDelay);
             defaultChangeOut.setInterpolator(mChangingDisappearingInterpolator);
+
             defaultFadeIn = ObjectAnimator.ofFloat(this, "alpha", 0f, 1f);
             defaultFadeIn.setDuration(DEFAULT_DURATION);
             defaultFadeIn.setStartDelay(mAppearingDelay);
@@ -572,122 +585,24 @@
 
             // only animate the views not being added or removed
             if (child != newView) {
-
-
-                // Make a copy of the appropriate animation
-                final Animator anim = baseAnimator.clone();
-
-                // Set the target object for the animation
-                anim.setTarget(child);
-
-                // A ObjectAnimator (or AnimatorSet of them) can extract start values from
-                // its target object
-                anim.setupStartValues();
-
-                // If there's an animation running on this view already, cancel it
-                Animator currentAnimation = pendingAnimations.get(child);
-                if (currentAnimation != null) {
-                    currentAnimation.cancel();
-                    pendingAnimations.remove(child);
-                }
-                // Cache the animation in case we need to cancel it later
-                pendingAnimations.put(child, anim);
-
-                // For the animations which don't get started, we have to have a means of
-                // removing them from the cache, lest we leak them and their target objects.
-                // We run an animator for the default duration+100 (an arbitrary time, but one
-                // which should far surpass the delay between setting them up here and
-                // handling layout events which start them.
-                ValueAnimator pendingAnimRemover = ValueAnimator.ofFloat(0f, 1f).
-                        setDuration(duration+100);
-                pendingAnimRemover.addListener(new AnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationEnd(Animator animation) {
-                        pendingAnimations.remove(child);
-                    }
-                });
-                pendingAnimRemover.start();
-
-                // Add a listener to track layout changes on this view. If we don't get a callback,
-                // then there's nothing to animate.
-                final View.OnLayoutChangeListener listener = new View.OnLayoutChangeListener() {
-                    public void onLayoutChange(View v, int left, int top, int right, int bottom,
-                            int oldLeft, int oldTop, int oldRight, int oldBottom) {
-
-                        // Tell the animation to extract end values from the changed object
-                        anim.setupEndValues();
-
-                        long startDelay;
-                        if (changeReason == APPEARING) {
-                            startDelay = mChangingAppearingDelay + staggerDelay;
-                            staggerDelay += mChangingAppearingStagger;
-                        } else {
-                            startDelay = mChangingDisappearingDelay + staggerDelay;
-                            staggerDelay += mChangingDisappearingStagger;
-                        }
-                        anim.setStartDelay(startDelay);
-                        anim.setDuration(duration);
-
-                        Animator prevAnimation = currentChangingAnimations.get(child);
-                        if (prevAnimation != null) {
-                            prevAnimation.cancel();
-                        }
-                        Animator pendingAnimation = pendingAnimations.get(child);
-                        if (pendingAnimation != null) {
-                            pendingAnimations.remove(child);
-                        }
-                        // Cache the animation in case we need to cancel it later
-                        currentChangingAnimations.put(child, anim);
-
-                        if (anim instanceof ObjectAnimator) {
-                            ((ObjectAnimator) anim).setCurrentPlayTime(0);
-                        }
-                        anim.start();
-
-                        // this only removes listeners whose views changed - must clear the
-                        // other listeners later
-                        child.removeOnLayoutChangeListener(this);
-                        layoutChangeListenerMap.remove(child);
-                    }
-                };
-                // Remove the animation from the cache when it ends
-                anim.addListener(new AnimatorListenerAdapter() {
-
-                    @Override
-                    public void onAnimationStart(Animator animator) {
-                        if (mListeners != null) {
-                            for (TransitionListener listener : mListeners) {
-                                listener.startTransition(LayoutTransition.this, parent, child,
-                                        changeReason == APPEARING ?
-                                                CHANGE_APPEARING : CHANGE_DISAPPEARING);
-                            }
-                        }
-                    }
-
-                    @Override
-                    public void onAnimationCancel(Animator animator) {
-                        child.removeOnLayoutChangeListener(listener);
-                        layoutChangeListenerMap.remove(child);
-                    }
-
-                    @Override
-                    public void onAnimationEnd(Animator animator) {
-                        currentChangingAnimations.remove(child);
-                        if (mListeners != null) {
-                            for (TransitionListener listener : mListeners) {
-                                listener.endTransition(LayoutTransition.this, parent, child,
-                                        changeReason == APPEARING ?
-                                                CHANGE_APPEARING : CHANGE_DISAPPEARING);
-                            }
-                        }
-                    }
-                });
-
-                child.addOnLayoutChangeListener(listener);
-                // cache the listener for later removal
-                layoutChangeListenerMap.put(child, listener);
+                setupChangeAnimation(parent, changeReason, baseAnimator, duration, child);
             }
         }
+        if (mAnimateParentHierarchy) {
+            ViewGroup tempParent = parent;
+            while (tempParent != null) {
+                ViewParent parentParent = tempParent.getParent();
+                if (parentParent instanceof ViewGroup) {
+                    setupChangeAnimation((ViewGroup)parentParent, changeReason, baseAnimator,
+                            duration, tempParent);
+                    tempParent = (ViewGroup) parentParent;
+                } else {
+                    tempParent = null;
+                }
+
+            }
+        }
+
         // This is the cleanup step. When we get this rendering event, we know that all of
         // the appropriate animations have been set up and run. Now we can clear out the
         // layout listeners.
@@ -706,6 +621,175 @@
     }
 
     /**
+     * This flag controls whether CHANGE_APPEARING or CHANGE_DISAPPEARING animations will
+     * cause the same changing animation to be run on the parent hierarchy as well. This allows
+     * containers of transitioning views to also transition, which may be necessary in situations
+     * where the containers bounds change between the before/after states and may clip their
+     * children during the transition animations. For example, layouts with wrap_content will
+     * adjust their bounds according to the dimensions of their children.
+     *
+     * @param animateParentHierarchy A boolean value indicating whether the parents of
+     * transitioning views should also be animated during the transition. Default value is true.
+     */
+    public void setAnimateParentHierarchy(boolean animateParentHierarchy) {
+        mAnimateParentHierarchy = animateParentHierarchy;
+    }
+
+    /**
+     * Utility function called by runChangingTransition for both the children and the parent
+     * hierarchy.
+     */
+    private void setupChangeAnimation(final ViewGroup parent, final int changeReason,
+            Animator baseAnimator, final long duration, final View child) {
+        // Make a copy of the appropriate animation
+        final Animator anim = baseAnimator.clone();
+
+        // Set the target object for the animation
+        anim.setTarget(child);
+
+        // A ObjectAnimator (or AnimatorSet of them) can extract start values from
+        // its target object
+        anim.setupStartValues();
+
+        // If there's an animation running on this view already, cancel it
+        Animator currentAnimation = pendingAnimations.get(child);
+        if (currentAnimation != null) {
+            currentAnimation.cancel();
+            pendingAnimations.remove(child);
+        }
+        // Cache the animation in case we need to cancel it later
+        pendingAnimations.put(child, anim);
+
+        // For the animations which don't get started, we have to have a means of
+        // removing them from the cache, lest we leak them and their target objects.
+        // We run an animator for the default duration+100 (an arbitrary time, but one
+        // which should far surpass the delay between setting them up here and
+        // handling layout events which start them.
+        ValueAnimator pendingAnimRemover = ValueAnimator.ofFloat(0f, 1f).
+                setDuration(duration + 100);
+        pendingAnimRemover.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                pendingAnimations.remove(child);
+            }
+        });
+        pendingAnimRemover.start();
+
+        // Add a listener to track layout changes on this view. If we don't get a callback,
+        // then there's nothing to animate.
+        final View.OnLayoutChangeListener listener = new View.OnLayoutChangeListener() {
+            public void onLayoutChange(View v, int left, int top, int right, int bottom,
+                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
+
+                // Tell the animation to extract end values from the changed object
+                anim.setupEndValues();
+                if (anim instanceof ValueAnimator) {
+                    boolean valuesDiffer = false;
+                    ValueAnimator valueAnim = (ValueAnimator)anim;
+                    PropertyValuesHolder[] oldValues = valueAnim.getValues();
+                    for (int i = 0; i < oldValues.length; ++i) {
+                        PropertyValuesHolder pvh = oldValues[i];
+                        KeyframeSet keyframeSet = pvh.mKeyframeSet;
+                        if (keyframeSet.mFirstKeyframe == null ||
+                                keyframeSet.mLastKeyframe == null ||
+                                !keyframeSet.mFirstKeyframe.getValue().equals(
+                                keyframeSet.mLastKeyframe.getValue())) {
+                            valuesDiffer = true;
+                        }
+                    }
+                    if (!valuesDiffer) {
+                        return;
+                    }
+                }
+
+                long startDelay;
+                if (changeReason == APPEARING) {
+                    startDelay = mChangingAppearingDelay + staggerDelay;
+                    staggerDelay += mChangingAppearingStagger;
+                } else {
+                    startDelay = mChangingDisappearingDelay + staggerDelay;
+                    staggerDelay += mChangingDisappearingStagger;
+                }
+                anim.setStartDelay(startDelay);
+                anim.setDuration(duration);
+
+                Animator prevAnimation = currentChangingAnimations.get(child);
+                if (prevAnimation != null) {
+                    prevAnimation.cancel();
+                }
+                Animator pendingAnimation = pendingAnimations.get(child);
+                if (pendingAnimation != null) {
+                    pendingAnimations.remove(child);
+                }
+                // Cache the animation in case we need to cancel it later
+                currentChangingAnimations.put(child, anim);
+
+                parent.requestTransitionStart(LayoutTransition.this);
+
+                // this only removes listeners whose views changed - must clear the
+                // other listeners later
+                child.removeOnLayoutChangeListener(this);
+                layoutChangeListenerMap.remove(child);
+            }
+        };
+        // Remove the animation from the cache when it ends
+        anim.addListener(new AnimatorListenerAdapter() {
+
+            @Override
+            public void onAnimationStart(Animator animator) {
+                if (mListeners != null) {
+                    for (TransitionListener listener : mListeners) {
+                        listener.startTransition(LayoutTransition.this, parent, child,
+                                changeReason == APPEARING ?
+                                        CHANGE_APPEARING : CHANGE_DISAPPEARING);
+                    }
+                }
+            }
+
+            @Override
+            public void onAnimationCancel(Animator animator) {
+                child.removeOnLayoutChangeListener(listener);
+                layoutChangeListenerMap.remove(child);
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animator) {
+                currentChangingAnimations.remove(child);
+                if (mListeners != null) {
+                    for (TransitionListener listener : mListeners) {
+                        listener.endTransition(LayoutTransition.this, parent, child,
+                                changeReason == APPEARING ?
+                                        CHANGE_APPEARING : CHANGE_DISAPPEARING);
+                    }
+                }
+            }
+        });
+
+        child.addOnLayoutChangeListener(listener);
+        // cache the listener for later removal
+        layoutChangeListenerMap.put(child, listener);
+    }
+
+    /**
+     * Starts the animations set up for a CHANGING transition. We separate the setup of these
+     * animations from actually starting them, to avoid side-effects that starting the animations
+     * may have on the properties of the affected objects. After setup, we tell the affected parent
+     * that this transition should be started. The parent informs its ViewAncestor, which then
+     * starts the transition after the current layout/measurement phase, just prior to drawing
+     * the view hierarchy.
+     *
+     * @hide
+     */
+    public void startChangingAnimations() {
+        for (Animator anim : currentChangingAnimations.values()) {
+            if (anim instanceof ObjectAnimator) {
+                ((ObjectAnimator) anim).setCurrentPlayTime(0);
+            }
+            anim.start();
+        }
+    }
+
+    /**
      * Returns true if animations are running which animate layout-related properties. This
      * essentially means that either CHANGE_APPEARING or CHANGE_DISAPPEARING animations
      * are running, since these animations operate on layout-related properties.
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 87369ab..3877bd0 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -1398,6 +1398,10 @@
     public void onConfigurationChanged(Configuration newConfig) {
         mCalled = true;
 
+        if (mActionBar != null) {
+            mActionBar.onConfigurationChanged(newConfig);
+        }
+
         mFragments.dispatchConfigurationChanged(newConfig);
 
         if (mWindow != null) {
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index f2c97964..2a0d798 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -1467,6 +1467,22 @@
             return true;
         }
 
+        case REGISTER_PROCESS_OBSERVER_TRANSACTION: {
+            data.enforceInterface(IActivityManager.descriptor);
+            IProcessObserver observer = IProcessObserver.Stub.asInterface(
+                    data.readStrongBinder());
+            registerProcessObserver(observer);
+            return true;
+        }
+
+        case UNREGISTER_PROCESS_OBSERVER_TRANSACTION: {
+            data.enforceInterface(IActivityManager.descriptor);
+            IProcessObserver observer = IProcessObserver.Stub.asInterface(
+                    data.readStrongBinder());
+            unregisterProcessObserver(observer);
+            return true;
+        }
+
         }
 
         return super.onTransact(code, data, reply, flags);
@@ -3300,5 +3316,27 @@
         return result;
     }
 
+    public void registerProcessObserver(IProcessObserver observer) throws RemoteException {
+        Parcel data = Parcel.obtain();
+        Parcel reply = Parcel.obtain();
+        data.writeInterfaceToken(IActivityManager.descriptor);
+        data.writeStrongBinder(observer != null ? observer.asBinder() : null);
+        mRemote.transact(REGISTER_PROCESS_OBSERVER_TRANSACTION, data, reply, 0);
+        reply.readException();
+        data.recycle();
+        reply.recycle();
+    }
+
+    public void unregisterProcessObserver(IProcessObserver observer) throws RemoteException {
+        Parcel data = Parcel.obtain();
+        Parcel reply = Parcel.obtain();
+        data.writeInterfaceToken(IActivityManager.descriptor);
+        data.writeStrongBinder(observer != null ? observer.asBinder() : null);
+        mRemote.transact(UNREGISTER_PROCESS_OBSERVER_TRANSACTION, data, reply, 0);
+        reply.readException();
+        data.recycle();
+        reply.recycle();
+    }
+
     private IBinder mRemote;
 }
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 85918cf..4cff12f 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -34,6 +34,7 @@
 import android.content.pm.InstrumentationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.ParceledListSlice;
 import android.content.pm.PermissionGroupInfo;
 import android.content.pm.PermissionInfo;
 import android.content.pm.ProviderInfo;
@@ -44,6 +45,7 @@
 import android.content.res.XmlResourceParser;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
+import android.os.Parcel;
 import android.os.Process;
 import android.os.RemoteException;
 import android.util.Log;
@@ -378,19 +380,41 @@
         throw new NameNotFoundException("No shared userid for user:"+sharedUserName);
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public List<PackageInfo> getInstalledPackages(int flags) {
         try {
-            return mPM.getInstalledPackages(flags);
+            final List<PackageInfo> packageInfos = new ArrayList<PackageInfo>();
+            PackageInfo lastItem = null;
+            ParceledListSlice<PackageInfo> slice;
+
+            do {
+                final String lastKey = lastItem != null ? lastItem.packageName : null;
+                slice = mPM.getInstalledPackages(flags, lastKey);
+                lastItem = slice.populateList(packageInfos, PackageInfo.CREATOR);
+            } while (!slice.isLastSlice());
+
+            return packageInfos;
         } catch (RemoteException e) {
             throw new RuntimeException("Package manager has died", e);
         }
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public List<ApplicationInfo> getInstalledApplications(int flags) {
         try {
-            return mPM.getInstalledApplications(flags);
+            final List<ApplicationInfo> applicationInfos = new ArrayList<ApplicationInfo>();
+            ApplicationInfo lastItem = null;
+            ParceledListSlice<ApplicationInfo> slice;
+
+            do {
+                final String lastKey = lastItem != null ? lastItem.packageName : null;
+                slice = mPM.getInstalledApplications(flags, lastKey);
+                lastItem = slice.populateList(applicationInfos, ApplicationInfo.CREATOR);
+            } while (!slice.isLastSlice());
+
+            return applicationInfos;
         } catch (RemoteException e) {
             throw new RuntimeException("Package manager has died", e);
         }
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 36b9d72..51f1e3d 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -35,6 +35,7 @@
 import android.content.pm.IPackageManager;
 import android.content.pm.PackageManager;
 import android.content.res.AssetManager;
+import android.content.res.CompatibilityInfo;
 import android.content.res.Resources;
 import android.database.DatabaseErrorHandler;
 import android.database.sqlite.SQLiteDatabase;
@@ -78,6 +79,7 @@
 import android.util.AndroidRuntimeException;
 import android.util.Log;
 import android.view.ContextThemeWrapper;
+import android.view.Display;
 import android.view.WindowManagerImpl;
 import android.view.accessibility.AccessibilityManager;
 import android.view.inputmethod.InputMethodManager;
@@ -423,7 +425,11 @@
 
         registerService(WINDOW_SERVICE, new ServiceFetcher() {
                 public Object getService(ContextImpl ctx) {
-                    return WindowManagerImpl.getDefault();
+                    RuntimeException e = new RuntimeException("foo");
+                    e.fillInStackTrace();
+                    Log.i(TAG, "Getting window manager", e);
+                    CompatibilityInfo ci = ctx.mResources.getCompatibilityInfo();
+                    return WindowManagerImpl.getDefault(ci);
                 }});
     }
 
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 54c3422..1f53c0e 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -355,6 +355,9 @@
 
     public boolean removeTask(int taskId, int flags) throws RemoteException;
 
+    public void registerProcessObserver(IProcessObserver observer) throws RemoteException;
+    public void unregisterProcessObserver(IProcessObserver observer) throws RemoteException;
+
     /*
      * Private non-Binder interfaces
      */
@@ -577,4 +580,6 @@
     int SWITCH_USER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+127;
     int REMOVE_SUB_TASK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+128;
     int REMOVE_TASK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+129;
+    int REGISTER_PROCESS_OBSERVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+130;
+    int UNREGISTER_PROCESS_OBSERVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+131;
 }
diff --git a/core/java/android/app/IProcessObserver.aidl b/core/java/android/app/IProcessObserver.aidl
new file mode 100644
index 0000000..2094294
--- /dev/null
+++ b/core/java/android/app/IProcessObserver.aidl
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2011 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;
+
+/** {@hide} */
+oneway interface IProcessObserver {
+
+    void onForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities);
+    void onProcessDied(int pid, int uid);
+
+}
diff --git a/core/java/android/app/IThumbnailRetriever.aidl b/core/java/android/app/IThumbnailRetriever.aidl
index 2a6737d..410cc20 100644
--- a/core/java/android/app/IThumbnailRetriever.aidl
+++ b/core/java/android/app/IThumbnailRetriever.aidl
@@ -18,6 +18,7 @@
 
 /**
  * System private API for retrieving thumbnails
+ * {@hide}
  */
 interface IThumbnailRetriever {
     Bitmap getThumbnail(int index);
diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java
index 7b02763..2952e6b 100644
--- a/core/java/android/app/Instrumentation.java
+++ b/core/java/android/app/Instrumentation.java
@@ -1044,7 +1044,7 @@
             }
         }
         
-        activity.onCreate(icicle);
+        activity.performCreate(icicle);
         
         if (mActivityMonitors != null) {
             synchronized (mSync) {
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index db8d5e9..9cb57be 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -29,12 +29,13 @@
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
-import android.os.SystemClock;
 import android.speech.RecognizerIntent;
 import android.text.InputType;
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.util.Log;
+import android.util.TypedValue;
+import android.view.ActionMode;
 import android.view.Gravity;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
@@ -50,9 +51,6 @@
 import android.widget.SearchView;
 import android.widget.TextView;
 
-import java.util.WeakHashMap;
-import java.util.concurrent.atomic.AtomicLong;
-
 /**
  * Search dialog. This is controlled by the 
  * SearchManager and runs in the current foreground process.
@@ -110,13 +108,20 @@
         }
     };
 
+    static int resolveDialogTheme(Context context) {
+        TypedValue outValue = new TypedValue();
+        context.getTheme().resolveAttribute(com.android.internal.R.attr.searchDialogTheme,
+                outValue, true);
+        return outValue.resourceId;
+    }
+
     /**
      * Constructor - fires it up and makes it look like the search UI.
      * 
      * @param context Application Context we can use for system acess
      */
     public SearchDialog(Context context, SearchManager searchManager) {
-        super(context, com.android.internal.R.style.Theme_SearchBar);
+        super(context, resolveDialogTheme(context));
 
         // Save voice intent for later queries/launching
         mVoiceWebSearchIntent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
@@ -642,6 +647,14 @@
             }
             return super.dispatchKeyEventPreIme(event);
         }
+
+        /**
+         * Don't allow action modes in a SearchBar, it looks silly.
+         */
+        @Override
+        public ActionMode startActionModeForChild(View child, ActionMode.Callback callback) {
+            return null;
+        }
     }
 
     private boolean isEmpty(AutoCompleteTextView actv) {
diff --git a/core/java/android/app/UiModeManager.java b/core/java/android/app/UiModeManager.java
index 95451d6..71f6445 100644
--- a/core/java/android/app/UiModeManager.java
+++ b/core/java/android/app/UiModeManager.java
@@ -167,7 +167,8 @@
      * Return the current running mode type.  May be one of
      * {@link Configuration#UI_MODE_TYPE_NORMAL Configuration.UI_MODE_TYPE_NORMAL},
      * {@link Configuration#UI_MODE_TYPE_DESK Configuration.UI_MODE_TYPE_DESK}, or
-     * {@link Configuration#UI_MODE_TYPE_CAR Configuration.UI_MODE_TYPE_CAR},
+     * {@link Configuration#UI_MODE_TYPE_CAR Configuration.UI_MODE_TYPE_CAR}, or
+     * {@link Configuration#UI_MODE_TYPE_TELEVISION Configuration.UI_MODE_TYPE_TV}.
      */
     public int getCurrentModeType() {
         if (mService != null) {
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 4c7d87f..a660bd7 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -1544,6 +1544,9 @@
      */
     public static final String NETWORKMANAGEMENT_SERVICE = "network_management";
 
+    /** {@hide} */
+    public static final String NETWORK_POLICY_SERVICE = "netpolicy";
+
     /**
      * Use with {@link #getSystemService} to retrieve a {@link
      * android.net.wifi.WifiManager} for handling management of
diff --git a/core/java/android/content/IOnPrimaryClipChangedListener.aidl b/core/java/android/content/IOnPrimaryClipChangedListener.aidl
index fb42a45..46d7f7c 100644
--- a/core/java/android/content/IOnPrimaryClipChangedListener.aidl
+++ b/core/java/android/content/IOnPrimaryClipChangedListener.aidl
@@ -16,6 +16,9 @@
 
 package android.content;
 
+/**
+ * {@hide}
+ */
 oneway interface IOnPrimaryClipChangedListener {
     void dispatchPrimaryClipChanged();
 }
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index 64c437d..4285388 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -340,6 +340,12 @@
     public static final int CONFIG_SCREEN_SIZE = 0x0400;
     /**
      * Bit in {@link #configChanges} that indicates that the activity
+     * can itself handle the smallest screen size. Set from the
+     * {@link android.R.attr#configChanges} attribute.
+     */
+    public static final int CONFIG_SMALLEST_SCREEN_SIZE = 0x0800;
+    /**
+     * Bit in {@link #configChanges} that indicates that the activity
      * can itself handle changes to the font scaling factor.  Set from the
      * {@link android.R.attr#configChanges} attribute.  This is
      * not a core resource configutation, but a higher-level value, so its
@@ -364,6 +370,7 @@
         0x0800, // SCREEN LAYOUT
         0x1000, // UI MODE
         0x0200, // SCREEN SIZE
+        0x2000, // SMALLEST SCREEN SIZE
     };
     /** @hide
      * Convert Java change bits to native.
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 11cd446..37b6822 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -30,6 +30,7 @@
 import android.content.pm.IPackageStatsObserver;
 import android.content.pm.InstrumentationInfo;
 import android.content.pm.PackageInfo;
+import android.content.pm.ParceledListSlice;
 import android.content.pm.ProviderInfo;
 import android.content.pm.PermissionGroupInfo;
 import android.content.pm.PermissionInfo;
@@ -110,9 +111,21 @@
     List<ResolveInfo> queryIntentServices(in Intent intent,
             String resolvedType, int flags);
 
-    List<PackageInfo> getInstalledPackages(int flags);
+    /**
+     * This implements getInstalledPackages via a "last returned row"
+     * mechanism that is not exposed in the API. This is to get around the IPC
+     * limit that kicks in when flags are included that bloat up the data
+     * returned.
+     */
+    ParceledListSlice getInstalledPackages(int flags, in String lastRead);
 
-    List<ApplicationInfo> getInstalledApplications(int flags);
+    /**
+     * This implements getInstalledApplications via a "last returned row"
+     * mechanism that is not exposed in the API. This is to get around the IPC
+     * limit that kicks in when flags are included that bloat up the data
+     * returned.
+     */
+    ParceledListSlice getInstalledApplications(int flags, in String lastRead);
 
     /**
      * Retrieve all applications that are marked as persistent.
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 18120ac..9ff324b 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -396,7 +396,7 @@
             int cookie = assmgr.addAssetPath(mArchiveSourcePath);
             if (cookie != 0) {
                 res = new Resources(assmgr, metrics, null);
-                assmgr.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                assmgr.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                         Build.VERSION.RESOURCES_SDK_INT);
                 parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
                 assetError = false;
@@ -596,7 +596,7 @@
         AssetManager assmgr = null;
         try {
             assmgr = new AssetManager();
-            assmgr.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            assmgr.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                     Build.VERSION.RESOURCES_SDK_INT);
             int cookie = assmgr.addAssetPath(packageFilePath);
             parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
@@ -1943,7 +1943,8 @@
                     0);
             if (owner.applicationInfo.targetSdkVersion
                         < android.os.Build.VERSION_CODES.HONEYCOMB_MR2) {
-                a.info.configChanges |= ActivityInfo.CONFIG_SCREEN_SIZE;
+                a.info.configChanges |= ActivityInfo.CONFIG_SCREEN_SIZE
+                        | ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE;
             }
             a.info.softInputMode = sa.getInt(
                     com.android.internal.R.styleable.AndroidManifestActivity_windowSoftInputMode,
diff --git a/core/java/android/content/pm/ParceledListSlice.aidl b/core/java/android/content/pm/ParceledListSlice.aidl
new file mode 100755
index 0000000..c02cc6a
--- /dev/null
+++ b/core/java/android/content/pm/ParceledListSlice.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2011, 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.content.pm;
+
+parcelable ParceledListSlice;
diff --git a/core/java/android/content/pm/ParceledListSlice.java b/core/java/android/content/pm/ParceledListSlice.java
new file mode 100644
index 0000000..f3a98db4
--- /dev/null
+++ b/core/java/android/content/pm/ParceledListSlice.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2011 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.content.pm;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.List;
+
+/**
+ * Builds up a parcel that is discarded when written to another parcel or
+ * written to a list. This is useful for API that sends huge lists across a
+ * Binder that may be larger than the IPC limit.
+ *
+ * @hide
+ */
+public class ParceledListSlice<T extends Parcelable> implements Parcelable {
+    /*
+     * TODO get this number from somewhere else. For now set it to a quarter of
+     * the 1MB limit.
+     */
+    private static final int MAX_IPC_SIZE = 256 * 1024;
+
+    private Parcel mParcel;
+
+    private int mNumItems;
+
+    private boolean mIsLastSlice;
+
+    public ParceledListSlice() {
+        mParcel = Parcel.obtain();
+    }
+
+    private ParceledListSlice(Parcel p, int numItems, boolean lastSlice) {
+        mParcel = p;
+        mNumItems = numItems;
+        mIsLastSlice = lastSlice;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    /**
+     * Write this to another Parcel. Note that this discards the internal Parcel
+     * and should not be used anymore. This is so we can pass this to a Binder
+     * where we won't have a chance to call recycle on this.
+     */
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(mNumItems);
+        dest.writeInt(mIsLastSlice ? 1 : 0);
+
+        if (mNumItems > 0) {
+            final int parcelSize = mParcel.dataSize();
+            dest.writeInt(parcelSize);
+            dest.appendFrom(mParcel, 0, parcelSize);
+        }
+
+        mNumItems = 0;
+        mParcel.recycle();
+        mParcel = null;
+    }
+
+    /**
+     * Appends a parcel to this list slice.
+     *
+     * @param item Parcelable item to append to this list slice
+     * @return true when the list slice is full and should not be appended to
+     *         anymore
+     */
+    public boolean append(T item) {
+        if (mParcel == null) {
+            throw new IllegalStateException("ParceledListSlice has already been recycled");
+        }
+
+        item.writeToParcel(mParcel, PARCELABLE_WRITE_RETURN_VALUE);
+        mNumItems++;
+
+        return mParcel.dataSize() > MAX_IPC_SIZE;
+    }
+
+    /**
+     * Populates a list and discards the internal state of the
+     * ParceledListSlice in the process. The instance should
+     * not be used anymore.
+     *
+     * @param list list to insert items from this slice.
+     * @param creator creator that knows how to unparcel the
+     *        target object type.
+     * @return the last item inserted into the list or null if none.
+     */
+    public T populateList(List<T> list, Creator<T> creator) {
+        mParcel.setDataPosition(0);
+
+        T item = null;
+        for (int i = 0; i < mNumItems; i++) {
+            item = creator.createFromParcel(mParcel);
+            list.add(item);
+        }
+
+        mParcel.recycle();
+        mParcel = null;
+
+        return item;
+    }
+
+    /**
+     * Sets whether this is the last list slice in the series.
+     *
+     * @param lastSlice
+     */
+    public void setLastSlice(boolean lastSlice) {
+        mIsLastSlice = lastSlice;
+    }
+
+    /**
+     * Returns whether this is the last slice in a series of slices.
+     *
+     * @return true if this is the last slice in the series.
+     */
+    public boolean isLastSlice() {
+        return mIsLastSlice;
+    }
+
+    @SuppressWarnings("unchecked")
+    public static final Parcelable.Creator<ParceledListSlice> CREATOR =
+            new Parcelable.Creator<ParceledListSlice>() {
+        public ParceledListSlice createFromParcel(Parcel in) {
+            final int numItems = in.readInt();
+            final boolean lastSlice = in.readInt() == 1;
+
+            if (numItems > 0) {
+                final int parcelSize = in.readInt();
+
+                // Advance within this Parcel
+                int offset = in.dataPosition();
+                in.setDataPosition(offset + parcelSize);
+
+                Parcel p = Parcel.obtain();
+                p.setDataPosition(0);
+                p.appendFrom(in, offset, parcelSize);
+                p.setDataPosition(0);
+
+                return new ParceledListSlice(p, numItems, lastSlice);
+            } else {
+                return new ParceledListSlice();
+            }
+        }
+
+        public ParceledListSlice[] newArray(int size) {
+            return new ParceledListSlice[size];
+        }
+    };
+}
diff --git a/core/java/android/content/res/AssetManager.java b/core/java/android/content/res/AssetManager.java
index be67e96..931cb18 100644
--- a/core/java/android/content/res/AssetManager.java
+++ b/core/java/android/content/res/AssetManager.java
@@ -652,8 +652,8 @@
     public native final void setConfiguration(int mcc, int mnc, String locale,
             int orientation, int touchscreen, int density, int keyboard,
             int keyboardHidden, int navigation, int screenWidth, int screenHeight,
-            int screenWidthDp, int screenHeightDp, int screenLayout, int uiMode,
-            int majorVersion);
+            int smallestScreenWidthDp, int screenWidthDp, int screenHeightDp,
+            int screenLayout, int uiMode, int majorVersion);
 
     /**
      * Retrieve the resource identifier for the given resource name.
diff --git a/core/java/android/content/res/CompatibilityInfo.java b/core/java/android/content/res/CompatibilityInfo.java
index 8bcb005..854d410 100644
--- a/core/java/android/content/res/CompatibilityInfo.java
+++ b/core/java/android/content/res/CompatibilityInfo.java
@@ -125,14 +125,16 @@
         if ((appInfo.flags & ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) != 0) {
             compatFlags |= XLARGE_SCREENS | EXPANDABLE;
         }
-        if (!forceCompat) {
+        if ((appInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) {
+            compatFlags |= EXPANDABLE;
+        }
+
+        if (forceCompat) {
             // If we are forcing compatibility mode, then ignore an app that
             // just says it is resizable for screens.  We'll only have it fill
             // the screen if it explicitly says it supports the screen size we
             // are running in.
-            if ((appInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) {
-                compatFlags |= EXPANDABLE;
-            }
+            compatFlags &= ~EXPANDABLE;
         }
 
         boolean supportsScreen = false;
@@ -155,12 +157,10 @@
                 break;
         }
 
-        if ((screenLayout&Configuration.SCREENLAYOUT_COMPAT_NEEDED) == 0) {
+        if ((screenLayout&Configuration.SCREENLAYOUT_COMPAT_NEEDED) != 0) {
             if ((compatFlags&EXPANDABLE) != 0) {
                 supportsScreen = true;
-            }
-            if ((compatFlags&EXPANDABLE) == 0 &&
-                    (appInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) == 0) {
+            } else if ((appInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) == 0) {
                 compatFlags |= ALWAYS_COMPAT;
             }
         }
@@ -382,6 +382,9 @@
             // This is a larger screen device and the app is not
             // compatible with large screens, so diddle it.
             CompatibilityInfo.updateCompatibleScreenFrame(inoutDm, null, inoutDm);
+        } else {
+            inoutDm.widthPixels = inoutDm.realWidthPixels;
+            inoutDm.heightPixels = inoutDm.realHeightPixels;
         }
 
         if (isScalingRequired()) {
diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java
index 0de08f2..d476997 100644
--- a/core/java/android/content/res/Configuration.java
+++ b/core/java/android/content/res/Configuration.java
@@ -226,6 +226,7 @@
     public static final int UI_MODE_TYPE_NORMAL = 0x01;
     public static final int UI_MODE_TYPE_DESK = 0x02;
     public static final int UI_MODE_TYPE_CAR = 0x03;
+    public static final int UI_MODE_TYPE_TELEVISION = 0x04;
 
     public static final int UI_MODE_NIGHT_MASK = 0x30;
     public static final int UI_MODE_NIGHT_UNDEFINED = 0x00;
@@ -259,6 +260,15 @@
      */
     public int screenHeightDp;
 
+    public static final int SMALLEST_SCREEN_WIDTH_DP_UNDEFINED = 0;
+
+    /**
+     * The smallest screen size an application will see in normal operation.
+     * This is the smallest value of both screenWidthDp and screenHeightDp
+     * in both portrait and landscape.
+     */
+    public int smallestScreenWidthDp;
+
     /**
      * @hide Internal book-keeping.
      */
@@ -298,6 +308,7 @@
         uiMode = o.uiMode;
         screenWidthDp = o.screenWidthDp;
         screenHeightDp = o.screenHeightDp;
+        smallestScreenWidthDp = o.smallestScreenWidthDp;
         seq = o.seq;
     }
     
@@ -305,16 +316,68 @@
         StringBuilder sb = new StringBuilder(128);
         sb.append("{");
         sb.append(fontScale);
-        sb.append("x imsi=");
+        sb.append(" ");
         sb.append(mcc);
-        sb.append("/");
+        sb.append("mcc");
         sb.append(mnc);
+        sb.append("mnc");
         if (locale != null) {
             sb.append(" ");
             sb.append(locale);
         } else {
             sb.append(" (no locale)");
         }
+        if (smallestScreenWidthDp != SMALLEST_SCREEN_WIDTH_DP_UNDEFINED) {
+            sb.append(" sw"); sb.append(smallestScreenWidthDp); sb.append("dp");
+        } else {
+            sb.append("?swdp");
+        }
+        if (screenWidthDp != SCREEN_WIDTH_DP_UNDEFINED) {
+            sb.append(" w"); sb.append(screenWidthDp); sb.append("dp");
+        } else {
+            sb.append("?wdp");
+        }
+        if (screenHeightDp != SCREEN_HEIGHT_DP_UNDEFINED) {
+            sb.append(" h"); sb.append(screenHeightDp); sb.append("dp");
+        } else {
+            sb.append("?hdp");
+        }
+        switch ((screenLayout&SCREENLAYOUT_SIZE_MASK)) {
+            case SCREENLAYOUT_SIZE_UNDEFINED: sb.append(" ?lsize"); break;
+            case SCREENLAYOUT_SIZE_SMALL: sb.append(" smll"); break;
+            case SCREENLAYOUT_SIZE_NORMAL: sb.append(" nrml"); break;
+            case SCREENLAYOUT_SIZE_LARGE: sb.append(" lrg"); break;
+            case SCREENLAYOUT_SIZE_XLARGE: sb.append(" xlrg"); break;
+            default: sb.append(" layoutSize=");
+                    sb.append(screenLayout&SCREENLAYOUT_SIZE_MASK); break;
+        }
+        switch ((screenLayout&SCREENLAYOUT_LONG_MASK)) {
+            case SCREENLAYOUT_LONG_UNDEFINED: sb.append(" ?long"); break;
+            case SCREENLAYOUT_LONG_NO: /* not-long is not interesting to print */ break;
+            case SCREENLAYOUT_LONG_YES: sb.append(" long"); break;
+            default: sb.append(" layoutLong=");
+                    sb.append(screenLayout&SCREENLAYOUT_LONG_MASK); break;
+        }
+        switch (orientation) {
+            case ORIENTATION_UNDEFINED: sb.append(" ?orien"); break;
+            case ORIENTATION_LANDSCAPE: sb.append(" land"); break;
+            case ORIENTATION_PORTRAIT: sb.append(" port"); break;
+            default: sb.append(" orien="); sb.append(orientation); break;
+        }
+        switch ((uiMode&UI_MODE_TYPE_MASK)) {
+            case UI_MODE_TYPE_UNDEFINED: sb.append(" ?uimode"); break;
+            case UI_MODE_TYPE_NORMAL: /* normal is not interesting to print */ break;
+            case UI_MODE_TYPE_DESK: sb.append(" desk"); break;
+            case UI_MODE_TYPE_CAR: sb.append(" car"); break;
+            case UI_MODE_TYPE_TELEVISION: sb.append(" television"); break;
+            default: sb.append(" uimode="); sb.append(uiMode&UI_MODE_TYPE_MASK); break;
+        }
+        switch ((uiMode&UI_MODE_NIGHT_MASK)) {
+            case UI_MODE_NIGHT_UNDEFINED: sb.append(" ?night"); break;
+            case UI_MODE_NIGHT_NO: /* not-night is not interesting to print */ break;
+            case UI_MODE_NIGHT_YES: sb.append(" night"); break;
+            default: sb.append(" night="); sb.append(uiMode&UI_MODE_NIGHT_MASK); break;
+        }
         switch (touchscreen) {
             case TOUCHSCREEN_UNDEFINED: sb.append(" ?touch"); break;
             case TOUCHSCREEN_NOTOUCH: sb.append(" -touch"); break;
@@ -356,51 +419,6 @@
             case NAVIGATIONHIDDEN_YES: sb.append("/h"); break;
             default: sb.append("/"); sb.append(navigationHidden); break;
         }
-        switch (orientation) {
-            case ORIENTATION_UNDEFINED: sb.append(" ?orien"); break;
-            case ORIENTATION_LANDSCAPE: sb.append(" land"); break;
-            case ORIENTATION_PORTRAIT: sb.append(" port"); break;
-            default: sb.append(" orien="); sb.append(orientation); break;
-        }
-        switch ((screenLayout&SCREENLAYOUT_SIZE_MASK)) {
-            case SCREENLAYOUT_SIZE_UNDEFINED: sb.append(" ?lsize"); break;
-            case SCREENLAYOUT_SIZE_SMALL: sb.append(" smll"); break;
-            case SCREENLAYOUT_SIZE_NORMAL: sb.append(" nrml"); break;
-            case SCREENLAYOUT_SIZE_LARGE: sb.append(" lrg"); break;
-            case SCREENLAYOUT_SIZE_XLARGE: sb.append(" xlrg"); break;
-            default: sb.append(" layoutSize=");
-                    sb.append(screenLayout&SCREENLAYOUT_SIZE_MASK); break;
-        }
-        switch ((screenLayout&SCREENLAYOUT_LONG_MASK)) {
-            case SCREENLAYOUT_LONG_UNDEFINED: sb.append(" ?long"); break;
-            case SCREENLAYOUT_LONG_NO: /* not-long is not interesting to print */ break;
-            case SCREENLAYOUT_LONG_YES: sb.append(" long"); break;
-            default: sb.append(" layoutLong=");
-                    sb.append(screenLayout&SCREENLAYOUT_LONG_MASK); break;
-        }
-        switch ((uiMode&UI_MODE_TYPE_MASK)) {
-            case UI_MODE_TYPE_UNDEFINED: sb.append(" ?uimode"); break;
-            case UI_MODE_TYPE_NORMAL: /* normal is not interesting to print */ break;
-            case UI_MODE_TYPE_DESK: sb.append(" desk"); break;
-            case UI_MODE_TYPE_CAR: sb.append(" car"); break;
-            default: sb.append(" uimode="); sb.append(uiMode&UI_MODE_TYPE_MASK); break;
-        }
-        switch ((uiMode&UI_MODE_NIGHT_MASK)) {
-            case UI_MODE_NIGHT_UNDEFINED: sb.append(" ?night"); break;
-            case UI_MODE_NIGHT_NO: /* not-night is not interesting to print */ break;
-            case UI_MODE_NIGHT_YES: sb.append(" night"); break;
-            default: sb.append(" night="); sb.append(uiMode&UI_MODE_NIGHT_MASK); break;
-        }
-        if (screenWidthDp != SCREEN_WIDTH_DP_UNDEFINED) {
-            sb.append(" w"); sb.append(screenWidthDp); sb.append("dp");
-        } else {
-            sb.append("?wdp");
-        }
-        if (screenHeightDp != SCREEN_HEIGHT_DP_UNDEFINED) {
-            sb.append(" h"); sb.append(screenHeightDp); sb.append("dp");
-        } else {
-            sb.append("?hdp");
-        }
         if (seq != 0) {
             sb.append(" s.");
             sb.append(seq);
@@ -428,6 +446,7 @@
         uiMode = UI_MODE_TYPE_UNDEFINED;
         screenWidthDp = SCREEN_WIDTH_DP_UNDEFINED;
         screenHeightDp = SCREEN_HEIGHT_DP_UNDEFINED;
+        smallestScreenWidthDp = SMALLEST_SCREEN_WIDTH_DP_UNDEFINED;
         seq = 0;
     }
 
@@ -531,6 +550,11 @@
             changed |= ActivityInfo.CONFIG_SCREEN_SIZE;
             screenHeightDp = delta.screenHeightDp;
         }
+        if (delta.smallestScreenWidthDp != SMALLEST_SCREEN_WIDTH_DP_UNDEFINED
+                && smallestScreenWidthDp != delta.smallestScreenWidthDp) {
+            changed |= ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE;
+            smallestScreenWidthDp = delta.smallestScreenWidthDp;
+        }
         
         if (delta.seq != 0) {
             seq = delta.seq;
@@ -564,7 +588,9 @@
      * {@link android.content.pm.ActivityInfo#CONFIG_SCREEN_LAYOUT
      * PackageManager.ActivityInfo.CONFIG_SCREEN_LAYOUT}, or
      * {@link android.content.pm.ActivityInfo#CONFIG_SCREEN_SIZE
-     * PackageManager.ActivityInfo.CONFIG_SCREEN_SIZE}.
+     * PackageManager.ActivityInfo.CONFIG_SCREEN_SIZE}, or
+     * {@link android.content.pm.ActivityInfo#CONFIG_SMALLEST_SCREEN_SIZE
+     * PackageManager.ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE}.
      */
     public int diff(Configuration delta) {
         int changed = 0;
@@ -625,6 +651,10 @@
                 && screenHeightDp != delta.screenHeightDp) {
             changed |= ActivityInfo.CONFIG_SCREEN_SIZE;
         }
+        if (delta.smallestScreenWidthDp != SMALLEST_SCREEN_WIDTH_DP_UNDEFINED
+                && smallestScreenWidthDp != delta.smallestScreenWidthDp) {
+            changed |= ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE;
+        }
         
         return changed;
     }
@@ -708,6 +738,7 @@
         dest.writeInt(uiMode);
         dest.writeInt(screenWidthDp);
         dest.writeInt(screenHeightDp);
+        dest.writeInt(smallestScreenWidthDp);
         dest.writeInt(seq);
     }
 
@@ -731,6 +762,7 @@
         uiMode = source.readInt();
         screenWidthDp = source.readInt();
         screenHeightDp = source.readInt();
+        smallestScreenWidthDp = source.readInt();
         seq = source.readInt();
     }
     
@@ -795,6 +827,8 @@
         n = this.screenWidthDp - that.screenWidthDp;
         if (n != 0) return n;
         n = this.screenHeightDp - that.screenHeightDp;
+        if (n != 0) return n;
+        n = this.smallestScreenWidthDp - that.smallestScreenWidthDp;
         //if (n != 0) return n;
         return n;
     }
@@ -830,6 +864,7 @@
         result = 31 * result + uiMode;
         result = 31 * result + screenWidthDp;
         result = 31 * result + screenHeightDp;
+        result = 31 * result + smallestScreenWidthDp;
         return result;
     }
 }
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index 540f704..e63e7eb 100755
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -115,7 +115,6 @@
     private NativePluralRules mPluralRule;
     
     private CompatibilityInfo mCompatibilityInfo;
-    private Display mDefaultDisplay;
 
     private static final LongSparseArray<Object> EMPTY_ARRAY = new LongSparseArray<Object>(0) {
         @Override
@@ -1426,6 +1425,15 @@
             }
             if (metrics != null) {
                 mMetrics.setTo(metrics);
+                // NOTE: We should re-arrange this code to create a Display
+                // with the CompatibilityInfo that is used everywhere we deal
+                // with the display in relation to this app, rather than
+                // doing the conversion here.  This impl should be okay because
+                // we make sure to return a compatible display in the places
+                // where there are public APIs to retrieve the display...  but
+                // it would be cleaner and more maintainble to just be
+                // consistently dealing with a compatible display everywhere in
+                // the framework.
                 mCompatibilityInfo.applyToDisplayMetrics(mMetrics);
             }
             mMetrics.scaledDensity = mMetrics.density * mConfiguration.fontScale;
@@ -1458,6 +1466,7 @@
                     mConfiguration.touchscreen,
                     (int)(mMetrics.density*160), mConfiguration.keyboard,
                     keyboardHidden, mConfiguration.navigation, width, height,
+                    mConfiguration.smallestScreenWidthDp,
                     mConfiguration.screenWidthDp, mConfiguration.screenHeightDp,
                     mConfiguration.screenLayout, mConfiguration.uiMode,
                     Build.VERSION.RESOURCES_SDK_INT);
@@ -2120,24 +2129,6 @@
                 + Integer.toHexString(id));
     }
 
-    /**
-     * Returns the display adjusted for the Resources' metrics.
-     * @hide
-     */
-    public Display getDefaultDisplay(Display defaultDisplay) {
-        if (mDefaultDisplay == null) {
-            if (!mCompatibilityInfo.isScalingRequired() && mCompatibilityInfo.supportsScreen()) {
-                // the app supports the display. just use the default one.
-                mDefaultDisplay = defaultDisplay;
-            } else {
-                // display needs adjustment.
-                mDefaultDisplay = Display.createMetricsBasedDisplay(
-                        defaultDisplay.getDisplayId(), mMetrics);
-            }
-        }
-        return mDefaultDisplay;
-    }
-
     private TypedArray getCachedStyledAttributes(int len) {
         synchronized (mTmpValue) {
             TypedArray attrs = mCachedStyledAttributes;
diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java
index 6d955e7..d5c4ace 100644
--- a/core/java/android/hardware/Camera.java
+++ b/core/java/android/hardware/Camera.java
@@ -1181,6 +1181,8 @@
         private static final String KEY_EXPOSURE_COMPENSATION_STEP = "exposure-compensation-step";
         private static final String KEY_AUTO_EXPOSURE_LOCK = "auto-exposure-lock";
         private static final String KEY_AUTO_EXPOSURE_LOCK_SUPPORTED = "auto-exposure-lock-supported";
+        private static final String KEY_AUTO_WHITEBALANCE_LOCK = "auto-whitebalance-lock";
+        private static final String KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED = "auto-whitebalance-lock-supported";
         private static final String KEY_METERING_AREAS = "metering-areas";
         private static final String KEY_MAX_NUM_METERING_AREAS = "max-num-metering-areas";
         private static final String KEY_ZOOM = "zoom";
@@ -2468,37 +2470,47 @@
         }
 
         /**
-         * Sets the auto-exposure lock state. Applications should check
-         * {@link #isAutoExposureLockSupported} before using this method.
+         * <p>Sets the auto-exposure lock state. Applications should check
+         * {@link #isAutoExposureLockSupported} before using this method.</p>
          *
-         * If set to true, the camera auto-exposure routine will pause until the
-         * lock is set to false. Exposure compensation settings changes will
-         * still take effect while auto-exposure is locked. Stopping preview
-         * with {@link #stopPreview()}, or triggering still image capture with
-         * {@link #takePicture(Camera.ShutterCallback, Camera.PictureCallback,
-         * Camera.PictureCallback)}, will automatically set the lock to
-         * false. However, the lock can be re-enabled before preview is
-         * re-started to keep the same AE parameters. Exposure compensation, in
-         * conjunction with re-enabling the AE lock after each still capture,
-         * can be used to capture an exposure-bracketed burst of images, for
-         * example. Auto-exposure state, including the lock state, will not be
+         * <p>If set to true, the camera auto-exposure routine will immediately
+         * pause until the lock is set to false. Exposure compensation settings
+         * changes will still take effect while auto-exposure is locked.</p>
+         *
+         * <p>If auto-exposure is already locked, setting this to true again has
+         * no effect (the driver will not recalculate exposure values).</p>
+         *
+         * <p>Stopping preview with {@link #stopPreview()}, or triggering still
+         * image capture with {@link #takePicture(Camera.ShutterCallback,
+         * Camera.PictureCallback, Camera.PictureCallback)}, will automatically
+         * set the lock to false. However, the lock can be re-enabled before
+         * preview is re-started to keep the same AE parameters.</p>
+         *
+         * <p>Exposure compensation, in conjunction with re-enabling the AE and
+         * AWB locks after each still capture, can be used to capture an
+         * exposure-bracketed burst of images, for example.</p>
+         *
+         * <p>Auto-exposure state, including the lock state, will not be
          * maintained after camera {@link #release()} is called.  Locking
          * auto-exposure after {@link #open()} but before the first call to
          * {@link #startPreview()} will not allow the auto-exposure routine to
-         * run at all, and may result in severely over- or under-exposed images.
+         * run at all, and may result in severely over- or under-exposed
+         * images.</p>
          *
-         * The driver may also independently lock auto-exposure after auto-focus
-         * completes. If this is undesirable, be sure to always set the
-         * auto-exposure lock to false after the
+         * <p>The driver may also independently lock auto-exposure after
+         * auto-focus completes. If this is undesirable, be sure to always set
+         * the auto-exposure lock to false after the
          * {@link AutoFocusCallback#onAutoFocus(boolean, Camera)} callback is
          * received. The {@link #getAutoExposureLock()} method can be used after
          * the callback to determine if the camera has locked auto-exposure
-         * independently.
+         * independently.</p>
          *
          * @param toggle new state of the auto-exposure lock. True means that
          *        auto-exposure is locked, false means that the auto-exposure
          *        routine is free to run normally.
          *
+         * @see #getAutoExposureLock()
+         *
          * @hide
          */
         public void setAutoExposureLock(boolean toggle) {
@@ -2542,6 +2554,91 @@
         }
 
         /**
+         * <p>Sets the auto-white balance lock state. Applications should check
+         * {@link #isAutoWhiteBalanceLockSupported} before using this
+         * method.</p>
+         *
+         * <p>If set to true, the camera auto-white balance routine will
+         * immediately pause until the lock is set to false.</p>
+         *
+         * <p>If auto-white balance is already locked, setting this to true
+         * again has no effect (the driver will not recalculate white balance
+         * values).</p>
+         *
+         * <p>Stopping preview with {@link #stopPreview()}, or triggering still
+         * image capture with {@link #takePicture(Camera.ShutterCallback,
+         * Camera.PictureCallback, Camera.PictureCallback)}, will automatically
+         * set the lock to false. However, the lock can be re-enabled before
+         * preview is re-started to keep the same white balance parameters.</p>
+         *
+         * <p>Exposure compensation, in conjunction with re-enabling the AE and
+         * AWB locks after each still capture, can be used to capture an
+         * exposure-bracketed burst of images, for example. Auto-white balance
+         * state, including the lock state, will not be maintained after camera
+         * {@link #release()} is called.  Locking auto-white balance after
+         * {@link #open()} but before the first call to {@link #startPreview()}
+         * will not allow the auto-white balance routine to run at all, and may
+         * result in severely incorrect color in captured images.</p>
+         *
+         * <p>The driver may also independently lock auto-white balance after
+         * auto-focus completes. If this is undesirable, be sure to always set
+         * the auto-white balance lock to false after the
+         * {@link AutoFocusCallback#onAutoFocus(boolean, Camera)} callback is
+         * received. The {@link #getAutoWhiteBalanceLock()} method can be used
+         * after the callback to determine if the camera has locked auto-white
+         * balance independently.</p>
+         *
+         * @param toggle new state of the auto-white balance lock. True means
+         *        that auto-white balance is locked, false means that the
+         *        auto-white balance routine is free to run normally.
+         *
+         * @see #getAutoWhiteBalanceLock()
+         *
+         * @hide
+         */
+        public void setAutoWhiteBalanceLock(boolean toggle) {
+            set(KEY_AUTO_WHITEBALANCE_LOCK, toggle ? TRUE : FALSE);
+        }
+
+        /**
+         * Gets the state of the auto-white balance lock. Applications should
+         * check {@link #isAutoWhiteBalanceLockSupported} before using this
+         * method. See {@link #setAutoWhiteBalanceLock} for details about the
+         * lock.
+         *
+         * @return State of the auto-white balance lock. Returns true if
+         *         auto-white balance is currently locked, and false
+         *         otherwise. The auto-white balance lock may be independently
+         *         enabled by the camera subsystem when auto-focus has
+         *         completed. This method can be used after the
+         *         {@link AutoFocusCallback#onAutoFocus(boolean, Camera)}
+         *         callback to determine if the camera has locked AWB.
+         *
+         * @see #setAutoWhiteBalanceLock(boolean)
+         *
+         * @hide
+         */
+        public boolean getAutoWhiteBalanceLock() {
+            String str = get(KEY_AUTO_WHITEBALANCE_LOCK);
+            return TRUE.equals(str);
+        }
+
+        /**
+         * Returns true if auto-white balance locking is supported. Applications
+         * should call this before trying to lock auto-white balance. See
+         * {@link #setAutoWhiteBalanceLock} for details about the lock.
+         *
+         * @return true if auto-white balance lock is supported.
+         * @see #setAutoWhiteBalanceLock(boolean)
+         *
+         * @hide
+         */
+        public boolean isAutoWhiteBalanceLockSupported() {
+            String str = get(KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED);
+            return TRUE.equals(str);
+        }
+
+        /**
          * Gets current zoom value. This also works when smooth zoom is in
          * progress. Applications should check {@link #isZoomSupported} before
          * using this method.
diff --git a/core/java/android/hardware/Sensor.java b/core/java/android/hardware/Sensor.java
index a4ba3bd..68fc101 100644
--- a/core/java/android/hardware/Sensor.java
+++ b/core/java/android/hardware/Sensor.java
@@ -104,6 +104,13 @@
      */
     public static final int TYPE_ROTATION_VECTOR = 11;
 
+    /**
+     * A constant describing a relative humidity sensor type.
+     * See {@link android.hardware.SensorEvent SensorEvent}
+     * for more details.
+     */
+    public static final int TYPE_RELATIVE_HUMIDITY = 12;
+
     /** A constant describing an ambient temperature sensor type */
     public static final int TYPE_AMBIENT_TEMPERATURE = 13;
 
diff --git a/core/java/android/hardware/SensorEvent.java b/core/java/android/hardware/SensorEvent.java
index b111b84..0411b5c 100644
--- a/core/java/android/hardware/SensorEvent.java
+++ b/core/java/android/hardware/SensorEvent.java
@@ -327,6 +327,64 @@
      * in the clockwise direction (mathematically speaking, it should be
      * positive in the counter-clockwise direction).
      * </p>
+     *
+     * <h4>{@link android.hardware.Sensor#TYPE_RELATIVE_HUMIDITY
+     * Sensor.TYPE_RELATIVE_HUMIDITY}:</h4>
+     * <ul>
+     * <p>
+     * values[0]: Relative ambient air humidity in percent
+     * </p>
+     * </ul>
+     * <p>
+     * When relative ambient air humidity and ambient temperature are
+     * measured, the dew point and absolute humidity can be calculated.
+     * </p>
+     * <u>Dew Point</u>
+     * <p>
+     * The dew point is the temperature to which a given parcel of air must be
+     * cooled, at constant barometric pressure, for water vapor to condense
+     * into water.
+     * </p>
+     * <center><pre>
+     *                    ln(RH/100%) + m&#183;t/(T<sub>n</sub>+t)
+     * t<sub>d</sub>(t,RH) = T<sub>n</sub> &#183; ------------------------------
+     *                 m - [ln(RH/100%) + m&#183;t/(T<sub>n</sub>+t)]
+     * </pre></center>
+     * <dl>
+     * <dt>t<sub>d</sub></dt> <dd>dew point temperature in &deg;C</dd>
+     * <dt>t</dt>             <dd>actual temperature in &deg;C</dd>
+     * <dt>RH</dt>            <dd>actual relative humidity in %</dd>
+     * <dt>m</dt>             <dd>17.62</dd>
+     * <dt>T<sub>n</sub></dt> <dd>243.12 &deg;C</dd>
+     * </dl>
+     * <p>for example:</p>
+     * <pre class="prettyprint">
+     * h = Math.log(rh / 100.0) + (17.62 * t) / (243.12 + t);
+     * td = 243.12 * h / (17.62 - h);
+     * </pre>
+     * <u>Absolute Humidity</u>
+     * <p>
+     * The absolute humidity is the mass of water vapor in a particular volume
+     * of dry air. The unit is g/m<sup>3</sup>.
+     * </p>
+     * <center><pre>
+     *                    RH/100%&#183;A&#183;exp(m&#183;t/(T<sub>n</sub>+t))
+     * d<sub>v</sub>(t,RH) = 216.7 &#183; -------------------------
+     *                           273.15 + t
+     * </pre></center>
+     * <dl>
+     * <dt>d<sub>v</sub></dt> <dd>absolute humidity in g/m<sup>3</sup></dd>
+     * <dt>t</dt>             <dd>actual temperature in &deg;C</dd>
+     * <dt>RH</dt>            <dd>actual relative humidity in %</dd>
+     * <dt>m</dt>             <dd>17.62</dd>
+     * <dt>T<sub>n</sub></dt> <dd>243.12 &deg;C</dd>
+     * <dt>A</dt>             <dd>6.112 hPa</dd>
+     * </dl>
+     * <p>for example:</p>
+     * <pre class="prettyprint">
+     * dv = 216.7 *
+     * (rh / 100.0 * 6.112 * Math.exp(17.62 * t / (243.12 + t)) / (273.15 + t));
+     * </pre>
      * 
      * <h4>{@link android.hardware.Sensor#TYPE_AMBIENT_TEMPERATURE Sensor.TYPE_AMBIENT_TEMPERATURE}:
      * </h4>
diff --git a/core/java/android/hardware/usb/UsbDeviceConnection.java b/core/java/android/hardware/usb/UsbDeviceConnection.java
index a153c0b..b536490 100644
--- a/core/java/android/hardware/usb/UsbDeviceConnection.java
+++ b/core/java/android/hardware/usb/UsbDeviceConnection.java
@@ -69,6 +69,17 @@
     }
 
     /**
+     * Returns the raw USB descriptors for the device.
+     * This can be used to access descriptors not supported directly
+     * via the higher level APIs.
+     *
+     * @return raw USB descriptors
+     */
+    public byte[] getRawDescriptors() {
+        return native_get_desc();
+    }
+
+    /**
      * Claims exclusive access to a {@link android.hardware.usb.UsbInterface}.
      * This must be done before sending or receiving data on any
      * {@link android.hardware.usb.UsbEndpoint}s belonging to the interface.
@@ -160,6 +171,7 @@
     private native boolean native_open(String deviceName, FileDescriptor pfd);
     private native void native_close();
     private native int native_get_fd();
+    private native byte[] native_get_desc();
     private native boolean native_claim_interface(int interfaceID, boolean force);
     private native boolean native_release_interface(int interfaceID);
     private native int native_control_request(int requestType, int request, int value,
diff --git a/core/java/android/net/INetworkPolicyManager.aidl b/core/java/android/net/INetworkPolicyManager.aidl
index fa6eae5..d9351ee 100644
--- a/core/java/android/net/INetworkPolicyManager.aidl
+++ b/core/java/android/net/INetworkPolicyManager.aidl
@@ -23,9 +23,6 @@
  */
 interface INetworkPolicyManager {
 
-    void onForegroundActivitiesChanged(int uid, int pid, boolean foregroundActivities);
-    void onProcessDied(int uid, int pid);
-
     void setUidPolicy(int uid, int policy);
     int getUidPolicy(int uid);
 
diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java
index 61acf2b..19894a0 100644
--- a/core/java/android/net/LinkProperties.java
+++ b/core/java/android/net/LinkProperties.java
@@ -68,7 +68,8 @@
             mLinkAddresses = source.getLinkAddresses();
             mDnses = source.getDnses();
             mRoutes = source.getRoutes();
-            mHttpProxy = new ProxyProperties(source.getHttpProxy());
+            mHttpProxy = (source.getHttpProxy() == null)  ?
+                null : new ProxyProperties(source.getHttpProxy());
         }
     }
 
diff --git a/core/java/android/net/MobileDataStateTracker.java b/core/java/android/net/MobileDataStateTracker.java
index bb6ee0f..770f152 100644
--- a/core/java/android/net/MobileDataStateTracker.java
+++ b/core/java/android/net/MobileDataStateTracker.java
@@ -276,6 +276,21 @@
                             setDetailedState(DetailedState.CONNECTED, reason, apnName);
                             break;
                     }
+                } else {
+                    // There was no state change. Check if LinkProperties has been updated.
+                    if (TextUtils.equals(reason, Phone.REASON_LINK_PROPERTIES_CHANGED)) {
+                        mLinkProperties = intent.getParcelableExtra(Phone.DATA_LINK_PROPERTIES_KEY);
+                        if (mLinkProperties == null) {
+                            log("No link property in LINK_PROPERTIES change event.");
+                            mLinkProperties = new LinkProperties();
+                        }
+                        // Just update reason field in this NetworkInfo
+                        mNetworkInfo.setDetailedState(mNetworkInfo.getDetailedState(), reason,
+                                                      mNetworkInfo.getExtraInfo());
+                        Message msg = mTarget.obtainMessage(EVENT_CONFIGURATION_CHANGED,
+                                                            mNetworkInfo);
+                        msg.sendToTarget();
+                    }
                 }
             } else if (intent.getAction().
                     equals(TelephonyIntents.ACTION_DATA_CONNECTION_FAILED)) {
diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java
index 2312bd9..1913aa7 100644
--- a/core/java/android/net/NetworkPolicyManager.java
+++ b/core/java/android/net/NetworkPolicyManager.java
@@ -16,6 +16,7 @@
 
 package android.net;
 
+import android.content.Context;
 import android.os.RemoteException;
 
 /**
@@ -43,6 +44,10 @@
         mService = service;
     }
 
+    public static NetworkPolicyManager getSystemService(Context context) {
+        return (NetworkPolicyManager) context.getSystemService(Context.NETWORK_POLICY_SERVICE);
+    }
+
     /**
      * Set policy flags for specific UID.
      *
diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java
index 4430e00..0f207bc 100644
--- a/core/java/android/net/NetworkStats.java
+++ b/core/java/android/net/NetworkStats.java
@@ -36,6 +36,9 @@
     /** {@link #uid} value when entry is summarized over all UIDs. */
     public static final int UID_ALL = 0;
 
+    // NOTE: data should only be accounted for once in this structure; if data
+    // is broken out, the summarized version should not be included.
+
     /**
      * {@link SystemClock#elapsedRealtime()} timestamp when this data was
      * generated.
@@ -81,12 +84,13 @@
             mTx = new long[size];
         }
 
-        public void addEntry(String iface, int uid, long rx, long tx) {
+        public Builder addEntry(String iface, int uid, long rx, long tx) {
             mIface[mIndex] = iface;
             mUid[mIndex] = uid;
             mRx[mIndex] = rx;
             mTx[mIndex] = tx;
             mIndex++;
+            return this;
         }
 
         public NetworkStats build() {
@@ -97,11 +101,17 @@
         }
     }
 
+    public int length() {
+        // length is identical for all fields
+        return iface.length;
+    }
+
     /**
      * Find first stats index that matches the requested parameters.
      */
     public int findIndex(String iface, int uid) {
-        for (int i = 0; i < this.iface.length; i++) {
+        final int length = length();
+        for (int i = 0; i < length; i++) {
             if (equal(iface, this.iface[i]) && uid == this.uid[i]) {
                 return i;
             }
@@ -109,13 +119,38 @@
         return -1;
     }
 
-    private static boolean equal(Object a, Object b) {
-        return a == b || (a != null && a.equals(b));
+    /**
+     * Subtract the given {@link NetworkStats}, effectively leaving the delta
+     * between two snapshots in time. Assumes that statistics rows collect over
+     * time, and that none of them have disappeared.
+     */
+    public NetworkStats subtract(NetworkStats value) {
+        // result will have our rows, but no meaningful timestamp
+        final int length = length();
+        final NetworkStats.Builder result = new NetworkStats.Builder(-1, length);
+
+        for (int i = 0; i < length; i++) {
+            final String iface = this.iface[i];
+            final int uid = this.uid[i];
+
+            // find remote row that matches, and subtract
+            final int j = value.findIndex(iface, uid);
+            if (j == -1) {
+                // newly appearing row, return entire value
+                result.addEntry(iface, uid, this.rx[i], this.tx[i]);
+            } else {
+                // existing row, subtract remote value
+                final long rx = this.rx[i] - value.rx[j];
+                final long tx = this.tx[i] - value.tx[j];
+                result.addEntry(iface, uid, rx, tx);
+            }
+        }
+
+        return result.build();
     }
 
-    /** {@inheritDoc} */
-    public int describeContents() {
-        return 0;
+    private static boolean equal(Object a, Object b) {
+        return a == b || (a != null && a.equals(b));
     }
 
     public void dump(String prefix, PrintWriter pw) {
@@ -138,6 +173,11 @@
     }
 
     /** {@inheritDoc} */
+    public int describeContents() {
+        return 0;
+    }
+
+    /** {@inheritDoc} */
     public void writeToParcel(Parcel dest, int flags) {
         dest.writeLong(elapsedRealtime);
         dest.writeStringArray(iface);
diff --git a/core/java/android/net/NetworkUtils.java b/core/java/android/net/NetworkUtils.java
index fbe5379..8a678d6 100644
--- a/core/java/android/net/NetworkUtils.java
+++ b/core/java/android/net/NetworkUtils.java
@@ -38,32 +38,6 @@
     /** Bring the named network interface down. */
     public native static int disableInterface(String interfaceName);
 
-    /**
-     * Add a route to the routing table.
-     *
-     * @param interfaceName the interface to route through.
-     * @param dst the network or host to route to. May be IPv4 or IPv6, e.g.
-     * "0.0.0.0" or "2001:4860::".
-     * @param prefixLength the prefix length of the route.
-     * @param gw the gateway to use, e.g., "192.168.251.1". If null,
-     * indicates a directly-connected route.
-     */
-    public native static int addRoute(String interfaceName, String dst,
-          int prefixLength, String gw);
-
-    /** Return the gateway address for the default route for the named interface. */
-    public static InetAddress getDefaultRoute(String interfaceName) {
-        int addr = getDefaultRouteNative(interfaceName);
-        return intToInetAddress(addr);
-    }
-    private native static int getDefaultRouteNative(String interfaceName);
-
-    /** Remove host routes that uses the named interface. */
-    public native static int removeHostRoutes(String interfaceName);
-
-    /** Remove the default route for the named interface. */
-    public native static int removeDefaultRoute(String interfaceName);
-
     /** Reset any sockets that are connected via the named interface. */
     public native static int resetConnections(String interfaceName);
 
@@ -160,6 +134,15 @@
     }
 
     /**
+     * Convert a IPv4 netmask integer to a prefix length
+     * @param netmask as an integer in network byte order
+     * @return the network prefix length
+     */
+    public static int netmaskIntToPrefixLength(int netmask) {
+        return Integer.bitCount(netmask);
+    }
+
+    /**
      * Create an InetAddress from a string where the string must be a standard
      * representation of a V4 or V6 address.  Avoids doing a DNS lookup on failure
      * but it will throw an IllegalArgumentException in that case.
@@ -173,60 +156,6 @@
     }
 
     /**
-     * Add a default route through the specified gateway.
-     * @param interfaceName interface on which the route should be added
-     * @param gw the IP address of the gateway to which the route is desired,
-     * @return {@code true} on success, {@code false} on failure
-     */
-    public static boolean addDefaultRoute(String interfaceName, InetAddress gw) {
-        String dstStr;
-        String gwStr = gw.getHostAddress();
-
-        if (gw instanceof Inet4Address) {
-            dstStr = "0.0.0.0";
-        } else if (gw instanceof Inet6Address) {
-            dstStr = "::";
-        } else {
-            Log.w(TAG, "addDefaultRoute failure: address is neither IPv4 nor IPv6" +
-                       "(" + gwStr + ")");
-            return false;
-        }
-        return addRoute(interfaceName, dstStr, 0, gwStr) == 0;
-    }
-
-    /**
-     * Add a host route.
-     * @param interfaceName interface on which the route should be added
-     * @param dst the IP address of the host to which the route is desired,
-     * this should not be null.
-     * @param gw the IP address of the gateway to which the route is desired,
-     * if null, indicates a directly-connected route.
-     * @return {@code true} on success, {@code false} on failure
-     */
-    public static boolean addHostRoute(String interfaceName, InetAddress dst,
-          InetAddress gw) {
-        if (dst == null) {
-            Log.w(TAG, "addHostRoute: dst should not be null");
-            return false;
-        }
-
-        int prefixLength;
-        String dstStr = dst.getHostAddress();
-        String gwStr = (gw != null) ? gw.getHostAddress() : null;
-
-        if (dst instanceof Inet4Address) {
-            prefixLength = 32;
-        } else if (dst instanceof Inet6Address) {
-            prefixLength = 128;
-        } else {
-            Log.w(TAG, "addHostRoute failure: address is neither IPv4 nor IPv6" +
-                       "(" + dst + ")");
-            return false;
-        }
-        return addRoute(interfaceName, dstStr, prefixLength, gwStr) == 0;
-    }
-
-    /**
      * Get InetAddress masked with prefixLength.  Will never return null.
      * @param IP address which will be masked with specified prefixLength
      * @param prefixLength the prefixLength used to mask the IP
@@ -271,4 +200,25 @@
         return (((left instanceof Inet4Address) && (right instanceof Inet4Address)) ||
                 ((left instanceof Inet6Address) && (right instanceof Inet6Address)));
     }
+
+    /**
+     * Convert a 32 char hex string into a Inet6Address.
+     * throws a runtime exception if the string isn't 32 chars, isn't hex or can't be
+     * made into an Inet6Address
+     * @param addrHexString a 32 character hex string representing an IPv6 addr
+     * @return addr an InetAddress representation for the string
+     */
+    public static InetAddress hexToInet6Address(String addrHexString)
+            throws IllegalArgumentException {
+        try {
+            return numericToInetAddress(String.format("%s:%s:%s:%s:%s:%s:%s:%s",
+                    addrHexString.substring(0,4),   addrHexString.substring(4,8),
+                    addrHexString.substring(8,12),  addrHexString.substring(12,16),
+                    addrHexString.substring(16,20), addrHexString.substring(20,24),
+                    addrHexString.substring(24,28), addrHexString.substring(28,32)));
+        } catch (Exception e) {
+            Log.e("NetworkUtils", "error in hexToInet6Address(" + addrHexString + "): " + e);
+            throw new IllegalArgumentException(e);
+        }
+    }
 }
diff --git a/core/java/android/net/RouteInfo.java b/core/java/android/net/RouteInfo.java
index 39e708a..8e5ddda 100644
--- a/core/java/android/net/RouteInfo.java
+++ b/core/java/android/net/RouteInfo.java
@@ -46,18 +46,16 @@
 
     public RouteInfo(LinkAddress destination, InetAddress gateway) {
         if (destination == null) {
-            try {
-                if (gateway != null) {
-                    if (gateway instanceof Inet4Address) {
-                        destination = new LinkAddress(Inet4Address.ANY, 0);
-                    } else {
-                        destination = new LinkAddress(Inet6Address.ANY, 0);
-                    }
+            if (gateway != null) {
+                if (gateway instanceof Inet4Address) {
+                    destination = new LinkAddress(Inet4Address.ANY, 0);
                 } else {
-                    // no destination, no gateway. invalid.
-                    throw new RuntimeException("Invalid arguments passed in.");
+                    destination = new LinkAddress(Inet6Address.ANY, 0);
                 }
-            } catch (Exception e) {}
+            } else {
+                // no destination, no gateway. invalid.
+                throw new RuntimeException("Invalid arguments passed in.");
+            }
         }
         if (gateway == null) {
             if (destination.getAddress() instanceof Inet4Address) {
@@ -76,6 +74,20 @@
         this(null, gateway);
     }
 
+    public static RouteInfo makeHostRoute(InetAddress host) {
+        return makeHostRoute(host, null);
+    }
+
+    public static RouteInfo makeHostRoute(InetAddress host, InetAddress gateway) {
+        if (host == null) return null;
+
+        if (host instanceof Inet4Address) {
+            return new RouteInfo(new LinkAddress(host, 32), gateway);
+        } else {
+            return new RouteInfo(new LinkAddress(host, 128), gateway);
+        }
+    }
+
     private boolean isDefault() {
         boolean val = false;
         if (mGateway != null) {
@@ -128,6 +140,33 @@
         }
     }
 
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) return true;
+
+        if (!(obj instanceof RouteInfo)) return false;
+
+        RouteInfo target = (RouteInfo) obj;
+
+        boolean sameDestination = ( mDestination == null) ?
+                target.getDestination() == null
+                : mDestination.equals(target.getDestination());
+
+        boolean sameAddress = (mGateway == null) ?
+                target.getGateway() == null
+                : mGateway.equals(target.getGateway());
+
+        return sameDestination && sameAddress
+            && mIsDefault == target.mIsDefault;
+    }
+
+    @Override
+    public int hashCode() {
+        return (mDestination == null ? 0 : mDestination.hashCode())
+            + (mGateway == null ? 0 :mGateway.hashCode())
+            + (mIsDefault ? 3 : 7);
+    }
+
     public static final Creator<RouteInfo> CREATOR =
         new Creator<RouteInfo>() {
         public RouteInfo createFromParcel(Parcel in) {
diff --git a/core/java/android/net/TrafficStats.java b/core/java/android/net/TrafficStats.java
index 7ee7a81..c0ff734 100644
--- a/core/java/android/net/TrafficStats.java
+++ b/core/java/android/net/TrafficStats.java
@@ -16,6 +16,12 @@
 
 package android.net;
 
+import android.content.Context;
+import android.os.IBinder;
+import android.os.INetworkManagementService;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+
 import dalvik.system.BlockGuard;
 
 import java.net.Socket;
@@ -36,6 +42,17 @@
     public final static int UNSUPPORTED = -1;
 
     /**
+     * Snapshot of {@link NetworkStats} when the currently active profiling
+     * session started, or {@code null} if no session active.
+     *
+     * @see #startDataProfiling(Context)
+     * @see #stopDataProfiling(Context)
+     */
+    private static NetworkStats sActiveProfilingStart;
+
+    private static Object sProfilingLock = new Object();
+
+    /**
      * Set active tag to use when accounting {@link Socket} traffic originating
      * from the current thread. Only one active tag per thread is supported.
      * <p>
@@ -93,6 +110,44 @@
     }
 
     /**
+     * Start profiling data usage for current UID. Only one profiling session
+     * can be active at a time.
+     *
+     * @hide
+     */
+    public static void startDataProfiling(Context context) {
+        synchronized (sProfilingLock) {
+            if (sActiveProfilingStart != null) {
+                throw new IllegalStateException("already profiling data");
+            }
+
+            // take snapshot in time; we calculate delta later
+            sActiveProfilingStart = getNetworkStatsForUid(context);
+        }
+    }
+
+    /**
+     * Stop profiling data usage for current UID.
+     *
+     * @return Detailed {@link NetworkStats} of data that occurred since last
+     *         {@link #startDataProfiling(Context)} call.
+     * @hide
+     */
+    public static NetworkStats stopDataProfiling(Context context) {
+        synchronized (sProfilingLock) {
+            if (sActiveProfilingStart == null) {
+                throw new IllegalStateException("not profiling data");
+            }
+
+            // subtract starting values and return delta
+            final NetworkStats profilingStop = getNetworkStatsForUid(context);
+            final NetworkStats profilingDelta = profilingStop.subtract(sActiveProfilingStart);
+            sActiveProfilingStart = null;
+            return profilingDelta;
+        }
+    }
+
+    /**
      * Get the total number of packets transmitted through the mobile interface.
      *
      * @return number of packets.  If the statistics are not supported by this device,
@@ -350,4 +405,21 @@
      * {@link #UNSUPPORTED} will be returned.
      */
     public static native long getUidUdpRxPackets(int uid);
+
+    /**
+     * Return detailed {@link NetworkStats} for the current UID. Requires no
+     * special permission.
+     */
+    private static NetworkStats getNetworkStatsForUid(Context context) {
+        final IBinder binder = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
+        final INetworkManagementService service = INetworkManagementService.Stub.asInterface(
+                binder);
+
+        final int uid = android.os.Process.myUid();
+        try {
+            return service.getNetworkStatsUidDetail(uid);
+        } catch (RemoteException e) {
+            throw new RuntimeException(e);
+        }
+    }
 }
diff --git a/core/java/android/nfc/INdefPushCallback.aidl b/core/java/android/nfc/INdefPushCallback.aidl
new file mode 100644
index 0000000..80ba2ed
--- /dev/null
+++ b/core/java/android/nfc/INdefPushCallback.aidl
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2011 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.nfc;
+
+import android.nfc.NdefMessage;
+
+/**
+ * @hide
+ */
+interface INdefPushCallback
+{
+    NdefMessage onConnect();
+    void onMessagePushed();
+}
diff --git a/core/java/android/nfc/INfcAdapter.aidl b/core/java/android/nfc/INfcAdapter.aidl
index 870127c..d11fea0 100644
--- a/core/java/android/nfc/INfcAdapter.aidl
+++ b/core/java/android/nfc/INfcAdapter.aidl
@@ -25,6 +25,7 @@
 import android.nfc.ILlcpSocket;
 import android.nfc.ILlcpServiceSocket;
 import android.nfc.ILlcpConnectionlessSocket;
+import android.nfc.INdefPushCallback;
 import android.nfc.INfcTag;
 import android.nfc.IP2pTarget;
 import android.nfc.IP2pInitiator;
@@ -51,6 +52,7 @@
             in IntentFilter[] filters, in TechListParcel techLists);
     void disableForegroundDispatch(in ComponentName activity);
     void enableForegroundNdefPush(in ComponentName activity, in NdefMessage msg);
+    void enableForegroundNdefPushWithCallback(in ComponentName activity, in INdefPushCallback callback);
     void disableForegroundNdefPush(in ComponentName activity);
 
     // Non-public methods
diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java
index 4689804..738e75f 100644
--- a/core/java/android/nfc/NfcAdapter.java
+++ b/core/java/android/nfc/NfcAdapter.java
@@ -124,7 +124,7 @@
      * Intent to start an activity when a tag is discovered.
      *
      * <p>This intent will not be started when a tag is discovered if any activities respond to
-     * {@link #ACTION_NDEF_DISCOVERED} or {@link #ACTION_TECH_DISCOVERED} for the current tag. 
+     * {@link #ACTION_NDEF_DISCOVERED} or {@link #ACTION_TECH_DISCOVERED} for the current tag.
      */
     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public static final String ACTION_TAG_DISCOVERED = "android.nfc.action.TAG_DISCOVERED";
@@ -235,6 +235,37 @@
      */
     private static final int DISCOVERY_MODE_CARD_EMULATION = 2;
 
+    /**
+     * Callback passed into {@link #enableForegroundNdefPush(Activity,NdefPushCallback)}. This
+     */
+    public interface NdefPushCallback {
+        /**
+         * Called when a P2P connection is created.
+         */
+        NdefMessage createMessage();
+        /**
+         * Called when the message is pushed.
+         */
+        void onMessagePushed();
+    }
+
+    private static class NdefPushCallbackWrapper extends INdefPushCallback.Stub {
+        private NdefPushCallback mCallback;
+
+        public NdefPushCallbackWrapper(NdefPushCallback callback) {
+            mCallback = callback;
+        }
+
+        @Override
+        public NdefMessage onConnect() {
+            return mCallback.createMessage();
+        }
+
+        @Override
+        public void onMessagePushed() {
+            mCallback.onMessagePushed();
+        }
+    }
 
     // Guarded by NfcAdapter.class
     private static boolean sIsInitialized = false;
@@ -575,6 +606,44 @@
     }
 
     /**
+     * Enable NDEF message push over P2P while this Activity is in the foreground.
+     *
+     * <p>For this to function properly the other NFC device being scanned must
+     * support the "com.android.npp" NDEF push protocol. Support for this
+     * protocol is currently optional for Android NFC devices.
+     *
+     * <p>This method must be called from the main thread.
+     *
+     * <p class="note"><em>NOTE:</em> While foreground NDEF push is active standard tag dispatch is disabled.
+     * Only the foreground activity may receive tag discovered dispatches via
+     * {@link #enableForegroundDispatch}.
+     *
+     * <p class="note">Requires the {@link android.Manifest.permission#NFC} permission.
+     *
+     * @param activity the foreground Activity
+     * @param callback is called on when the P2P connection is established
+     * @throws IllegalStateException if the Activity is not currently in the foreground
+     * @throws OperationNotSupportedException if this Android device does not support NDEF push
+     */
+    public void enableForegroundNdefPush(Activity activity, NdefPushCallback callback) {
+        if (activity == null || callback == null) {
+            throw new NullPointerException();
+        }
+        if (!activity.isResumed()) {
+            throw new IllegalStateException("Foregorund NDEF push can only be enabled " +
+                    "when your activity is resumed");
+        }
+        try {
+            ActivityThread.currentActivityThread().registerOnActivityPausedListener(activity,
+                    mForegroundNdefPushListener);
+            sService.enableForegroundNdefPushWithCallback(activity.getComponentName(),
+                    new NdefPushCallbackWrapper(callback));
+        } catch (RemoteException e) {
+            attemptDeadServiceRecovery(e);
+        }
+    }
+
+    /**
      * Disable NDEF message push over P2P.
      *
      * <p>After calling {@link #enableForegroundNdefPush}, an activity
diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
index 6b58877..11f9445 100644
--- a/core/java/android/os/Environment.java
+++ b/core/java/android/os/Environment.java
@@ -113,18 +113,18 @@
             = getDirectory("ANDROID_SECURE_DATA", "/data/secure");
 
     private static final File EXTERNAL_STORAGE_DIRECTORY
-            = getDirectory("EXTERNAL_STORAGE", "/sdcard");
+            = getDirectory("EXTERNAL_STORAGE", "/mnt/sdcard");
 
     private static final File EXTERNAL_STORAGE_ANDROID_DATA_DIRECTORY
-            = new File (new File(getDirectory("EXTERNAL_STORAGE", "/sdcard"),
+            = new File (new File(getDirectory("EXTERNAL_STORAGE", "/mnt/sdcard"),
                     "Android"), "data");
 
     private static final File EXTERNAL_STORAGE_ANDROID_MEDIA_DIRECTORY
-            = new File (new File(getDirectory("EXTERNAL_STORAGE", "/sdcard"),
+            = new File (new File(getDirectory("EXTERNAL_STORAGE", "/mnt/sdcard"),
                     "Android"), "media");
 
     private static final File EXTERNAL_STORAGE_ANDROID_OBB_DIRECTORY
-            = new File (new File(getDirectory("EXTERNAL_STORAGE", "/sdcard"),
+            = new File (new File(getDirectory("EXTERNAL_STORAGE", "/mnt/sdcard"),
                     "Android"), "obb");
 
     private static final File DOWNLOAD_CACHE_DIRECTORY
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl
index fe36786..f17a6f2 100644
--- a/core/java/android/os/INetworkManagementService.aidl
+++ b/core/java/android/os/INetworkManagementService.aidl
@@ -20,6 +20,7 @@
 import android.net.InterfaceConfiguration;
 import android.net.INetworkManagementEventObserver;
 import android.net.NetworkStats;
+import android.net.RouteInfo;
 import android.net.wifi.WifiConfiguration;
 
 /**
@@ -58,6 +59,22 @@
     void setInterfaceConfig(String iface, in InterfaceConfiguration cfg);
 
     /**
+     * Retrieves the network routes currently configured on the specified
+     * interface
+     */
+    RouteInfo[] getRoutes(String iface);
+
+    /**
+     * Add the specified route to the interface.
+     */
+    void addRoute(String iface, in RouteInfo route);
+
+    /**
+     * Remove the specified route from the interface.
+     */
+    void removeRoute(String iface, in RouteInfo route);
+
+    /**
      * Shuts down the service
      */
     void shutdown();
@@ -197,6 +214,12 @@
     NetworkStats getNetworkStatsDetail();
 
     /**
+     * Return detailed network statistics for the requested UID,
+     * including interface and tag details.
+     */
+    NetworkStats getNetworkStatsUidDetail(int uid);
+
+    /**
      * Configures bandwidth throttling on an interface.
      */
     void setInterfaceThrottle(String iface, int rxKbps, int txKbps);
diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java
index 727fcca..3ea3f56 100644
--- a/core/java/android/os/ParcelFileDescriptor.java
+++ b/core/java/android/os/ParcelFileDescriptor.java
@@ -129,7 +129,46 @@
     }
 
     /**
-     * Create a new ParcelFileDescriptor from the specified Socket.
+     * Create a new ParcelFileDescriptor from a raw native fd.  The new
+     * ParcelFileDescriptor holds a dup of the original fd passed in here,
+     * so you must still close that fd as well as the new ParcelFileDescriptor.
+     *
+     * @param fd The native fd that the ParcelFileDescriptor should dup.
+     *
+     * @return Returns a new ParcelFileDescriptor holding a FileDescriptor
+     * for a dup of the given fd.
+     */
+    public static ParcelFileDescriptor fromFd(int fd) throws IOException {
+        FileDescriptor fdesc = getFileDescriptorFromFd(fd);
+        return new ParcelFileDescriptor(fdesc);
+    }
+
+    // Extracts the file descriptor from the specified socket and returns it untouched
+    private static native FileDescriptor getFileDescriptorFromFd(int fd) throws IOException;
+
+    /**
+     * Take ownership of a raw native fd in to a new ParcelFileDescriptor.
+     * The returned ParcelFileDescriptor now owns the given fd, and will be
+     * responsible for closing it.  You must not close the fd yourself.
+     *
+     * @param fd The native fd that the ParcelFileDescriptor should adopt.
+     *
+     * @return Returns a new ParcelFileDescriptor holding a FileDescriptor
+     * for the given fd.
+     */
+    public static ParcelFileDescriptor adoptFd(int fd) {
+        FileDescriptor fdesc = getFileDescriptorFromFdNoDup(fd);
+        return new ParcelFileDescriptor(fdesc);
+    }
+
+    // Extracts the file descriptor from the specified socket and returns it untouched
+    private static native FileDescriptor getFileDescriptorFromFdNoDup(int fd);
+
+    /**
+     * Create a new ParcelFileDescriptor from the specified Socket.  The new
+     * ParcelFileDescriptor holds a dup of the original FileDescriptor in
+     * the Socket, so you must still close the Socket as well as the new
+     * ParcelFileDescriptor.
      *
      * @param socket The Socket whose FileDescriptor is used to create
      *               a new ParcelFileDescriptor.
@@ -163,17 +202,14 @@
      */
     public static ParcelFileDescriptor[] createPipe() throws IOException {
         FileDescriptor[] fds = new FileDescriptor[2];
-        int res = createPipeNative(fds);
-        if (res == 0) {
-            ParcelFileDescriptor[] pfds = new ParcelFileDescriptor[2];
-            pfds[0] = new ParcelFileDescriptor(fds[0]);
-            pfds[1] = new ParcelFileDescriptor(fds[1]);
-            return pfds;
-        }
-        throw new IOException("Unable to create pipe: errno=" + -res);
+        createPipeNative(fds);
+        ParcelFileDescriptor[] pfds = new ParcelFileDescriptor[2];
+        pfds[0] = new ParcelFileDescriptor(fds[0]);
+        pfds[1] = new ParcelFileDescriptor(fds[1]);
+        return pfds;
     }
 
-    private static native int createPipeNative(FileDescriptor[] outFds);
+    private static native void createPipeNative(FileDescriptor[] outFds) throws IOException;
 
     /**
      * @hide Please use createPipe() or ContentProvider.openPipeHelper().
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index f85df6c..d475f36 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -634,6 +634,20 @@
     }
 
     /**
+     * Returns the parent process id for a currently running process.
+     * @param pid the process id
+     * @return the parent process id of the process, or -1 if the process is not running.
+     * @hide
+     */
+    public static final int getParentPid(int pid) {
+        String[] procStatusLabels = { "PPid:" };
+        long[] procStatusValues = new long[1];
+        procStatusValues[0] = -1;
+        Process.readProcLines("/proc/" + pid + "/status", procStatusLabels, procStatusValues);
+        return (int) procStatusValues[0];
+    }
+
+    /**
      * Set the priority of a thread, based on Linux priorities.
      * 
      * @param tid The identifier of the thread/process to change.
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index 1375a29..01c640a 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -1481,6 +1481,13 @@
         onVmPolicyViolation(message, originStack);
     }
 
+    /**
+     * @hide
+     */
+    public static void onWebViewMethodCalledOnWrongThread(Throwable originStack) {
+        onVmPolicyViolation(null, originStack);
+    }
+
     // Map from VM violation fingerprint to uptime millis.
     private static final HashMap<Integer, Long> sLastVmViolationTime = new HashMap<Integer, Long>();
 
diff --git a/core/java/android/os/storage/StorageVolume.java b/core/java/android/os/storage/StorageVolume.java
index d79f6c8..bc6e993 100644
--- a/core/java/android/os/storage/StorageVolume.java
+++ b/core/java/android/os/storage/StorageVolume.java
@@ -34,10 +34,15 @@
     private final boolean mRemovable;
     private final boolean mEmulated;
     private final int mMtpReserveSpace;
+    private int mStorageId;
+
+    // StorageVolume extra for ACTION_MEDIA_REMOVED, ACTION_MEDIA_UNMOUNTED, ACTION_MEDIA_CHECKING,
+    // ACTION_MEDIA_NOFS, ACTION_MEDIA_MOUNTED, ACTION_MEDIA_SHARED, ACTION_MEDIA_UNSHARED,
+    // ACTION_MEDIA_BAD_REMOVAL, ACTION_MEDIA_UNMOUNTABLE and ACTION_MEDIA_EJECT broadcasts.
+    public static final String EXTRA_STORAGE_VOLUME = "storage_volume";
 
     public StorageVolume(String path, String description,
-            boolean removable, boolean emulated,
-            int mtpReserveSpace) {
+            boolean removable, boolean emulated, int mtpReserveSpace) {
         mPath = path;
         mDescription = description;
         mRemovable = removable;
@@ -45,6 +50,17 @@
         mMtpReserveSpace = mtpReserveSpace;
     }
 
+    // for parcelling only
+    private StorageVolume(String path, String description,
+            boolean removable, boolean emulated, int mtpReserveSpace, int storageId) {
+        mPath = path;
+        mDescription = description;
+        mRemovable = removable;
+        mEmulated = emulated;
+        mMtpReserveSpace = mtpReserveSpace;
+        mStorageId = storageId;
+    }
+
     /**
      * Returns the mount path for the volume.
      *
@@ -82,6 +98,25 @@
     }
 
     /**
+     * Returns the MTP storage ID for the volume.
+     * this is also used for the storage_id column in the media provider.
+     *
+     * @return MTP storage ID
+     */
+    public int getStorageId() {
+        return mStorageId;
+    }
+
+    /**
+     * Do not call this unless you are MountService
+     */
+    public void setStorageId(int index) {
+        // storage ID is 0x00010001 for primary storage,
+        // then 0x00020001, 0x00030001, etc. for secondary storages
+        mStorageId = ((index + 1) << 16) + 1;
+    }
+
+    /**
      * Number of megabytes of space to leave unallocated by MTP.
      * MTP will subtract this value from the free space it reports back
      * to the host via GetStorageInfo, and will not allow new files to
@@ -123,9 +158,11 @@
             String description = in.readString();
             int removable = in.readInt();
             int emulated = in.readInt();
+            int storageId = in.readInt();
             int mtpReserveSpace = in.readInt();
             return new StorageVolume(path, description,
-                    removable == 1, emulated == 1, mtpReserveSpace);
+                    removable == 1, emulated == 1,
+                    mtpReserveSpace, storageId);
         }
 
         public StorageVolume[] newArray(int size) {
@@ -142,6 +179,7 @@
         parcel.writeString(mDescription);
         parcel.writeInt(mRemovable ? 1 : 0);
         parcel.writeInt(mEmulated ? 1 : 0);
+        parcel.writeInt(mStorageId);
         parcel.writeInt(mMtpReserveSpace);
     }
 }
diff --git a/core/java/android/provider/Calendar.java b/core/java/android/provider/Calendar.java
index 4141879..20614dc 100644
--- a/core/java/android/provider/Calendar.java
+++ b/core/java/android/provider/Calendar.java
@@ -616,18 +616,6 @@
         public static final String DTEND = "dtend";
 
         /**
-         * The time the event starts with allDay events in a local tz
-         * <P>Type: INTEGER (long; millis since epoch)</P>
-         */
-        public static final String DTSTART2 = "dtstart2";
-
-        /**
-         * The time the event ends with allDay events in a local tz
-         * <P>Type: INTEGER (long; millis since epoch)</P>
-         */
-        public static final String DTEND2 = "dtend2";
-
-        /**
          * The duration of the event
          * <P>Type: TEXT (duration in RFC2445 format)</P>
          */
@@ -734,8 +722,16 @@
         public static final String EXDATE = "exdate";
 
         /**
+         * The _id of the original recurring event for which this event is an
+         * exception.
+         * <P>Type: TEXT</P>
+         */
+        public static final String ORIGINAL_ID = "original_id";
+
+        /**
          * The _sync_id of the original recurring event for which this event is
-         * an exception.
+         * an exception. The provider should keep the original_id in sync when
+         * this is updated.
          * <P>Type: TEXT</P>
          */
         public static final String ORIGINAL_SYNC_ID = "original_sync_id";
@@ -899,6 +895,7 @@
                 DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DTEND);
                 DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, DURATION);
                 DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EVENT_TIMEZONE);
+                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EVENT_END_TIMEZONE);
                 DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ALL_DAY);
                 DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, ACCESS_LEVEL);
                 DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, AVAILABILITY);
@@ -910,6 +907,7 @@
                 DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EXRULE);
                 DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EXDATE);
                 DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ORIGINAL_SYNC_ID);
+                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ORIGINAL_ID);
                 DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv,
                         ORIGINAL_INSTANCE_TIME);
                 DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, ORIGINAL_ALL_DAY);
@@ -925,7 +923,7 @@
                 DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DIRTY);
                 DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, _SYNC_VERSION);
                 DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, EventsColumns.DELETED);
-                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, Calendars.SYNC1);
+                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC1);
                 DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv,
                         Events.SYNC_DATA1);
 
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index f1d7e29..c78b935 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2563,6 +2563,13 @@
             "lock_screen_owner_info_enabled";
 
         /**
+         * The saved value for WindowManagerService.setForcedDisplaySize().
+         * Two integers separated by a comma.  If unset, then use the real display size.
+         * @hide
+         */
+        public static final String DISPLAY_SIZE_FORCED = "display_size_forced";
+
+        /**
          * Whether assisted GPS should be enabled or not.
          * @hide
          */
diff --git a/core/java/android/server/BluetoothService.java b/core/java/android/server/BluetoothService.java
old mode 100644
new mode 100755
index 2c79385..60bee9a
--- a/core/java/android/server/BluetoothService.java
+++ b/core/java/android/server/BluetoothService.java
@@ -1104,7 +1104,7 @@
     }
 
     /*package*/ synchronized boolean setBondState(String address, int state, int reason) {
-        mBondState.setBondState(address.toUpperCase(), state);
+        mBondState.setBondState(address.toUpperCase(), state, reason);
         return true;
     }
 
diff --git a/core/java/android/speech/tts/PlaybackSynthesisRequest.java b/core/java/android/speech/tts/PlaybackSynthesisRequest.java
index 6f4c15b..d698b54 100644
--- a/core/java/android/speech/tts/PlaybackSynthesisRequest.java
+++ b/core/java/android/speech/tts/PlaybackSynthesisRequest.java
@@ -18,6 +18,7 @@
 import android.media.AudioFormat;
 import android.media.AudioTrack;
 import android.os.Bundle;
+import android.os.Handler;
 import android.util.Log;
 
 /**
@@ -49,16 +50,20 @@
     private final float mPan;
 
     private final Object mStateLock = new Object();
-    private AudioTrack mAudioTrack = null;
+    private final Handler mAudioTrackHandler;
+    private volatile AudioTrack mAudioTrack = null;
     private boolean mStopped = false;
     private boolean mDone = false;
+    private volatile boolean mWriteErrorOccured;
 
     PlaybackSynthesisRequest(String text, Bundle params,
-            int streamType, float volume, float pan) {
+            int streamType, float volume, float pan, Handler audioTrackHandler) {
         super(text, params);
         mStreamType = streamType;
         mVolume = volume;
         mPan = pan;
+        mAudioTrackHandler = audioTrackHandler;
+        mWriteErrorOccured = false;
     }
 
     @Override
@@ -70,14 +75,28 @@
         }
     }
 
+    // Always guarded by mStateLock.
     private void cleanUp() {
         if (DBG) Log.d(TAG, "cleanUp()");
-        if (mAudioTrack != null) {
-            mAudioTrack.flush();
-            mAudioTrack.stop();
-            mAudioTrack.release();
-            mAudioTrack = null;
+        if (mAudioTrack == null) {
+            return;
         }
+
+        final AudioTrack audioTrack = mAudioTrack;
+        mAudioTrack = null;
+
+        // Clean up on the audiotrack handler thread.
+        //
+        // NOTE: It isn't very clear whether AudioTrack is thread safe.
+        // If it is we can clean up on the current (synthesis) thread.
+        mAudioTrackHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                audioTrack.flush();
+                audioTrack.stop();
+                audioTrack.release();
+            }
+        });
     }
 
     @Override
@@ -146,10 +165,15 @@
             Log.d(TAG, "audioAvailable(byte[" + buffer.length + "],"
                     + offset + "," + length + ")");
         }
-        if (length > getMaxBufferSize()) {
-            throw new IllegalArgumentException("buffer is too large (" + length + " bytes)");
+        if (length > getMaxBufferSize() || length <= 0) {
+            throw new IllegalArgumentException("buffer is too large or of zero length (" +
+                    + length + " bytes)");
         }
         synchronized (mStateLock) {
+            if (mWriteErrorOccured) {
+                if (DBG) Log.d(TAG, "Error writing to audio track, count < 0");
+                return TextToSpeech.ERROR;
+            }
             if (mStopped) {
                 if (DBG) Log.d(TAG, "Request has been aborted.");
                 return TextToSpeech.ERROR;
@@ -158,22 +182,33 @@
                 Log.e(TAG, "audioAvailable(): Not started");
                 return TextToSpeech.ERROR;
             }
-            int playState = mAudioTrack.getPlayState();
-            if (playState == AudioTrack.PLAYSTATE_STOPPED) {
-                if (DBG) Log.d(TAG, "AudioTrack stopped, restarting");
-                mAudioTrack.play();
-            }
-            // TODO: loop until all data is written?
-            if (DBG) Log.d(TAG, "AudioTrack.write()");
-            int count = mAudioTrack.write(buffer, offset, length);
-            if (DBG) Log.d(TAG, "AudioTrack.write() returned " + count);
-            if (count < 0) {
-                Log.e(TAG, "Writing to AudioTrack failed: " + count);
-                cleanUp();
-                return TextToSpeech.ERROR;
-            } else {
-                return TextToSpeech.SUCCESS;
-            }
+            final AudioTrack audioTrack = mAudioTrack;
+            // Sigh, another copy.
+            final byte[] bufferCopy = new byte[length];
+            System.arraycopy(buffer, offset, bufferCopy, 0, length);
+
+            mAudioTrackHandler.post(new Runnable() {
+                @Override
+                public void run() {
+                    int playState = audioTrack.getPlayState();
+                    if (playState == AudioTrack.PLAYSTATE_STOPPED) {
+                        if (DBG) Log.d(TAG, "AudioTrack stopped, restarting");
+                        audioTrack.play();
+                    }
+                    // TODO: loop until all data is written?
+                    if (DBG) Log.d(TAG, "AudioTrack.write()");
+                    int count = audioTrack.write(bufferCopy, 0, bufferCopy.length);
+                    // The semantics of this change very slightly. Earlier, we would
+                    // report an error immediately, Now we will return an error on
+                    // the next API call, usually done( ) or another audioAvailable( )
+                    // call.
+                    if (count < 0) {
+                        mWriteErrorOccured = true;
+                    }
+                }
+            });
+
+            return TextToSpeech.SUCCESS;
         }
     }
 
@@ -181,6 +216,10 @@
     public int done() {
         if (DBG) Log.d(TAG, "done()");
         synchronized (mStateLock) {
+            if (mWriteErrorOccured) {
+                if (DBG) Log.d(TAG, "Error writing to audio track, count < 0");
+                return TextToSpeech.ERROR;
+            }
             if (mStopped) {
                 if (DBG) Log.d(TAG, "Request has been aborted.");
                 return TextToSpeech.ERROR;
diff --git a/core/java/android/speech/tts/TextToSpeechService.java b/core/java/android/speech/tts/TextToSpeechService.java
index f32474f..717dde8 100644
--- a/core/java/android/speech/tts/TextToSpeechService.java
+++ b/core/java/android/speech/tts/TextToSpeechService.java
@@ -51,6 +51,7 @@
     private static final String SYNTH_THREAD_NAME = "SynthThread";
 
     private SynthHandler mSynthHandler;
+    private Handler mAudioTrackHandler;
 
     private CallbackMap mCallbacks;
 
@@ -63,6 +64,10 @@
         synthThread.start();
         mSynthHandler = new SynthHandler(synthThread.getLooper());
 
+        HandlerThread audioTrackThread = new HandlerThread("TTS.audioTrackThread");
+        audioTrackThread.start();
+        mAudioTrackHandler = new Handler(audioTrackThread.getLooper());
+
         mCallbacks = new CallbackMap();
 
         // Load default language
@@ -75,6 +80,7 @@
 
         // Tell the synthesizer to stop
         mSynthHandler.quit();
+        mAudioTrackHandler.getLooper().quit();
 
         // Unregister all callbacks.
         mCallbacks.kill();
@@ -444,7 +450,7 @@
 
         protected SynthesisRequest createSynthesisRequest() {
             return new PlaybackSynthesisRequest(mText, mParams,
-                    getStreamType(), getVolume(), getPan());
+                    getStreamType(), getVolume(), getPan(), mAudioTrackHandler);
         }
 
         private void setRequestParams(SynthesisRequest request) {
diff --git a/core/java/android/text/method/ArrowKeyMovementMethod.java b/core/java/android/text/method/ArrowKeyMovementMethod.java
index d432dee..fe96565 100644
--- a/core/java/android/text/method/ArrowKeyMovementMethod.java
+++ b/core/java/android/text/method/ArrowKeyMovementMethod.java
@@ -234,7 +234,7 @@
             if (action == MotionEvent.ACTION_DOWN) {
               boolean cap = isSelecting(buffer);
               if (cap) {
-                  int offset = widget.getOffset((int) event.getX(), (int) event.getY());
+                  int offset = widget.getOffsetForPosition(event.getX(), event.getY());
 
                   buffer.setSpan(LAST_TAP_DOWN, offset, offset, Spannable.SPAN_POINT_POINT);
 
@@ -259,7 +259,7 @@
                     // Update selection as we're moving the selection area.
 
                     // Get the current touch position
-                    int offset = widget.getOffset((int) event.getX(), (int) event.getY());
+                    int offset = widget.getOffsetForPosition(event.getX(), event.getY());
 
                     Selection.extendSelection(buffer, offset);
                     return true;
@@ -275,7 +275,7 @@
                     return true;
                 }
 
-                int offset = widget.getOffset((int) event.getX(), (int) event.getY());
+                int offset = widget.getOffsetForPosition(event.getX(), event.getY());
                 if (isSelecting(buffer)) {
                     buffer.removeSpan(LAST_TAP_DOWN);
                     Selection.extendSelection(buffer, offset);
diff --git a/core/java/android/text/style/SuggestionSpan.java b/core/java/android/text/style/SuggestionSpan.java
index dcb0898..240ad9b 100644
--- a/core/java/android/text/style/SuggestionSpan.java
+++ b/core/java/android/text/style/SuggestionSpan.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.os.SystemClock;
 import android.text.ParcelableSpan;
 import android.text.TextUtils;
 
@@ -29,14 +30,18 @@
  * Holds suggestion candidates of words under this span.
  */
 public class SuggestionSpan implements ParcelableSpan {
-
     /**
      * Flag for indicating that the input is verbatim. TextView refers to this flag to determine
      * how it displays a word with SuggestionSpan.
      */
     public static final int FLAG_VERBATIM = 0x0001;
 
-    private static final int SUGGESTIONS_MAX_SIZE = 5;
+    public static final String ACTION_SUGGESTION_PICKED = "android.text.style.SUGGESTION_PICKED";
+    public static final String SUGGESTION_SPAN_PICKED_AFTER = "after";
+    public static final String SUGGESTION_SPAN_PICKED_BEFORE = "before";
+    public static final String SUGGESTION_SPAN_PICKED_HASHCODE = "hashcode";
+
+    public static final int SUGGESTIONS_MAX_SIZE = 5;
 
     /*
      * TODO: Needs to check the validity and add a feature that TextView will change
@@ -48,7 +53,9 @@
     private final int mFlags;
     private final String[] mSuggestions;
     private final String mLocaleString;
-    private final String mOriginalString;
+    private final String mNotificationTargetClassName;
+    private final int mHashCode;
+
     /*
      * TODO: If switching IME is required, needs to add parameters for ids of InputMethodInfo
      * and InputMethodSubtype.
@@ -77,10 +84,11 @@
      * @param locale locale Locale of the suggestions
      * @param suggestions Suggestions for the string under the span
      * @param flags Additional flags indicating how this span is handled in TextView
-     * @param originalString originalString for suggestions
+     * @param notificationTargetClass if not null, this class will get notified when the user
+     * selects one of the suggestions.
      */
     public SuggestionSpan(Context context, Locale locale, String[] suggestions, int flags,
-            String originalString) {
+            Class<?> notificationTargetClass) {
         final int N = Math.min(SUGGESTIONS_MAX_SIZE, suggestions.length);
         mSuggestions = Arrays.copyOf(suggestions, N);
         mFlags = flags;
@@ -89,14 +97,21 @@
         } else {
             mLocaleString = locale.toString();
         }
-        mOriginalString = originalString;
+        if (notificationTargetClass != null) {
+            mNotificationTargetClassName = notificationTargetClass.getCanonicalName();
+        } else {
+            mNotificationTargetClassName = "";
+        }
+        mHashCode = hashCodeInternal(
+                mFlags, mSuggestions, mLocaleString, mNotificationTargetClassName);
     }
 
     public SuggestionSpan(Parcel src) {
         mSuggestions = src.readStringArray();
         mFlags = src.readInt();
         mLocaleString = src.readString();
-        mOriginalString = src.readString();
+        mNotificationTargetClassName = src.readString();
+        mHashCode = src.readInt();
     }
 
     /**
@@ -114,10 +129,16 @@
     }
 
     /**
-     * @return original string of suggestions
+     * @return The name of the class to notify. The class of the original IME package will receive
+     * a notification when the user selects one of the suggestions. The notification will include
+     * the original string, the suggested replacement string as well as the hashCode of this span.
+     * The class will get notified by an intent that has those information.
+     * This is an internal API because only the framework should know the class name.
+     *
+     * @hide
      */
-    public String getOriginalString() {
-        return mOriginalString;
+    public String getNotificationTargetClassName() {
+        return mNotificationTargetClassName;
     }
 
     public int getFlags() {
@@ -134,7 +155,8 @@
         dest.writeStringArray(mSuggestions);
         dest.writeInt(mFlags);
         dest.writeString(mLocaleString);
-        dest.writeString(mOriginalString);
+        dest.writeString(mNotificationTargetClassName);
+        dest.writeInt(mHashCode);
     }
 
     @Override
@@ -142,6 +164,25 @@
         return TextUtils.SUGGESTION_SPAN;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (o instanceof SuggestionSpan) {
+            return ((SuggestionSpan)o).hashCode() == mHashCode;
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return mHashCode;
+    }
+
+    private static int hashCodeInternal(int flags, String[] suggestions,String locale,
+            String notificationTargetClassName) {
+        return Arrays.hashCode(new Object[] {SystemClock.uptimeMillis(), flags, suggestions, locale,
+                notificationTargetClassName});
+    }
+
     public static final Parcelable.Creator<SuggestionSpan> CREATOR =
             new Parcelable.Creator<SuggestionSpan>() {
         @Override
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 1d60066..b5d36d9 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -16,6 +16,7 @@
 
 package android.view;
 
+import android.content.res.CompatibilityInfo;
 import android.graphics.Point;
 import android.graphics.Rect;
 import android.os.RemoteException;
@@ -37,7 +38,7 @@
      * Display gives you access to some information about a particular display
      * connected to the device.
      */
-    Display(int display) {
+    Display(int display, CompatibilityInfo compatInfo) {
         // initalize the statics when this class is first instansiated. This is
         // done here instead of in the static block because Zygote
         synchronized (sStaticInit) {
@@ -46,6 +47,12 @@
                 sInitialized = true;
             }
         }
+        if (compatInfo != null && (compatInfo.isScalingRequired()
+                || !compatInfo.supportsScreen())) {
+            mCompatibilityInfo = compatInfo;
+        } else {
+            mCompatibilityInfo = null;
+        }
         mDisplay = display;
         init(display);
     }
@@ -82,6 +89,16 @@
                 // system process before the window manager is up.
                 outSize.y = getRealHeight();
             }
+            if (mCompatibilityInfo != null) {
+                synchronized (mTmpMetrics) {
+                    mTmpMetrics.realWidthPixels = outSize.x;
+                    mTmpMetrics.realHeightPixels = outSize.y;
+                    mTmpMetrics.density = mDensity;
+                    mCompatibilityInfo.applyToDisplayMetrics(mTmpMetrics);
+                    outSize.x = mTmpMetrics.widthPixels;
+                    outSize.y = mTmpMetrics.heightPixels;
+                }
+            }
         } catch (RemoteException e) {
             Slog.w("Display", "Unable to get display size", e);
         }
@@ -206,6 +223,10 @@
             outMetrics.heightPixels = mTmpPoint.y;
         }
         getNonSizeMetrics(outMetrics);
+
+        if (mCompatibilityInfo != null) {
+            mCompatibilityInfo.applyToDisplayMetrics(outMetrics);
+        }
     }
 
     /**
@@ -249,7 +270,8 @@
     
     private native void init(int display);
 
-    private int         mDisplay;
+    private final CompatibilityInfo mCompatibilityInfo;
+    private final int   mDisplay;
     // Following fields are initialized from native code
     private int         mPixelFormat;
     private float       mRefreshRate;
@@ -258,6 +280,7 @@
     private float       mDpiY;
     
     private final Point mTmpPoint = new Point();
+    private final DisplayMetrics mTmpMetrics = new DisplayMetrics();
     private float mLastGetTime;
 
     private static final Object sStaticInit = new Object();
@@ -268,27 +291,8 @@
      * Returns a display object which uses the metric's width/height instead.
      * @hide
      */
-    public static Display createMetricsBasedDisplay(int displayId, DisplayMetrics metrics) {
-        return new CompatibleDisplay(displayId, metrics);
-    }
-
-    private static class CompatibleDisplay extends Display {
-        private final DisplayMetrics mMetrics;
-
-        private CompatibleDisplay(int displayId, DisplayMetrics metrics) {
-            super(displayId);
-            mMetrics = metrics;
-        }
-
-        @Override
-        public int getWidth() {
-            return mMetrics.widthPixels;
-        }
-
-        @Override
-        public int getHeight() {
-            return mMetrics.heightPixels;
-        }
+    public static Display createCompatibleDisplay(int displayId, CompatibilityInfo compat) {
+        return new Display(displayId, compat);
     }
 }
 
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index 845fbc3..61a24a0 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -17,7 +17,6 @@
 
 package android.view;
 
-import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Rect;
 import android.graphics.SurfaceTexture;
@@ -137,14 +136,14 @@
          * 
          * @param canvas The Canvas used to render the view.
          */
-        void onHardwarePreDraw(Canvas canvas);
+        void onHardwarePreDraw(HardwareCanvas canvas);
 
         /**
          * Invoked after a view is drawn by a hardware renderer.
          * 
          * @param canvas The Canvas used to render the view.
          */
-        void onHardwarePostDraw(Canvas canvas);
+        void onHardwarePostDraw(HardwareCanvas canvas);
     }
 
     /**
diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java
index 82fd581..3436cd1 100644
--- a/core/java/android/view/MotionEvent.java
+++ b/core/java/android/view/MotionEvent.java
@@ -883,8 +883,8 @@
      * <p>
      * <ul>
      * <li>For a stylus, reports the distance of the stylus from the screen.
-     * The value is normalized to a range from 0.0 (direct contact) to 1.0 (furthest measurable
-     * distance).
+     * The value is nominally measured in millimeters where 0.0 indicates direct contact
+     * and larger values indicate increasing distance from the surface.
      * </ul>
      * </p>
      *
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index 83f9119..c913bb3 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -20,7 +20,6 @@
 import android.graphics.*;
 import android.os.Parcelable;
 import android.os.Parcel;
-import android.util.DisplayMetrics;
 import android.util.Log;
 
 /**
@@ -174,9 +173,9 @@
     private int mSurfaceGenerationId;
     private String mName;
 
-    // The display metrics used to provide the pseudo canvas size for applications
-    // running in compatibility mode. This is set to null for non compatibility mode.
-    private DisplayMetrics mCompatibleDisplayMetrics;
+    // The Translator for density compatibility mode.  This is used for scaling
+    // the canvas to perform the appropriate density transformation.
+    private Translator mCompatibilityTranslator;
 
     // A matrix to scale the matrix set by application. This is set to null for
     // non compatibility mode.
@@ -263,14 +262,20 @@
 
         @Override
         public int getWidth() {
-            return mCompatibleDisplayMetrics == null ?
-                    super.getWidth() : mCompatibleDisplayMetrics.widthPixels;
+            int w = super.getWidth();
+            if (mCompatibilityTranslator != null) {
+                w = (int)(w * mCompatibilityTranslator.applicationInvertedScale + .5f);
+            }
+            return w;
         }
 
         @Override
         public int getHeight() {
-            return mCompatibleDisplayMetrics == null ?
-                    super.getHeight() : mCompatibleDisplayMetrics.heightPixels;
+            int h = super.getHeight();
+            if (mCompatibilityTranslator != null) {
+                h = (int)(h * mCompatibilityTranslator.applicationInvertedScale + .5f);
+            }
+            return h;
         }
 
         @Override
@@ -297,10 +302,9 @@
     }
 
     /**
-     * Sets the display metrics used to provide canvas's width/height in compatibility mode.
+     * Sets the translator used to scale canvas's width/height in compatibility mode.
      */
-    void setCompatibleDisplayMetrics(DisplayMetrics metrics, Translator translator) {
-        mCompatibleDisplayMetrics = metrics;
+    void setCompatibilityTranslator(Translator translator) {
         if (translator != null) {
             float appScale = translator.applicationScale;
             mCompatibleMatrix = new Matrix();
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index a98c669..764899f 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -21,7 +21,6 @@
 
 import android.content.Context;
 import android.content.res.Configuration;
-import android.content.res.Resources;
 import android.content.res.CompatibilityInfo.Translator;
 import android.graphics.Canvas;
 import android.graphics.PixelFormat;
@@ -432,9 +431,8 @@
             mTranslator = viewRoot.mTranslator;
         }
 
-        Resources res = getContext().getResources();
-        if (mTranslator != null || !res.getCompatibilityInfo().supportsScreen()) {
-            mSurface.setCompatibleDisplayMetrics(res.getDisplayMetrics(), mTranslator);
+        if (mTranslator != null) {
+            mSurface.setCompatibilityTranslator(mTranslator);
         }
         
         int myWidth = mRequestedWidth;
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 68caa53..98d07c4 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -49,8 +49,6 @@
 import android.os.Parcelable;
 import android.os.RemoteException;
 import android.os.SystemClock;
-import android.os.SystemProperties;
-import android.text.format.DateUtils;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.Pool;
@@ -6050,6 +6048,26 @@
     }
 
     /**
+     * Set the horizontal scrolled position of your view. This will cause a call to
+     * {@link #onScrollChanged(int, int, int, int)} and the view will be
+     * invalidated.
+     * @param value the x position to scroll to
+     */
+    public void setScrollX(int value) {
+        scrollTo(value, mScrollY);
+    }
+
+    /**
+     * Set the vertical scrolled position of your view. This will cause a call to
+     * {@link #onScrollChanged(int, int, int, int)} and the view will be
+     * invalidated.
+     * @param value the y position to scroll to
+     */
+    public void setScrollY(int value) {
+        scrollTo(mScrollX, value);
+    }
+
+    /**
      * Return the scrolled left position of this view. This is the left edge of
      * the displayed part of your view. You do not need to draw any pixels
      * farther left, since those are outside of the frame of your view on
@@ -8496,6 +8514,8 @@
         }
         jumpDrawablesToCurrentState();
 
+        // We are supposing here that the parent directionality will be resolved before its children
+        // View horizontalDirection public attribute resolution to an internal var.
         // Resolving the layout direction. LTR is set initially.
         mPrivateFlags2 &= ~RESOLVED_LAYOUT_RTL;
         switch (getHorizontalDirection()) {
diff --git a/core/java/android/view/ViewAncestor.java b/core/java/android/view/ViewAncestor.java
index 8085ea8..bd33a6a 100644
--- a/core/java/android/view/ViewAncestor.java
+++ b/core/java/android/view/ViewAncestor.java
@@ -17,6 +17,7 @@
 package android.view;
 
 import android.Manifest;
+import android.animation.LayoutTransition;
 import android.app.ActivityManagerNative;
 import android.content.ClipDescription;
 import android.content.ComponentCallbacks;
@@ -25,7 +26,6 @@
 import android.content.res.CompatibilityInfo;
 import android.content.res.Configuration;
 import android.content.res.Resources;
-import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.PixelFormat;
@@ -45,9 +45,7 @@
 import android.os.ParcelFileDescriptor;
 import android.os.Process;
 import android.os.RemoteException;
-import android.os.ServiceManager;
 import android.os.SystemClock;
-import android.os.SystemProperties;
 import android.util.AndroidRuntimeException;
 import android.util.DisplayMetrics;
 import android.util.EventLog;
@@ -230,10 +228,11 @@
     int mScrollY;
     int mCurScrollY;
     Scroller mScroller;
-    Bitmap mResizeBitmap;
-    long mResizeBitmapStartTime;
-    int mResizeBitmapDuration;
+    HardwareLayer mResizeBuffer;
+    long mResizeBufferStartTime;
+    int mResizeBufferDuration;
     static final Interpolator mResizeInterpolator = new AccelerateDecelerateInterpolator();
+    private ArrayList<LayoutTransition> mPendingTransitions;
 
     final ViewConfiguration mViewConfiguration;
 
@@ -381,9 +380,8 @@
                 CompatibilityInfo compatibilityInfo = resources.getCompatibilityInfo();
                 mTranslator = compatibilityInfo.getTranslator();
 
-                if (mTranslator != null || !compatibilityInfo.supportsScreen()) {
-                    mSurface.setCompatibleDisplayMetrics(resources.getDisplayMetrics(),
-                            mTranslator);
+                if (mTranslator != null) {
+                    mSurface.setCompatibilityTranslator(mTranslator);
                 }
 
                 boolean restore = false;
@@ -672,6 +670,7 @@
         if (!mTraversalScheduled) {
             mTraversalScheduled = true;
 
+            //noinspection ConstantConditions
             if (ViewDebug.DEBUG_LATENCY && mLastTraversalFinishedTimeNanos != 0) {
                 final long now = System.nanoTime();
                 Log.d(TAG, "Latency: Scheduled traversal, it has been "
@@ -694,10 +693,32 @@
         return mAppVisible ? mView.getVisibility() : View.GONE;
     }
 
-    void disposeResizeBitmap() {
-        if (mResizeBitmap != null) {
-            mResizeBitmap.recycle();
-            mResizeBitmap = null;
+    void disposeResizeBuffer() {
+        if (mResizeBuffer != null) {
+            mResizeBuffer.destroy();
+            mResizeBuffer = null;
+        }
+    }
+
+    /**
+     * Add LayoutTransition to the list of transitions to be started in the next traversal.
+     * This list will be cleared after the transitions on the list are start()'ed. These
+     * transitionsa re added by LayoutTransition itself when it sets up animations. The setup
+     * happens during the layout phase of traversal, which we want to complete before any of the
+     * animations are started (because those animations may side-effect properties that layout
+     * depends upon, like the bounding rectangles of the affected views). So we add the transition
+     * to the list and it is started just prior to starting the drawing phase of traversal.
+     *
+     * @param transition The LayoutTransition to be started on the next traversal.
+     *
+     * @hide
+     */
+    public void requestTransitionStart(LayoutTransition transition) {
+        if (mPendingTransitions == null || !mPendingTransitions.contains(transition)) {
+            if (mPendingTransitions == null) {
+                 mPendingTransitions = new ArrayList<LayoutTransition>();
+            }
+            mPendingTransitions.add(transition);
         }
     }
 
@@ -819,15 +840,25 @@
                             mAttachInfo.mHardwareRenderer.isEnabled() &&
                             lp != null && !PixelFormat.formatHasAlpha(lp.format)) {
 
-                        disposeResizeBitmap();
+                        disposeResizeBuffer();
 
                         boolean completed = false;
+                        HardwareCanvas canvas = null;
                         try {
-                            mResizeBitmap = Bitmap.createBitmap(mWidth, mHeight,
-                                    Bitmap.Config.ARGB_8888);
-                            mResizeBitmap.setHasAlpha(false);
-                            Canvas canvas = new Canvas(mResizeBitmap);
+                            if (mResizeBuffer == null) {
+                                mResizeBuffer = mAttachInfo.mHardwareRenderer.createHardwareLayer(
+                                        mWidth, mHeight, false);
+                            } else if (mResizeBuffer.getWidth() != mWidth ||
+                                    mResizeBuffer.getHeight() != mHeight) {
+                                mResizeBuffer.resize(mWidth, mHeight);
+                            }
+                            canvas = mResizeBuffer.start(mAttachInfo.mHardwareCanvas);
+                            canvas.setViewport(mWidth, mHeight);
+                            canvas.onPreDraw(null);
+                            final int restoreCount = canvas.save();
+                            
                             canvas.drawColor(0xff000000, PorterDuff.Mode.SRC);
+
                             int yoff;
                             final boolean scrolling = mScroller != null
                                     && mScroller.computeScrollOffset();
@@ -837,22 +868,32 @@
                             } else {
                                 yoff = mScrollY;
                             }
+
                             canvas.translate(0, -yoff);
                             if (mTranslator != null) {
                                 mTranslator.translateCanvas(canvas);
                             }
-                            canvas.setScreenDensity(mAttachInfo.mScalingRequired
-                                    ? DisplayMetrics.DENSITY_DEVICE : 0);
+
                             mView.draw(canvas);
-                            mResizeBitmapStartTime = SystemClock.uptimeMillis();
-                            mResizeBitmapDuration = mView.getResources().getInteger(
+
+                            mResizeBufferStartTime = SystemClock.uptimeMillis();
+                            mResizeBufferDuration = mView.getResources().getInteger(
                                     com.android.internal.R.integer.config_mediumAnimTime);
                             completed = true;
+
+                            canvas.restoreToCount(restoreCount);
                         } catch (OutOfMemoryError e) {
                             Log.w(TAG, "Not enough memory for content change anim buffer", e);
                         } finally {
-                            if (!completed) {
-                                mResizeBitmap = null;
+                            if (canvas != null) {
+                                canvas.onPostDraw();
+                            }
+                            if (mResizeBuffer != null) {
+                                mResizeBuffer.end(mAttachInfo.mHardwareCanvas);
+                                if (!completed) {
+                                    mResizeBuffer.destroy();
+                                    mResizeBuffer = null;
+                                }
                             }
                         }
                     }
@@ -1114,7 +1155,7 @@
                     if (mScroller != null) {
                         mScroller.abortAnimation();
                     }
-                    disposeResizeBitmap();
+                    disposeResizeBuffer();
                 } else if (surfaceGenerationId != mSurface.getGenerationId() &&
                         mSurfaceHolder == null && mAttachInfo.mHardwareRenderer != null) {
                     fullRedrawNeeded = true;
@@ -1396,6 +1437,12 @@
         boolean cancelDraw = attachInfo.mTreeObserver.dispatchOnPreDraw();
 
         if (!cancelDraw && !newSurface) {
+            if (mPendingTransitions != null && mPendingTransitions.size() > 0) {
+                for (int i = 0; i < mPendingTransitions.size(); ++i) {
+                    mPendingTransitions.get(i).startChangingAnimations();
+                }
+                mPendingTransitions.clear();
+            }
             mFullRedrawNeeded = false;
 
             final long drawStartTime;
@@ -1495,15 +1542,14 @@
     int mResizeAlpha;
     final Paint mResizePaint = new Paint();
 
-    public void onHardwarePreDraw(Canvas canvas) {
+    public void onHardwarePreDraw(HardwareCanvas canvas) {
         canvas.translate(0, -mHardwareYOffset);
     }
 
-    public void onHardwarePostDraw(Canvas canvas) {
-        if (mResizeBitmap != null) {
-            canvas.translate(0, mHardwareYOffset);
+    public void onHardwarePostDraw(HardwareCanvas canvas) {
+        if (mResizeBuffer != null) {
             mResizePaint.setAlpha(mResizeAlpha);
-            canvas.drawBitmap(mResizeBitmap, 0, 0, mResizePaint);
+            canvas.drawHardwareLayer(mResizeBuffer, 0.0f, mHardwareYOffset, mResizePaint);
         }
     }
 
@@ -1559,15 +1605,15 @@
         boolean scalingRequired = mAttachInfo.mScalingRequired;
 
         int resizeAlpha = 0;
-        if (mResizeBitmap != null) {
-            long deltaTime = SystemClock.uptimeMillis() - mResizeBitmapStartTime;
-            if (deltaTime < mResizeBitmapDuration) {
-                float amt = deltaTime/(float)mResizeBitmapDuration;
+        if (mResizeBuffer != null) {
+            long deltaTime = SystemClock.uptimeMillis() - mResizeBufferStartTime;
+            if (deltaTime < mResizeBufferDuration) {
+                float amt = deltaTime/(float) mResizeBufferDuration;
                 amt = mResizeInterpolator.getInterpolation(amt);
                 animating = true;
                 resizeAlpha = 255 - (int)(amt*255);
             } else {
-                disposeResizeBitmap();
+                disposeResizeBuffer();
             }
         }
 
@@ -1579,7 +1625,7 @@
                 if (mScroller != null) {
                     mScroller.abortAnimation();
                 }
-                disposeResizeBitmap();
+                disposeResizeBuffer();
             }
             return;
         }
@@ -1863,7 +1909,7 @@
         if (scrollY != mScrollY) {
             if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Pan scroll changed: old="
                     + mScrollY + " , new=" + scrollY);
-            if (!immediate && mResizeBitmap == null) {
+            if (!immediate && mResizeBuffer == null) {
                 if (mScroller == null) {
                     mScroller = new Scroller(mView.getContext());
                 }
@@ -1909,20 +1955,22 @@
     public void focusableViewAvailable(View v) {
         checkThread();
 
-        if (mView != null && !mView.hasFocus()) {
-            v.requestFocus();
-        } else {
-            // the one case where will transfer focus away from the current one
-            // is if the current view is a view group that prefers to give focus
-            // to its children first AND the view is a descendant of it.
-            mFocusedView = mView.findFocus();
-            boolean descendantsHaveDibsOnFocus =
-                    (mFocusedView instanceof ViewGroup) &&
-                        (((ViewGroup) mFocusedView).getDescendantFocusability() ==
-                                ViewGroup.FOCUS_AFTER_DESCENDANTS);
-            if (descendantsHaveDibsOnFocus && isViewDescendantOf(v, mFocusedView)) {
-                // If a view gets the focus, the listener will be invoked from requestChildFocus()
+        if (mView != null) {
+            if (!mView.hasFocus()) {
                 v.requestFocus();
+            } else {
+                // the one case where will transfer focus away from the current one
+                // is if the current view is a view group that prefers to give focus
+                // to its children first AND the view is a descendant of it.
+                mFocusedView = mView.findFocus();
+                boolean descendantsHaveDibsOnFocus =
+                        (mFocusedView instanceof ViewGroup) &&
+                            (((ViewGroup) mFocusedView).getDescendantFocusability() ==
+                                    ViewGroup.FOCUS_AFTER_DESCENDANTS);
+                if (descendantsHaveDibsOnFocus && isViewDescendantOf(v, mFocusedView)) {
+                    // If a view gets the focus, the listener will be invoked from requestChildFocus()
+                    v.requestFocus();
+                }
             }
         }
     }
@@ -1986,9 +2034,7 @@
             // At this point the resources have been updated to
             // have the most recent config, whatever that is.  Use
             // the on in them which may be newer.
-            if (mView != null) {
-                config = mView.getResources().getConfiguration();
-            }
+            config = mView.getResources().getConfiguration();
             if (force || mLastConfiguration.diff(config) != 0) {
                 mLastConfiguration.setTo(config);
                 mView.dispatchConfigurationChanged(config);
@@ -2207,6 +2253,7 @@
             if ((event.getFlags()&KeyEvent.FLAG_FROM_SYSTEM) != 0) {
                 // The IME is trying to say this event is from the
                 // system!  Bad bad bad!
+                //noinspection UnusedAssignment
                 event = KeyEvent.changeFlags(event, event.getFlags() & ~KeyEvent.FLAG_FROM_SYSTEM);
             }
             deliverKeyEventPostIme((KeyEvent)msg.obj, false);
@@ -2240,7 +2287,7 @@
         }
     }
     
-    private void startInputEvent(InputEvent event, InputQueue.FinishedCallback finishedCallback) {
+    private void startInputEvent(InputQueue.FinishedCallback finishedCallback) {
         if (mFinishedCallback != null) {
             Slog.w(TAG, "Received a new input event from the input queue but there is "
                     + "already an unfinished input event in progress.");
@@ -2454,9 +2501,6 @@
         if (isDown) {
             ensureTouchMode(true);
         }
-        if(false) {
-            captureMotionLog("captureDispatchPointer", event);
-        }
 
         // Offset the scroll position.
         if (mCurScrollY != 0) {
@@ -2534,6 +2578,7 @@
         if (sendDone) {
             finishInputEvent(event, handled);
         }
+        //noinspection ConstantConditions
         if (LOCAL_LOGV || WATCH_POINTER) {
             if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) {
                 Log.i(TAG, "Done dispatching!");
@@ -2859,52 +2904,6 @@
         return false;
     }
 
-    /**
-     * log motion events
-     */
-    private static void captureMotionLog(String subTag, MotionEvent ev) {
-        //check dynamic switch
-        if (ev == null ||
-                SystemProperties.getInt(ViewDebug.SYSTEM_PROPERTY_CAPTURE_EVENT, 0) == 0) {
-            return;
-        }
-
-        StringBuilder sb = new StringBuilder(subTag + ": ");
-        sb.append(ev.getDownTime()).append(',');
-        sb.append(ev.getEventTime()).append(',');
-        sb.append(ev.getAction()).append(',');
-        sb.append(ev.getX()).append(',');
-        sb.append(ev.getY()).append(',');
-        sb.append(ev.getPressure()).append(',');
-        sb.append(ev.getSize()).append(',');
-        sb.append(ev.getMetaState()).append(',');
-        sb.append(ev.getXPrecision()).append(',');
-        sb.append(ev.getYPrecision()).append(',');
-        sb.append(ev.getDeviceId()).append(',');
-        sb.append(ev.getEdgeFlags());
-        Log.d(TAG, sb.toString());
-    }
-    /**
-     * log motion events
-     */
-    private static void captureKeyLog(String subTag, KeyEvent ev) {
-        //check dynamic switch
-        if (ev == null ||
-                SystemProperties.getInt(ViewDebug.SYSTEM_PROPERTY_CAPTURE_EVENT, 0) == 0) {
-            return;
-        }
-        StringBuilder sb = new StringBuilder(subTag + ": ");
-        sb.append(ev.getDownTime()).append(',');
-        sb.append(ev.getEventTime()).append(',');
-        sb.append(ev.getAction()).append(',');
-        sb.append(ev.getKeyCode()).append(',');
-        sb.append(ev.getRepeatCount()).append(',');
-        sb.append(ev.getMetaState()).append(',');
-        sb.append(ev.getDeviceId()).append(',');
-        sb.append(ev.getScanCode());
-        Log.d(TAG, sb.toString());
-    }
-
     int enqueuePendingEvent(Object event, boolean sendDone) {
         int seq = mPendingEventSeq+1;
         if (seq < 0) seq = 0;
@@ -2993,10 +2992,6 @@
             return;
         }
 
-        if (false) {
-            captureKeyLog("captureDispatchKeyEvent", event);
-        }
-
         // Make sure the fallback event policy sees all keys that will be delivered to the
         // view hierarchy.
         mFallbackEventHandler.preDispatchKeyEvent(event);
@@ -3392,12 +3387,12 @@
     
     private final InputHandler mInputHandler = new InputHandler() {
         public void handleKey(KeyEvent event, InputQueue.FinishedCallback finishedCallback) {
-            startInputEvent(event, finishedCallback);
+            startInputEvent(finishedCallback);
             dispatchKey(event, true);
         }
 
         public void handleMotion(MotionEvent event, InputQueue.FinishedCallback finishedCallback) {
-            startInputEvent(event, finishedCallback);
+            startInputEvent(finishedCallback);
             dispatchMotion(event, true);
         }
     };
@@ -3429,10 +3424,6 @@
         sendMessageAtTime(msg, event.getEventTime());
     }
     
-    public void dispatchMotion(MotionEvent event) {
-        dispatchMotion(event, false);
-    }
-
     private void dispatchMotion(MotionEvent event, boolean sendDone) {
         int source = event.getSource();
         if ((source & InputDevice.SOURCE_CLASS_POINTER) != 0) {
@@ -3444,10 +3435,6 @@
         }
     }
 
-    public void dispatchPointer(MotionEvent event) {
-        dispatchPointer(event, false);
-    }
-
     private void dispatchPointer(MotionEvent event, boolean sendDone) {
         Message msg = obtainMessage(DISPATCH_POINTER);
         msg.obj = event;
@@ -3455,10 +3442,6 @@
         sendMessageAtTime(msg, event.getEventTime());
     }
 
-    public void dispatchTrackball(MotionEvent event) {
-        dispatchTrackball(event, false);
-    }
-
     private void dispatchTrackball(MotionEvent event, boolean sendDone) {
         Message msg = obtainMessage(DISPATCH_TRACKBALL);
         msg.obj = event;
diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java
index 1534099..f014070 100644
--- a/core/java/android/view/ViewDebug.java
+++ b/core/java/android/view/ViewDebug.java
@@ -92,27 +92,6 @@
     public static final boolean TRACE_RECYCLER = false;
 
     /**
-     * Enables or disables motion events tracing. Any invoker of
-     * {@link #trace(View, MotionEvent, MotionEventTraceType)} should first check
-     * that this value is set to true as not to affect performance.
-     * 
-     * @hide
-     */
-    public static final boolean TRACE_MOTION_EVENTS = false;
-
-    /**
-     * The system property of dynamic switch for capturing view information
-     * when it is set, we dump interested fields and methods for the view on focus
-     */
-    static final String SYSTEM_PROPERTY_CAPTURE_VIEW = "debug.captureview";
-
-    /**
-     * The system property of dynamic switch for capturing event information
-     * when it is set, we log key events, touch/motion and trackball events
-     */
-    static final String SYSTEM_PROPERTY_CAPTURE_EVENT = "debug.captureevent";
-
-    /**
      * Profiles drawing times in the events log.
      *
      * @hide
@@ -170,12 +149,6 @@
     @Debug.DebugProperty
     public static boolean consistencyCheckEnabled = false;
 
-    static {
-        if (false) {        
-	        Debug.setFieldsOn(ViewDebug.class, true);
-	    }
-    }
-
     /**
      * This annotation can be used to mark fields and methods to be dumped by
      * the view server. Only non-void methods with no arguments can be annotated
@@ -424,21 +397,6 @@
     private static String sRecyclerTracePrefix;
 
     /**
-     * Defines the type of motion events trace to output to the motion events traces file.
-     * 
-     * @hide
-     */
-    public enum MotionEventTraceType {
-        DISPATCH,
-        ON_INTERCEPT,
-        ON_TOUCH
-    }
-
-    private static BufferedWriter sMotionEventTraces;
-    private static ViewAncestor sMotionEventRoot;
-    private static String sMotionEventTracePrefix;
-
-    /**
      * Returns the number of instanciated Views.
      *
      * @return The number of Views instanciated in the current process.
@@ -574,6 +532,7 @@
         recyclerDump = new File(recyclerDump, sRecyclerTracePrefix + ".traces");
         try {
             if (recyclerDump.exists()) {
+                //noinspection ResultOfMethodCallIgnored
                 recyclerDump.delete();
             }
             final FileOutputStream file = new FileOutputStream(recyclerDump);
@@ -732,146 +691,6 @@
         sHierarhcyRoot = null;
     }
 
-    /**
-     * Outputs a trace to the currently opened traces file. The trace contains the class name
-     * and instance's hashcode of the specified view as well as the supplied trace type.
-     *
-     * @param view the view to trace
-     * @param event the event of the trace
-     * @param type the type of the trace
-     * 
-     * @hide
-     */
-    public static void trace(View view, MotionEvent event, MotionEventTraceType type) {
-        if (sMotionEventTraces == null) {
-            return;
-        }
-
-        try {
-            sMotionEventTraces.write(type.name());
-            sMotionEventTraces.write(' ');
-            sMotionEventTraces.write(event.getAction());
-            sMotionEventTraces.write(' ');
-            sMotionEventTraces.write(view.getClass().getName());
-            sMotionEventTraces.write('@');
-            sMotionEventTraces.write(Integer.toHexString(view.hashCode()));
-            sHierarchyTraces.newLine();
-        } catch (IOException e) {
-            Log.w("View", "Error while dumping trace of event " + event + " for view " + view);
-        }
-    }
-
-    /**
-     * Starts tracing the motion events for the hierarchy of the specificy view.
-     * The trace is identified by a prefix, used to build the traces files names:
-     * <code>/EXTERNAL/motion-events/PREFIX.traces</code> and
-     * <code>/EXTERNAL/motion-events/PREFIX.tree</code>.
-     *
-     * Only one view hierarchy can be traced at the same time. After calling this method, any
-     * other invocation will result in a <code>IllegalStateException</code> unless
-     * {@link #stopMotionEventTracing()} is invoked before.
-     *
-     * Calling this method creates the file <code>/EXTERNAL/motion-events/PREFIX.traces</code>
-     * containing all the traces (or method calls) relative to the specified view's hierarchy.
-     *
-     * This method will return immediately if TRACE_HIERARCHY is false.
-     *
-     * @param prefix the traces files name prefix
-     * @param view the view whose hierarchy must be traced
-     *
-     * @see #stopMotionEventTracing()
-     * @see #trace(View, MotionEvent, android.view.ViewDebug.MotionEventTraceType)
-     * 
-     * @hide 
-     */
-    public static void startMotionEventTracing(String prefix, View view) {
-        //noinspection PointlessBooleanExpression,ConstantConditions
-        if (!TRACE_MOTION_EVENTS) {
-            return;
-        }
-
-        if (sMotionEventRoot != null) {
-            throw new IllegalStateException("You must call stopMotionEventTracing() before running" +
-                " a new trace!");
-        }
-
-        File hierarchyDump = new File(Environment.getExternalStorageDirectory(), "motion-events/");
-        //noinspection ResultOfMethodCallIgnored
-        hierarchyDump.mkdirs();
-
-        hierarchyDump = new File(hierarchyDump, prefix + ".traces");
-        sMotionEventTracePrefix = prefix;
-
-        try {
-            sMotionEventTraces = new BufferedWriter(new FileWriter(hierarchyDump), 32 * 1024);
-        } catch (IOException e) {
-            Log.e("View", "Could not dump view hierarchy");
-            return;
-        }
-
-        sMotionEventRoot = (ViewAncestor) view.getRootView().getParent();
-    }
-
-    /**
-     * Stops the current motion events tracing. This method closes the file
-     * <code>/EXTERNAL/motion-events/PREFIX.traces</code>.
-     *
-     * Calling this method creates the file <code>/EXTERNAL/motion-events/PREFIX.tree</code>
-     * containing the view hierarchy of the view supplied to
-     * {@link #startMotionEventTracing(String, View)}.
-     *
-     * This method will return immediately if TRACE_HIERARCHY is false.
-     *
-     * @see #startMotionEventTracing(String, View) 
-     * @see #trace(View, MotionEvent, android.view.ViewDebug.MotionEventTraceType) 
-     * 
-     * @hide
-     */
-    public static void stopMotionEventTracing() {
-        //noinspection PointlessBooleanExpression,ConstantConditions
-        if (!TRACE_MOTION_EVENTS) {
-            return;
-        }
-
-        if (sMotionEventRoot == null || sMotionEventTraces == null) {
-            throw new IllegalStateException("You must call startMotionEventTracing() before" +
-                " stopMotionEventTracing()!");
-        }
-
-        try {
-            sMotionEventTraces.close();
-        } catch (IOException e) {
-            Log.e("View", "Could not write view traces");
-        }
-        sMotionEventTraces = null;
-
-        File hierarchyDump = new File(Environment.getExternalStorageDirectory(), "motion-events/");
-        //noinspection ResultOfMethodCallIgnored
-        hierarchyDump.mkdirs();
-        hierarchyDump = new File(hierarchyDump, sMotionEventTracePrefix + ".tree");
-
-        BufferedWriter out;
-        try {
-            out = new BufferedWriter(new FileWriter(hierarchyDump), 8 * 1024);
-        } catch (IOException e) {
-            Log.e("View", "Could not dump view hierarchy");
-            return;
-        }
-
-        View view = sMotionEventRoot.getView();
-        if (view instanceof ViewGroup) {
-            ViewGroup group = (ViewGroup) view;
-            dumpViewHierarchy(group, out, 0);
-            try {
-                out.close();
-            } catch (IOException e) {
-                Log.e("View", "Could not dump view hierarchy");
-            }
-        }
-
-        sHierarhcyRoot = null;
-    }
-
     static void dispatchCommand(View view, String command, String parameters,
             OutputStream clientStream) throws IOException {
 
@@ -1069,8 +888,10 @@
                 try {
                     T[] data = operation.pre();
                     long start = Debug.threadCpuTimeNanos();
+                    //noinspection unchecked
                     operation.run(data);
                     duration[0] = Debug.threadCpuTimeNanos() - start;
+                    //noinspection unchecked
                     operation.post(data);
                 } finally {
                     latch.countDown();
@@ -1201,12 +1022,7 @@
                         cache[0] = captureView.createSnapshot(
                                 Bitmap.Config.ARGB_8888, 0, skpiChildren);
                     } catch (OutOfMemoryError e) {
-                        try {
-                            cache[0] = captureView.createSnapshot(
-                                    Bitmap.Config.ARGB_4444, 0, skpiChildren);
-                        } catch (OutOfMemoryError e2) {
-                            Log.w("View", "Out of memory for bitmap");
-                        }
+                        Log.w("View", "Out of memory for bitmap");
                     } finally {
                         latch.countDown();
                     }
@@ -1316,7 +1132,6 @@
         }
 
         final HashMap<Class<?>, Field[]> map = sFieldsForClasses;
-        final HashMap<AccessibleObject, ExportedProperty> annotations = sAnnotations;
 
         Field[] fields = map.get(klass);
         if (fields != null) {
@@ -1332,7 +1147,7 @@
             if (field.isAnnotationPresent(ExportedProperty.class)) {
                 field.setAccessible(true);
                 foundFields.add(field);
-                annotations.put(field, field.getAnnotation(ExportedProperty.class));
+                sAnnotations.put(field, field.getAnnotation(ExportedProperty.class));
             }
         }
 
@@ -1351,7 +1166,6 @@
         }
 
         final HashMap<Class<?>, Method[]> map = sMethodsForClasses;
-        final HashMap<AccessibleObject, ExportedProperty> annotations = sAnnotations;
 
         Method[] methods = map.get(klass);
         if (methods != null) {
@@ -1369,7 +1183,7 @@
                     method.getReturnType() != Void.class) {
                 method.setAccessible(true);
                 foundMethods.add(method);
-                annotations.put(method, method.getAnnotation(ExportedProperty.class));
+                sAnnotations.put(method, method.getAnnotation(ExportedProperty.class));
             }
         }
 
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 6937573..f504b90 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -4838,6 +4838,20 @@
     }
 
     /**
+     * This method is called by LayoutTransition when there are 'changing' animations that need
+     * to start after the layout/setup phase. The request is forwarded to the ViewAncestor, who
+     * starts all pending transitions prior to the drawing phase in the current traversal.
+     *
+     * @param transition The LayoutTransition to be started on the next traversal.
+     *
+     * @hide
+     */
+    public void requestTransitionStart(LayoutTransition transition) {
+        ViewAncestor viewAncestor = getViewAncestor();
+        viewAncestor.requestTransitionStart(transition);
+    }
+
+    /**
      * Return true if the pressed state should be delayed for children or descendants of this
      * ViewGroup. Generally, this should be done for containers that can scroll, such as a List.
      * This prevents the pressed state from appearing when the user is actually trying to scroll
diff --git a/core/java/android/view/ViewPropertyAnimator.java b/core/java/android/view/ViewPropertyAnimator.java
index 1d56e9d..9eddf23 100644
--- a/core/java/android/view/ViewPropertyAnimator.java
+++ b/core/java/android/view/ViewPropertyAnimator.java
@@ -67,6 +67,19 @@
     private boolean mDurationSet = false;
 
     /**
+     * The startDelay of the underlying Animator object. By default, we don't set the startDelay
+     * on the Animator and just use its default startDelay. If the startDelay is ever set on this
+     * Animator, then we use the startDelay that it was set to.
+     */
+    private long mStartDelay = 0;
+
+    /**
+     * A flag indicating whether the startDelay has been set on this object. If not, we don't set
+     * the startDelay on the underlying Animator, but instead just use its default startDelay.
+     */
+    private boolean mStartDelaySet = false;
+
+    /**
      * The interpolator of the underlying Animator object. By default, we don't set the interpolator
      * on the Animator and just use its default interpolator. If the interpolator is ever set on
      * this Animator, then we use the interpolator that it was set to.
@@ -233,6 +246,60 @@
     }
 
     /**
+     * Returns the current duration of property animations. If the duration was set on this
+     * object, that value is returned. Otherwise, the default value of the underlying Animator
+     * is returned.
+     *
+     * @see #setDuration(long)
+     * @return The duration of animations, in milliseconds.
+     */
+    public long getDuration() {
+        if (mStartDelaySet) {
+            return mStartDelay;
+        } else {
+            // Just return the default from ValueAnimator, since that's what we'd get if
+            // the value has not been set otherwise
+            return new ValueAnimator().getDuration();
+        }
+    }
+
+    /**
+     * Returns the current startDelay of property animations. If the startDelay was set on this
+     * object, that value is returned. Otherwise, the default value of the underlying Animator
+     * is returned.
+     *
+     * @see #setStartDelay(long)
+     * @return The startDelay of animations, in milliseconds.
+     */
+    public long getStartDelay() {
+        if (mStartDelaySet) {
+            return mStartDelay;
+        } else {
+            // Just return the default from ValueAnimator (0), since that's what we'd get if
+            // the value has not been set otherwise
+            return 0;
+        }
+    }
+
+    /**
+     * Sets the startDelay for the underlying animator that animates the requested properties.
+     * By default, the animator uses the default value for ValueAnimator. Calling this method
+     * will cause the declared value to be used instead.
+     * @param startDelay The delay of ensuing property animations, in milliseconds. The value
+     * cannot be negative.
+     * @return This object, allowing calls to methods in this class to be chained.
+     */
+    public ViewPropertyAnimator setStartDelay(long startDelay) {
+        if (startDelay < 0) {
+            throw new IllegalArgumentException("Animators cannot have negative duration: " +
+                    startDelay);
+        }
+        mStartDelaySet = true;
+        mStartDelay = startDelay;
+        return this;
+    }
+
+    /**
      * Sets the interpolator for the underlying animator that animates the requested properties.
      * By default, the animator uses the default interpolator for ValueAnimator. Calling this method
      * will cause the declared object to be used instead.
@@ -259,6 +326,33 @@
     }
 
     /**
+     * Starts the currently pending property animations immediately. Calling <code>start()</code>
+     * is optional because all animations start automatically at the next opportunity. However,
+     * if the animations are needed to start immediately and synchronously (not at the time when
+     * the next event is processed by the hierarchy, which is when the animations would begin
+     * otherwise), then this method can be used.
+     */
+    public void start() {
+        startAnimation();
+    }
+
+    /**
+     * Cancels all property animations that are currently running or pending.
+     */
+    public void cancel() {
+        if (mAnimatorMap.size() > 0) {
+            HashMap<Animator, PropertyBundle> mAnimatorMapCopy =
+                    (HashMap<Animator, PropertyBundle>)mAnimatorMap.clone();
+            Set<Animator> animatorSet = mAnimatorMapCopy.keySet();
+            for (Animator runningAnim : animatorSet) {
+                runningAnim.cancel();
+            }
+        }
+        mPendingAnimations.clear();
+        mView.getHandler().removeCallbacks(mAnimationStarter);
+    }
+
+    /**
      * This method will cause the View's <code>x</code> property to be animated to the
      * specified value. Animations already running on the property will be canceled.
      *
@@ -598,7 +692,7 @@
                     // on a property will cancel a previous animation on that property, so
                     // there can only ever be one such animation running.
                     if (bundle.mPropertyMask == NONE) {
-                        // the animation is not longer changing anything - cancel it
+                        // the animation is no longer changing anything - cancel it
                         animatorToCancel = runningAnim;
                         break;
                     }
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index 2095a93..5236a9e 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -17,6 +17,7 @@
 package android.view;
 
 import android.content.Context;
+import android.content.res.CompatibilityInfo;
 import android.content.res.Configuration;
 import android.content.res.TypedArray;
 import android.graphics.PixelFormat;
@@ -462,13 +463,11 @@
         mWindowManager = new LocalWindowManager(wm, hardwareAccelerated);
     }
 
-    private class LocalWindowManager implements WindowManager {
-        private boolean mHardwareAccelerated;
+    private class LocalWindowManager extends WindowManagerImpl.CompatModeWrapper {
+        private final boolean mHardwareAccelerated;
 
         LocalWindowManager(WindowManager wm, boolean hardwareAccelerated) {
-            mWindowManager = wm;
-            mDefaultDisplay = mContext.getResources().getDefaultDisplay(
-                    mWindowManager.getDefaultDisplay());
+            super(wm, mContext.getResources().getCompatibilityInfo());
             mHardwareAccelerated = hardwareAccelerated;
         }
 
@@ -523,28 +522,8 @@
             if (mHardwareAccelerated) {
                 wp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
             }
-            mWindowManager.addView(view, params);
+            super.addView(view, params);
         }
-
-        public void updateViewLayout(View view, ViewGroup.LayoutParams params) {
-            mWindowManager.updateViewLayout(view, params);
-        }
-
-        public final void removeView(View view) {
-            mWindowManager.removeView(view);
-        }
-
-        public final void removeViewImmediate(View view) {
-            mWindowManager.removeViewImmediate(view);
-        }
-
-        public Display getDefaultDisplay() {
-            return mDefaultDisplay;
-        }
-        
-        private final WindowManager mWindowManager;
-
-        private final Display mDefaultDisplay;
     }
 
     /**
diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java
index d7a3096..d18ae0e 100644
--- a/core/java/android/view/WindowManagerImpl.java
+++ b/core/java/android/view/WindowManagerImpl.java
@@ -16,6 +16,9 @@
 
 package android.view;
 
+import java.util.HashMap;
+
+import android.content.res.CompatibilityInfo;
 import android.graphics.PixelFormat;
 import android.os.IBinder;
 import android.util.AndroidRuntimeException;
@@ -74,9 +77,92 @@
     public static final int ADD_MULTIPLE_SINGLETON = -7;
     public static final int ADD_PERMISSION_DENIED = -8;
 
-    public static WindowManagerImpl getDefault()
-    {
-        return mWindowManager;
+    private View[] mViews;
+    private ViewAncestor[] mRoots;
+    private WindowManager.LayoutParams[] mParams;
+
+    private final static Object sLock = new Object();
+    private final static WindowManagerImpl sWindowManager = new WindowManagerImpl();
+    private final static HashMap<CompatibilityInfo, WindowManager> sCompatWindowManagers
+            = new HashMap<CompatibilityInfo, WindowManager>();
+
+    static class CompatModeWrapper implements WindowManager {
+        private final WindowManager mWindowManager;
+        private final Display mDefaultDisplay;
+
+        CompatModeWrapper(WindowManager wm, CompatibilityInfo ci) {
+            mWindowManager = wm;
+
+            // Use the original display if there is no compatibility mode
+            // to apply, or the underlying window manager is already a
+            // compatibility mode wrapper.  (We assume that if it is a
+            // wrapper, it is applying the same compatibility mode.)
+            if (ci == null || wm instanceof CompatModeWrapper
+                    || (!ci.isScalingRequired() && ci.supportsScreen())) {
+                mDefaultDisplay = mWindowManager.getDefaultDisplay();
+            } else {
+                //mDefaultDisplay = mWindowManager.getDefaultDisplay();
+                mDefaultDisplay = Display.createCompatibleDisplay(
+                        mWindowManager.getDefaultDisplay().getDisplayId(), ci);
+            }
+        }
+
+        @Override
+        public void addView(View view, android.view.ViewGroup.LayoutParams params) {
+            mWindowManager.addView(view, params);
+        }
+
+        @Override
+        public void updateViewLayout(View view, android.view.ViewGroup.LayoutParams params) {
+            mWindowManager.updateViewLayout(view, params);
+
+        }
+
+        @Override
+        public void removeView(View view) {
+            mWindowManager.removeView(view);
+        }
+
+        @Override
+        public Display getDefaultDisplay() {
+            return mDefaultDisplay;
+        }
+
+        @Override
+        public void removeViewImmediate(View view) {
+            mWindowManager.removeViewImmediate(view);
+        }
+
+        @Override
+        public boolean isHardwareAccelerated() {
+            return mWindowManager.isHardwareAccelerated();
+        }
+
+    }
+
+    public static WindowManagerImpl getDefault() {
+        return sWindowManager;
+    }
+
+    public static WindowManager getDefault(CompatibilityInfo compatInfo) {
+        if (compatInfo == null || (!compatInfo.isScalingRequired()
+                && compatInfo.supportsScreen())) {
+            return sWindowManager;
+        }
+
+        synchronized (sLock) {
+            // NOTE: It would be cleaner to move the implementation of
+            // WindowManagerImpl into a static inner class, and have this
+            // public impl just call into that.  Then we can make multiple
+            // instances of WindowManagerImpl for compat mode rather than
+            // having to make wrappers.
+            WindowManager wm = sCompatWindowManagers.get(compatInfo);
+            if (wm == null) {
+                wm = new CompatModeWrapper(sWindowManager, compatInfo);
+                sCompatWindowManagers.put(compatInfo, wm);
+            }
+            return wm;
+        }
     }
     
     public boolean isHardwareAccelerated() {
@@ -340,13 +426,9 @@
     }
     
     public Display getDefaultDisplay() {
-        return new Display(Display.DEFAULT_DISPLAY);
+        return new Display(Display.DEFAULT_DISPLAY, null);
     }
 
-    private View[] mViews;
-    private ViewAncestor[] mRoots;
-    private WindowManager.LayoutParams[] mParams;
-
     private static void removeItem(Object[] dst, Object[] src, int index)
     {
         if (dst.length > 0) {
@@ -375,6 +457,4 @@
             return -1;
         }
     }
-
-    private static WindowManagerImpl mWindowManager = new WindowManagerImpl();
 }
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 84f42b0..64b1ac8 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -466,16 +466,34 @@
     public int getMaxWallpaperLayer();
     
     /**
-     * Return the display width available after excluding the window
-     * decor.
+     * Return the display width available after excluding any screen
+     * decorations that can never be removed.  That is, system bar or
+     * button bar.
      */
-    public int getNonDecorDisplayWidth(int fullWidth);
+    public int getNonDecorDisplayWidth(int rotation, int fullWidth);
 
     /**
-     * Return the display height available after excluding the screen
-     * decor.
+     * Return the display height available after excluding any screen
+     * decorations that can never be removed.  That is, system bar or
+     * button bar.
      */
-    public int getNonDecorDisplayHeight(int fullHeight);
+    public int getNonDecorDisplayHeight(int rotation, int fullHeight);
+
+    /**
+     * Return the available screen width that we should report for the
+     * configuration.  This must be no larger than
+     * {@link #getNonDecorDisplayWidth(int, int)}; it may be smaller than
+     * that to account for more transient decoration like a status bar.
+     */
+    public int getConfigDisplayWidth(int rotation, int fullWidth);
+
+    /**
+     * Return the available screen height that we should report for the
+     * configuration.  This must be no larger than
+     * {@link #getNonDecorDisplayHeight(int, int)}; it may be smaller than
+     * that to account for more transient decoration like a status bar.
+     */
+    public int getConfigDisplayHeight(int rotation, int fullHeight);
 
     /**
      * Return whether the given window should forcibly hide everything
diff --git a/core/java/android/view/accessibility/AccessibilityRecord.java b/core/java/android/view/accessibility/AccessibilityRecord.java
index fecf9df..7819b17 100644
--- a/core/java/android/view/accessibility/AccessibilityRecord.java
+++ b/core/java/android/view/accessibility/AccessibilityRecord.java
@@ -341,7 +341,7 @@
      *
      * @return An instance.
      */
-    protected static AccessibilityRecord obtain() {
+    public static AccessibilityRecord obtain() {
         synchronized (sPoolLock) {
             if (sPool != null) {
                 AccessibilityRecord record = sPool;
diff --git a/core/java/android/view/inputmethod/BaseInputConnection.java b/core/java/android/view/inputmethod/BaseInputConnection.java
index b4303f4..abe3c2c 100644
--- a/core/java/android/view/inputmethod/BaseInputConnection.java
+++ b/core/java/android/view/inputmethod/BaseInputConnection.java
@@ -49,8 +49,9 @@
     private static final boolean DEBUG = false;
     private static final String TAG = "BaseInputConnection";
     static final Object COMPOSING = new ComposingText();
-    
-    final InputMethodManager mIMM;
+
+    /** @hide */
+    protected final InputMethodManager mIMM;
     final View mTargetView;
     final boolean mDummyMode;
     
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 27cbaf7..ea66d67 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -35,6 +35,7 @@
 import android.os.RemoteException;
 import android.os.ResultReceiver;
 import android.os.ServiceManager;
+import android.text.style.SuggestionSpan;
 import android.util.Log;
 import android.util.PrintWriterPrinter;
 import android.util.Printer;
@@ -550,7 +551,25 @@
     public void setFullscreenMode(boolean fullScreen) {
         mFullscreenMode = fullScreen;
     }
-    
+
+    /** @hide */
+    public void registerSuggestionSpansForNotification(SuggestionSpan[] spans) {
+        try {
+            mService.registerSuggestionSpansForNotification(spans);
+        } catch (RemoteException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /** @hide */
+    public void notifySuggestionPicked(SuggestionSpan span, String originalString, int index) {
+        try {
+            mService.notifySuggestionPicked(span, originalString, index);
+        } catch (RemoteException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
     /**
      * Allows you to discover whether the attached input method is running
      * in fullscreen mode.  Return true if it is fullscreen, entirely covering
diff --git a/core/java/android/webkit/JWebCoreJavaBridge.java b/core/java/android/webkit/JWebCoreJavaBridge.java
index 976e786..12391df 100644
--- a/core/java/android/webkit/JWebCoreJavaBridge.java
+++ b/core/java/android/webkit/JWebCoreJavaBridge.java
@@ -39,9 +39,6 @@
     // immediately.
     private boolean mHasInstantTimer;
 
-    // Reference count the pause/resume of timers
-    private int mPauseTimerRefCount;
-
     private boolean mTimerPaused;
     private boolean mHasDeferredTimers;
 
@@ -136,7 +133,7 @@
      * Pause all timers.
      */
     public void pause() {
-        if (--mPauseTimerRefCount == 0) {
+        if (!mTimerPaused) {
             mTimerPaused = true;
             mHasDeferredTimers = false;
         }
@@ -146,7 +143,7 @@
      * Resume all timers.
      */
     public void resume() {
-        if (++mPauseTimerRefCount == 1) {
+        if (mTimerPaused) {
            mTimerPaused = false;
            if (mHasDeferredTimers) {
                mHasDeferredTimers = false;
diff --git a/core/java/android/webkit/L10nUtils.java b/core/java/android/webkit/L10nUtils.java
index f59d7d0..5b4fb1d 100644
--- a/core/java/android/webkit/L10nUtils.java
+++ b/core/java/android/webkit/L10nUtils.java
@@ -69,7 +69,8 @@
         com.android.internal.R.string.autofill_card_number_re,              // IDS_AUTOFILL_CARD_NUMBER_RE
         com.android.internal.R.string.autofill_expiration_month_re,         // IDS_AUTOFILL_EXPIRATION_MONTH_RE
         com.android.internal.R.string.autofill_expiration_date_re,          // IDS_AUTOFILL_EXPIRATION_DATE_RE
-        com.android.internal.R.string.autofill_card_ignored_re              // IDS_AUTOFILL_CARD_IGNORED_RE
+        com.android.internal.R.string.autofill_card_ignored_re,             // IDS_AUTOFILL_CARD_IGNORED_RE
+        com.android.internal.R.string.autofill_fax_re                       // IDS_AUTOFILL_FAX_RE
     };
 
     private static Context mApplicationContext;
diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java
index 8ffbda2..66fcc27 100644
--- a/core/java/android/webkit/WebSettings.java
+++ b/core/java/android/webkit/WebSettings.java
@@ -183,7 +183,6 @@
     private boolean         mJavaScriptCanOpenWindowsAutomatically = false;
     private boolean         mUseDoubleTree = false;
     private boolean         mUseWideViewport = false;
-    private boolean         mUseFixedViewport = false;
     private boolean         mSupportMultipleWindows = false;
     private boolean         mShrinksStandaloneImagesToFit = false;
     private long            mMaximumDecodedImageSize = 0; // 0 means default
@@ -361,10 +360,9 @@
     }
 
     // User agent strings.
-    private static final String DESKTOP_USERAGENT =
-            "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us)"
-            + " AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0"
-            + " Safari/530.17";
+    private static final String DESKTOP_USERAGENT = "Mozilla/5.0 (X11; " +
+        "Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) " +
+        "Chrome/11.0.696.34 Safari/534.24";
     private static final String IPHONE_USERAGENT =
             "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us)"
             + " AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0"
@@ -383,13 +381,6 @@
         mDefaultTextEncoding = context.getString(com.android.internal.
                                                  R.string.default_text_encoding);
 
-        // Detect tablet device for fixed viewport mode.
-        final DisplayMetrics metrics = context.getResources().getDisplayMetrics();
-        final int landscapeWidth = Math.max(metrics.widthPixels, metrics.heightPixels);
-        final int minTabletWidth = context.getResources().getDimensionPixelSize(
-            com.android.internal.R.dimen.min_xlarge_screen_width);
-        mUseFixedViewport = (metrics.density == 1.0f && landscapeWidth >= minTabletWidth);
-
         if (sLockForLocaleSettings == null) {
             sLockForLocaleSettings = new Object();
             sLocale = Locale.getDefault();
@@ -1652,11 +1643,11 @@
     }
 
     /**
-     * Returns whether to use fixed viewport.  Fixed viewport should operate only
-     * when wide viewport is on.
+     * Returns whether to use fixed viewport.  Use fixed viewport
+     * whenever wide viewport is on.
      */
     /* package */ boolean getUseFixedViewport() {
-        return getUseWideViewPort() && mUseFixedViewport;
+        return getUseWideViewPort();
     }
 
     /**
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index f774803..61a69ca 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -54,7 +54,9 @@
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Message;
+import android.os.StrictMode;
 import android.provider.Settings;
 import android.speech.tts.TextToSpeech;
 import android.text.Selection;
@@ -8933,15 +8935,14 @@
     }
 
     private static void checkThread() {
-        if (!"main".equals(Thread.currentThread().getName())) {
-            try {
-                throw new RuntimeException("A WebView method was called on thread '" +
-                        Thread.currentThread().getName() + "'. " +
-                        "All WebView methods must be called on the UI thread. " +
-                        "Future versions of WebView may not support use on other threads.");
-            } catch (RuntimeException e) {
-                Log.e(LOGTAG, Log.getStackTraceString(e));
-            }
+        if (Looper.myLooper() != Looper.getMainLooper()) {
+            RuntimeException exception = new RuntimeException(
+                    "A WebView method was called on thread '" +
+                    Thread.currentThread().getName() + "'. " +
+                    "All WebView methods must be called on the UI thread. " +
+                    "Future versions of WebView may not support use on other threads.");
+            Log.e(LOGTAG, Log.getStackTraceString(exception));
+            StrictMode.onWebViewMethodCalledOnWrongThread(exception);
         }
     }
 
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index e8083eb..db5ff54 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -1865,7 +1865,7 @@
             Log.w(LOGTAG, "skip viewSizeChanged as w is 0");
             return;
         }
-        int width = calculateWindowWidth(w, textwrapWidth);
+        int width = calculateWindowWidth(w);
         int height = h;
         if (width != w) {
             float heightWidthRatio = data.mHeightWidthRatio;
@@ -1891,41 +1891,18 @@
     }
 
     // Calculate width to be used in webkit window.
-    private int calculateWindowWidth(int viewWidth, int textwrapWidth) {
+    private int calculateWindowWidth(int viewWidth) {
         int width = viewWidth;
         if (mSettings.getUseWideViewPort()) {
             if (mViewportWidth == -1) {
-                if (mSettings.getLayoutAlgorithm() ==
-                        WebSettings.LayoutAlgorithm.NORMAL || mSettings.getUseFixedViewport()) {
-                    width = WebView.DEFAULT_VIEWPORT_WIDTH;
-                } else {
-                    /*
-                     * if a page's minimum preferred width is wider than the
-                     * given "w", use it instead to get better layout result. If
-                     * we start a page with MAX_ZOOM_WIDTH, "w" will be always
-                     * wider. If we start a page with screen width, due to the
-                     * delay between {@link #didFirstLayout} and
-                     * {@link #viewSizeChanged},
-                     * {@link #nativeGetContentMinPrefWidth} will return a more
-                     * accurate value than initial 0 to result a better layout.
-                     * In the worse case, the native width will be adjusted when
-                     * next zoom or screen orientation change happens.
-                     */
-                    width = Math.min(WebView.sMaxViewportWidth, Math.max(viewWidth,
-                            Math.max(WebView.DEFAULT_VIEWPORT_WIDTH,
-                                    nativeGetContentMinPrefWidth())));
-                }
+                // Fixed viewport width.
+                width = WebView.DEFAULT_VIEWPORT_WIDTH;
             } else if (mViewportWidth > 0) {
-                if (mSettings.getUseFixedViewport()) {
-                    // Use website specified or desired fixed viewport width.
-                    width = mViewportWidth;
-                } else {
-                    width = Math.max(viewWidth, mViewportWidth);
-                }
-            } else if (mSettings.getUseFixedViewport()) {
-                width = mWebView.getViewWidth();
+                // Use website specified or desired fixed viewport width.
+                width = mViewportWidth;
             } else {
-                width = textwrapWidth;
+                // For mobile web site.
+                width = viewWidth;
             }
         }
         return width;
@@ -2025,7 +2002,8 @@
         if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, "webkitDraw start");
         draw.mBaseLayer = nativeRecordContent(draw.mInvalRegion, draw.mContentSize);
         if (draw.mBaseLayer == 0) {
-            if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, "webkitDraw abort");
+            if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, "webkitDraw abort, resending draw message");
+            mEventHub.sendMessage(Message.obtain(null, EventHub.WEBKIT_DRAW));
             return;
         }
         webkitDraw(draw);
@@ -2439,8 +2417,7 @@
                     // in zoom overview mode.
                     tentativeScale = mInitialViewState.mTextWrapScale;
                     int tentativeViewWidth = Math.round(webViewWidth / tentativeScale);
-                    int windowWidth = calculateWindowWidth(tentativeViewWidth,
-                            tentativeViewWidth);
+                    int windowWidth = calculateWindowWidth(tentativeViewWidth);
                     // In viewport setup time, since no content width is known, we assume
                     // the windowWidth will be the content width, to get a more likely
                     // zoom overview scale.
@@ -2449,8 +2426,7 @@
                         // If user choose non-overview mode.
                         data.mScale = Math.max(data.mScale, tentativeScale);
                     }
-                    if (mSettings.isNarrowColumnLayout() &&
-                            mSettings.getUseFixedViewport()) {
+                    if (mSettings.isNarrowColumnLayout()) {
                         // In case of automatic text reflow in fixed view port mode.
                         mInitialViewState.mTextWrapScale =
                                 ZoomManager.computeReadingLevelScale(data.mScale);
diff --git a/core/java/android/webkit/ZoomManager.java b/core/java/android/webkit/ZoomManager.java
index f2a1ec3..e330737 100644
--- a/core/java/android/webkit/ZoomManager.java
+++ b/core/java/android/webkit/ZoomManager.java
@@ -1019,19 +1019,11 @@
         WebSettings settings = mWebView.getSettings();
         int newZoomOverviewWidth = mZoomOverviewWidth;
         if (settings.getUseWideViewPort()) {
-            if (!settings.getUseFixedViewport()) {
-                // limit mZoomOverviewWidth upper bound to
-                // sMaxViewportWidth so that if the page doesn't behave
-                // well, the WebView won't go insane. limit the lower
-                // bound to match the default scale for mobile sites.
-                newZoomOverviewWidth = Math.min(WebView.sMaxViewportWidth,
-                    Math.max((int) (viewWidth * mInvDefaultScale),
-                          Math.max(drawData.mMinPrefWidth, drawData.mViewSize.x)));
-            } else if (drawData.mContentSize.x > 0) {
+            if (drawData.mContentSize.x > 0) {
                 // The webkitDraw for layers will not populate contentSize, and it'll be
                 // ignored for zoom overview width update.
-                final int contentWidth = Math.max(drawData.mContentSize.x, drawData.mMinPrefWidth);
-                newZoomOverviewWidth = Math.min(WebView.sMaxViewportWidth, contentWidth);
+                newZoomOverviewWidth = Math.min(WebView.sMaxViewportWidth,
+                    drawData.mContentSize.x);
             }
         } else {
             // If not use wide viewport, use view width as the zoom overview width.
diff --git a/core/java/android/widget/ExpandableListView.java b/core/java/android/widget/ExpandableListView.java
index f862368..ead9b4f 100644
--- a/core/java/android/widget/ExpandableListView.java
+++ b/core/java/android/widget/ExpandableListView.java
@@ -599,12 +599,35 @@
      *         was already expanded, this will return false)
      */
     public boolean expandGroup(int groupPos) {
-        boolean retValue = mConnector.expandGroup(groupPos);
+       return expandGroup(groupPos, false);
+    }
+
+    /**
+     * Expand a group in the grouped list view
+     *
+     * @param groupPos the group to be expanded
+     * @param animate true if the expanding group should be animated in
+     * @return True if the group was expanded, false otherwise (if the group
+     *         was already expanded, this will return false)
+     */
+    public boolean expandGroup(int groupPos, boolean animate) {
+        PositionMetadata pm = mConnector.getFlattenedPos(ExpandableListPosition.obtain(
+                ExpandableListPosition.GROUP, groupPos, -1, -1));
+        boolean retValue = mConnector.expandGroup(pm);
 
         if (mOnGroupExpandListener != null) {
             mOnGroupExpandListener.onGroupExpand(groupPos);
         }
-        
+
+        if (animate) {
+            final int groupFlatPos = pm.position.flatListPos;
+
+            final int shiftedGroupPosition = groupFlatPos + getHeaderViewsCount();
+            smoothScrollToPosition(shiftedGroupPosition + mAdapter.getChildrenCount(groupPos),
+                    shiftedGroupPosition);
+        }
+        pm.recycle();
+
         return retValue;
     }
     
diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java
index 86fefaf..6f30452 100644
--- a/core/java/android/widget/LinearLayout.java
+++ b/core/java/android/widget/LinearLayout.java
@@ -696,7 +696,8 @@
             mTotalLength += mDividerHeight;
         }
 
-        if (useLargestChild && heightMode == MeasureSpec.AT_MOST) {
+        if (useLargestChild &&
+                (heightMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.UNSPECIFIED)) {
             mTotalLength = 0;
 
             for (int i = 0; i < count; ++i) {
@@ -809,6 +810,31 @@
         } else {
             alternativeMaxWidth = Math.max(alternativeMaxWidth,
                                            weightedMaxWidth);
+
+
+            // We have no limit, so make all weighted views as tall as the largest child.
+            // Children will have already been measured once.
+            if (useLargestChild && widthMode == MeasureSpec.UNSPECIFIED) {
+                for (int i = 0; i < count; i++) {
+                    final View child = getVirtualChildAt(i);
+
+                    if (child == null || child.getVisibility() == View.GONE) {
+                        continue;
+                    }
+
+                    final LinearLayout.LayoutParams lp =
+                            (LinearLayout.LayoutParams) child.getLayoutParams();
+
+                    float childExtra = lp.weight;
+                    if (childExtra > 0) {
+                        child.measure(
+                                MeasureSpec.makeMeasureSpec(child.getMeasuredWidth(),
+                                        MeasureSpec.EXACTLY),
+                                MeasureSpec.makeMeasureSpec(largestChildHeight,
+                                        MeasureSpec.EXACTLY));
+                    }
+                }
+            }
         }
 
         if (!allFillParent && widthMode != MeasureSpec.EXACTLY) {
@@ -1044,7 +1070,8 @@
             maxHeight = Math.max(maxHeight, ascent + descent);
         }
 
-        if (useLargestChild && widthMode == MeasureSpec.AT_MOST) {
+        if (useLargestChild &&
+                (widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.UNSPECIFIED)) {
             mTotalLength = 0;
 
             for (int i = 0; i < count; ++i) {
@@ -1200,6 +1227,29 @@
             }
         } else {
             alternativeMaxHeight = Math.max(alternativeMaxHeight, weightedMaxHeight);
+
+            // We have no limit, so make all weighted views as wide as the largest child.
+            // Children will have already been measured once.
+            if (useLargestChild && widthMode == MeasureSpec.UNSPECIFIED) {
+                for (int i = 0; i < count; i++) {
+                    final View child = getVirtualChildAt(i);
+
+                    if (child == null || child.getVisibility() == View.GONE) {
+                        continue;
+                    }
+
+                    final LinearLayout.LayoutParams lp =
+                            (LinearLayout.LayoutParams) child.getLayoutParams();
+
+                    float childExtra = lp.weight;
+                    if (childExtra > 0) {
+                        child.measure(
+                                MeasureSpec.makeMeasureSpec(largestChildWidth, MeasureSpec.EXACTLY),
+                                MeasureSpec.makeMeasureSpec(child.getMeasuredHeight(),
+                                        MeasureSpec.EXACTLY));
+                    }
+                }
+            }
         }
 
         if (!allFillParent && heightMode != MeasureSpec.EXACTLY) {
@@ -1331,7 +1381,7 @@
     void layoutVertical() {
         final int paddingLeft = mPaddingLeft;
 
-        int childTop = mPaddingTop;
+        int childTop;
         int childLeft;
         
         // Where right end of child should go
@@ -1346,19 +1396,21 @@
         final int majorGravity = mGravity & Gravity.VERTICAL_GRAVITY_MASK;
         final int minorGravity = mGravity & Gravity.HORIZONTAL_GRAVITY_MASK;
 
-        if (majorGravity != Gravity.TOP) {
-           switch (majorGravity) {
-               case Gravity.BOTTOM:
-                   // mTotalLength contains the padding already, we add the top
-                   // padding to compensate
-                   childTop = mBottom - mTop + mPaddingTop - mTotalLength;
-                   break;
+        switch (majorGravity) {
+           case Gravity.BOTTOM:
+               // mTotalLength contains the padding already
+               childTop = mPaddingTop + mBottom - mTop - mTotalLength;
+               break;
 
-               case Gravity.CENTER_VERTICAL:
-                   childTop += ((mBottom - mTop)  - mTotalLength) / 2;
-                   break;
-           }
-           
+               // mTotalLength contains the padding already
+           case Gravity.CENTER_VERTICAL:
+               childTop = mPaddingTop + (mBottom - mTop - mTotalLength) / 2;
+               break;
+
+           case Gravity.TOP:
+           default:
+               childTop = mPaddingTop;
+               break;
         }
 
         for (int i = 0; i < count; i++) {
@@ -1376,12 +1428,8 @@
                 if (gravity < 0) {
                     gravity = minorGravity;
                 }
-                
-                switch (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
-                    case Gravity.LEFT:
-                        childLeft = paddingLeft + lp.leftMargin;
-                        break;
 
+                switch (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
                     case Gravity.CENTER_HORIZONTAL:
                         childLeft = paddingLeft + ((childSpace - childWidth) / 2)
                                 + lp.leftMargin - lp.rightMargin;
@@ -1390,11 +1438,13 @@
                     case Gravity.RIGHT:
                         childLeft = childRight - childWidth - lp.rightMargin;
                         break;
+
+                    case Gravity.LEFT:
                     default:
-                        childLeft = paddingLeft;
+                        childLeft = paddingLeft + lp.leftMargin;
                         break;
                 }
-                
+
                 if (hasDividerBeforeChildAt(i)) {
                     childTop += mDividerHeight;
                 }
@@ -1418,10 +1468,11 @@
      * @see #onLayout(boolean, int, int, int, int)
      */
     void layoutHorizontal() {
+        final boolean isLayoutRtl = isLayoutRtl();
         final int paddingTop = mPaddingTop;
 
         int childTop;
-        int childLeft = mPaddingLeft;
+        int childLeft;
         
         // Where bottom of child should go
         final int height = mBottom - mTop;
@@ -1440,25 +1491,37 @@
         final int[] maxAscent = mMaxAscent;
         final int[] maxDescent = mMaxDescent;
 
-        if (majorGravity != Gravity.LEFT) {
-            switch (majorGravity) {
-                case Gravity.RIGHT:
-                    // mTotalLength contains the padding already, we add the left
-                    // padding to compensate
-                    childLeft = mRight - mLeft + mPaddingLeft - mTotalLength;
-                    break;
+        switch (majorGravity) {
+            case Gravity.RIGHT:
+                // mTotalLength contains the padding already
+                childLeft = mPaddingLeft + mRight - mLeft - mTotalLength;
+                break;
 
-                case Gravity.CENTER_HORIZONTAL:
-                    childLeft += ((mRight - mLeft) - mTotalLength) / 2;
-                    break;
-            }
+            case Gravity.CENTER_HORIZONTAL:
+                // mTotalLength contains the padding already
+                childLeft = mPaddingLeft + (mRight - mLeft - mTotalLength) / 2;
+                break;
+
+            case Gravity.LEFT:
+            default:
+                childLeft = mPaddingLeft;
+                break;
+        }
+
+        int start = 0;
+        int dir = 1;
+        //In case of RTL, start drawing from the last child.
+        if (isLayoutRtl) {
+            start = count - 1;
+            dir = -1;
         }
 
         for (int i = 0; i < count; i++) {
-            final View child = getVirtualChildAt(i);
+            int childIndex = start + dir * i;
+            final View child = getVirtualChildAt(childIndex);
 
             if (child == null) {
-                childLeft += measureNullChild(i);
+                childLeft += measureNullChild(childIndex);
             } else if (child.getVisibility() != GONE) {
                 final int childWidth = child.getMeasuredWidth();
                 final int childHeight = child.getMeasuredHeight();
@@ -1512,7 +1575,7 @@
                         break;
                 }
 
-                if (hasDividerBeforeChildAt(i)) {
+                if (hasDividerBeforeChildAt(childIndex)) {
                     childLeft += mDividerWidth;
                 }
 
@@ -1522,7 +1585,7 @@
                 childLeft += childWidth + lp.rightMargin +
                         getNextLocationOffset(child);
 
-                i += getChildrenSkipCount(child, i);
+                i += getChildrenSkipCount(child, childIndex);
             }
         }
     }
diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java
index 1e1a043..563fc26 100644
--- a/core/java/android/widget/PopupWindow.java
+++ b/core/java/android/widget/PopupWindow.java
@@ -1171,8 +1171,7 @@
         int bottomEdge = displayFrame.bottom;
         if (ignoreBottomDecorations) {
             Resources res = anchor.getContext().getResources();
-            bottomEdge = res.getDisplayMetrics().heightPixels -
-                    (int) res.getDimension(com.android.internal.R.dimen.screen_margin_bottom);
+            bottomEdge = res.getDisplayMetrics().heightPixels;
         }
         final int distanceToBottom = bottomEdge - (anchorPos[1] + anchor.getHeight()) - yOffset;
         final int distanceToTop = anchorPos[1] - displayFrame.top + yOffset;
diff --git a/core/java/android/widget/StackView.java b/core/java/android/widget/StackView.java
index 71c91e1..c4ba7c8 100644
--- a/core/java/android/widget/StackView.java
+++ b/core/java/android/widget/StackView.java
@@ -116,7 +116,7 @@
 
     private static final int MIN_TIME_BETWEEN_INTERACTION_AND_AUTOADVANCE = 5000;
 
-    private static long MIN_TIME_BETWEEN_SCROLLS = 100;
+    private static final long MIN_TIME_BETWEEN_SCROLLS = 100;
 
     /**
      * These variables are all related to the current state of touch interaction
@@ -213,8 +213,7 @@
      * Animate the views between different relative indexes within the {@link AdapterViewAnimator}
      */
     void transformViewForTransition(int fromIndex, int toIndex, final View view, boolean animate) {
-        ObjectAnimator alphaOa = null;
-        ObjectAnimator oldAlphaOa = null;
+        ObjectAnimator alphaOa;
 
         if (!animate) {
             ((StackFrame) view).cancelSliderAnimator();
@@ -1276,13 +1275,11 @@
 
             boolean firstPass = true;
             parentRect.set(0, 0, 0, 0);
-            int depth = 0;
             while (p.getParent() != null && p.getParent() instanceof View
                     && !parentRect.contains(globalInvalidateRect)) {
                 if (!firstPass) {
                     globalInvalidateRect.offset(p.getLeft() - p.getScrollX(), p.getTop()
                             - p.getScrollY());
-                    depth++;
                 }
                 firstPass = false;
                 p = (View) p.getParent();
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index d58c72b..3875765 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -16,11 +16,6 @@
 
 package android.widget;
 
-import com.android.internal.util.FastMath;
-import com.android.internal.widget.EditableInputConnection;
-
-import org.xmlpull.v1.XmlPullParserException;
-
 import android.R;
 import android.content.ClipData;
 import android.content.ClipData.Item;
@@ -129,6 +124,11 @@
 import android.view.inputmethod.InputMethodManager;
 import android.widget.RemoteViews.RemoteView;
 
+import com.android.internal.util.FastMath;
+import com.android.internal.widget.EditableInputConnection;
+
+import org.xmlpull.v1.XmlPullParserException;
+
 import java.io.IOException;
 import java.lang.ref.WeakReference;
 import java.text.BreakIterator;
@@ -320,6 +320,7 @@
     private int mTextEditSuggestionItemLayout;
     private SuggestionsPopupWindow mSuggestionsPopupWindow;
     private SuggestionRangeSpan mSuggestionRangeSpan;
+    private boolean mSuggestionsEnabled = true;
 
     private int mCursorDrawableRes;
     private final Drawable[] mCursorDrawable = new Drawable[2];
@@ -329,7 +330,7 @@
     private Drawable mSelectHandleRight;
     private Drawable mSelectHandleCenter;
 
-    private int mLastDownPositionX, mLastDownPositionY;
+    private float mLastDownPositionX, mLastDownPositionY;
     private Callback mCustomSelectionActionModeCallback;
 
     private final int mSquaredTouchSlopDistance;
@@ -806,6 +807,10 @@
             case com.android.internal.R.styleable.TextView_textIsSelectable:
                 mTextIsSelectable = a.getBoolean(attr, false);
                 break;
+
+            case com.android.internal.R.styleable.TextView_suggestionsEnabled:
+                mSuggestionsEnabled = a.getBoolean(attr, true);
+                break;
             }
         }
         a.recycle();
@@ -2898,8 +2903,7 @@
         setText(mCharWrapper, mBufferType, false, oldlen);
     }
 
-    private static class CharWrapper
-            implements CharSequence, GetChars, GraphicsOperations {
+    private static class CharWrapper implements CharSequence, GetChars, GraphicsOperations {
         private char[] mChars;
         private int mStart, mLength;
 
@@ -7323,8 +7327,8 @@
         }
 
         if (action == MotionEvent.ACTION_DOWN) {
-            mLastDownPositionX = (int) event.getX();
-            mLastDownPositionY = (int) event.getY();
+            mLastDownPositionX = event.getX();
+            mLastDownPositionY = event.getY();
 
             // Reset this state; it will be re-set if super.onTouchEvent
             // causes focus to move to the view.
@@ -7758,16 +7762,6 @@
                 hasPrimaryClip());
     }
 
-    private boolean isWordCharacter(int c, int type) {
-        return (c == '\'' || c == '"' ||
-                type == Character.UPPERCASE_LETTER ||
-                type == Character.LOWERCASE_LETTER ||
-                type == Character.TITLECASE_LETTER ||
-                type == Character.MODIFIER_LETTER ||
-                type == Character.OTHER_LETTER || // Should handle asian characters
-                type == Character.DECIMAL_DIGIT_NUMBER);
-    }
-
     private static long packRangeInLong(int start, int end) {
         return (((long) start) << 32) | end;
     }
@@ -8140,7 +8134,7 @@
         // Long press in empty space moves cursor and shows the Paste affordance if available.
         if (!isPositionOnText(mLastDownPositionX, mLastDownPositionY) &&
                 mInsertionControllerEnabled) {
-            final int offset = getOffset(mLastDownPositionX, mLastDownPositionY);
+            final int offset = getOffsetForPosition(mLastDownPositionX, mLastDownPositionY);
             stopSelectionActionMode();
             Selection.setSelection((Spannable) mText, offset);
             getInsertionController().showWithPaste();
@@ -8208,7 +8202,7 @@
         private final ViewGroup[] mSuggestionViews = new ViewGroup[2];
         private final int[] mSuggestionViewLayouts = new int[] {
                 mTextEditSuggestionsBottomWindowLayout, mTextEditSuggestionsTopWindowLayout};
-        private WordIterator mWordIterator;
+        private WordIterator mSuggestionWordIterator;
         private TextAppearanceSpan[] mHighlightSpans = new TextAppearanceSpan[0];
 
         public SuggestionsPopupWindow() {
@@ -8344,26 +8338,27 @@
         }
 
         private long[] getWordLimits(CharSequence text) {
-            if (mWordIterator == null) mWordIterator = new WordIterator(); // TODO locale
-            mWordIterator.setCharSequence(text);
+            // TODO locale for mSuggestionWordIterator
+            if (mSuggestionWordIterator == null) mSuggestionWordIterator = new WordIterator();
+            mSuggestionWordIterator.setCharSequence(text);
 
             // First pass will simply count the number of words to be able to create an array
             // Not too expensive since previous break positions are cached by the BreakIterator
             int nbWords = 0;
-            int position = mWordIterator.following(0);
+            int position = mSuggestionWordIterator.following(0);
             while (position != BreakIterator.DONE) {
                 nbWords++;
-                position = mWordIterator.following(position);
+                position = mSuggestionWordIterator.following(position);
             }
 
             int index = 0;
             long[] result = new long[nbWords];
 
-            position = mWordIterator.following(0);
+            position = mSuggestionWordIterator.following(0);
             while (position != BreakIterator.DONE) {
-                int wordStart = mWordIterator.getBeginning(position);
+                int wordStart = mSuggestionWordIterator.getBeginning(position);
                 result[index++] = packRangeInLong(wordStart, position);
-                position = mWordIterator.following(position);
+                position = mSuggestionWordIterator.following(position);
             }
 
             return result;
@@ -8601,6 +8596,8 @@
     }
 
     void showSuggestions() {
+        if (!mSuggestionsEnabled || !isTextEditable()) return;
+
         if (mSuggestionsPopupWindow == null) {
             mSuggestionsPopupWindow = new SuggestionsPopupWindow();
         }
@@ -8615,6 +8612,31 @@
     }
 
     /**
+     * Some parts of the text can have alternate suggestion text attached. This is typically done by
+     * the IME by adding {@link SuggestionSpan}s to the text.
+     *
+     * When suggestions are enabled (default), this list of suggestions will be displayed when the
+     * user double taps on these parts of the text. No suggestions are displayed when this value is
+     * false. Use {@link #setSuggestionsEnabled(boolean)} to change this value.
+     *
+     * @return true if the suggestions popup window is enabled.
+     *
+     * @attr ref android.R.styleable#TextView_suggestionsEnabled
+     */
+    public boolean isSuggestionsEnabled() {
+        return mSuggestionsEnabled;
+    }
+
+    /**
+     * Enables or disables the suggestion popup. See {@link #isSuggestionsEnabled()}.
+     *
+     * @param enabled Whether or not suggestions are enabled.
+     */
+    public void setSuggestionsEnabled(boolean enabled) {
+        mSuggestionsEnabled = enabled;
+    }
+
+    /**
      * If provided, this ActionMode.Callback will be used to create the ActionMode when text
      * selection is initiated in this View.
      *
@@ -9115,7 +9137,7 @@
 
         public abstract void updateOffset(int offset);
 
-        public abstract void updatePosition(int x, int y);
+        public abstract void updatePosition(float x, float y);
 
         protected void positionAtCursorOffset(int offset) {
             addPositionToTouchUpFilter(offset);
@@ -9215,7 +9237,7 @@
                     final float newPosX = rawX - mTouchToWindowOffsetX + mHotspotX;
                     final float newPosY = rawY - mTouchToWindowOffsetY + mTouchOffsetY;
 
-                    updatePosition(Math.round(newPosX), Math.round(newPosY));
+                    updatePosition(newPosX, newPosY);
                     break;
                 }
 
@@ -9366,8 +9388,8 @@
         }
 
         @Override
-        public void updatePosition(int x, int y) {
-            updateOffset(getOffset(x, y));
+        public void updatePosition(float x, float y) {
+            updateOffset(getOffsetForPosition(x, y));
         }
 
         void showPastePopupWindow() {
@@ -9421,11 +9443,11 @@
         }
 
         @Override
-        public void updatePosition(int x, int y) {
+        public void updatePosition(float x, float y) {
             final int selectionStart = getSelectionStart();
             final int selectionEnd = getSelectionEnd();
 
-            int offset = getOffset(x, y);
+            int offset = getOffsetForPosition(x, y);
 
             // No need to redraw when the offset is unchanged
             if (offset == selectionStart) return;
@@ -9458,11 +9480,11 @@
         }
 
         @Override
-        public void updatePosition(int x, int y) {
+        public void updatePosition(float x, float y) {
             final int selectionStart = getSelectionStart();
             final int selectionEnd = getSelectionEnd();
 
-            int offset = getOffset(x, y);
+            int offset = getOffsetForPosition(x, y);
 
             // No need to redraw when the offset is unchanged
             if (offset == selectionEnd) return;
@@ -9560,7 +9582,7 @@
 
         // Double tap detection
         private long mPreviousTapUpTime = 0;
-        private int mPreviousTapPositionX, mPreviousTapPositionY;
+        private float mPreviousTapPositionX, mPreviousTapPositionY;
 
         SelectionModifierCursorController() {
             resetTouchOffsets();
@@ -9593,19 +9615,19 @@
             if (isTextEditable() || mTextIsSelectable) {
                 switch (event.getActionMasked()) {
                     case MotionEvent.ACTION_DOWN:
-                        final int x = (int) event.getX();
-                        final int y = (int) event.getY();
+                        final float x = event.getX();
+                        final float y = event.getY();
 
                         // Remember finger down position, to be able to start selection from there
-                        mMinTouchOffset = mMaxTouchOffset = getOffset(x, y);
+                        mMinTouchOffset = mMaxTouchOffset = getOffsetForPosition(x, y);
 
                         // Double tap detection
                         long duration = SystemClock.uptimeMillis() - mPreviousTapUpTime;
                         if (duration <= ViewConfiguration.getDoubleTapTimeout() &&
                                 isPositionOnText(x, y)) {
-                            final int deltaX = x - mPreviousTapPositionX;
-                            final int deltaY = y - mPreviousTapPositionY;
-                            final int distanceSquared = deltaX * deltaX + deltaY * deltaY;
+                            final float deltaX = x - mPreviousTapPositionX;
+                            final float deltaY = y - mPreviousTapPositionY;
+                            final float distanceSquared = deltaX * deltaX + deltaY * deltaY;
                             if (distanceSquared < mSquaredTouchSlopDistance) {
                                 showSuggestions();
                                 mDiscardNextActionUp = true;
@@ -9641,9 +9663,7 @@
         private void updateMinAndMaxOffsets(MotionEvent event) {
             int pointerCount = event.getPointerCount();
             for (int index = 0; index < pointerCount; index++) {
-                final int x = (int) event.getX(index);
-                final int y = (int) event.getY(index);
-                int offset = getOffset(x, y);
+                int offset = getOffsetForPosition(event.getX(index), event.getY(index));
                 if (offset < mMinTouchOffset) mMinTouchOffset = offset;
                 if (offset > mMaxTouchOffset) mMaxTouchOffset = offset;
             }
@@ -9701,41 +9721,40 @@
     }
 
     /**
-     * Get the offset character closest to the specified absolute position.
+     * Get the character offset closest to the specified absolute position. A typical use case is to
+     * pass the result of {@link MotionEvent#getX()} and {@link MotionEvent#getY()} to this method.
      *
      * @param x The horizontal absolute position of a point on screen
      * @param y The vertical absolute position of a point on screen
      * @return the character offset for the character whose position is closest to the specified
      *  position. Returns -1 if there is no layout.
-     *
-     * @hide
      */
-    public int getOffset(int x, int y) {
+    public int getOffsetForPosition(float x, float y) {
         if (getLayout() == null) return -1;
         final int line = getLineAtCoordinate(y);
         final int offset = getOffsetAtCoordinate(line, x);
         return offset;
     }
 
-    private int convertToLocalHorizontalCoordinate(int x) {
+    private float convertToLocalHorizontalCoordinate(float x) {
         x -= getTotalPaddingLeft();
         // Clamp the position to inside of the view.
-        x = Math.max(0, x);
+        x = Math.max(0.0f, x);
         x = Math.min(getWidth() - getTotalPaddingRight() - 1, x);
         x += getScrollX();
         return x;
     }
 
-    private int getLineAtCoordinate(int y) {
+    private int getLineAtCoordinate(float y) {
         y -= getTotalPaddingTop();
         // Clamp the position to inside of the view.
-        y = Math.max(0, y);
+        y = Math.max(0.0f, y);
         y = Math.min(getHeight() - getTotalPaddingBottom() - 1, y);
         y += getScrollY();
-        return getLayout().getLineForVertical(y);
+        return getLayout().getLineForVertical((int) y);
     }
 
-    private int getOffsetAtCoordinate(int line, int x) {
+    private int getOffsetAtCoordinate(int line, float x) {
         x = convertToLocalHorizontalCoordinate(x);
         return getLayout().getOffsetForHorizontal(line, x);
     }
@@ -9743,7 +9762,7 @@
     /** Returns true if the screen coordinates position (x,y) corresponds to a character displayed
      * in the view. Returns false when the position is in the empty space of left/right of text.
      */
-    private boolean isPositionOnText(int x, int y) {
+    private boolean isPositionOnText(float x, float y) {
         if (getLayout() == null) return false;
 
         final int line = getLineAtCoordinate(y);
@@ -9765,7 +9784,7 @@
                 return true;
 
             case DragEvent.ACTION_DRAG_LOCATION:
-                final int offset = getOffset((int) event.getX(), (int) event.getY());
+                final int offset = getOffsetForPosition(event.getX(), event.getY());
                 Selection.setSelection((Spannable)mText, offset);
                 return true;
 
@@ -9789,7 +9808,7 @@
             content.append(item.coerceToText(TextView.this.mContext));
         }
 
-        final int offset = getOffset((int) event.getX(), (int) event.getY());
+        final int offset = getOffsetForPosition(event.getX(), event.getY());
 
         Object localState = event.getLocalState();
         DragLocalState dragLocalState = null;
diff --git a/core/java/com/android/internal/app/ActionBarImpl.java b/core/java/com/android/internal/app/ActionBarImpl.java
index 1e576ce..183cfbd 100644
--- a/core/java/com/android/internal/app/ActionBarImpl.java
+++ b/core/java/com/android/internal/app/ActionBarImpl.java
@@ -16,25 +16,27 @@
 
 package com.android.internal.app;
 
+import com.android.internal.R;
 import com.android.internal.view.menu.MenuBuilder;
 import com.android.internal.view.menu.MenuPopupHelper;
 import com.android.internal.view.menu.SubMenuBuilder;
-import com.android.internal.widget.AbsActionBarView;
 import com.android.internal.widget.ActionBarContainer;
 import com.android.internal.widget.ActionBarContextView;
 import com.android.internal.widget.ActionBarView;
+import com.android.internal.widget.ScrollingTabContainerView;
 
 import android.animation.Animator;
 import android.animation.Animator.AnimatorListener;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
-import android.animation.TimeInterpolator;
 import android.app.ActionBar;
 import android.app.Activity;
 import android.app.Dialog;
 import android.app.FragmentTransaction;
 import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.TypedArray;
 import android.graphics.drawable.Drawable;
 import android.os.Handler;
 import android.view.ActionMode;
@@ -43,10 +45,7 @@
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
-import android.view.ViewGroup;
 import android.view.Window;
-import android.view.animation.DecelerateInterpolator;
-import android.widget.HorizontalScrollView;
 import android.widget.SpinnerAdapter;
 
 import java.lang.ref.WeakReference;
@@ -71,7 +70,7 @@
     private ActionBarContextView mContextView;
     private ActionBarContainer mSplitView;
     private View mContentView;
-    private ViewGroup mExternalTabView;
+    private ScrollingTabContainerView mTabScrollView;
 
     private ArrayList<TabImpl> mTabs = new ArrayList<TabImpl>();
 
@@ -90,16 +89,17 @@
     private static final int INVALID_POSITION = -1;
 
     private int mContextDisplayMode;
+    private boolean mHasEmbeddedTabs;
+    private int mContentHeight;
 
     final Handler mHandler = new Handler();
+    Runnable mTabSelector;
 
     private Animator mCurrentShowAnim;
     private Animator mCurrentModeAnim;
     private boolean mShowHideAnimationEnabled;
     boolean mWasHiddenBeforeMode;
 
-    private static final TimeInterpolator sFadeOutInterpolator = new DecelerateInterpolator();
-
     final AnimatorListener mHideListener = new AnimatorListenerAdapter() {
         @Override
         public void onAnimationEnd(Animator animation) {
@@ -150,21 +150,59 @@
                     "with a compatible window decor layout");
         }
 
+        mHasEmbeddedTabs = mContext.getResources().getBoolean(
+                com.android.internal.R.bool.action_bar_embed_tabs);
         mActionView.setContextView(mContextView);
         mContextDisplayMode = mActionView.isSplitActionBar() ?
                 CONTEXT_DISPLAY_SPLIT : CONTEXT_DISPLAY_NORMAL;
 
-        if (!mActionView.hasEmbeddedTabs()) {
-            HorizontalScrollView tabScroller = new HorizontalScrollView(mContext);
-            ViewGroup tabContainer = mActionView.createTabContainer();
-            tabScroller.setHorizontalFadingEdgeEnabled(true);
-            tabScroller.addView(tabContainer);
+        TypedArray a = mContext.obtainStyledAttributes(null, R.styleable.ActionBar);
+        mContentHeight = a.getLayoutDimension(R.styleable.ActionBar_height, 0);
+        a.recycle();
+    }
+
+    public void onConfigurationChanged(Configuration newConfig) {
+        mHasEmbeddedTabs = mContext.getResources().getBoolean(
+                com.android.internal.R.bool.action_bar_embed_tabs);
+
+        // Switch tab layout configuration if needed
+        if (!mHasEmbeddedTabs) {
+            mActionView.setEmbeddedTabView(null);
+            mContainerView.setTabContainer(mTabScrollView);
+        } else {
+            mContainerView.setTabContainer(null);
+            if (mTabScrollView != null) {
+                mTabScrollView.setVisibility(View.VISIBLE);
+            }
+            mActionView.setEmbeddedTabView(mTabScrollView);
+        }
+
+        TypedArray a = mContext.obtainStyledAttributes(null, R.styleable.ActionBar);
+        mContentHeight = a.getLayoutDimension(R.styleable.ActionBar_height, 0);
+        a.recycle();
+
+        if (mTabScrollView != null) {
+            mTabScrollView.getLayoutParams().height = mContentHeight;
+            mTabScrollView.requestLayout();
+        }
+    }
+
+    private void ensureTabsExist() {
+        if (mTabScrollView != null) {
+            return;
+        }
+
+        ScrollingTabContainerView tabScroller = mActionView.createTabContainer();
+
+        if (mHasEmbeddedTabs) {
+            tabScroller.setVisibility(View.VISIBLE);
+            mActionView.setEmbeddedTabView(tabScroller);
+        } else {
             tabScroller.setVisibility(getNavigationMode() == NAVIGATION_MODE_TABS ?
                     View.VISIBLE : View.GONE);
-            mActionView.setExternalTabLayout(tabContainer);
             mContainerView.setTabContainer(tabScroller);
-            mExternalTabView = tabScroller;
         }
+        mTabScrollView = tabScroller;
     }
 
     /**
@@ -269,7 +307,7 @@
             selectTab(null);
         }
         mTabs.clear();
-        mActionView.removeAllTabs();
+        mTabScrollView.removeAllTabs();
         mSavedTabPosition = INVALID_POSITION;
     }
 
@@ -365,7 +403,8 @@
 
     @Override
     public void addTab(Tab tab, boolean setSelected) {
-        mActionView.addTab(tab, setSelected);
+        ensureTabsExist();
+        mTabScrollView.addTab(tab, setSelected);
         configureTab(tab, mTabs.size());
         if (setSelected) {
             selectTab(tab);
@@ -374,7 +413,8 @@
 
     @Override
     public void addTab(Tab tab, int position, boolean setSelected) {
-        mActionView.addTab(tab, position, setSelected);
+        ensureTabsExist();
+        mTabScrollView.addTab(tab, position, setSelected);
         configureTab(tab, position);
         if (setSelected) {
             selectTab(tab);
@@ -393,9 +433,14 @@
 
     @Override
     public void removeTabAt(int position) {
+        if (mTabScrollView == null) {
+            // No tabs around to remove
+            return;
+        }
+
         int selectedTabPosition = mSelectedTab != null
                 ? mSelectedTab.getPosition() : mSavedTabPosition;
-        mActionView.removeTabAt(position);
+        mTabScrollView.removeTabAt(position);
         TabImpl removedTab = mTabs.remove(position);
         if (removedTab != null) {
             removedTab.setPosition(-1);
@@ -424,9 +469,10 @@
         if (mSelectedTab == tab) {
             if (mSelectedTab != null) {
                 mSelectedTab.getCallback().onTabReselected(mSelectedTab, trans);
+                mTabScrollView.animateToTab(tab.getPosition());
             }
         } else {
-            mActionView.setTabSelected(tab != null ? tab.getPosition() : Tab.INVALID_POSITION);
+            mTabScrollView.setTabSelected(tab != null ? tab.getPosition() : Tab.INVALID_POSITION);
             if (mSelectedTab != null) {
                 mSelectedTab.getCallback().onTabUnselected(mSelectedTab, trans);
             }
@@ -705,7 +751,9 @@
         @Override
         public Tab setCustomView(View view) {
             mCustomView = view;
-            if (mPosition >= 0) mActionView.updateTab(mPosition);
+            if (mPosition >= 0) {
+                mTabScrollView.updateTab(mPosition);
+            }
             return this;
         }
 
@@ -736,7 +784,9 @@
         @Override
         public Tab setIcon(Drawable icon) {
             mIcon = icon;
-            if (mPosition >= 0) mActionView.updateTab(mPosition);
+            if (mPosition >= 0) {
+                mTabScrollView.updateTab(mPosition);
+            }
             return this;
         }
 
@@ -748,7 +798,9 @@
         @Override
         public Tab setText(CharSequence text) {
             mText = text;
-            if (mPosition >= 0) mActionView.updateTab(mPosition);
+            if (mPosition >= 0) {
+                mTabScrollView.updateTab(mPosition);
+            }
             return this;
         }
 
@@ -818,15 +870,16 @@
                 mSavedTabPosition = getSelectedNavigationIndex();
                 selectTab(null);
                 if (!mActionView.hasEmbeddedTabs()) {
-                    mExternalTabView.setVisibility(View.GONE);
+                    mTabScrollView.setVisibility(View.GONE);
                 }
                 break;
         }
         mActionView.setNavigationMode(mode);
         switch (mode) {
             case NAVIGATION_MODE_TABS:
+                ensureTabsExist();
                 if (!mActionView.hasEmbeddedTabs()) {
-                    mExternalTabView.setVisibility(View.VISIBLE);
+                    mTabScrollView.setVisibility(View.VISIBLE);
                 }
                 if (mSavedTabPosition != INVALID_POSITION) {
                     setSelectedNavigationItem(mSavedTabPosition);
diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java
index 0f086f6..5e9cd23 100644
--- a/core/java/com/android/internal/os/RuntimeInit.java
+++ b/core/java/com/android/internal/os/RuntimeInit.java
@@ -32,7 +32,6 @@
 
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.logging.LogManager;
 import java.util.TimeZone;
 
@@ -45,6 +44,7 @@
  */
 public class RuntimeInit {
     private final static String TAG = "AndroidRuntime";
+    private final static boolean DEBUG = false;
 
     /** true if commonInit() has been called */
     private static boolean initialized;
@@ -89,14 +89,14 @@
     }
 
     private static final void commonInit() {
-        if (false) Slog.d(TAG, "Entered RuntimeInit!");
+        if (DEBUG) Slog.d(TAG, "Entered RuntimeInit!");
 
         /* set default handler; this applies to all threads in the VM */
         Thread.setDefaultUncaughtExceptionHandler(new UncaughtHandler());
 
         int hasQwerty = getQwertyKeyboard();
 
-        if (false) Slog.d(TAG, ">>>>> qwerty keyboard = " + hasQwerty);
+        if (DEBUG) Slog.d(TAG, ">>>>> qwerty keyboard = " + hasQwerty);
         if (hasQwerty == 1) {
             System.setProperty("qwerty", "1");
         }
@@ -183,11 +183,6 @@
      */
     private static void invokeStaticMain(String className, String[] argv)
             throws ZygoteInit.MethodAndArgsCaller {
-
-        // We want to be fairly aggressive about heap utilization, to avoid
-        // holding on to a lot of memory that isn't needed.
-        VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
-
         Class<?> cl;
 
         try {
@@ -225,6 +220,13 @@
     }
 
     public static final void main(String[] argv) {
+        if (argv.length == 2 && argv[1].equals("application")) {
+            if (DEBUG) Slog.d(TAG, "RuntimeInit: Starting application");
+            redirectLogStreams();
+        } else {
+            if (DEBUG) Slog.d(TAG, "RuntimeInit: Starting tool");
+        }
+
         commonInit();
 
         /*
@@ -233,7 +235,7 @@
          */
         finishInit();
 
-        if (false) Slog.d(TAG, "Leaving RuntimeInit!");
+        if (DEBUG) Slog.d(TAG, "Leaving RuntimeInit!");
     }
 
     public static final native void finishInit();
@@ -245,7 +247,6 @@
      *
      * Current recognized args:
      * <ul>
-     *   <li> --nice-name=<i>nice name to appear in ps</i>
      *   <li> <code> [--] &lt;start class name&gt;  &lt;args&gt;
      * </ul>
      *
@@ -253,45 +254,60 @@
      */
     public static final void zygoteInit(String[] argv)
             throws ZygoteInit.MethodAndArgsCaller {
-        // TODO: Doing this here works, but it seems kind of arbitrary. Find
-        // a better place. The goal is to set it up for applications, but not
-        // tools like am.
-        System.out.close();
-        System.setOut(new AndroidPrintStream(Log.INFO, "System.out"));
-        System.err.close();
-        System.setErr(new AndroidPrintStream(Log.WARN, "System.err"));
+        if (DEBUG) Slog.d(TAG, "RuntimeInit: Starting application from zygote");
+
+        redirectLogStreams();
 
         commonInit();
         zygoteInitNative();
 
-        int curArg = 0;
-        for ( /* curArg */ ; curArg < argv.length; curArg++) {
-            String arg = argv[curArg];
+        applicationInit(argv);
+    }
 
-            if (arg.equals("--")) {
-                curArg++;
-                break;
-            } else if (!arg.startsWith("--")) {
-                break;
-            } else if (arg.startsWith("--nice-name=")) {
-                String niceName = arg.substring(arg.indexOf('=') + 1);
-                Process.setArgV0(niceName);
-            }
-        }
+    /**
+     * The main function called when an application is started through a
+     * wrapper process.
+     *
+     * When the wrapper starts, the runtime starts {@link RuntimeInit#main}
+     * which calls {@link WrapperInit#main} which then calls this method.
+     * So we don't need to call commonInit() here.
+     *
+     * @param argv arg strings
+     */
+    public static void wrapperInit(String[] argv)
+            throws ZygoteInit.MethodAndArgsCaller {
+        if (DEBUG) Slog.d(TAG, "RuntimeInit: Starting application from wrapper");
 
-        if (curArg == argv.length) {
-            Slog.e(TAG, "Missing classname argument to RuntimeInit!");
+        applicationInit(argv);
+    }
+
+    private static void applicationInit(String[] argv)
+            throws ZygoteInit.MethodAndArgsCaller {
+        // We want to be fairly aggressive about heap utilization, to avoid
+        // holding on to a lot of memory that isn't needed.
+        VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
+
+        final Arguments args;
+        try {
+            args = new Arguments(argv);
+        } catch (IllegalArgumentException ex) {
+            Slog.e(TAG, ex.getMessage());
             // let the process exit
             return;
         }
 
         // Remaining arguments are passed to the start class's static main
+        invokeStaticMain(args.startClass, args.startArgs);
+    }
 
-        String startClass = argv[curArg++];
-        String[] startArgs = new String[argv.length - curArg];
-
-        System.arraycopy(argv, curArg, startArgs, 0, startArgs.length);
-        invokeStaticMain(startClass, startArgs);
+    /**
+     * Redirect System.out and System.err to the Android log.
+     */
+    public static void redirectLogStreams() {
+        System.out.close();
+        System.setOut(new AndroidPrintStream(Log.INFO, "System.out"));
+        System.err.close();
+        System.setErr(new AndroidPrintStream(Log.WARN, "System.err"));
     }
 
     public static final native void zygoteInitNative();
@@ -351,4 +367,55 @@
         // Register handlers for DDM messages.
         android.ddm.DdmRegister.registerHandlers();
     }
+
+    /**
+     * Handles argument parsing for args related to the runtime.
+     *
+     * Current recognized args:
+     * <ul>
+     *   <li> <code> [--] &lt;start class name&gt;  &lt;args&gt;
+     * </ul>
+     */
+    static class Arguments {
+        /** first non-option argument */
+        String startClass;
+
+        /** all following arguments */
+        String[] startArgs;
+
+        /**
+         * Constructs instance and parses args
+         * @param args runtime command-line args
+         * @throws IllegalArgumentException
+         */
+        Arguments(String args[]) throws IllegalArgumentException {
+            parseArgs(args);
+        }
+
+        /**
+         * Parses the commandline arguments intended for the Runtime.
+         */
+        private void parseArgs(String args[])
+                throws IllegalArgumentException {
+            int curArg = 0;
+            for (; curArg < args.length; curArg++) {
+                String arg = args[curArg];
+
+                if (arg.equals("--")) {
+                    curArg++;
+                    break;
+                } else if (!arg.startsWith("--")) {
+                    break;
+                }
+            }
+
+            if (curArg == args.length) {
+                throw new IllegalArgumentException("Missing classname argument to RuntimeInit!");
+            }
+
+            startClass = args[curArg++];
+            startArgs = new String[args.length - curArg];
+            System.arraycopy(args, curArg, startArgs, 0, startArgs.length);
+        }
+    }
 }
diff --git a/core/java/com/android/internal/os/WrapperInit.java b/core/java/com/android/internal/os/WrapperInit.java
new file mode 100644
index 0000000..18d6caa
--- /dev/null
+++ b/core/java/com/android/internal/os/WrapperInit.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2011 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 com.android.internal.os;
+
+import android.os.Process;
+import android.util.Slog;
+
+import java.io.DataOutputStream;
+import java.io.FileDescriptor;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import libcore.io.IoUtils;
+import libcore.io.Libcore;
+
+import dalvik.system.Zygote;
+
+/**
+ * Startup class for the wrapper process.
+ * @hide
+ */
+public class WrapperInit {
+    private final static String TAG = "AndroidRuntime";
+
+    /**
+     * Class not instantiable.
+     */
+    private WrapperInit() {
+    }
+
+    /**
+     * The main function called when starting a runtime application through a
+     * wrapper process instead of by forking Zygote.
+     *
+     * The first argument specifies the file descriptor for a pipe that should receive
+     * the pid of this process, or 0 if none.  The remaining arguments are passed to
+     * the runtime.
+     *
+     * @param args The command-line arguments.
+     */
+    public static void main(String[] args) {
+        try {
+            int fdNum = Integer.parseInt(args[0], 10);
+            if (fdNum != 0) {
+                try {
+                    FileDescriptor fd = ZygoteInit.createFileDescriptor(fdNum);
+                    DataOutputStream os = new DataOutputStream(new FileOutputStream(fd));
+                    os.writeInt(Process.myPid());
+                    os.close();
+                    IoUtils.closeQuietly(fd);
+                } catch (IOException ex) {
+                    Slog.d(TAG, "Could not write pid of wrapped process to Zygote pipe.", ex);
+                }
+            }
+
+            String[] runtimeArgs = new String[args.length - 1];
+            System.arraycopy(args, 1, runtimeArgs, 0, runtimeArgs.length);
+            RuntimeInit.wrapperInit(runtimeArgs);
+        } catch (ZygoteInit.MethodAndArgsCaller caller) {
+            caller.run();
+        }
+    }
+
+    /**
+     * Executes a runtime application with a wrapper command.
+     * This method never returns.
+     *
+     * @param invokeWith The wrapper command.
+     * @param niceName The nice name for the application, or null if none.
+     * @param pipeFd The pipe to which the application's pid should be written, or null if none.
+     * @param args Arguments for {@link RuntimeInit.main}.
+     */
+    public static void execApplication(String invokeWith, String niceName,
+            FileDescriptor pipeFd, String[] args) {
+        StringBuilder command = new StringBuilder(invokeWith);
+        command.append(" /system/bin/app_process /system/bin --application");
+        if (niceName != null) {
+            command.append(" '--nice-name=").append(niceName).append("'");
+        }
+        command.append(" com.android.internal.os.WrapperInit ");
+        command.append(pipeFd != null ? pipeFd.getInt$() : 0);
+        Zygote.appendQuotedShellArgs(command, args);
+        Zygote.execShell(command.toString());
+    }
+
+    /**
+     * Executes a standalone application with a wrapper command.
+     * This method never returns.
+     *
+     * @param invokeWith The wrapper command.
+     * @param classPath The class path.
+     * @param className The class name to invoke.
+     * @param args Arguments for the main() method of the specified class.
+     */
+    public static void execStandalone(String invokeWith, String classPath, String className,
+            String[] args) {
+        StringBuilder command = new StringBuilder(invokeWith);
+        command.append(" /system/bin/dalvikvm -classpath '").append(classPath);
+        command.append("' ").append(className);
+        Zygote.appendQuotedShellArgs(command, args);
+        Zygote.execShell(command.toString());
+    }
+}
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index c473fd2..b872e22 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -26,14 +26,20 @@
 import dalvik.system.Zygote;
 
 import java.io.BufferedReader;
+import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.FileDescriptor;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.PrintStream;
 import java.util.ArrayList;
 
+import libcore.io.ErrnoException;
+import libcore.io.IoUtils;
+import libcore.io.Libcore;
+
 /**
  * A connection that can make spawn requests.
  */
@@ -193,15 +199,20 @@
                     new FileOutputStream(descriptors[2]));
         }
 
-        int pid;
+        int pid = -1;
+        FileDescriptor childPipeFd = null;
+        FileDescriptor serverPipeFd = null;
 
         try {
             parsedArgs = new Arguments(args);
 
             applyUidSecurityPolicy(parsedArgs, peer);
-            applyDebuggerSecurityPolicy(parsedArgs);
             applyRlimitSecurityPolicy(parsedArgs, peer);
             applyCapabilitiesSecurityPolicy(parsedArgs, peer);
+            applyInvokeWithSecurityPolicy(parsedArgs, peer);
+
+            applyDebuggerSystemProperty(parsedArgs);
+            applyInvokeWithSystemProperty(parsedArgs);
 
             int[][] rlimits = null;
 
@@ -209,25 +220,45 @@
                 rlimits = parsedArgs.rlimits.toArray(intArray2d);
             }
 
+            if (parsedArgs.runtimeInit && parsedArgs.invokeWith != null) {
+                FileDescriptor[] pipeFds = Libcore.os.pipe();
+                childPipeFd = pipeFds[1];
+                serverPipeFd = pipeFds[0];
+                ZygoteInit.setCloseOnExec(serverPipeFd, true);
+            }
+
             pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid,
                     parsedArgs.gids, parsedArgs.debugFlags, rlimits);
+        } catch (IOException ex) {
+            logAndPrintError(newStderr, "Exception creating pipe", ex);
+        } catch (ErrnoException ex) {
+            logAndPrintError(newStderr, "Exception creating pipe", ex);
         } catch (IllegalArgumentException ex) {
-            logAndPrintError (newStderr, "Invalid zygote arguments", ex);
-            pid = -1;
+            logAndPrintError(newStderr, "Invalid zygote arguments", ex);
         } catch (ZygoteSecurityException ex) {
             logAndPrintError(newStderr,
                     "Zygote security policy prevents request: ", ex);
-            pid = -1;
         }
 
-        if (pid == 0) {
-            // in child
-            handleChildProc(parsedArgs, descriptors, newStderr);
-            // should never happen
-            return true;
-        } else { /* pid != 0 */
-            // in parent...pid of < 0 means failure
-            return handleParentProc(pid, descriptors, parsedArgs);
+        try {
+            if (pid == 0) {
+                // in child
+                IoUtils.closeQuietly(serverPipeFd);
+                serverPipeFd = null;
+                handleChildProc(parsedArgs, descriptors, childPipeFd, newStderr);
+
+                // should never get here, the child is expected to either
+                // throw ZygoteInit.MethodAndArgsCaller or exec().
+                return true;
+            } else {
+                // in parent...pid of < 0 means failure
+                IoUtils.closeQuietly(childPipeFd);
+                childPipeFd = null;
+                return handleParentProc(pid, descriptors, serverPipeFd, parsedArgs);
+            }
+        } finally {
+            IoUtils.closeQuietly(childPipeFd);
+            IoUtils.closeQuietly(serverPipeFd);
         }
     }
 
@@ -244,8 +275,8 @@
     }
 
     /**
-     * Handles argument parsing for args related to the zygote spawner.<p>
-
+     * Handles argument parsing for args related to the zygote spawner.
+     *
      * Current recognized args:
      * <ul>
      *   <li> --setuid=<i>uid of child process, defaults to 0</i>
@@ -274,6 +305,7 @@
      * be handed off to com.android.internal.os.RuntimeInit, rather than
      * processed directly
      * Android runtime startup (eg, Binder initialization) is also eschewed.
+     *   <li> --nice-name=<i>nice name to appear in ps</i>
      *   <li> If <code>--runtime-init</code> is present:
      *      [--] &lt;args for RuntimeInit &gt;
      *   <li> If <code>--runtime-init</code> is absent:
@@ -307,6 +339,9 @@
         /** from --runtime-init */
         boolean runtimeInit;
 
+        /** from --nice-name */
+        String niceName;
+
         /** from --capabilities */
         boolean capabilitiesSpecified;
         long permittedCapabilities;
@@ -315,6 +350,9 @@
         /** from all --rlimit=r,c,m */
         ArrayList<int[]> rlimits;
 
+        /** from --invoke-with */
+        String invokeWith;
+
         /**
          * Any args after and including the first non-option arg
          * (or after a '--')
@@ -438,6 +476,23 @@
                     for (int i = params.length - 1; i >= 0 ; i--) {
                         gids[i] = Integer.parseInt(params[i]);
                     }
+                } else if (arg.equals("--invoke-with")) {
+                    if (invokeWith != null) {
+                        throw new IllegalArgumentException(
+                                "Duplicate arg specified");
+                    }
+                    try {
+                        invokeWith = args[++curArg];
+                    } catch (IndexOutOfBoundsException ex) {
+                        throw new IllegalArgumentException(
+                                "--invoke-with requires argument");
+                    }
+                } else if (arg.startsWith("--nice-name=")) {
+                    if (niceName != null) {
+                        throw new IllegalArgumentException(
+                                "Duplicate arg specified");
+                    }
+                    niceName = arg.substring(arg.indexOf('=') + 1);
                 } else {
                     break;
                 }
@@ -567,14 +622,15 @@
 
 
     /**
-     * Applies debugger security policy.
+     * Applies debugger system properties to the zygote arguments.
+     *
      * If "ro.debuggable" is "1", all apps are debuggable. Otherwise,
      * the debugger state is specified via the "--enable-debugger" flag
      * in the spawn request.
      *
      * @param args non-null; zygote spawner args
      */
-    private static void applyDebuggerSecurityPolicy(Arguments args) {
+    public static void applyDebuggerSystemProperty(Arguments args) {
         if ("1".equals(SystemProperties.get("ro.debuggable"))) {
             args.debugFlags |= Zygote.DEBUG_ENABLE_DEBUGGER;
         }
@@ -664,12 +720,56 @@
     }
 
     /**
+     * Applies zygote security policy.
+     * Based on the credentials of the process issuing a zygote command:
+     * <ol>
+     * <li> uid 0 (root) may specify --invoke-with to launch Zygote with a
+     * wrapper command.
+     * <li> Any other uid may not specify any invoke-with argument.
+     * </ul>
+     *
+     * @param args non-null; zygote spawner arguments
+     * @param peer non-null; peer credentials
+     * @throws ZygoteSecurityException
+     */
+    private static void applyInvokeWithSecurityPolicy(Arguments args, Credentials peer)
+            throws ZygoteSecurityException {
+        int peerUid = peer.getUid();
+
+        if (args.invokeWith != null && peerUid != 0) {
+            throw new ZygoteSecurityException("Peer is not permitted to specify "
+                    + "an explicit invoke-with wrapper command");
+        }
+    }
+
+    /**
+     * Applies invoke-with system properties to the zygote arguments.
+     *
+     * @param parsedArgs non-null; zygote args
+     */
+    public static void applyInvokeWithSystemProperty(Arguments args) {
+        if (args.invokeWith == null && args.niceName != null) {
+            if (args.niceName != null) {
+                String property = "wrap." + args.niceName;
+                if (property.length() > 31) {
+                    property = property.substring(0, 31);
+                }
+                args.invokeWith = SystemProperties.get(property);
+                if (args.invokeWith != null && args.invokeWith.length() == 0) {
+                    args.invokeWith = null;
+                }
+            }
+        }
+    }
+
+    /**
      * Handles post-fork setup of child proc, closing sockets as appropriate,
      * reopen stdio as appropriate, and ultimately throwing MethodAndArgsCaller
      * if successful or returning if failed.
      *
      * @param parsedArgs non-null; zygote args
      * @param descriptors null-ok; new file descriptors for stdio if available.
+     * @param pipeFd null-ok; pipe for communication back to Zygote.
      * @param newStderr null-ok; stream to use for stderr until stdio
      * is reopened.
      *
@@ -677,7 +777,7 @@
      * trampoline to code that invokes static main.
      */
     private void handleChildProc(Arguments parsedArgs,
-            FileDescriptor[] descriptors, PrintStream newStderr)
+            FileDescriptor[] descriptors, FileDescriptor pipeFd, PrintStream newStderr)
             throws ZygoteInit.MethodAndArgsCaller {
 
         /*
@@ -704,7 +804,7 @@
                         descriptors[1], descriptors[2]);
 
                 for (FileDescriptor fd: descriptors) {
-                    ZygoteInit.closeDescriptor(fd);
+                    IoUtils.closeQuietly(fd);
                 }
                 newStderr = System.err;
             } catch (IOException ex) {
@@ -712,37 +812,48 @@
             }
         }
 
+        if (parsedArgs.niceName != null) {
+            Process.setArgV0(parsedArgs.niceName);
+        }
+
         if (parsedArgs.runtimeInit) {
-            RuntimeInit.zygoteInit(parsedArgs.remainingArgs);
-        } else {
-            ClassLoader cloader;
-
-            if (parsedArgs.classpath != null) {
-                cloader
-                    = new PathClassLoader(parsedArgs.classpath,
-                    ClassLoader.getSystemClassLoader());
+            if (parsedArgs.invokeWith != null) {
+                WrapperInit.execApplication(parsedArgs.invokeWith,
+                        parsedArgs.niceName, pipeFd, parsedArgs.remainingArgs);
             } else {
-                cloader = ClassLoader.getSystemClassLoader();
+                RuntimeInit.zygoteInit(parsedArgs.remainingArgs);
             }
-
+        } else {
             String className;
             try {
                 className = parsedArgs.remainingArgs[0];
             } catch (ArrayIndexOutOfBoundsException ex) {
-                logAndPrintError (newStderr,
+                logAndPrintError(newStderr,
                         "Missing required class name argument", null);
                 return;
             }
-            String[] mainArgs
-                    = new String[parsedArgs.remainingArgs.length - 1];
 
+            String[] mainArgs = new String[parsedArgs.remainingArgs.length - 1];
             System.arraycopy(parsedArgs.remainingArgs, 1,
                     mainArgs, 0, mainArgs.length);
 
-            try {
-                ZygoteInit.invokeStaticMain(cloader, className, mainArgs);
-            } catch (RuntimeException ex) {
-                logAndPrintError (newStderr, "Error starting. ", ex);
+            if (parsedArgs.invokeWith != null) {
+                WrapperInit.execStandalone(parsedArgs.invokeWith,
+                        parsedArgs.classpath, className, mainArgs);
+            } else {
+                ClassLoader cloader;
+                if (parsedArgs.classpath != null) {
+                    cloader = new PathClassLoader(parsedArgs.classpath,
+                            ClassLoader.getSystemClassLoader());
+                } else {
+                    cloader = ClassLoader.getSystemClassLoader();
+                }
+
+                try {
+                    ZygoteInit.invokeStaticMain(cloader, className, mainArgs);
+                } catch (RuntimeException ex) {
+                    logAndPrintError(newStderr, "Error starting.", ex);
+                }
             }
         }
     }
@@ -754,36 +865,54 @@
      * if &lt; 0;
      * @param descriptors null-ok; file descriptors for child's new stdio if
      * specified.
+     * @param pipeFd null-ok; pipe for communication with child.
      * @param parsedArgs non-null; zygote args
      * @return true for "exit command loop" and false for "continue command
      * loop"
      */
     private boolean handleParentProc(int pid,
-            FileDescriptor[] descriptors, Arguments parsedArgs) {
+            FileDescriptor[] descriptors, FileDescriptor pipeFd, Arguments parsedArgs) {
 
-        if(pid > 0) {
-            // Try to move the new child into the peer's process group.
-            try {
-                ZygoteInit.setpgid(pid, ZygoteInit.getpgid(peer.getPid()));
-            } catch (IOException ex) {
-                // This exception is expected in the case where
-                // the peer is not in our session
-                // TODO get rid of this log message in the case where
-                // getsid(0) != getsid(peer.getPid())
-                Log.i(TAG, "Zygote: setpgid failed. This is "
-                    + "normal if peer is not in our session");
+        if (pid > 0) {
+            setChildPgid(pid);
+        }
+
+        if (descriptors != null) {
+            for (FileDescriptor fd: descriptors) {
+                IoUtils.closeQuietly(fd);
             }
         }
 
-        try {
-            if (descriptors != null) {
-                for (FileDescriptor fd: descriptors) {
-                    ZygoteInit.closeDescriptor(fd);
+        if (pipeFd != null && pid > 0) {
+            DataInputStream is = new DataInputStream(new FileInputStream(pipeFd));
+            int innerPid = -1;
+            try {
+                innerPid = is.readInt();
+            } catch (IOException ex) {
+                Log.w(TAG, "Error reading pid from wrapped process, child may have died", ex);
+            } finally {
+                try {
+                    is.close();
+                } catch (IOException ex) {
                 }
             }
-        } catch (IOException ex) {
-            Log.e(TAG, "Error closing passed descriptors in "
-                    + "parent process", ex);
+
+            // Ensure that the pid reported by the wrapped process is either the
+            // child process that we forked, or a descendant of it.
+            if (innerPid > 0) {
+                int parentPid = innerPid;
+                while (parentPid > 0 && parentPid != pid) {
+                    parentPid = Process.getParentPid(parentPid);
+                }
+                if (parentPid > 0) {
+                    Log.i(TAG, "Wrapped process has pid " + innerPid);
+                    pid = innerPid;
+                } else {
+                    Log.w(TAG, "Wrapped process reported a pid that is not a child of "
+                            + "the process that we forked: childPid=" + pid
+                            + " innerPid=" + innerPid);
+                }
+            }
         }
 
         try {
@@ -808,6 +937,20 @@
         return false;
     }
 
+    private void setChildPgid(int pid) {
+        // Try to move the new child into the peer's process group.
+        try {
+            ZygoteInit.setpgid(pid, ZygoteInit.getpgid(peer.getPid()));
+        } catch (IOException ex) {
+            // This exception is expected in the case where
+            // the peer is not in our session
+            // TODO get rid of this log message in the case where
+            // getsid(0) != getsid(peer.getPid())
+            Log.i(TAG, "Zygote: setpgid failed. This is "
+                + "normal if peer is not in our session");
+        }
+    }
+
     /**
      * Logs an error message and prints it to the specified stream, if
      * provided
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index fbe66e5..157c0bf 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -23,6 +23,7 @@
 import android.net.LocalServerSocket;
 import android.os.Debug;
 import android.os.FileUtils;
+import android.os.Process;
 import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.util.EventLog;
@@ -68,7 +69,7 @@
     private static final int PRELOAD_GC_THRESHOLD = 50000;
 
     public static final String USAGE_STRING =
-            " <\"true\"|\"false\" for startSystemServer>";
+            " <\"start-system-server\"|\"\" for startSystemServer>";
 
     private static LocalServerSocket sServerSocket;
 
@@ -441,11 +442,20 @@
         // set umask to 0077 so new files and directories will default to owner-only permissions.
         FileUtils.setUMask(FileUtils.S_IRWXG | FileUtils.S_IRWXO);
 
-        /*
-         * Pass the remaining arguments to SystemServer.
-         * "--nice-name=system_server com.android.server.SystemServer"
-         */
-        RuntimeInit.zygoteInit(parsedArgs.remainingArgs);
+        if (parsedArgs.niceName != null) {
+            Process.setArgV0(parsedArgs.niceName);
+        }
+
+        if (parsedArgs.invokeWith != null) {
+            WrapperInit.execApplication(parsedArgs.invokeWith,
+                    parsedArgs.niceName, null, parsedArgs.remainingArgs);
+        } else {
+            /*
+             * Pass the remaining arguments to SystemServer.
+             */
+            RuntimeInit.zygoteInit(parsedArgs.remainingArgs);
+        }
+
         /* should never reach here */
     }
 
@@ -470,20 +480,13 @@
 
         try {
             parsedArgs = new ZygoteConnection.Arguments(args);
-
-            /*
-             * Enable debugging of the system process if *either* the command line flags
-             * indicate it should be debuggable or the ro.debuggable system property
-             * is set to "1"
-             */
-            int debugFlags = parsedArgs.debugFlags;
-            if ("1".equals(SystemProperties.get("ro.debuggable")))
-                debugFlags |= Zygote.DEBUG_ENABLE_DEBUGGER;
+            ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);
+            ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);
 
             /* Request to fork the system server process */
             pid = Zygote.forkSystemServer(
                     parsedArgs.uid, parsedArgs.gid,
-                    parsedArgs.gids, debugFlags, null,
+                    parsedArgs.gids, parsedArgs.debugFlags, null,
                     parsedArgs.permittedCapabilities,
                     parsedArgs.effectiveCapabilities);
         } catch (IllegalArgumentException ex) {
@@ -522,9 +525,9 @@
                 throw new RuntimeException(argv[0] + USAGE_STRING);
             }
 
-            if (argv[1].equals("true")) {
+            if (argv[1].equals("start-system-server")) {
                 startSystemServer();
-            } else if (!argv[1].equals("false")) {
+            } else if (!argv[1].equals("")) {
                 throw new RuntimeException(argv[0] + USAGE_STRING);
             }
 
@@ -696,15 +699,6 @@
             FileDescriptor out, FileDescriptor err) throws IOException;
 
     /**
-     * Calls close() on a file descriptor
-     *
-     * @param fd descriptor to close
-     * @throws IOException
-     */
-    static native void closeDescriptor(FileDescriptor fd)
-            throws IOException;
-
-    /**
      * Toggles the close-on-exec flag for the specified file descriptor.
      *
      * @param fd non-null; file descriptor
diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl
index 4ffa4e1..8039fda 100644
--- a/core/java/com/android/internal/view/IInputMethodManager.aidl
+++ b/core/java/com/android/internal/view/IInputMethodManager.aidl
@@ -17,6 +17,7 @@
 package com.android.internal.view;
 
 import android.os.ResultReceiver;
+import android.text.style.SuggestionSpan;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodSubtype;
 import android.view.inputmethod.EditorInfo;
@@ -61,6 +62,8 @@
     void showMySoftInput(in IBinder token, int flags);
     void updateStatusIcon(in IBinder token, String packageName, int iconId);
     void setImeWindowStatus(in IBinder token, int vis, int backDisposition);
+    void registerSuggestionSpansForNotification(in SuggestionSpan[] spans);
+    boolean notifySuggestionPicked(in SuggestionSpan span, String originalString, int index);
     InputMethodSubtype getCurrentInputMethodSubtype();
     boolean setCurrentInputMethodSubtype(in InputMethodSubtype subtype);
     boolean switchToLastInputMethod(in IBinder token);
diff --git a/core/java/com/android/internal/view/menu/ActionMenuView.java b/core/java/com/android/internal/view/menu/ActionMenuView.java
index 290bf08..7b4f216 100644
--- a/core/java/com/android/internal/view/menu/ActionMenuView.java
+++ b/core/java/com/android/internal/view/menu/ActionMenuView.java
@@ -89,7 +89,6 @@
         final int childCount = getChildCount();
         final int midVertical = (top + bottom) / 2;
         final int dividerWidth = getDividerWidth();
-        boolean hasOverflow = false;
         int overflowWidth = 0;
         int nonOverflowWidth = 0;
         int nonOverflowCount = 0;
@@ -102,7 +101,6 @@
 
             LayoutParams p = (LayoutParams) v.getLayoutParams();
             if (p.isOverflowButton) {
-                hasOverflow = true;
                 overflowWidth = v.getMeasuredWidth();
                 if (hasDividerBeforeChildAt(i)) {
                     overflowWidth += dividerWidth;
@@ -125,15 +123,12 @@
             }
         }
 
-        // Try to center non-overflow items with uniformly spaced padding, including on the edges.
-        // Overflow will always pin to the right edge. If there isn't enough room for that,
-        // center in the remaining space.
+        // Fill action items from the left. Overflow will always pin to the right edge.
         if (nonOverflowWidth <= widthRemaining - overflowWidth) {
             widthRemaining -= overflowWidth;
         }
 
-        final int spacing = (widthRemaining - nonOverflowWidth) / (nonOverflowCount + 1);
-        int startLeft = getPaddingLeft() + overflowWidth + spacing;
+        int startLeft = getPaddingLeft();
         for (int i = 0; i < childCount; i++) {
             final View v = getChildAt(i);
             final LayoutParams lp = (LayoutParams) v.getLayoutParams();
@@ -146,7 +141,7 @@
             int height = v.getMeasuredHeight();
             int t = midVertical - (height / 2);
             v.layout(startLeft, t, startLeft + width, t + height);
-            startLeft += width + lp.rightMargin + spacing;
+            startLeft += width + lp.rightMargin;
         }
     }
 
diff --git a/core/java/com/android/internal/view/menu/SubMenuBuilder.java b/core/java/com/android/internal/view/menu/SubMenuBuilder.java
index ad773ee..834041f 100644
--- a/core/java/com/android/internal/view/menu/SubMenuBuilder.java
+++ b/core/java/com/android/internal/view/menu/SubMenuBuilder.java
@@ -76,6 +76,12 @@
         return mParentMenu;
     }
 
+    @Override
+    boolean dispatchMenuItemSelected(MenuBuilder menu, MenuItem item) {
+        return super.dispatchMenuItemSelected(menu, item) ||
+                mParentMenu.dispatchMenuItemSelected(menu, item);
+    }
+
     public SubMenu setIcon(Drawable icon) {
         mItem.setIcon(icon);
         return this;
diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java
index f1887eb..ff04735 100644
--- a/core/java/com/android/internal/widget/ActionBarView.java
+++ b/core/java/com/android/internal/widget/ActionBarView.java
@@ -78,7 +78,7 @@
 
     private static final int DEFAULT_CUSTOM_GRAVITY = Gravity.LEFT | Gravity.CENTER_VERTICAL;
     
-    private final int mContentHeight;
+    private int mContentHeight;
 
     private int mNavigationMode;
     private int mDisplayOptions = ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP;
@@ -95,8 +95,7 @@
     private TextView mSubtitleView;
     private Spinner mSpinner;
     private LinearLayout mListNavLayout;
-    private HorizontalScrollView mTabScrollView;
-    private ViewGroup mTabLayout;
+    private ScrollingTabContainerView mTabScrollView;
     private View mCustomNavView;
     private ProgressBar mProgressView;
     private ProgressBar mIndeterminateProgressView;
@@ -122,6 +121,8 @@
     private SpinnerAdapter mSpinnerAdapter;
     private OnNavigationListener mCallback;
 
+    private Runnable mTabSelector;
+
     private final AdapterView.OnItemSelectedListener mNavItemSelectedListener =
             new AdapterView.OnItemSelectedListener() {
         public void onItemSelected(AdapterView parent, View view, int position, long id) {
@@ -199,8 +200,6 @@
         mProgressBarPadding = a.getDimensionPixelOffset(R.styleable.ActionBar_progressBarPadding, 0);
         mItemPadding = a.getDimensionPixelOffset(R.styleable.ActionBar_itemPadding, 0);
 
-        mIncludeTabs = a.getBoolean(R.styleable.ActionBar_embeddedTabs, true);
-
         setDisplayOptions(a.getInt(R.styleable.ActionBar_displayOptions, DISPLAY_DEFAULT));
 
         final int customNavId = a.getResourceId(R.styleable.ActionBar_customNavigationLayout, 0);
@@ -229,6 +228,12 @@
     }
 
     @Override
+    public void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        removeCallbacks(mTabSelector);
+    }
+
+    @Override
     public boolean shouldDelayChildPressedState() {
         return false;
     }
@@ -247,6 +252,11 @@
         addView(mIndeterminateProgressView);
     }
 
+    public void setContentHeight(int height) {
+        mContentHeight = height;
+        requestLayout();
+    }
+
     public void setSplitActionBar(boolean splitActionBar) {
         if (mSplitActionBar != splitActionBar) {
             if (mMenuView != null) {
@@ -271,8 +281,9 @@
         return mIncludeTabs;
     }
 
-    public void setExternalTabLayout(ViewGroup tabLayout) {
-        mTabLayout = tabLayout;
+    public void setEmbeddedTabView(ScrollingTabContainerView tabs) {
+        mTabScrollView = tabs;
+        mIncludeTabs = tabs != null;
     }
 
     public void setCallback(OnNavigationListener callback) {
@@ -489,7 +500,7 @@
                 }
                 break;
             case ActionBar.NAVIGATION_MODE_TABS:
-                if (mTabScrollView != null) {
+                if (mTabScrollView != null && mIncludeTabs) {
                     removeView(mTabScrollView);
                 }
             }
@@ -513,8 +524,7 @@
                 addView(mListNavLayout);
                 break;
             case ActionBar.NAVIGATION_MODE_TABS:
-                ensureTabsExist();
-                if (mTabScrollView != null) {
+                if (mTabScrollView != null && mIncludeTabs) {
                     addView(mTabScrollView);
                 }
                 break;
@@ -523,24 +533,17 @@
             requestLayout();
         }
     }
-    
-    private void ensureTabsExist() {
-        if (!mIncludeTabs) return;
 
-        if (mTabScrollView == null) {
-            mTabScrollView = new HorizontalScrollView(getContext());
-            mTabScrollView.setHorizontalFadingEdgeEnabled(true);
-            mTabLayout = createTabContainer();
-            mTabScrollView.addView(mTabLayout);
-        }
-    }
-
-    public ViewGroup createTabContainer() {
-        ViewGroup result = new LinearLayout(getContext(), null,
+    public ScrollingTabContainerView createTabContainer() {
+        final LinearLayout tabLayout = new LinearLayout(getContext(), null,
                 com.android.internal.R.attr.actionBarTabBarStyle);
-        result.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
-                mContentHeight));
-        return result;
+        tabLayout.setMeasureWithLargestChildEnabled(true);
+        tabLayout.setLayoutParams(new LinearLayout.LayoutParams(
+                LinearLayout.LayoutParams.WRAP_CONTENT, mContentHeight));
+
+        final ScrollingTabContainerView scroller = new ScrollingTabContainerView(mContext);
+        scroller.setTabLayout(tabLayout);
+        return scroller;
     }
 
     public void setDropdownAdapter(SpinnerAdapter adapter) {
@@ -574,51 +577,6 @@
         return mDisplayOptions;
     }
 
-    private TabView createTabView(ActionBar.Tab tab) {
-        final TabView tabView = new TabView(getContext(), tab);
-        tabView.setFocusable(true);
-
-        if (mTabClickListener == null) {
-            mTabClickListener = new TabClickListener();
-        }
-        tabView.setOnClickListener(mTabClickListener);
-        return tabView;
-    }
-
-    public void addTab(ActionBar.Tab tab, boolean setSelected) {
-        ensureTabsExist();
-        View tabView = createTabView(tab);
-        mTabLayout.addView(tabView);
-        if (setSelected) {
-            tabView.setSelected(true);
-        }
-    }
-
-    public void addTab(ActionBar.Tab tab, int position, boolean setSelected) {
-        ensureTabsExist();
-        final TabView tabView = createTabView(tab);
-        mTabLayout.addView(tabView, position);
-        if (setSelected) {
-            tabView.setSelected(true);
-        }
-    }
-
-    public void updateTab(int position) {
-        ((TabView) mTabLayout.getChildAt(position)).update();
-    }
-
-    public void removeTabAt(int position) {
-        if (mTabLayout != null) {
-            mTabLayout.removeViewAt(position);
-        }
-    }
-
-    public void removeAllTabs() {
-        if (mTabLayout != null) {
-            mTabLayout.removeAllViews();
-        }
-    }
-
     @Override
     protected LayoutParams generateDefaultLayoutParams() {
         // Used by custom nav views if they don't supply layout params. Everything else
@@ -667,15 +625,6 @@
         addView(mTitleLayout);
     }
 
-    public void setTabSelected(int position) {
-        ensureTabsExist();
-        final int tabCount = mTabLayout.getChildCount();
-        for (int i = 0; i < tabCount; i++) {
-            final View child = mTabLayout.getChildAt(i);
-            child.setSelected(i == position);
-        }
-    }
-
     public void setContextView(ActionBarContextView view) {
         mContextView = view;
     }
@@ -948,97 +897,6 @@
         }
     }
 
-    private static class TabView extends LinearLayout {
-        private ActionBar.Tab mTab;
-        private TextView mTextView;
-        private ImageView mIconView;
-        private View mCustomView;
-
-        public TabView(Context context, ActionBar.Tab tab) {
-            super(context, null, com.android.internal.R.attr.actionBarTabStyle);
-            mTab = tab;
-
-            update();
-
-            setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
-                    LayoutParams.MATCH_PARENT, 1));
-        }
-
-        public void update() {
-            final ActionBar.Tab tab = mTab;
-            final View custom = tab.getCustomView();
-            if (custom != null) {
-                addView(custom);
-                mCustomView = custom;
-                if (mTextView != null) mTextView.setVisibility(GONE);
-                if (mIconView != null) {
-                    mIconView.setVisibility(GONE);
-                    mIconView.setImageDrawable(null);
-                }
-            } else {
-                if (mCustomView != null) {
-                    removeView(mCustomView);
-                    mCustomView = null;
-                }
-
-                final Drawable icon = tab.getIcon();
-                final CharSequence text = tab.getText();
-
-                if (icon != null) {
-                    if (mIconView == null) {
-                        ImageView iconView = new ImageView(getContext());
-                        LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,
-                                LayoutParams.WRAP_CONTENT);
-                        lp.gravity = Gravity.CENTER_VERTICAL;
-                        iconView.setLayoutParams(lp);
-                        addView(iconView, 0);
-                        mIconView = iconView;
-                    }
-                    mIconView.setImageDrawable(icon);
-                    mIconView.setVisibility(VISIBLE);
-                } else if (mIconView != null) {
-                    mIconView.setVisibility(GONE);
-                    mIconView.setImageDrawable(null);
-                }
-
-                if (text != null) {
-                    if (mTextView == null) {
-                        TextView textView = new TextView(getContext(), null,
-                                com.android.internal.R.attr.actionBarTabTextStyle);
-                        textView.setSingleLine();
-                        textView.setEllipsize(TruncateAt.END);
-                        LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,
-                                LayoutParams.WRAP_CONTENT);
-                        lp.gravity = Gravity.CENTER_VERTICAL;
-                        textView.setLayoutParams(lp);
-                        addView(textView);
-                        mTextView = textView;
-                    }
-                    mTextView.setText(text);
-                    mTextView.setVisibility(VISIBLE);
-                } else {
-                    mTextView.setVisibility(GONE);
-                }
-            }
-        }
-
-        public ActionBar.Tab getTab() {
-            return mTab;
-        }
-    }
-
-    private class TabClickListener implements OnClickListener {
-        public void onClick(View view) {
-            TabView tabView = (TabView) view;
-            tabView.getTab().select();
-            final int tabCount = mTabLayout.getChildCount();
-            for (int i = 0; i < tabCount; i++) {
-                final View child = mTabLayout.getChildAt(i);
-                child.setSelected(child == view);
-            }
-        }
-    }
-
     private static class HomeView extends FrameLayout {
         private View mUpView;
         private View mIconView;
diff --git a/core/java/com/android/internal/widget/EditableInputConnection.java b/core/java/com/android/internal/widget/EditableInputConnection.java
index 0d32d4ba..32e733b 100644
--- a/core/java/com/android/internal/widget/EditableInputConnection.java
+++ b/core/java/com/android/internal/widget/EditableInputConnection.java
@@ -17,9 +17,10 @@
 package com.android.internal.widget;
 
 import android.os.Bundle;
-import android.os.IBinder;
 import android.text.Editable;
+import android.text.Spanned;
 import android.text.method.KeyListener;
+import android.text.style.SuggestionSpan;
 import android.util.Log;
 import android.view.inputmethod.BaseInputConnection;
 import android.view.inputmethod.CompletionInfo;
@@ -138,6 +139,11 @@
         if (mTextView == null) {
             return super.commitText(text, newCursorPosition);
         }
+        if (text instanceof Spanned) {
+            Spanned spanned = ((Spanned) text);
+            SuggestionSpan[] spans = spanned.getSpans(0, text.length(), SuggestionSpan.class);
+            mIMM.registerSuggestionSpansForNotification(spans);
+        }
 
         mTextView.resetErrorChangedFlag();
         boolean success = super.commitText(text, newCursorPosition);
diff --git a/core/java/com/android/internal/widget/PointerLocationView.java b/core/java/com/android/internal/widget/PointerLocationView.java
index d789584..bf1c637 100644
--- a/core/java/com/android/internal/widget/PointerLocationView.java
+++ b/core/java/com/android/internal/widget/PointerLocationView.java
@@ -385,6 +385,7 @@
                 .append(" ToolMinor=").append(coords.toolMinor, 3)
                 .append(" Orientation=").append((float)(coords.orientation * 180 / Math.PI), 1)
                 .append("deg")
+                .append(" Distance=").append(coords.getAxisValue(MotionEvent.AXIS_DISTANCE), 1)
                 .append(" VScroll=").append(coords.getAxisValue(MotionEvent.AXIS_VSCROLL), 1)
                 .append(" HScroll=").append(coords.getAxisValue(MotionEvent.AXIS_HSCROLL), 1)
                 .append(" ToolType=").append(MotionEvent.toolTypeToString(toolType))
diff --git a/core/java/com/android/internal/widget/ScrollingTabContainerView.java b/core/java/com/android/internal/widget/ScrollingTabContainerView.java
new file mode 100644
index 0000000..c7d37f2
--- /dev/null
+++ b/core/java/com/android/internal/widget/ScrollingTabContainerView.java
@@ -0,0 +1,261 @@
+/*
+ * Copyright (C) 2011 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 com.android.internal.widget;
+
+import android.app.ActionBar;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils.TruncateAt;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.HorizontalScrollView;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+public class ScrollingTabContainerView extends HorizontalScrollView {
+    Runnable mTabSelector;
+    private TabClickListener mTabClickListener;
+
+    private LinearLayout mTabLayout;
+
+    int mMaxTabWidth;
+
+    public ScrollingTabContainerView(Context context) {
+        super(context);
+        setHorizontalScrollBarEnabled(false);
+    }
+
+    @Override
+    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+        setFillViewport(widthMode == MeasureSpec.EXACTLY);
+
+        final int childCount = getChildCount();
+        if (childCount > 1 &&
+                (widthMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST)) {
+            if (childCount > 2) {
+                mMaxTabWidth = (int) (MeasureSpec.getSize(widthMeasureSpec) * 0.4f);
+            } else {
+                mMaxTabWidth = MeasureSpec.getSize(widthMeasureSpec) / 2;
+            }
+        } else {
+            mMaxTabWidth = -1;
+        }
+
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+    }
+
+    public void setTabSelected(int position) {
+        if (mTabLayout == null) {
+            return;
+        }
+
+        final int tabCount = mTabLayout.getChildCount();
+        for (int i = 0; i < tabCount; i++) {
+            final View child = mTabLayout.getChildAt(i);
+            final boolean isSelected = i == position;
+            child.setSelected(isSelected);
+            if (isSelected) {
+                animateToTab(position);
+            }
+        }
+    }
+
+    public void animateToTab(int position) {
+        final View tabView = mTabLayout.getChildAt(position);
+        if (mTabSelector != null) {
+            removeCallbacks(mTabSelector);
+        }
+        mTabSelector = new Runnable() {
+            public void run() {
+                final int scrollPos = tabView.getLeft() - (getWidth() - tabView.getWidth()) / 2;
+                smoothScrollTo(scrollPos, 0);
+                mTabSelector = null;
+            }
+        };
+        post(mTabSelector);
+    }
+
+    public void setTabLayout(LinearLayout tabLayout) {
+        if (mTabLayout != tabLayout) {
+            if (mTabLayout != null) {
+                ((ViewGroup) mTabLayout.getParent()).removeView(mTabLayout);
+            }
+            if (tabLayout != null) {
+                addView(tabLayout);
+            }
+            mTabLayout = tabLayout;
+        }
+    }
+
+    public LinearLayout getTabLayout() {
+        return mTabLayout;
+    }
+
+    @Override
+    public void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        if (mTabSelector != null) {
+            removeCallbacks(mTabSelector);
+        }
+    }
+
+    private TabView createTabView(ActionBar.Tab tab) {
+        final TabView tabView = new TabView(getContext(), tab);
+        tabView.setFocusable(true);
+
+        if (mTabClickListener == null) {
+            mTabClickListener = new TabClickListener();
+        }
+        tabView.setOnClickListener(mTabClickListener);
+        return tabView;
+    }
+
+    public void addTab(ActionBar.Tab tab, boolean setSelected) {
+        View tabView = createTabView(tab);
+        mTabLayout.addView(tabView, new LinearLayout.LayoutParams(0,
+                LayoutParams.MATCH_PARENT, 1));
+        if (setSelected) {
+            tabView.setSelected(true);
+        }
+    }
+
+    public void addTab(ActionBar.Tab tab, int position, boolean setSelected) {
+        final TabView tabView = createTabView(tab);
+        mTabLayout.addView(tabView, position, new LinearLayout.LayoutParams(
+                0, LayoutParams.MATCH_PARENT, 1));
+        if (setSelected) {
+            tabView.setSelected(true);
+        }
+    }
+
+    public void updateTab(int position) {
+        ((TabView) mTabLayout.getChildAt(position)).update();
+    }
+
+    public void removeTabAt(int position) {
+        if (mTabLayout != null) {
+            mTabLayout.removeViewAt(position);
+        }
+    }
+
+    public void removeAllTabs() {
+        if (mTabLayout != null) {
+            mTabLayout.removeAllViews();
+        }
+    }
+
+    private class TabView extends LinearLayout {
+        private ActionBar.Tab mTab;
+        private TextView mTextView;
+        private ImageView mIconView;
+        private View mCustomView;
+
+        public TabView(Context context, ActionBar.Tab tab) {
+            super(context, null, com.android.internal.R.attr.actionBarTabStyle);
+            mTab = tab;
+
+            update();
+        }
+
+        @Override
+        public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+            // Re-measure if we went beyond our maximum size.
+            if (mMaxTabWidth > 0 && getMeasuredWidth() > mMaxTabWidth) {
+                super.onMeasure(MeasureSpec.makeMeasureSpec(mMaxTabWidth, MeasureSpec.EXACTLY),
+                        heightMeasureSpec);
+            }
+        }
+
+        public void update() {
+            final ActionBar.Tab tab = mTab;
+            final View custom = tab.getCustomView();
+            if (custom != null) {
+                addView(custom);
+                mCustomView = custom;
+                if (mTextView != null) mTextView.setVisibility(GONE);
+                if (mIconView != null) {
+                    mIconView.setVisibility(GONE);
+                    mIconView.setImageDrawable(null);
+                }
+            } else {
+                if (mCustomView != null) {
+                    removeView(mCustomView);
+                    mCustomView = null;
+                }
+
+                final Drawable icon = tab.getIcon();
+                final CharSequence text = tab.getText();
+
+                if (icon != null) {
+                    if (mIconView == null) {
+                        ImageView iconView = new ImageView(getContext());
+                        LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,
+                                LayoutParams.WRAP_CONTENT);
+                        lp.gravity = Gravity.CENTER_VERTICAL;
+                        iconView.setLayoutParams(lp);
+                        addView(iconView, 0);
+                        mIconView = iconView;
+                    }
+                    mIconView.setImageDrawable(icon);
+                    mIconView.setVisibility(VISIBLE);
+                } else if (mIconView != null) {
+                    mIconView.setVisibility(GONE);
+                    mIconView.setImageDrawable(null);
+                }
+
+                if (text != null) {
+                    if (mTextView == null) {
+                        TextView textView = new TextView(getContext(), null,
+                                com.android.internal.R.attr.actionBarTabTextStyle);
+                        textView.setSingleLine();
+                        textView.setEllipsize(TruncateAt.END);
+                        LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,
+                                LayoutParams.WRAP_CONTENT);
+                        lp.gravity = Gravity.CENTER_VERTICAL;
+                        textView.setLayoutParams(lp);
+                        addView(textView);
+                        mTextView = textView;
+                    }
+                    mTextView.setText(text);
+                    mTextView.setVisibility(VISIBLE);
+                } else {
+                    mTextView.setVisibility(GONE);
+                }
+            }
+        }
+
+        public ActionBar.Tab getTab() {
+            return mTab;
+        }
+    }
+
+    private class TabClickListener implements OnClickListener {
+        public void onClick(View view) {
+            TabView tabView = (TabView) view;
+            tabView.getTab().select();
+            final int tabCount = mTabLayout.getChildCount();
+            for (int i = 0; i < tabCount; i++) {
+                final View child = mTabLayout.getChildAt(i);
+                child.setSelected(child == view);
+            }
+        }
+    }
+}
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index b787e9f..e610640 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -808,8 +808,11 @@
  * Start the Android runtime.  This involves starting the virtual machine
  * and calling the "static void main(String[] args)" method in the class
  * named by "className".
+ *
+ * Passes the main function two arguments, the class name and the specified
+ * options string.
  */
-void AndroidRuntime::start(const char* className, const bool startSystemServer)
+void AndroidRuntime::start(const char* className, const char* options)
 {
     LOGD("\n>>>>>> AndroidRuntime START %s <<<<<<\n",
             className != NULL ? className : "(unknown)");
@@ -820,7 +823,7 @@
      * 'startSystemServer == true' means runtime is obsolete and not run from
      * init.rc anymore, so we print out the boot start event here.
      */
-    if (startSystemServer) {
+    if (strcmp(options, "start-system-server") == 0) {
         /* track our progress through the boot sequence */
         const int LOG_BOOT_PROGRESS_START = 3000;
         LOG_EVENT_LONG(LOG_BOOT_PROGRESS_START,
@@ -857,13 +860,13 @@
 
     /*
      * We want to call main() with a String array with arguments in it.
-     * At present we only have one argument, the class name.  Create an
-     * array to hold it.
+     * At present we have two arguments, the class name and an option string.
+     * Create an array to hold them.
      */
     jclass stringClass;
     jobjectArray strArray;
     jstring classNameStr;
-    jstring startSystemServerStr;
+    jstring optionsStr;
 
     stringClass = env->FindClass("java/lang/String");
     assert(stringClass != NULL);
@@ -872,9 +875,8 @@
     classNameStr = env->NewStringUTF(className);
     assert(classNameStr != NULL);
     env->SetObjectArrayElement(strArray, 0, classNameStr);
-    startSystemServerStr = env->NewStringUTF(startSystemServer ?
-                                                 "true" : "false");
-    env->SetObjectArrayElement(strArray, 1, startSystemServerStr);
+    optionsStr = env->NewStringUTF(options);
+    env->SetObjectArrayElement(strArray, 1, optionsStr);
 
     /*
      * Start VM.  This thread becomes the main thread of the VM, and will
@@ -909,12 +911,6 @@
         LOGW("Warning: VM did not shut down cleanly\n");
 }
 
-void AndroidRuntime::start()
-{
-    start("com.android.internal.os.RuntimeInit",
-        false /* Don't start the system server */);
-}
-
 void AndroidRuntime::onExit(int code)
 {
     LOGV("AndroidRuntime onExit calling exit(%d)", code);
diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp
index 26aa7d9..a5b2006 100644
--- a/core/jni/android/graphics/TextLayoutCache.cpp
+++ b/core/jni/android/graphics/TextLayoutCache.cpp
@@ -547,6 +547,25 @@
     LOGD("         -- isDevKernText=%d", paint->isDevKernText());
 #endif
 
+    if (shaperItem.advances == NULL || shaperItem.num_glyphs == 0) {
+#if DEBUG_GLYPHS
+    LOGD("HARFBUZZ -- advances array is empty or num_glypth = 0");
+#endif
+        for (size_t i = 0; i < count; i++) {
+            outAdvances[i] = 0;
+        }
+        *outTotalAdvance = 0;
+
+        if (outGlyphs) {
+            *outGlyphsCount = 0;
+            *outGlyphs = new jchar[0];
+        }
+
+        // Cleaning
+        deleteGlyphArrays(&shaperItem);
+        HB_FreeFace(shaperItem.face);
+        return;
+    }
     // Get Advances and their total
     jfloat totalAdvance = outAdvances[0] = HBFixedToFloat(shaperItem.advances[shaperItem.log_clusters[0]]);
     for (size_t i = 1; i < count; i++) {
diff --git a/core/jni/android_content_res_Configuration.cpp b/core/jni/android_content_res_Configuration.cpp
index 95b18ea..246e3bd 100644
--- a/core/jni/android_content_res_Configuration.cpp
+++ b/core/jni/android_content_res_Configuration.cpp
@@ -38,6 +38,9 @@
     jfieldID navigationHidden;
     jfieldID orientation;
     jfieldID uiMode;
+    jfieldID screenWidthDp;
+    jfieldID screenHeightDp;
+    jfieldID smallestScreenWidthDp;
 } gConfigurationClassInfo;
 
 void android_Configuration_getFromJava(
@@ -60,6 +63,11 @@
 
     out->orientation = env->GetIntField(clazz, gConfigurationClassInfo.orientation);
     out->uiMode = env->GetIntField(clazz, gConfigurationClassInfo.uiMode);
+
+    out->screenWidthDp = env->GetIntField(clazz, gConfigurationClassInfo.screenWidthDp);
+    out->screenHeightDp = env->GetIntField(clazz, gConfigurationClassInfo.screenHeightDp);
+    out->smallestScreenWidthDp = env->GetIntField(clazz,
+            gConfigurationClassInfo.smallestScreenWidthDp);
 }
 
 /*
@@ -108,6 +116,12 @@
             "orientation", "I");
     GET_FIELD_ID(gConfigurationClassInfo.uiMode, clazz,
             "uiMode", "I");
+    GET_FIELD_ID(gConfigurationClassInfo.screenWidthDp, clazz,
+            "screenWidthDp", "I");
+    GET_FIELD_ID(gConfigurationClassInfo.screenHeightDp, clazz,
+            "screenHeightDp", "I");
+    GET_FIELD_ID(gConfigurationClassInfo.smallestScreenWidthDp, clazz,
+            "smallestScreenWidthDp", "I");
 
     return AndroidRuntime::registerNativeMethods(env, "android/content/res/Configuration", gMethods,
             NELEM(gMethods));
diff --git a/core/jni/android_hardware_UsbDeviceConnection.cpp b/core/jni/android_hardware_UsbDeviceConnection.cpp
index 4d73bf3..68be9e1 100644
--- a/core/jni/android_hardware_UsbDeviceConnection.cpp
+++ b/core/jni/android_hardware_UsbDeviceConnection.cpp
@@ -83,6 +83,27 @@
     return usb_device_get_fd(device);
 }
 
+static jbyteArray
+android_hardware_UsbDeviceConnection_get_desc(JNIEnv *env, jobject thiz)
+{
+    char buffer[16384];
+    int fd = android_hardware_UsbDeviceConnection_get_fd(env, thiz);
+    if (fd < 0) return NULL;
+    lseek(fd, 0, SEEK_SET);
+    int length = read(fd, buffer, sizeof(buffer));
+    if (length < 0) return NULL;
+
+    jbyteArray ret = env->NewByteArray(length);
+    if (ret) {
+        jbyte* bytes = (jbyte*)env->GetPrimitiveArrayCritical(ret, 0);
+        if (bytes) {
+            memcpy(bytes, buffer, length);
+            env->ReleasePrimitiveArrayCritical(ret, bytes, 0);
+        }
+    }
+    return ret;
+}
+
 static jboolean
 android_hardware_UsbDeviceConnection_claim_interface(JNIEnv *env, jobject thiz,
         int interfaceID, jboolean force)
@@ -211,6 +232,7 @@
                                         (void *)android_hardware_UsbDeviceConnection_open},
     {"native_close",            "()V",  (void *)android_hardware_UsbDeviceConnection_close},
     {"native_get_fd",           "()I",  (void *)android_hardware_UsbDeviceConnection_get_fd},
+    {"native_get_desc",         "()[B", (void *)android_hardware_UsbDeviceConnection_get_desc},
     {"native_claim_interface",  "(IZ)Z",(void *)android_hardware_UsbDeviceConnection_claim_interface},
     {"native_release_interface","(I)Z", (void *)android_hardware_UsbDeviceConnection_release_interface},
     {"native_control_request",  "(IIII[BII)I",
diff --git a/core/jni/android_net_NetUtils.cpp b/core/jni/android_net_NetUtils.cpp
index 548376d..ddae505 100644
--- a/core/jni/android_net_NetUtils.cpp
+++ b/core/jni/android_net_NetUtils.cpp
@@ -26,10 +26,6 @@
 extern "C" {
 int ifc_enable(const char *ifname);
 int ifc_disable(const char *ifname);
-int ifc_add_route(const char *ifname, const char *destStr, uint32_t prefixLen, const char *gwStr);
-int ifc_remove_host_routes(const char *ifname);
-int ifc_get_default_route(const char *ifname);
-int ifc_remove_default_route(const char *ifname);
 int ifc_reset_connections(const char *ifname);
 
 int dhcp_do_request(const char *ifname,
@@ -94,56 +90,6 @@
     return (jint)result;
 }
 
-static jint android_net_utils_addRoute(JNIEnv* env, jobject clazz, jstring ifname,
-          jstring dst, jint prefixLength, jstring gw)
-{
-    int result;
-
-    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
-    const char *dstStr = env->GetStringUTFChars(dst, NULL);
-    const char *gwStr = NULL;
-    if (gw != NULL) {
-        gwStr = env->GetStringUTFChars(gw, NULL);
-    }
-    result = ::ifc_add_route(nameStr, dstStr, prefixLength, gwStr);
-    env->ReleaseStringUTFChars(ifname, nameStr);
-    env->ReleaseStringUTFChars(dst, dstStr);
-    if (gw != NULL) {
-        env->ReleaseStringUTFChars(gw, gwStr);
-    }
-    return (jint)result;
-}
-
-static jint android_net_utils_removeHostRoutes(JNIEnv* env, jobject clazz, jstring ifname)
-{
-    int result;
-
-    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
-    result = ::ifc_remove_host_routes(nameStr);
-    env->ReleaseStringUTFChars(ifname, nameStr);
-    return (jint)result;
-}
-
-static jint android_net_utils_getDefaultRoute(JNIEnv* env, jobject clazz, jstring ifname)
-{
-    int result;
-
-    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
-    result = ::ifc_get_default_route(nameStr);
-    env->ReleaseStringUTFChars(ifname, nameStr);
-    return (jint)result;
-}
-
-static jint android_net_utils_removeDefaultRoute(JNIEnv* env, jobject clazz, jstring ifname)
-{
-    int result;
-
-    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
-    result = ::ifc_remove_default_route(nameStr);
-    env->ReleaseStringUTFChars(ifname, nameStr);
-    return (jint)result;
-}
-
 static jint android_net_utils_resetConnections(JNIEnv* env, jobject clazz, jstring ifname)
 {
     int result;
@@ -260,12 +206,6 @@
 
     { "enableInterface", "(Ljava/lang/String;)I",  (void *)android_net_utils_enableInterface },
     { "disableInterface", "(Ljava/lang/String;)I",  (void *)android_net_utils_disableInterface },
-    { "addRoute", "(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)I",
-       (void *)android_net_utils_addRoute },
-    { "removeHostRoutes", "(Ljava/lang/String;)I",  (void *)android_net_utils_removeHostRoutes },
-    { "getDefaultRouteNative", "(Ljava/lang/String;)I",
-       (void *)android_net_utils_getDefaultRoute },
-    { "removeDefaultRoute", "(Ljava/lang/String;)I",  (void *)android_net_utils_removeDefaultRoute },
     { "resetConnections", "(Ljava/lang/String;)I",  (void *)android_net_utils_resetConnections },
     { "runDhcp", "(Ljava/lang/String;Landroid/net/DhcpInfoInternal;)Z",  (void *)android_net_utils_runDhcp },
     { "runDhcpRenew", "(Ljava/lang/String;Landroid/net/DhcpInfoInternal;)Z",  (void *)android_net_utils_runDhcpRenew },
diff --git a/core/jni/android_os_ParcelFileDescriptor.cpp b/core/jni/android_os_ParcelFileDescriptor.cpp
index 4ec131c..99a2d04 100644
--- a/core/jni/android_os_ParcelFileDescriptor.cpp
+++ b/core/jni/android_os_ParcelFileDescriptor.cpp
@@ -34,20 +34,37 @@
     jfieldID mFileDescriptor;
 } gParcelFileDescriptorOffsets;
 
-static int android_os_ParcelFileDescriptor_createPipeNative(JNIEnv* env,
+static jobject android_os_ParcelFileDescriptor_getFileDescriptorFromFd(JNIEnv* env,
+    jobject clazz, jint origfd)
+{
+    int fd = dup(origfd);
+    if (fd < 0) {
+        jniThrowException(env, "java/io/IOException", strerror(errno));
+        return NULL;
+    }
+    return jniCreateFileDescriptor(env, fd);
+}
+
+static jobject android_os_ParcelFileDescriptor_getFileDescriptorFromFdNoDup(JNIEnv* env,
+    jobject clazz, jint fd)
+{
+    return jniCreateFileDescriptor(env, fd);
+}
+
+static void android_os_ParcelFileDescriptor_createPipeNative(JNIEnv* env,
     jobject clazz, jobjectArray outFds)
 {
     int fds[2];
     if (pipe(fds) < 0) {
-        return -errno;
+        int therr = errno;
+        jniThrowException(env, "java/io/IOException", strerror(therr));
+        return;
     }
 
     for (int i=0; i<2; i++) {
         jobject fdObj = jniCreateFileDescriptor(env, fds[i]);
         env->SetObjectArrayElement(outFds, i, fdObj);
     }
-
-    return 0;
 }
 
 static jint getFd(JNIEnv* env, jobject clazz)
@@ -102,7 +119,11 @@
 }
 
 static const JNINativeMethod gParcelFileDescriptorMethods[] = {
-    {"createPipeNative", "([Ljava/io/FileDescriptor;)I",
+    {"getFileDescriptorFromFd", "(I)Ljava/io/FileDescriptor;",
+        (void*)android_os_ParcelFileDescriptor_getFileDescriptorFromFd},
+    {"getFileDescriptorFromFdNoDup", "(I)Ljava/io/FileDescriptor;",
+        (void*)android_os_ParcelFileDescriptor_getFileDescriptorFromFdNoDup},
+    {"createPipeNative", "([Ljava/io/FileDescriptor;)V",
         (void*)android_os_ParcelFileDescriptor_createPipeNative},
     {"getStatSize", "()J",
         (void*)android_os_ParcelFileDescriptor_getStatSize},
diff --git a/core/jni/android_server_BluetoothEventLoop.cpp b/core/jni/android_server_BluetoothEventLoop.cpp
index dced1a5..59b97c2 100644
--- a/core/jni/android_server_BluetoothEventLoop.cpp
+++ b/core/jni/android_server_BluetoothEventLoop.cpp
@@ -351,7 +351,7 @@
 {
     DBusMessage *msg, *reply;
     DBusError err;
-    bool oob = TRUE;
+    dbus_bool_t oob = TRUE;
 
     if (!dbus_connection_register_object_path(nat->conn, agent_path,
             &agent_vtable, nat)) {
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
index b0e92e4..4f8f1af 100644
--- a/core/jni/android_util_AssetManager.cpp
+++ b/core/jni/android_util_AssetManager.cpp
@@ -510,6 +510,7 @@
                                                           jint keyboard, jint keyboardHidden,
                                                           jint navigation,
                                                           jint screenWidth, jint screenHeight,
+                                                          jint smallestScreenWidthDp,
                                                           jint screenWidthDp, jint screenHeightDp,
                                                           jint screenLayout, jint uiMode,
                                                           jint sdkVersion)
@@ -534,6 +535,7 @@
     config.navigation = (uint8_t)navigation;
     config.screenWidth = (uint16_t)screenWidth;
     config.screenHeight = (uint16_t)screenHeight;
+    config.smallestScreenWidthDp = (uint16_t)smallestScreenWidthDp;
     config.screenWidthDp = (uint16_t)screenWidthDp;
     config.screenHeightDp = (uint16_t)screenHeightDp;
     config.screenLayout = (uint8_t)screenLayout;
@@ -1646,7 +1648,7 @@
         (void*) android_content_AssetManager_setLocale },
     { "getLocales",      "()[Ljava/lang/String;",
         (void*) android_content_AssetManager_getLocales },
-    { "setConfiguration", "(IILjava/lang/String;IIIIIIIIIIIII)V",
+    { "setConfiguration", "(IILjava/lang/String;IIIIIIIIIIIIII)V",
         (void*) android_content_AssetManager_setConfiguration },
     { "getResourceIdentifier","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I",
         (void*) android_content_AssetManager_getResourceIdentifier },
diff --git a/core/jni/com_android_internal_os_ZygoteInit.cpp b/core/jni/com_android_internal_os_ZygoteInit.cpp
index e627e4a..86fd9cb 100644
--- a/core/jni/com_android_internal_os_ZygoteInit.cpp
+++ b/core/jni/com_android_internal_os_ZygoteInit.cpp
@@ -131,28 +131,6 @@
     } while (err < 0 && errno == EINTR);
 }
 
-static void com_android_internal_os_ZygoteInit_closeDescriptor(JNIEnv* env,
-        jobject clazz, jobject descriptor)
-{
-    int fd;
-    int err;
-
-    fd = jniGetFDFromFileDescriptor(env, descriptor);
-
-    if  (env->ExceptionOccurred() != NULL) {
-        return;
-    }
-
-    do {
-        err = close(fd);
-    } while (err < 0 && errno == EINTR);
-
-    if (err < 0) {
-        jniThrowIOException(env, errno);
-        return;
-    }
-}
-
 static void com_android_internal_os_ZygoteInit_setCloseOnExec (JNIEnv *env,
     jobject clazz, jobject descriptor, jboolean flag)
 {
@@ -332,8 +310,6 @@
         "(Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;"
         "Ljava/io/FileDescriptor;)V",
             (void *) com_android_internal_os_ZygoteInit_reopenStdio},
-    { "closeDescriptor", "(Ljava/io/FileDescriptor;)V",
-        (void *) com_android_internal_os_ZygoteInit_closeDescriptor},
     { "setCloseOnExec", "(Ljava/io/FileDescriptor;Z)V",
         (void *)  com_android_internal_os_ZygoteInit_setCloseOnExec},
     { "setCapabilities", "(JJ)V",
diff --git a/core/res/res/drawable-hdpi/cab_background_dark.9.png b/core/res/res/drawable-hdpi/cab_background_dark.9.png
deleted file mode 100644
index bc5db49..0000000
--- a/core/res/res/drawable-hdpi/cab_background_dark.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/cab_background_light.9.png b/core/res/res/drawable-hdpi/cab_background_light.9.png
deleted file mode 100644
index 1f45bc9..0000000
--- a/core/res/res/drawable-hdpi/cab_background_light.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/cab_background_opaque_holo_dark.9.png b/core/res/res/drawable-hdpi/cab_background_opaque_holo_dark.9.png
new file mode 100644
index 0000000..0f4c3c3
--- /dev/null
+++ b/core/res/res/drawable-hdpi/cab_background_opaque_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/cab_background_opaque_holo_light.9.png b/core/res/res/drawable-hdpi/cab_background_opaque_holo_light.9.png
new file mode 100644
index 0000000..fb9b831
--- /dev/null
+++ b/core/res/res/drawable-hdpi/cab_background_opaque_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/dialog_bottom_holo_dark.9.png b/core/res/res/drawable-hdpi/dialog_bottom_holo_dark.9.png
index 6c6252e..32c2c97 100644
--- a/core/res/res/drawable-hdpi/dialog_bottom_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/dialog_bottom_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/dialog_bottom_holo_light.9.png b/core/res/res/drawable-hdpi/dialog_bottom_holo_light.9.png
index 175c750..f1cba06 100644
--- a/core/res/res/drawable-hdpi/dialog_bottom_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/dialog_bottom_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/dialog_full_holo_dark.9.png b/core/res/res/drawable-hdpi/dialog_full_holo_dark.9.png
index 6e9abe65..08b163a 100644
--- a/core/res/res/drawable-hdpi/dialog_full_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/dialog_full_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/dialog_full_holo_light.9.png b/core/res/res/drawable-hdpi/dialog_full_holo_light.9.png
index f96d09e..77ec017 100644
--- a/core/res/res/drawable-hdpi/dialog_full_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/dialog_full_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/dialog_middle_holo_dark.9.png b/core/res/res/drawable-hdpi/dialog_middle_holo_dark.9.png
index 1f11f44..029f186 100644
--- a/core/res/res/drawable-hdpi/dialog_middle_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/dialog_middle_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/dialog_middle_holo_light.9.png b/core/res/res/drawable-hdpi/dialog_middle_holo_light.9.png
index 2e376cd..abaea2d 100644
--- a/core/res/res/drawable-hdpi/dialog_middle_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/dialog_middle_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/dialog_top_holo_dark.9.png b/core/res/res/drawable-hdpi/dialog_top_holo_dark.9.png
index 73d56b7..acbd7cf 100644
--- a/core/res/res/drawable-hdpi/dialog_top_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/dialog_top_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/dialog_top_holo_light.9.png b/core/res/res/drawable-hdpi/dialog_top_holo_light.9.png
index 869decf..8982396 100644
--- a/core/res/res/drawable-hdpi/dialog_top_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/dialog_top_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/keyboard_textfield_selected.9.png b/core/res/res/drawable-hdpi/keyboard_textfield_selected.9.png
deleted file mode 100644
index 61db22c..0000000
--- a/core/res/res/drawable-hdpi/keyboard_textfield_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/toast_frame.9.png b/core/res/res/drawable-hdpi/toast_frame.9.png
index 736683e..08b163a 100644
--- a/core/res/res/drawable-hdpi/toast_frame.9.png
+++ b/core/res/res/drawable-hdpi/toast_frame.9.png
Binary files differ
diff --git a/core/res/res/drawable-ldpi/keyboard_textfield_selected.9.png b/core/res/res/drawable-ldpi/keyboard_textfield_selected.9.png
deleted file mode 100644
index d6478fb..0000000
--- a/core/res/res/drawable-ldpi/keyboard_textfield_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_code_lock_default.png b/core/res/res/drawable-mdpi/btn_code_lock_default.png
old mode 100755
new mode 100644
index f524317..45cc20d
--- a/core/res/res/drawable-mdpi/btn_code_lock_default.png
+++ b/core/res/res/drawable-mdpi/btn_code_lock_default.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_code_lock_touched.png b/core/res/res/drawable-mdpi/btn_code_lock_touched.png
old mode 100755
new mode 100644
index 5cd436c..45cc20d
--- a/core/res/res/drawable-mdpi/btn_code_lock_touched.png
+++ b/core/res/res/drawable-mdpi/btn_code_lock_touched.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_normal.9.png b/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_normal.9.png
index 20f3d50..0fbdbfa 100644
--- a/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_normal.9.png
+++ b/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_normal_off.9.png b/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_normal_off.9.png
index d09ce53..ae97453 100644
--- a/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_normal_off.9.png
+++ b/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_normal_off.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_normal_on.9.png b/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_normal_on.9.png
index a9e008c..4127d1e 100644
--- a/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_normal_on.9.png
+++ b/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_normal_on.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_pressed.9.png b/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_pressed.9.png
index 1ed3065..525ab8a 100644
--- a/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_pressed.9.png
+++ b/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_pressed_off.9.png b/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_pressed_off.9.png
index 5710ebf..eb05820 100644
--- a/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_pressed_off.9.png
+++ b/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_pressed_off.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_pressed_on.9.png b/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_pressed_on.9.png
index dd7d89e..416b2c7 100644
--- a/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_pressed_on.9.png
+++ b/core/res/res/drawable-mdpi/btn_keyboard_key_fulltrans_pressed_on.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/cab_background_dark.9.png b/core/res/res/drawable-mdpi/cab_background_dark.9.png
deleted file mode 100644
index 253b12c..0000000
--- a/core/res/res/drawable-mdpi/cab_background_dark.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/cab_background_light.9.png b/core/res/res/drawable-mdpi/cab_background_light.9.png
deleted file mode 100644
index aaccdfb..0000000
--- a/core/res/res/drawable-mdpi/cab_background_light.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/cab_background_opaque_holo_dark.9.png b/core/res/res/drawable-mdpi/cab_background_opaque_holo_dark.9.png
new file mode 100644
index 0000000..013319c
--- /dev/null
+++ b/core/res/res/drawable-mdpi/cab_background_opaque_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/cab_background_opaque_holo_light.9.png b/core/res/res/drawable-mdpi/cab_background_opaque_holo_light.9.png
new file mode 100644
index 0000000..6d8861a
--- /dev/null
+++ b/core/res/res/drawable-mdpi/cab_background_opaque_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/dialog_bottom_holo_dark.9.png b/core/res/res/drawable-mdpi/dialog_bottom_holo_dark.9.png
index 9471615..cc66804 100644
--- a/core/res/res/drawable-mdpi/dialog_bottom_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/dialog_bottom_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/dialog_bottom_holo_light.9.png b/core/res/res/drawable-mdpi/dialog_bottom_holo_light.9.png
index 0502b93..bc734c8 100644
--- a/core/res/res/drawable-mdpi/dialog_bottom_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/dialog_bottom_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/dialog_full_holo_dark.9.png b/core/res/res/drawable-mdpi/dialog_full_holo_dark.9.png
index f364b2e..8603e93 100644
--- a/core/res/res/drawable-mdpi/dialog_full_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/dialog_full_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/dialog_full_holo_light.9.png b/core/res/res/drawable-mdpi/dialog_full_holo_light.9.png
index 91c2076..65a318c 100644
--- a/core/res/res/drawable-mdpi/dialog_full_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/dialog_full_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/dialog_middle_holo_dark.9.png b/core/res/res/drawable-mdpi/dialog_middle_holo_dark.9.png
index 92788c9..e39a472 100644
--- a/core/res/res/drawable-mdpi/dialog_middle_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/dialog_middle_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/dialog_middle_holo_light.9.png b/core/res/res/drawable-mdpi/dialog_middle_holo_light.9.png
index 74b66f8..68f9e57 100644
--- a/core/res/res/drawable-mdpi/dialog_middle_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/dialog_middle_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/dialog_top_holo_dark.9.png b/core/res/res/drawable-mdpi/dialog_top_holo_dark.9.png
index f25cfb6..32c49f2 100644
--- a/core/res/res/drawable-mdpi/dialog_top_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/dialog_top_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/dialog_top_holo_light.9.png b/core/res/res/drawable-mdpi/dialog_top_holo_light.9.png
index ff3ff06..60aa8cb 100644
--- a/core/res/res/drawable-mdpi/dialog_top_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/dialog_top_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_lock_idle_alarm.png b/core/res/res/drawable-mdpi/ic_lock_idle_alarm.png
index d29c6c3..97ac023 100644
--- a/core/res/res/drawable-mdpi/ic_lock_idle_alarm.png
+++ b/core/res/res/drawable-mdpi/ic_lock_idle_alarm.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_lock_idle_charging.png b/core/res/res/drawable-mdpi/ic_lock_idle_charging.png
old mode 100755
new mode 100644
index 20d6320..4210db2
--- a/core/res/res/drawable-mdpi/ic_lock_idle_charging.png
+++ b/core/res/res/drawable-mdpi/ic_lock_idle_charging.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_lock_idle_lock.png b/core/res/res/drawable-mdpi/ic_lock_idle_lock.png
old mode 100755
new mode 100644
index 0206aee..1060f5a
--- a/core/res/res/drawable-mdpi/ic_lock_idle_lock.png
+++ b/core/res/res/drawable-mdpi/ic_lock_idle_lock.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_lock_idle_low_battery.png b/core/res/res/drawable-mdpi/ic_lock_idle_low_battery.png
old mode 100755
new mode 100644
index bb96782..72e4afa
--- a/core/res/res/drawable-mdpi/ic_lock_idle_low_battery.png
+++ b/core/res/res/drawable-mdpi/ic_lock_idle_low_battery.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_drag_direction_green_up.png b/core/res/res/drawable-mdpi/indicator_code_lock_drag_direction_green_up.png
index 7ddeba5..0bc86c3 100644
--- a/core/res/res/drawable-mdpi/indicator_code_lock_drag_direction_green_up.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_drag_direction_green_up.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_drag_direction_red_up.png b/core/res/res/drawable-mdpi/indicator_code_lock_drag_direction_red_up.png
index 7201e58..2ab4547 100644
--- a/core/res/res/drawable-mdpi/indicator_code_lock_drag_direction_red_up.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_drag_direction_red_up.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default.png b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default.png
old mode 100755
new mode 100644
index 8546c5f..fe72d00
--- a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green.png b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green.png
old mode 100755
new mode 100644
index a98a29a..be666c6
--- a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_red.png b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_red.png
old mode 100755
new mode 100644
index 6d579cb..9627197
--- a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_red.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_red.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/keyboard_textfield_selected.9.png b/core/res/res/drawable-mdpi/keyboard_textfield_selected.9.png
deleted file mode 100644
index 6e703af..0000000
--- a/core/res/res/drawable-mdpi/keyboard_textfield_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/sym_keyboard_delete_holo.png b/core/res/res/drawable-mdpi/sym_keyboard_delete_holo.png
similarity index 100%
rename from core/res/res/drawable-xlarge-mdpi/sym_keyboard_delete_holo.png
rename to core/res/res/drawable-mdpi/sym_keyboard_delete_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/sym_keyboard_shift.png b/core/res/res/drawable-mdpi/sym_keyboard_shift.png
index 0566e5a..91d6e32 100644
--- a/core/res/res/drawable-mdpi/sym_keyboard_shift.png
+++ b/core/res/res/drawable-mdpi/sym_keyboard_shift.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/sym_keyboard_shift_locked.png b/core/res/res/drawable-mdpi/sym_keyboard_shift_locked.png
old mode 100755
new mode 100644
index ccaf05d..2bd0536
--- a/core/res/res/drawable-mdpi/sym_keyboard_shift_locked.png
+++ b/core/res/res/drawable-mdpi/sym_keyboard_shift_locked.png
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/textfield_bg_activated_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_bg_activated_holo_dark.9.png
similarity index 100%
rename from core/res/res/drawable-xlarge-mdpi/textfield_bg_activated_holo_dark.9.png
rename to core/res/res/drawable-mdpi/textfield_bg_activated_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/textfield_bg_default_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_bg_default_holo_dark.9.png
similarity index 100%
rename from core/res/res/drawable-xlarge-mdpi/textfield_bg_default_holo_dark.9.png
rename to core/res/res/drawable-mdpi/textfield_bg_default_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/textfield_bg_disabled_focused_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_bg_disabled_focused_holo_dark.9.png
similarity index 100%
rename from core/res/res/drawable-xlarge-mdpi/textfield_bg_disabled_focused_holo_dark.9.png
rename to core/res/res/drawable-mdpi/textfield_bg_disabled_focused_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/textfield_bg_disabled_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_bg_disabled_holo_dark.9.png
similarity index 100%
rename from core/res/res/drawable-xlarge-mdpi/textfield_bg_disabled_holo_dark.9.png
rename to core/res/res/drawable-mdpi/textfield_bg_disabled_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/textfield_bg_focused_holo_dark.9.png b/core/res/res/drawable-mdpi/textfield_bg_focused_holo_dark.9.png
similarity index 100%
rename from core/res/res/drawable-xlarge-mdpi/textfield_bg_focused_holo_dark.9.png
rename to core/res/res/drawable-mdpi/textfield_bg_focused_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/toast_frame.9.png b/core/res/res/drawable-mdpi/toast_frame.9.png
index 1b06b7c8..8603e93 100755
--- a/core/res/res/drawable-mdpi/toast_frame.9.png
+++ b/core/res/res/drawable-mdpi/toast_frame.9.png
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/unlock_default.png b/core/res/res/drawable-mdpi/unlock_default.png
similarity index 100%
rename from core/res/res/drawable-xlarge-mdpi/unlock_default.png
rename to core/res/res/drawable-mdpi/unlock_default.png
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/unlock_halo.png b/core/res/res/drawable-mdpi/unlock_halo.png
similarity index 100%
rename from core/res/res/drawable-xlarge-mdpi/unlock_halo.png
rename to core/res/res/drawable-mdpi/unlock_halo.png
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/unlock_ring.png b/core/res/res/drawable-mdpi/unlock_ring.png
similarity index 100%
rename from core/res/res/drawable-xlarge-mdpi/unlock_ring.png
rename to core/res/res/drawable-mdpi/unlock_ring.png
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/unlock_wave.png b/core/res/res/drawable-mdpi/unlock_wave.png
similarity index 100%
rename from core/res/res/drawable-xlarge-mdpi/unlock_wave.png
rename to core/res/res/drawable-mdpi/unlock_wave.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/cab_background_opaque_holo_dark.9.png b/core/res/res/drawable-xhdpi/cab_background_opaque_holo_dark.9.png
new file mode 100644
index 0000000..e2b604b
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/cab_background_opaque_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/cab_background_opaque_holo_light.9.png b/core/res/res/drawable-xhdpi/cab_background_opaque_holo_light.9.png
new file mode 100644
index 0000000..0c1aeaa
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/cab_background_opaque_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/dialog_bottom_holo_dark.9.png b/core/res/res/drawable-xhdpi/dialog_bottom_holo_dark.9.png
new file mode 100644
index 0000000..b33e117
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/dialog_bottom_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/dialog_bottom_holo_light.9.png b/core/res/res/drawable-xhdpi/dialog_bottom_holo_light.9.png
new file mode 100644
index 0000000..d84d427
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/dialog_bottom_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/dialog_full_holo_dark.9.png b/core/res/res/drawable-xhdpi/dialog_full_holo_dark.9.png
new file mode 100644
index 0000000..9c0ff47
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/dialog_full_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/dialog_full_holo_light.9.png b/core/res/res/drawable-xhdpi/dialog_full_holo_light.9.png
new file mode 100644
index 0000000..331a4f2
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/dialog_full_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/dialog_middle_holo_dark.9.png b/core/res/res/drawable-xhdpi/dialog_middle_holo_dark.9.png
new file mode 100644
index 0000000..cdc887d
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/dialog_middle_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/dialog_middle_holo_light.9.png b/core/res/res/drawable-xhdpi/dialog_middle_holo_light.9.png
new file mode 100644
index 0000000..55c60b8
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/dialog_middle_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/dialog_top_holo_dark.9.png b/core/res/res/drawable-xhdpi/dialog_top_holo_dark.9.png
new file mode 100644
index 0000000..600efb3
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/dialog_top_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/dialog_top_holo_light.9.png b/core/res/res/drawable-xhdpi/dialog_top_holo_light.9.png
new file mode 100644
index 0000000..d33d033
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/dialog_top_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/toast_frame.9.png b/core/res/res/drawable-xhdpi/toast_frame.9.png
new file mode 100644
index 0000000..9c0ff47
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/toast_frame.9.png
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/btn_code_lock_default.png b/core/res/res/drawable-xlarge-mdpi/btn_code_lock_default.png
deleted file mode 100644
index 45cc20d..0000000
--- a/core/res/res/drawable-xlarge-mdpi/btn_code_lock_default.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/btn_code_lock_touched.png b/core/res/res/drawable-xlarge-mdpi/btn_code_lock_touched.png
deleted file mode 100644
index 45cc20d..0000000
--- a/core/res/res/drawable-xlarge-mdpi/btn_code_lock_touched.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_normal.9.png b/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_normal.9.png
deleted file mode 100644
index 0fbdbfa..0000000
--- a/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_normal_off.9.png b/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_normal_off.9.png
deleted file mode 100644
index ae97453..0000000
--- a/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_normal_off.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_normal_on.9.png b/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_normal_on.9.png
deleted file mode 100644
index 4127d1e..0000000
--- a/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_normal_on.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_pressed.9.png b/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_pressed.9.png
deleted file mode 100644
index 525ab8a..0000000
--- a/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_pressed_off.9.png b/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_pressed_off.9.png
deleted file mode 100644
index eb05820..0000000
--- a/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_pressed_off.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_pressed_on.9.png b/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_pressed_on.9.png
deleted file mode 100644
index 416b2c7..0000000
--- a/core/res/res/drawable-xlarge-mdpi/btn_keyboard_key_fulltrans_pressed_on.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/ic_lock_idle_alarm.png b/core/res/res/drawable-xlarge-mdpi/ic_lock_idle_alarm.png
deleted file mode 100644
index 97ac023..0000000
--- a/core/res/res/drawable-xlarge-mdpi/ic_lock_idle_alarm.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/ic_lock_idle_charging.png b/core/res/res/drawable-xlarge-mdpi/ic_lock_idle_charging.png
deleted file mode 100644
index 4210db2..0000000
--- a/core/res/res/drawable-xlarge-mdpi/ic_lock_idle_charging.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/ic_lock_idle_lock.png b/core/res/res/drawable-xlarge-mdpi/ic_lock_idle_lock.png
deleted file mode 100644
index 1060f5a..0000000
--- a/core/res/res/drawable-xlarge-mdpi/ic_lock_idle_lock.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/ic_lock_idle_low_battery.png b/core/res/res/drawable-xlarge-mdpi/ic_lock_idle_low_battery.png
deleted file mode 100644
index 72e4afa..0000000
--- a/core/res/res/drawable-xlarge-mdpi/ic_lock_idle_low_battery.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/indicator_code_lock_drag_direction_green_up.png b/core/res/res/drawable-xlarge-mdpi/indicator_code_lock_drag_direction_green_up.png
deleted file mode 100644
index 0bc86c3..0000000
--- a/core/res/res/drawable-xlarge-mdpi/indicator_code_lock_drag_direction_green_up.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/indicator_code_lock_drag_direction_red_up.png b/core/res/res/drawable-xlarge-mdpi/indicator_code_lock_drag_direction_red_up.png
deleted file mode 100644
index 2ab4547..0000000
--- a/core/res/res/drawable-xlarge-mdpi/indicator_code_lock_drag_direction_red_up.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/indicator_code_lock_point_area_default.png b/core/res/res/drawable-xlarge-mdpi/indicator_code_lock_point_area_default.png
deleted file mode 100644
index fe72d00..0000000
--- a/core/res/res/drawable-xlarge-mdpi/indicator_code_lock_point_area_default.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/indicator_code_lock_point_area_green.png b/core/res/res/drawable-xlarge-mdpi/indicator_code_lock_point_area_green.png
deleted file mode 100644
index be666c6..0000000
--- a/core/res/res/drawable-xlarge-mdpi/indicator_code_lock_point_area_green.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/indicator_code_lock_point_area_red.png b/core/res/res/drawable-xlarge-mdpi/indicator_code_lock_point_area_red.png
deleted file mode 100644
index 9627197..0000000
--- a/core/res/res/drawable-xlarge-mdpi/indicator_code_lock_point_area_red.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/sym_keyboard_shift.png b/core/res/res/drawable-xlarge-mdpi/sym_keyboard_shift.png
deleted file mode 100644
index 91d6e32..0000000
--- a/core/res/res/drawable-xlarge-mdpi/sym_keyboard_shift.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xlarge-mdpi/sym_keyboard_shift_locked.png b/core/res/res/drawable-xlarge-mdpi/sym_keyboard_shift_locked.png
deleted file mode 100644
index 2bd0536..0000000
--- a/core/res/res/drawable-xlarge-mdpi/sym_keyboard_shift_locked.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/extract_edit_text.xml b/core/res/res/drawable/extract_edit_text.xml
deleted file mode 100644
index c7f66f6..0000000
--- a/core/res/res/drawable/extract_edit_text.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_focused="true" android:drawable="@drawable/keyboard_textfield_selected" />
-    <item android:drawable="@drawable/textfield_disabled" />
-</selector>
-
diff --git a/core/res/res/layout-xlarge/keyguard.xml b/core/res/res/layout-sw600dp/keyguard.xml
similarity index 100%
rename from core/res/res/layout-xlarge/keyguard.xml
rename to core/res/res/layout-sw600dp/keyguard.xml
diff --git a/core/res/res/layout-xlarge/keyguard_screen_glogin_unlock.xml b/core/res/res/layout-sw600dp/keyguard_screen_glogin_unlock.xml
similarity index 100%
rename from core/res/res/layout-xlarge/keyguard_screen_glogin_unlock.xml
rename to core/res/res/layout-sw600dp/keyguard_screen_glogin_unlock.xml
diff --git a/core/res/res/layout-xlarge/keyguard_screen_lock.xml b/core/res/res/layout-sw600dp/keyguard_screen_lock.xml
similarity index 100%
rename from core/res/res/layout-xlarge/keyguard_screen_lock.xml
rename to core/res/res/layout-sw600dp/keyguard_screen_lock.xml
diff --git a/core/res/res/layout-xlarge/keyguard_screen_password_landscape.xml b/core/res/res/layout-sw600dp/keyguard_screen_password_landscape.xml
similarity index 100%
rename from core/res/res/layout-xlarge/keyguard_screen_password_landscape.xml
rename to core/res/res/layout-sw600dp/keyguard_screen_password_landscape.xml
diff --git a/core/res/res/layout-xlarge/keyguard_screen_password_portrait.xml b/core/res/res/layout-sw600dp/keyguard_screen_password_portrait.xml
similarity index 100%
rename from core/res/res/layout-xlarge/keyguard_screen_password_portrait.xml
rename to core/res/res/layout-sw600dp/keyguard_screen_password_portrait.xml
diff --git a/core/res/res/layout-xlarge/keyguard_screen_sim_pin_landscape.xml b/core/res/res/layout-sw600dp/keyguard_screen_sim_pin_landscape.xml
similarity index 100%
rename from core/res/res/layout-xlarge/keyguard_screen_sim_pin_landscape.xml
rename to core/res/res/layout-sw600dp/keyguard_screen_sim_pin_landscape.xml
diff --git a/core/res/res/layout-xlarge/keyguard_screen_sim_pin_portrait.xml b/core/res/res/layout-sw600dp/keyguard_screen_sim_pin_portrait.xml
similarity index 100%
rename from core/res/res/layout-xlarge/keyguard_screen_sim_pin_portrait.xml
rename to core/res/res/layout-sw600dp/keyguard_screen_sim_pin_portrait.xml
diff --git a/core/res/res/layout-xlarge/keyguard_screen_status_land.xml b/core/res/res/layout-sw600dp/keyguard_screen_status_land.xml
similarity index 100%
rename from core/res/res/layout-xlarge/keyguard_screen_status_land.xml
rename to core/res/res/layout-sw600dp/keyguard_screen_status_land.xml
diff --git a/core/res/res/layout-xlarge/keyguard_screen_status_port.xml b/core/res/res/layout-sw600dp/keyguard_screen_status_port.xml
similarity index 100%
rename from core/res/res/layout-xlarge/keyguard_screen_status_port.xml
rename to core/res/res/layout-sw600dp/keyguard_screen_status_port.xml
diff --git a/core/res/res/layout-xlarge/keyguard_screen_tab_unlock.xml b/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock.xml
similarity index 100%
rename from core/res/res/layout-xlarge/keyguard_screen_tab_unlock.xml
rename to core/res/res/layout-sw600dp/keyguard_screen_tab_unlock.xml
diff --git a/core/res/res/layout-xlarge/keyguard_screen_tab_unlock_land.xml b/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock_land.xml
similarity index 100%
rename from core/res/res/layout-xlarge/keyguard_screen_tab_unlock_land.xml
rename to core/res/res/layout-sw600dp/keyguard_screen_tab_unlock_land.xml
diff --git a/core/res/res/layout-xlarge/keyguard_screen_unlock_landscape.xml b/core/res/res/layout-sw600dp/keyguard_screen_unlock_landscape.xml
similarity index 96%
rename from core/res/res/layout-xlarge/keyguard_screen_unlock_landscape.xml
rename to core/res/res/layout-sw600dp/keyguard_screen_unlock_landscape.xml
index 8acb656..e3d7a3f 100644
--- a/core/res/res/layout-xlarge/keyguard_screen_unlock_landscape.xml
+++ b/core/res/res/layout-sw600dp/keyguard_screen_unlock_landscape.xml
@@ -47,13 +47,12 @@
     <RelativeLayout
         android:layout_weight="1"
         android:layout_width="0dip"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:gravity="center_vertical|center_horizontal">
 
         <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
             android:layout_width="354dip"
             android:layout_height="354dip"
-            android:layout_marginLeft="143dip"
-            android:layout_marginTop="201dip"
             android:layout_gravity="center_vertical"
         />
 
diff --git a/core/res/res/layout-xlarge/keyguard_screen_unlock_portrait.xml b/core/res/res/layout-sw600dp/keyguard_screen_unlock_portrait.xml
similarity index 100%
rename from core/res/res/layout-xlarge/keyguard_screen_unlock_portrait.xml
rename to core/res/res/layout-sw600dp/keyguard_screen_unlock_portrait.xml
diff --git a/core/res/res/layout/alert_dialog_holo.xml b/core/res/res/layout/alert_dialog_holo.xml
index 57eb9c7..8ee91ca 100644
--- a/core/res/res/layout/alert_dialog_holo.xml
+++ b/core/res/res/layout/alert_dialog_holo.xml
@@ -22,6 +22,8 @@
     android:id="@+id/parentPanel"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    android:layout_marginLeft="8dip"
+    android:layout_marginRight="8dip"
     android:orientation="vertical">
 
     <LinearLayout android:id="@+id/topPanel"
@@ -42,7 +44,7 @@
             android:layout_height="wrap_content"
             android:orientation="horizontal"
             android:gravity="center_vertical|left"
-            android:minHeight="60dip"
+            android:minHeight="@dimen/alert_dialog_title_height"
             android:layout_marginLeft="32dip"
             android:layout_marginRight="32dip">
             <ImageView android:id="@+id/icon"
@@ -107,7 +109,7 @@
     <LinearLayout android:id="@+id/buttonPanel"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:minHeight="54dip"
+        android:minHeight="@dimen/alert_dialog_button_bar_height"
         android:orientation="vertical"
         android:divider="?android:attr/dividerHorizontal"
         android:showDividers="beginning"
@@ -132,6 +134,7 @@
                 android:layout_weight="1"
                 android:maxLines="2"
                 style="?android:attr/buttonBarButtonStyle"
+                android:minHeight="@dimen/alert_dialog_button_bar_height"
                 android:layout_height="wrap_content" />
             <Button android:id="@+id/button3"
                 android:layout_width="0dip"
@@ -139,12 +142,14 @@
                 android:layout_weight="1"
                 android:maxLines="2"
                 style="?android:attr/buttonBarButtonStyle"
+                android:minHeight="@dimen/alert_dialog_button_bar_height"
                 android:layout_height="wrap_content" />
             <Button android:id="@+id/button2"
                 android:layout_width="0dip"
                 android:layout_gravity="right"
                 android:layout_weight="1"
                 android:maxLines="2"
+                android:minHeight="@dimen/alert_dialog_button_bar_height"
                 style="?android:attr/buttonBarButtonStyle"
                 android:layout_height="wrap_content" />
             <LinearLayout android:id="@+id/rightSpacer"
diff --git a/core/res/res/layout/input_method_extract_view.xml b/core/res/res/layout/input_method_extract_view.xml
index 689ba7b..7d59d02 100644
--- a/core/res/res/layout/input_method_extract_view.xml
+++ b/core/res/res/layout/input_method_extract_view.xml
@@ -31,7 +31,6 @@
             android:gravity="top"
             android:minLines="1"
             android:inputType="text"
-            android:background="@android:drawable/extract_edit_text"
         >
     </android.inputmethodservice.ExtractEditText>
 
diff --git a/core/res/res/layout/search_bar.xml b/core/res/res/layout/search_bar.xml
index 9cf08ea..7918a3f 100644
--- a/core/res/res/layout/search_bar.xml
+++ b/core/res/res/layout/search_bar.xml
@@ -25,7 +25,7 @@
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:focusable="true"
-    android:background="@drawable/cab_background_light"
+    android:background="?android:attr/actionModeBackground"
     android:descendantFocusability="afterDescendants">
 
     <RelativeLayout
diff --git a/core/res/res/values-h720dp/dimens.xml b/core/res/res/values-h720dp/dimens.xml
new file mode 100644
index 0000000..7f43946
--- /dev/null
+++ b/core/res/res/values-h720dp/dimens.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2011, 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.
+*/
+-->
+<resources>
+    <!-- Dialog title height -->
+    <dimen name="alert_dialog_title_height">54dip</dimen>
+    <!-- Dialog button bar height -->
+    <dimen name="alert_dialog_button_bar_height">54dip</dimen>
+</resources>
diff --git a/core/res/res/values-large/dimens.xml b/core/res/res/values-large/dimens.xml
index da36b67..55eb145 100644
--- a/core/res/res/values-large/dimens.xml
+++ b/core/res/res/values-large/dimens.xml
@@ -24,10 +24,6 @@
     <!-- Size of the giant number (unread count) in the notifications -->
     <dimen name="status_bar_content_number_size">48sp</dimen>
 
-    <!-- Margin at the edge of the screen to ignore touch events for in the windowshade. -->
-    <!-- Margin for permanent screen decorations at the bottom. -->
-    <dimen name="screen_margin_bottom">48dip</dimen>
-
     <!-- Default height of a key in the password keyboard for alpha -->
     <dimen name="password_keyboard_key_height_alpha">75dip</dimen>
     <!-- Default height of a key in the password keyboard for numeric -->
diff --git a/core/res/res/values-large/strings.xml b/core/res/res/values-large/strings.xml
new file mode 100644
index 0000000..e998b9a
--- /dev/null
+++ b/core/res/res/values-large/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2011, 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.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+    <!-- Do not translate.  WebView User Agent targeted content -->
+    <string name="web_user_agent_target_content" translatable="false"></string>
+
+</resources>
diff --git a/core/res/res/values-xlarge/config.xml b/core/res/res/values-sw600dp/config.xml
similarity index 99%
rename from core/res/res/values-xlarge/config.xml
rename to core/res/res/values-sw600dp/config.xml
index 4c8bbe6..49ace34 100644
--- a/core/res/res/values-xlarge/config.xml
+++ b/core/res/res/values-sw600dp/config.xml
@@ -27,6 +27,7 @@
 
     <!-- Show sliding tab before lockscreen -->
     <bool name="config_enableSlidingTabFirst">false</bool>
+
     <!-- Enable lockscreen rotation -->
     <bool name="config_enableLockScreenRotation">true</bool>
 
diff --git a/core/res/res/values-xlarge/dimens.xml b/core/res/res/values-xlarge/dimens.xml
index e058442..b906e1a 100644
--- a/core/res/res/values-xlarge/dimens.xml
+++ b/core/res/res/values-xlarge/dimens.xml
@@ -25,10 +25,6 @@
     <!-- Size of the giant number (unread count) in the notifications -->
     <dimen name="status_bar_content_number_size">48sp</dimen>
 
-    <!-- Margin at the edge of the screen to ignore touch events for in the windowshade. -->
-    <!-- Margin for permanent screen decorations at the bottom. -->
-    <dimen name="screen_margin_bottom">48dip</dimen>
-
     <!-- Default height of a key in the password keyboard for alpha -->
     <dimen name="password_keyboard_key_height_alpha">75dip</dimen>
     <!-- Default height of a key in the password keyboard for numeric -->
diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml
index 9073531..810c3b2 100644
--- a/core/res/res/values/arrays.xml
+++ b/core/res/res/values/arrays.xml
@@ -233,7 +233,10 @@
        <item>@drawable/btn_cab_done_focused_holo</item>
        <item>@drawable/btn_cab_done_holo</item>
        <item>@drawable/btn_cab_done_pressed_holo</item>
-       <item>@drawable/cab_background_light</item>
+       <item>@drawable/cab_background_holo_dark</item>
+       <item>@drawable/cab_background_holo_light</item>
+       <item>@drawable/cab_background_opaque_holo_dark</item>
+       <item>@drawable/cab_background_opaque_holo_light</item>
        <item>@drawable/cab_ic_close_focused_holo</item>
        <item>@drawable/cab_ic_close_holo</item>
        <item>@drawable/cab_ic_close_normal_holo</item>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 2bb3e83..c1e81c3 100755
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -752,6 +752,9 @@
         <!-- SearchView text field background for the right section -->
         <attr name="searchViewTextFieldRight" format="reference" />
 
+        <!-- Theme to use for Search Dialogs -->
+        <attr name="searchDialogTheme" format="reference" />
+
         <!-- Specifies a drawable to use for the 'home as up' indicator. -->
         <attr name="homeAsUpIndicator" format="reference" />
 
@@ -820,6 +823,10 @@
      Default value is false. EditText content is always selectable. -->
     <attr name="textIsSelectable" format="boolean" />
 
+    <!-- When true, IME suggestions will be displayed when the user double taps on editable text.
+     The default value is true. -->
+    <attr name="suggestionsEnabled" format="boolean" />
+
     <!-- Where to ellipsize text. -->
     <attr name="ellipsize">
         <enum name="none" value="0" />
@@ -2874,6 +2881,8 @@
 
         <!-- Indicates that the content of a non-editable text can be selected. -->
         <attr name="textIsSelectable" />
+        <!-- Suggestions will be displayed when the user double taps on editable text. -->
+        <attr name="suggestionsEnabled" />
     </declare-styleable>
     <!-- An <code>input-extras</code> is a container for extra data to supply to
          an input method.  Contains
@@ -4904,9 +4913,6 @@
         <!-- Specifies padding that should be applied to the left and right sides of
              system-provided items in the bar. -->
         <attr name="itemPadding" format="dimension" />
-        <!-- Specifies whether tabs should be embedded within the bar itself (true)
-             or displayed elsewhere (false). -->
-        <attr name="embeddedTabs" format="boolean" />
     </declare-styleable>
 
     <declare-styleable name="ActionMode">
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 625afff..6b7c2a6 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -590,11 +590,21 @@
         <!-- The global user interface mode has changed.  For example,
              going in or out of car mode, night mode changing, etc. -->
         <flag name="uiMode" value="0x0200" />
+        <!-- The current available screen size has changed.  If applications don't
+             target at least {@link android.os.Build.VERSION_CODES#HONEYCOMB_MR2}
+             then the activity will always handle this itself (the change
+             will not result in a restart).  This represents a change in the
+             currently available size, so will change when the user switches
+             between landscape and portrait. -->
+        <flag name="screenSize" value="0x0400" />
         <!-- The physical screen size has changed.  If applications don't
              target at least {@link android.os.Build.VERSION_CODES#HONEYCOMB_MR2}
              then the activity will always handle this itself (the change
-             will not result in a restart). -->
-        <flag name="screenSize" value="0x0400" />
+             will not result in a restart).  This represents a change in size
+             regardless of orientation, so will only change when the actual
+             physical screen size has changed such as switching to an external
+             display. -->
+        <flag name="smallestScreenSize" value="0x0800" />
         <!-- The font scaling factor has changed, that is the user has
              selected a new global font size. -->
         <flag name="fontScale" value="0x40000000" />
diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml
index 39d2329..6529fe1 100644
--- a/core/res/res/values/colors.xml
+++ b/core/res/res/values/colors.xml
@@ -77,6 +77,7 @@
     <drawable name="dialog_holo_light_frame">@drawable/dialog_full_holo_light</drawable>
     
     <drawable name="input_method_fullscreen_background">#fff9f9f9</drawable>
+    <drawable name="input_method_fullscreen_background_holo">@drawable/screen_background_holo_dark</drawable>
 
     <!-- For date picker widget -->
     <drawable name="selected_day_background">#ff0092f4</drawable>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 990885d..4dd4ff2 100755
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -94,49 +94,6 @@
          when there's no network connection. If the scan doesn't timeout, use zero -->
     <integer name="config_radioScanningTimeout">0</integer>
 
-    <!-- Set to true if the location returned Environment.getExternalStorageDirectory()
-         is actually a subdirectory of the internal storage.
-         If this is set then Environment.getExternalStorageState() will always return
-         MEDIA_MOUNTED and Intent.ACTION_MEDIA_MOUNTED will be broadcast at boot time
-         for backward compatibility with apps that require external storage. -->
-    <bool name="config_emulateExternalStorage">false</bool>
-
-    <!-- A product with no SD card == not removable. -->
-    <bool name="config_externalStorageRemovable" product="nosdcard">false</bool>
-    <!-- Configures whether the primary external storage device is
-         removable.  For example, if external storage is on an SD card,
-         it is removable; if it is built in to the device, it is not removable.
-         The default product has external storage on an SD card, which is
-         removable. -->
-    <bool name="config_externalStorageRemovable" product="default">true</bool>
-
-    <!-- List of mount points for external storage devices.
-         The first item on the list should be the primary external storage and should match the
-         value returned by Environment.getExternalStorageDirectory (/mnt/sdcard).
-         MTP storage IDs will be generated based on the position of the mountpoint in this list:
-            0x00010001 - ID for primary external storage (/mnt/sdcard)
-            0x00020001 - ID for first secondary external storage
-            0x00030001 - ID for second secondary external storage
-         etc. -->
-    <string-array translatable="false" name="config_externalStoragePaths">
-        <item>"/mnt/sdcard"</item>
-    </string-array>
-
-    <!-- User visible descriptions of the volumes in the config_externalStoragePaths array. -->
-    <string-array translatable="true" name="config_externalStorageDescriptions">
-        <item>"SD card"</item>
-    </string-array>
-
-    <!-- Number of megabytes of space to leave unallocated by MTP.
-         MTP will subtract this value from the free space it reports back
-         to the host via GetStorageInfo, and will not allow new files to
-         be added via MTP if there is less than this amount left free in the storage.
-         If MTP has dedicated storage this value should be zero, but if MTP is
-         sharing storage with the rest of the system, set this to a positive value
-         to ensure that MTP activity does not result in the storage being
-         too close to full. -->
-    <integer name="config_mtpReserveSpaceMegabytes">0</integer>
-
     <!-- XXXXX NOTE THE FOLLOWING RESOURCES USE THE WRONG NAMING CONVENTION.
          Please don't copy them, copy anything else. -->
 
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index a1511b3..3f4010b 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -19,9 +19,9 @@
 -->
 <resources>
     <!-- The width that is used when creating thumbnails of applications. -->
-    <dimen name="thumbnail_width">64dp</dimen>
+    <dimen name="thumbnail_width">120dp</dimen>
     <!-- The height that is used when creating thumbnails of applications. -->
-    <dimen name="thumbnail_height">100dp</dimen>
+    <dimen name="thumbnail_height">120dp</dimen>
     <!-- The standard size (both width and height) of an application icon that
          will be displayed in the app launcher and elsewhere. -->
     <dimen name="app_icon_size">48dip</dimen>
@@ -38,8 +38,6 @@
     <dimen name="status_bar_content_number_size">48sp</dimen>
     <!-- Margin at the edge of the screen to ignore touch events for in the windowshade. -->
     <dimen name="status_bar_edge_ignore">5dp</dimen>
-    <!-- Margin for permanent screen decorations at the bottom. -->
-    <dimen name="screen_margin_bottom">0dip</dimen>
     <!-- Size of the fastscroll hint letter -->
     <dimen name="fastscroll_overlay_size">104dp</dimen>
     <!-- Width of the fastscroll thumb -->
@@ -80,6 +78,11 @@
     <!-- Minimum width of the search view text entry area. -->
     <dimen name="search_view_text_min_width">160dip</dimen>
 
+    <!-- Dialog title height -->
+    <dimen name="alert_dialog_title_height">48dip</dimen>
+    <!-- Dialog button bar height -->
+    <dimen name="alert_dialog_button_bar_height">48dip</dimen>
+
     <!-- Default height of an action bar. -->
     <dimen name="action_bar_default_height">48dip</dimen>
     <!-- Vertical padding around action bar icons. -->
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 8ad8f67..1957b2a 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -1670,5 +1670,6 @@
   <public type="attr" name="horizontalDirection" />
 
   <public type="attr" name="fullBackupAgent" />
+  <public type="attr" name="suggestionsEnabled" />
 
 </resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 158d524..816546b 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1852,7 +1852,7 @@
 
     <!-- Do not translate.  WebView User Agent string -->
     <string name="web_user_agent" translatable="false">Mozilla/5.0 (Linux; U; <xliff:g id="x">Android %s</xliff:g>)
-        AppleWebKit/534.16 (KHTML, like Gecko) Version/4.0 <xliff:g id="mobile">%s</xliff:g>Safari/534.16</string>
+        AppleWebKit/534.20 (KHTML, like Gecko) Version/4.0 <xliff:g id="mobile">%s</xliff:g>Safari/534.20</string>
     <!-- Do not translate.  WebView User Agent targeted content -->
     <string name="web_user_agent_target_content" translatable="false">"Mobile "</string>
 
@@ -1998,6 +1998,9 @@
     <!-- Do not translate. Regex used by AutoFill. -->
     <string name="autofill_card_ignored_re">^card</string>
 
+    <!-- Do not translate. Regex used by AutoFill. -->
+    <string name="autofill_fax_re">fax<!-- fr-FR -->|télécopie|telecopie<!-- ja-JP -->|ファックス<!-- ru -->|факс<!-- zh-CN -->|传真<!-- zh-TW -->|傳真</string>
+
     <!-- Title of an application permission, listed so the user can choose whether
         they want to allow the application to do this. -->
     <string name="permlab_readHistoryBookmarks">read Browser\'s history and bookmarks</string>
@@ -2449,6 +2452,20 @@
     <!-- See SMS_DIALOG.  This is a button choice to disallow sending the SMSes.. -->
     <string name="sms_control_no">Cancel</string>
 
+    <!-- SIM swap and device reboot Dialog --> <skip />
+    <!-- See SIM_REMOVED_DIALOG.  This is the title of that dialog. -->
+    <string name="sim_removed_title">SIM card removed</string>
+    <!-- See SIM_REMOVED_DIALOG.  This is the message of that dialog. -->
+    <string name="sim_removed_message">The mobile network will be unavailable until you replace the SIM card.</string>
+    <!-- See SIM_REMOVED_DIALOG.  This is the button of that dialog. -->
+    <string name="sim_done_button">Done</string>
+    <!-- See SIM_ADDED_DIALOG.  This is the title of that dialog. -->
+    <string name="sim_added_title">SIM card added</string>
+    <!-- See SIM_ADDED_DIALOG.  This is the message of that dialog. -->
+    <string name="sim_added_message">You must restart your device to access the mobile network.</string>
+    <!-- See SIM_ADDED_DIALOG.  This is the button of that dialog. -->
+    <string name="sim_restart_button">Restart</string>
+
     <!-- Date/Time picker dialogs strings -->
 
     <!-- The title of the time picker dialog. [CHAR LIMIT=NONE] -->
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index ed1fec3..e95094f 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -1078,7 +1078,6 @@
         <item name="android:progressBarStyle">@android:style/Widget.ProgressBar.Horizontal</item>
         <item name="android:indeterminateProgressStyle">@android:style/Widget.ProgressBar.Small</item>
         <item name="android:homeLayout">@android:layout/action_bar_home</item>
-        <item name="android:embeddedTabs">@android:bool/action_bar_embed_tabs</item>
     </style>
 
     <style name="Widget.ActionMode">
@@ -1122,6 +1121,7 @@
     </style>
 
     <style name="Widget.ActionBarView_TabView">
+        <item name="android:gravity">center_horizontal</item>
         <item name="android:background">@drawable/minitab_lt</item>
         <item name="android:paddingLeft">4dip</item>
         <item name="android:paddingRight">4dip</item>
@@ -1459,6 +1459,10 @@
     </style>
 
     <style name="Holo.ButtonBar" parent="ButtonBar">
+        <item name="android:paddingTop">0dip</item>
+        <item name="android:paddingLeft">0dip</item>
+        <item name="android:paddingRight">0dip</item>
+        <item name="android:paddingBottom">0dip</item>
         <item name="divider">?android:attr/dividerVertical</item>
         <item name="showDividers">middle</item>
         <item name="dividerPadding">8dip</item>
@@ -1791,6 +1795,9 @@
     </style>
 
     <style name="Widget.Holo.ActionBarView_TabBar" parent="Widget.ActionBarView_TabBar">
+        <item name="android:divider">?android:attr/dividerVertical</item>
+        <item name="android:showDividers">middle</item>
+        <item name="android:dividerPadding">8dip</item>
     </style>
 
     <style name="Widget.Holo.ActionBarView_TabText" parent="Widget.ActionBarView_TabText">
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index cdfdd11..0a614b2 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -262,7 +262,7 @@
         <item name="actionDropDownStyle">@android:style/Widget.Spinner.DropDown</item>
         <item name="actionButtonStyle">@android:style/Widget.ActionButton</item>
         <item name="actionOverflowButtonStyle">@android:style/Widget.ActionButton.Overflow</item>
-        <item name="actionModeBackground">@android:drawable/cab_background_dark</item>
+        <item name="actionModeBackground">@android:drawable/cab_background_opaque_holo_dark</item>
         <item name="actionModeCloseDrawable">@android:drawable/ic_menu_close_clear_cancel</item>
         <item name="actionModeCutDrawable">@android:drawable/ic_menu_cut_holo_dark</item>
         <item name="actionModeCopyDrawable">@android:drawable/ic_menu_copy_holo_dark</item>
@@ -298,6 +298,8 @@
         <item name="searchViewEditQuery">@android:drawable/ic_commit</item>
         <item name="searchViewEditQueryBackground">?attr/selectableItemBackground</item>
 
+        <item name="searchDialogTheme">@style/Theme.SearchBar</item>
+
         <!-- PreferenceFrameLayout attributes -->
         <item name="preferenceFrameLayoutStyle">@android:style/Widget.PreferenceFrameLayout</item>
 
@@ -397,7 +399,7 @@
         <item name="actionModeShareDrawable">@android:drawable/ic_menu_share_holo_light</item>
         <item name="actionModeFindDrawable">@android:drawable/ic_menu_find_holo_light</item>
         <item name="actionModeWebSearchDrawable">@android:drawable/ic_menu_search_holo_light</item>
-        <item name="actionModeBackground">@android:drawable/cab_background_light</item>
+        <item name="actionModeBackground">@android:drawable/cab_background_opaque_holo_light</item>
 
         <!-- SearchView attributes -->
         <item name="searchDropdownBackground">@android:drawable/search_dropdown_light</item>
@@ -679,7 +681,7 @@
          and a few custom attributes. -->
     <style name="Theme.Holo.InputMethod" parent="Theme.Holo.Panel">
         <item name="android:windowAnimationStyle">@android:style/Animation.InputMethod</item>
-        <item name="android:imeFullscreenBackground">@android:drawable/input_method_fullscreen_background</item>
+        <item name="android:imeFullscreenBackground">@android:drawable/input_method_fullscreen_background_holo</item>
         <item name="android:imeExtractEnterAnimation">@android:anim/input_method_extract_enter</item>
         <item name="android:imeExtractExitAnimation">@android:anim/input_method_extract_exit</item>
     </style>
@@ -687,12 +689,24 @@
     <!-- Theme for the search input bar. -->
     <style name="Theme.SearchBar" parent="Theme.Holo.Light.Panel">
         <item name="windowContentOverlay">@null</item>        
+        <item name="actionModeBackground">@android:drawable/cab_background_opaque_holo_light</item>
     </style>
-    
+
+    <style name="Theme.Holo.SearchBar" parent="Theme.Holo.Panel">
+        <item name="windowContentOverlay">@null</item>
+        <item name="actionModeBackground">@android:drawable/cab_background_opaque_holo_dark</item>
+    </style>
+
+    <style name="Theme.Holo.Light.SearchBar" parent="Theme.Holo.Light.Panel">
+        <item name="windowContentOverlay">@null</item>
+        <item name="actionModeBackground">@android:drawable/cab_background_opaque_holo_light</item>
+    </style>
+
     <!-- Theme for the search input bar when doing global search. The only
          difference from non-global search is that we do not dim the background. -->
     <style name="Theme.GlobalSearchBar" parent="Theme.Panel">
         <item name="windowContentOverlay">@null</item>
+        <item name="actionModeBackground">@android:drawable/cab_background_opaque_holo_light</item>
     </style>
 
     <!-- Menu Themes -->
@@ -1028,6 +1042,8 @@
         <!-- SearchView attributes -->
         <item name="searchDropdownBackground">@android:drawable/search_dropdown_dark</item>
 
+        <item name="searchDialogTheme">@style/Theme.Holo.SearchBar</item>
+
         <!-- PreferenceFrameLayout attributes -->
         <item name="preferenceFrameLayoutStyle">@android:style/Widget.Holo.PreferenceFrameLayout</item>
 
@@ -1313,6 +1329,8 @@
         <!-- SearchView attributes -->
         <item name="searchDropdownBackground">@android:drawable/search_dropdown_light</item>
 
+        <item name="searchDialogTheme">@style/Theme.Holo.Light.SearchBar</item>
+
         <!-- NumberPicker attributes and styles-->
         <item name="numberPickerUpButtonStyle">@style/Widget.Holo.Light.ImageButton.NumberPickerUpButton</item>
         <item name="numberPickerDownButtonStyle">@style/Widget.Holo.Light.ImageButton.NumberPickerDownButton</item>
diff --git a/core/tests/coretests/src/android/net/NetworkStatsTest.java b/core/tests/coretests/src/android/net/NetworkStatsTest.java
new file mode 100644
index 0000000..45719c2
--- /dev/null
+++ b/core/tests/coretests/src/android/net/NetworkStatsTest.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2011 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.net;
+
+import android.os.SystemClock;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import junit.framework.TestCase;
+
+@SmallTest
+public class NetworkStatsTest extends TestCase {
+
+    private static final String TEST_IFACE = "test0";
+
+    public void testFindIndex() throws Exception {
+        final NetworkStats stats = new NetworkStats.Builder(SystemClock.elapsedRealtime(), 3)
+                .addEntry(TEST_IFACE, 100, 1024, 0)
+                .addEntry(TEST_IFACE, 101, 0, 1024)
+                .addEntry(TEST_IFACE, 102, 1024, 1024).build();
+
+        assertEquals(2, stats.findIndex(TEST_IFACE, 102));
+        assertEquals(2, stats.findIndex(TEST_IFACE, 102));
+        assertEquals(0, stats.findIndex(TEST_IFACE, 100));
+        assertEquals(-1, stats.findIndex(TEST_IFACE, 6));
+    }
+
+    public void testSubtractIdenticalData() throws Exception {
+        final NetworkStats before = new NetworkStats.Builder(SystemClock.elapsedRealtime(), 2)
+                .addEntry(TEST_IFACE, 100, 1024, 0)
+                .addEntry(TEST_IFACE, 101, 0, 1024).build();
+
+        final NetworkStats after = new NetworkStats.Builder(SystemClock.elapsedRealtime(), 2)
+                .addEntry(TEST_IFACE, 100, 1024, 0)
+                .addEntry(TEST_IFACE, 101, 0, 1024).build();
+
+        final NetworkStats result = after.subtract(before);
+
+        assertEquals(0, result.rx[0]);
+        assertEquals(0, result.tx[0]);
+        assertEquals(0, result.rx[1]);
+        assertEquals(0, result.tx[1]);
+    }
+
+    public void testSubtractIdenticalRows() throws Exception {
+        final NetworkStats before = new NetworkStats.Builder(SystemClock.elapsedRealtime(), 2)
+                .addEntry(TEST_IFACE, 100, 1024, 0)
+                .addEntry(TEST_IFACE, 101, 0, 1024).build();
+
+        final NetworkStats after = new NetworkStats.Builder(SystemClock.elapsedRealtime(), 2)
+                .addEntry(TEST_IFACE, 100, 1025, 2)
+                .addEntry(TEST_IFACE, 101, 3, 1028).build();
+
+        final NetworkStats result = after.subtract(before);
+
+        // expect delta between measurements
+        assertEquals(1, result.rx[0]);
+        assertEquals(2, result.tx[0]);
+        assertEquals(3, result.rx[1]);
+        assertEquals(4, result.tx[1]);
+    }
+
+    public void testSubtractNewRows() throws Exception {
+        final NetworkStats before = new NetworkStats.Builder(SystemClock.elapsedRealtime(), 2)
+                .addEntry(TEST_IFACE, 100, 1024, 0)
+                .addEntry(TEST_IFACE, 101, 0, 1024).build();
+
+        final NetworkStats after = new NetworkStats.Builder(SystemClock.elapsedRealtime(), 3)
+                .addEntry(TEST_IFACE, 100, 1024, 0)
+                .addEntry(TEST_IFACE, 101, 0, 1024)
+                .addEntry(TEST_IFACE, 102, 1024, 1024).build();
+
+        final NetworkStats result = after.subtract(before);
+
+        // its okay to have new rows
+        assertEquals(0, result.rx[0]);
+        assertEquals(0, result.tx[0]);
+        assertEquals(0, result.rx[1]);
+        assertEquals(0, result.tx[1]);
+        assertEquals(1024, result.rx[2]);
+        assertEquals(1024, result.tx[2]);
+    }
+
+}
diff --git a/data/fonts/MTLc3m.ttf b/data/fonts/MTLc3m.ttf
index 3cc5c96..86bdcc7 100644
--- a/data/fonts/MTLc3m.ttf
+++ b/data/fonts/MTLc3m.ttf
Binary files differ
diff --git a/data/fonts/MTLmr3m.ttf b/data/fonts/MTLmr3m.ttf
index 05b9093..76fe737 100644
--- a/data/fonts/MTLmr3m.ttf
+++ b/data/fonts/MTLmr3m.ttf
Binary files differ
diff --git a/docs/html/guide/appendix/install-location.jd b/docs/html/guide/appendix/install-location.jd
index 7f96809..617f4fc 100644
--- a/docs/html/guide/appendix/install-location.jd
+++ b/docs/html/guide/appendix/install-location.jd
@@ -171,6 +171,11 @@
     <dd>The system delivers the {@link android.content.Intent#ACTION_BOOT_COMPLETED} broadcast
 before the external storage is mounted to the device. If your application is installed on the
 external storage, it can never receive this broadcast.</dd>
+  <dt>Copy Protection</dt>
+    <dd>Your application cannot be installed to a device's SD card if it uses Android Market's 
+      Copy Protection feature. However, if you use Android Market's 
+      <a href="{@docRoot}guide/publishing/licensing.html">Application Licensing</a> instead, your 
+      application <em>can</em> be installed to internal or external storage, including SD cards.</dd>
 </dl>
 
 <p>If your application uses any of the features listed above, you <strong>should not</strong> allow
diff --git a/docs/html/guide/publishing/licensing.jd b/docs/html/guide/publishing/licensing.jd
index a9b182e..d89a8ca 100644
--- a/docs/html/guide/publishing/licensing.jd
+++ b/docs/html/guide/publishing/licensing.jd
@@ -263,15 +263,15 @@
 you won't be able to upload a new version that uses licensing.</li>
 </ul>
 
-<h4>Replacement for copy protection</h4>
+<h4>Replacement for Copy Protection</h4>
 
 <p>Android Market Licensing is a flexible, secure mechanism for controlling
-access to your applications. It effectively replaces the copy-protection
+access to your applications. It effectively replaces the Copy Protection
 mechanism offered on Android Market and gives you wider distribution
 potential for your applications. </p>
 
 <ul>
-<li>A limitation of the legacy copy-protection mechanism on Android Market is
+<li>A limitation of the legacy Copy Protection mechanism on Android Market is
 that applications using it can be installed only on compatible devices that
 provide a secure internal storage environment. For example, a copy-protected
 application cannot be downloaded from Market to a device that provides root
diff --git a/docs/html/guide/topics/appwidgets/index.jd b/docs/html/guide/topics/appwidgets/index.jd
index 89306a2..e589292 100644
--- a/docs/html/guide/topics/appwidgets/index.jd
+++ b/docs/html/guide/topics/appwidgets/index.jd
@@ -7,7 +7,8 @@
     <ul>
       <li>App Widgets provide users access to some of your application features
 directly from the Home screen (without the need to launch an activity)</li>
-      <li>App Widgets are backed by a special kind of broadcast receiver that handles the App
+      <li>App Widgets are backed by a special kind of broadcast receiver that
+handles the App
 Widget lifecycle</li>
     </ul>
     
@@ -19,15 +20,28 @@
       <li><a href="#CreatingLayout">Creating the App Widget Layout</a></li>
       <li><a href="#AppWidgetProvider">Using the AppWidgetProvider Class</a>
         <ol>
-          <li><a href="#ProviderBroadcasts">Receiving App Widget broadcast Intents</a></li>
+          <li><a href="#ProviderBroadcasts">Receiving App Widget broadcast
+Intents</a></li>
         </ol>
       </li>
-      <li><a href="#Configuring">Creating an App Widget Configuration Activity</a>
+      <li><a href="#Configuring">Creating an App Widget Configuration
+Activity</a>
         <ol>
-          <li><a href="#UpdatingFromTheConfiguration">Updating the App Widget from 
+          <li><a href="#UpdatingFromTheConfiguration">Updating the App Widget
+from 
             the configuration Activity</a></li>
         </ol>
       </li>
+      <li><a href="#preview">Setting a Preview Image</a></li>
+      <li><a href="#collections">Using App Widgets with Collections</a>
+        <ol>
+          <li><a href="#collection_sample">Sample application</a></li>
+          <li><a href="#implementing_collections">Implementing app widgets with
+collections
+</a></li>
+          <li><a href="#fresh">Keeping Collection Data Fresh</a></li>
+        </ol>   
+      </li>
     </ol>
 
     <h2>Key classes</h2>
@@ -39,25 +53,34 @@
     
     <h2>See also</h2>
     <ol>
-      <li><a href="{@docRoot}guide/practices/ui_guidelines/widget_design.html">App Widget Design 
+      <li><a
+href="{@docRoot}guide/practices/ui_guidelines/widget_design.html">App Widget
+Design 
         Guidelines</a></li>
-      <li><a href="http://android-developers.blogspot.com/2009/04/introducing-home-screen-widgets-and.html">Introducing
+      <li><a
+href="http://android-developers.blogspot.com/2009/04/introducing-home-screen-
+widgets-and.html">Introducing
         home screen widgets and the AppWidget framework &raquo;</a></li>
     </ol>
   </div>
 </div>
 
 
-<p>App Widgets are miniature application views that can be embedded in other applications
-(such as the Home screen) and receive periodic updates. These views are referred 
+<p>App Widgets are miniature application views that can be embedded in other
+applications
+(such as the Home screen) and receive periodic updates. These views are
+referred 
 to as Widgets in the user interface,
-and you can publish one with an App Widget provider. An application component that is 
-able to hold other App Widgets is called an App Widget host. The screenshot below shows
+and you can publish one with an App Widget provider. An application component
+that is 
+able to hold other App Widgets is called an App Widget host. The screenshot
+below shows
 the Music App Widget.</p>
 
 <img src="{@docRoot}images/appwidget.png" alt="" />
 
-<p>This document describes how to publish an App Widget using an App Widget provider.</p>
+<p>This document describes how to publish an App Widget using an App Widget
+provider.</p>
 
 
 <h2 id="Basics">The Basics</h2>
@@ -66,18 +89,23 @@
 
 <dl>
   <dt>{@link android.appwidget.AppWidgetProviderInfo} object</dt>
-  <dd>Describes the metadata for an App Widget, such as the App Widget's layout, update frequency,
+  <dd>Describes the metadata for an App Widget, such as the App Widget's layout,
+update frequency,
     and the AppWidgetProvider class. This should be defined in XML.</dd>
   <dt>{@link android.appwidget.AppWidgetProvider} class implementation</dt>
-  <dd>Defines the basic methods that allow you to programmatically interface with the App Widget,
-    based on broadcast events. Through it, you will receive broadcasts when the App Widget is updated, 
+  <dd>Defines the basic methods that allow you to programmatically interface
+with the App Widget,
+    based on broadcast events. Through it, you will receive broadcasts when the
+App Widget is updated, 
     enabled, disabled and deleted.</dd>
   <dt>View layout</dt>
   <dd>Defines the initial layout for the App Widget, defined in XML.</dd>
 </dl>
 
-<p>Additionally, you can implement an App Widget configuration Activity. This is an optional 
-{@link android.app.Activity} that launches when the user adds your App Widget and allows him or her
+<p>Additionally, you can implement an App Widget configuration Activity. This is
+an optional 
+{@link android.app.Activity} that launches when the user adds your App Widget
+and allows him or her
 to modify App Widget settings at create-time.</p>
 
 <p>The following sections describe how to setup each of these components.</p>
@@ -85,7 +113,8 @@
 
 <h2 id="Manifest">Declaring an App Widget in the Manifest</h2>
 
-<p>First, declare the {@link android.appwidget.AppWidgetProvider} class in your application's
+<p>First, declare the {@link android.appwidget.AppWidgetProvider} class in your
+application's
 <code>AndroidManifest.xml</code> file. For example:</p>
 
 <pre>
@@ -98,24 +127,32 @@
 &lt;/receiver>
 </pre>
 
-<p>The <code>&lt;receiver&gt;</code> element requires the <code>android:name</code> 
+<p>The <code>&lt;receiver&gt;</code> element requires the
+<code>android:name</code> 
 attribute, which specifies the {@link android.appwidget.AppWidgetProvider} used
 by the App Widget.</p>
 
-<p>The <code>&lt;intent-filter&gt;</code> element must include an <code>&lt;action></code>
+<p>The <code>&lt;intent-filter&gt;</code> element must include an
+<code>&lt;action></code>
 element with the <code>android:name</code> attribute. This attribute specifies
 that the {@link android.appwidget.AppWidgetProvider} accepts the {@link
-android.appwidget.AppWidgetManager#ACTION_APPWIDGET_UPDATE ACTION_APPWIDGET_UPDATE} broadcast.
-This is the only broadcast that you must explicitly declare. The {@link android.appwidget.AppWidgetManager}
-automatically sends all other App Widget broadcasts to the AppWidgetProvider as necessary.</p>
+android.appwidget.AppWidgetManager#ACTION_APPWIDGET_UPDATE
+ACTION_APPWIDGET_UPDATE} broadcast.
+This is the only broadcast that you must explicitly declare. The {@link
+android.appwidget.AppWidgetManager}
+automatically sends all other App Widget broadcasts to the AppWidgetProvider as
+necessary.</p>
 
 <p>The <code>&lt;meta-data&gt;</code> element specifies the
 {@link android.appwidget.AppWidgetProviderInfo} resource and requires the 
 following attributes:</p>
 <ul>
-  <li><code>android:name</code> - Specifies the metadata name. Use <code>android.appwidget.provider</code>
-    to identify the data as the {@link android.appwidget.AppWidgetProviderInfo} descriptor.</li>
-  <li><code>android:resource</code> - Specifies the {@link android.appwidget.AppWidgetProviderInfo} 
+  <li><code>android:name</code> - Specifies the metadata name. Use
+<code>android.appwidget.provider</code>
+    to identify the data as the {@link android.appwidget.AppWidgetProviderInfo}
+descriptor.</li>
+  <li><code>android:resource</code> - Specifies the {@link
+android.appwidget.AppWidgetProviderInfo} 
     resource location.</li>
 </ul>
 
@@ -123,10 +160,13 @@
 <h2 id="MetaData">Adding the AppWidgetProviderInfo Metadata</h2>
 
 <p>The {@link android.appwidget.AppWidgetProviderInfo} defines the essential 
-qualities of an App Widget, such as its minimum layout dimensions, its initial layout resource,
-how often to update the App Widget, and (optionally) a configuration Activity to launch at create-time.
+qualities of an App Widget, such as its minimum layout dimensions, its initial
+layout resource,
+how often to update the App Widget, and (optionally) a configuration Activity to
+launch at create-time.
 Define the AppWidgetProviderInfo object in an XML resource using a single
-<code>&lt;appwidget-provider></code> element and save it in the project's <code>res/xml/</code> 
+<code>&lt;appwidget-provider></code> element and save it in the project's
+<code>res/xml/</code> 
 folder.</p>
 
 <p>For example:</p>
@@ -136,71 +176,131 @@
     android:minWidth="294dp"
     android:minHeight="72dp"
     android:updatePeriodMillis="86400000"
+    android:previewImage="@drawable/preview"
     android:initialLayout="@layout/example_appwidget"
-    android:configure="com.example.android.ExampleAppWidgetConfigure" >
+    android:configure="com.example.android.ExampleAppWidgetConfigure" 
+    android:resizeMode="horizontal|vertical">
 &lt;/appwidget-provider>
 </pre>
 
 <p>Here's a summary of the <code>&lt;appwidget-provider></code> attributes:</p>
 <ul>
-  <li>The values for the <code>minWidth</code> and <code>minHeight</code> attributes specify the minimum
-    area required by the App Widget's layout.
-    <p>The default Home screen positions App Widgets in its window based on a grid of
-    cells that have a defined height and width. If the values for an App Widget's minimum width 
+  <li>The values for the <code>minWidth</code> and <code>minHeight</code>
+attributes specify the minimum
+    area required by the App Widget's layout. 
+    <p>The default Home screen positions App Widgets in its window based on a
+grid of
+    cells that have a defined height and width. If the values for an App
+Widget's minimum width 
     or height don't match the dimensions of the cells,
     then the App Widget dimensions round <em>up</em> to the nearest cell size.
-    (See the <a href="{@docRoot}guide/practices/ui_guidelines/widget_design.html">App Widget Design 
+    (See the <a
+href="{@docRoot}guide/practices/ui_guidelines/widget_design.html">App Widget
+Design 
     Guidelines</a> for more information on the Home screen cell sizes.)</p>
-    <p>Because the Home screen's layout orientation (and thus, the cell sizes) can change,
-    as a rule of thumb, you should assume the worst-case cell size of 74 pixels for the height
-    <em>and</em> width of a cell. However, you must subtract 2 from the final dimension to account
-    for any integer rounding errors that occur in the pixel count. To find your minimum width
+    <p>Because the Home screen's layout orientation (and thus, the cell sizes)
+can change,
+    as a rule of thumb, you should assume the worst-case cell size of 74 pixels
+for the height
+    <em>and</em> width of a cell. However, you must subtract 2 from the final
+dimension to account
+    for any integer rounding errors that occur in the pixel count. To find your
+minimum width
     and height in density-independent pixels (dp), use this formula:<br/>
       <code>(number of cells * 74) - 2</code><br/>
-    Following this formula, you should use 72 dp for a height of one cell, 294 dp and for a width of four cells.</p>
+    Following this formula, you should use 72 dp for a height of one cell, 294
+dp and for a width of four cells.</p>
+<p class="note"><strong>Note:</strong> To make your app widget portable across
+devices, your app widget's minimum size should never be larger than 4 x 4 cells.
+See the <a
+href="{@docRoot}guide/practices/ui_guidelines/widget_design.htmll#sizes">App
+Widget Design Guidelines</a> for more discussion of Home screen cell sizes.</p>
   </li>
-  <li>The <code>updatePeriodMillis</code> attribute defines how often the App Widget framework should
-    request an update from the {@link android.appwidget.AppWidgetProvider} by calling the
-    {@link android.appwidget.AppWidgetProvider#onUpdate(Context,AppWidgetManager,int[])
-    onUpdate()} method. The actual update is not guaranteed to occur exactly on time with this value
-    and we suggest updating as infrequently as possible&mdash;perhaps no more than once an hour to 
-    conserve the battery. You might also allow the user to adjust the frequency in a 
-    configuration&mdash;some people might want a stock ticker to update every 15 minutes, or maybe 
-    only four times a day. 
-    	<p class="note"><strong>Note:</strong> If the device is asleep when it is time for an update 
-    	(as defined by <code>updatePeriodMillis</code>), then the device will wake up in order 
-    	to perform the update. If you don't update more than once per hour, this probably won't 
-    	cause significant problems for the battery life. If, however, you need to update more 
-    	frequently and/or you do not need to update while the device is asleep, then you can instead 
-    	perform updates based on an alarm that will not wake the device. To do so, set an alarm with 
-    	an Intent that your AppWidgetProvider receives, using the	{@link android.app.AlarmManager}. 
-    	Set the alarm type to either {@link android.app.AlarmManager#ELAPSED_REALTIME} or 
+  <li>The <code>updatePeriodMillis</code> attribute defines how often the App
+Widget framework should request an update from the {@link
+android.appwidget.AppWidgetProvider} by calling the 
+{@link android.appwidget.AppWidgetProvider#onUpdate(android.content.Context,android.appwidget.AppWidgetManager,int[]) onUpdate()} 
+callback method. The actual update
+is not guaranteed to occur exactly on time with this value and we suggest
+updating as infrequently as possible&mdash;perhaps no more than once an hour to
+conserve the battery. You might also allow the user to adjust the frequency in a
+configuration&mdash;some people might want a stock ticker to update every 15
+minutes, or maybe only four times a day. 
+    	<p class="note"><strong>Note:</strong> If the device is asleep when it
+is time for an update 
+    	(as defined by <code>updatePeriodMillis</code>), then the device will
+wake up in order 
+    	to perform the update. If you don't update more than once per hour, this
+probably won't 
+    	cause significant problems for the battery life. If, however, you need
+to update more 
+    	frequently and/or you do not need to update while the device is asleep,
+then you can instead 
+    	perform updates based on an alarm that will not wake the device. To do
+so, set an alarm with 
+    	an Intent that your AppWidgetProvider receives, using the	{@link
+android.app.AlarmManager}. 
+    	Set the alarm type to either {@link
+android.app.AlarmManager#ELAPSED_REALTIME} or 
     	{@link android.app.AlarmManager#RTC}, which will only
-    	deliver the alarm when the device is awake. Then set <code>updatePeriodMillis</code> to 
+    	deliver the alarm when the device is awake. Then set
+<code>updatePeriodMillis</code> to 
     	zero (<code>"0"</code>).</p>
   </li>
-  <li>The <code>initialLayout</code> attribute points to the layout resource that defines the
+  <li>The <code>initialLayout</code> attribute points to the layout resource
+that defines the
     App Widget layout.</li>
-  <li>The <code>configure</code> attribute defines the {@link android.app.Activity} to launch when
-    the user adds the App Widget, in order for him or her to configure App Widget properties. This is optional
-    (read <a href="#Configuring">Creating an App Widget Configuration Activity</a> below).</li>
-</ul>
+  <li>The <code>configure</code> attribute defines the {@link
+android.app.Activity} to launch when
+    the user adds the App Widget, in order for him or her to configure App
+Widget properties. This is optional
+    (read <a href="#Configuring">Creating an App Widget Configuration
+Activity</a> below).</li>
+    
+   <li>The <code>previewImage</code> attribute specifies a preview of what the
+app widget will look like after it's configured, which the user sees when
+selecting the app widget. If not supplied, the user instead sees your
+application's launcher icon. This field corresponds to the
+<code>android:previewImage</code> attribute in the <code>&lt;receiver&gt;</code>
+element in the <code>AndroidManifest.xml</code> file. For more discussion of
+using <code>previewImage</code>, see <a href="#preview">Setting a Preview
+Image</a>. Introduced in Android 3.0.</li>
 
-<p>See the {@link android.appwidget.AppWidgetProviderInfo} class for more information on the
+   <li>The <code>autoAdvanceViewId</code> attribute specifies the view ID of the
+app widget subview that should be auto-advanced by the widget's host. Introduced in Android 3.0.</li> 
+
+<li>The <code>resizeMode</code> attribute specifies the rules by which a widget
+can be resized. You use this attribute to make homescreen widgets
+resizeable&mdash;horizontally, vertically, or on both axes. Users touch-hold a
+widget to show its resize handles, then drag the horizontal and/or vertical
+handles to change the size on the layout grid. Values for the
+<code>resizeMode</code> attribute include "horizontal", "vertical", and "none".
+To declare a widget as resizeable horizontally and vertically, supply the value
+"horizontal|vertical". Introduced in Android 3.1.</li> </ul>
+
+<p>See the {@link android.appwidget.AppWidgetProviderInfo} class for more
+information on the
 attributes accepted by the <code>&lt;appwidget-provider></code> element.</p>
 
 
 <h2 id="CreatingLayout">Creating the App Widget Layout</h2>
 
-<p>You must define an initial layout for your App Widget in XML and save it in the project's
-<code>res/layout/</code> directory. You can design your App Widget using the View objects listed
-below, but before you begin designing your App Widget, please read and understand the
-<a href="{@docRoot}guide/practices/ui_guidelines/widget_design.html">App Widget Design 
+<p>You must define an initial layout for your App Widget in XML and save it in
+the project's
+<code>res/layout/</code> directory. You can design your App Widget using the
+View objects listed
+below, but before you begin designing your App Widget, please read and
+understand the
+<a href="{@docRoot}guide/practices/ui_guidelines/widget_design.html">App Widget
+Design 
 Guidelines</a>.</p>
 
 <p>Creating the App Widget layout is simple if you're
-familiar with <a href="{@docRoot}guide/topics/ui/declaring-layout.html">Declaring Layout in XML</a>.
-However, you must be aware that App Widget layouts are based on {@link android.widget.RemoteViews},
+familiar with <a
+href="{@docRoot}guide/topics/ui/declaring-layout.html">Declaring Layout in
+XML</a>.
+However, you must be aware that App Widget layouts are based on {@link
+android.widget.RemoteViews},
 which do not support every kind of layout or view widget.</p>
 
 <p>A RemoteViews object (and, consequently, an App Widget) can support the 
@@ -221,6 +321,7 @@
   <li>{@link android.widget.ImageView}</li>
   <li>{@link android.widget.ProgressBar}</li>
   <li>{@link android.widget.TextView}</li>
+  <li>{@link android.widget.ViewFlipper}</li>
 </ul>
 
 <p>Descendants of these classes are not supported.</p>
@@ -230,66 +331,90 @@
 
 <div class="sidebox-wrapper">
 <div class="sidebox">
-    <p>You must declare your AppWidgetProvider class implementation as a broadcast receiver 
+    <p>You must declare your AppWidgetProvider class implementation as a
+broadcast receiver 
     using the <code>&lt;receiver></code> element in the AndroidManifest (see
     <a href="#Manifest">Declaring an App Widget in the Manifest</a> above).</p>
   </div>
 </div>
 
-<p>The {@link android.appwidget.AppWidgetProvider} class extends BroadcastReceiver as a convenience
-class to handle the App Widget broadcasts. The AppWidgetProvider receives only the event broadcasts that
-are relevant to the App Widget, such as when the App Widget is updated, deleted, enabled, and disabled.
-When these broadcast events occur, the AppWidgetProvider receives the following method calls:</p>
+<p>The {@link android.appwidget.AppWidgetProvider} class extends
+BroadcastReceiver as a convenience
+class to handle the App Widget broadcasts. The AppWidgetProvider receives only
+the event broadcasts that
+are relevant to the App Widget, such as when the App Widget is updated, deleted,
+enabled, and disabled.
+When these broadcast events occur, the AppWidgetProvider receives the following
+method calls:</p>
 
 <dl>
-  <dt>{@link android.appwidget.AppWidgetProvider#onUpdate(Context,AppWidgetManager,int[])}</dt>
-    <dd>This is called to update the App Widget at intervals defined by the <code>updatePeriodMillis</code>
+  <dt>
+  {@link android.appwidget.AppWidgetProvider#onUpdate(android.content.Context,android.appwidget.AppWidgetManager,int[]) onUpdate()} 
+</dt>
+    <dd>This is called to update the App Widget at intervals defined by the
+<code>updatePeriodMillis</code>
     attribute in the AppWidgetProviderInfo (see <a href="#MetaData">Adding the 
     AppWidgetProviderInfo Metadata</a> above). This method is also called
     when the user adds the App Widget, so it should perform the essential setup,
     such as define event handlers for Views and start a temporary
-    {@link android.app.Service}, if necessary. However, if you have declared a configuration
-    Activity, <strong>this method is not called</strong> when the user adds the App Widget,
+    {@link android.app.Service}, if necessary. However, if you have declared a
+configuration
+    Activity, <strong>this method is not called</strong> when the user adds the
+App Widget,
     but is called for the subsequent updates. It is the responsibility of the 
-    configuration Activity to perform the first update when configuration is done.
-    (See <a href="#Configuring">Creating an App Widget Configuration Activity</a> below.)</dd> 
+    configuration Activity to perform the first update when configuration is
+done.
+    (See <a href="#Configuring">Creating an App Widget Configuration
+Activity</a> below.)</dd> 
   <dt>{@link android.appwidget.AppWidgetProvider#onDeleted(Context,int[])}</dt>
-    <dd>This is called every time an App Widget is deleted from the App Widget host.</dd>
+    <dd>This is called every time an App Widget is deleted from the App Widget
+host.</dd>
   <dt>{@link android.appwidget.AppWidgetProvider#onEnabled(Context)}</dt>
-    <dd>This is called when an instance the App Widget is created for the first time. For example, if the user 
+    <dd>This is called when an instance the App Widget is created for the first
+time. For example, if the user 
     adds two instances of your App Widget, this is only called the first time.
-    If you need to open a new database or perform other setup that only needs to occur once 
+    If you need to open a new database or perform other setup that only needs to
+occur once 
     for all App Widget instances, then this is a good place to do it.</dd> 
   <dt>{@link android.appwidget.AppWidgetProvider#onDisabled(Context)}</dt>
-    <dd>This is called when the last instance of your App Widget is deleted from the App Widget host. 
+    <dd>This is called when the last instance of your App Widget is deleted from
+the App Widget host. 
     This is where you should clean up any work done in 
     {@link android.appwidget.AppWidgetProvider#onEnabled(Context)}, 
     such as delete a temporary database.</dd> 
   <dt>{@link android.appwidget.AppWidgetProvider#onReceive(Context,Intent)}</dt>
-    <dd>This is called for every broadcast and before each of the above callback methods.
-    You normally don't need to implement this method because the default AppWidgetProvider 
+    <dd>This is called for every broadcast and before each of the above callback
+methods.
+    You normally don't need to implement this method because the default
+AppWidgetProvider 
     implementation filters all App Widget broadcasts and calls the above 
     methods as appropriate.</dd> 
 </dl>
 
-<p class="warning"><strong>Note:</strong> In Android 1.5, there is a known issue in which the
-<code>onDeleted()</code> method will not be called when it should be. To work around this issue, 
-you can implement {@link android.appwidget.AppWidgetProvider#onReceive(Context,Intent)
+<p class="warning"><strong>Note:</strong> In Android 1.5, there is a known issue
+in which the
+<code>onDeleted()</code> method will not be called when it should be. To work
+around this issue, 
+you can implement {@link
+android.appwidget.AppWidgetProvider#onReceive(Context,Intent)
 onReceive()} as described in this 
-<a href="http://groups.google.com/group/android-developers/msg/e405ca19df2170e2">Group post</a>
+<a
+href="http://groups.google.com/group/android-developers/msg/e405ca19df2170e2">
+Group post</a>
 to receive the <code>onDeleted()</code> callback.
 </p>
 
 <p>The most important AppWidgetProvider callback is 
-{@link android.appwidget.AppWidgetProvider#onUpdate(Context,AppWidgetManager,int[])
-onUpdated()} because it is called when each App Widget is added to a host (unless you use
-a configuration Activity). If your App Widget accepts any
-user interaction events, then you need to register the event handlers in this callback.
-If your App Widget doesn't create temporary
-files or databases, or perform other work that requires clean-up, then
-{@link android.appwidget.AppWidgetProvider#onUpdate(Context,AppWidgetManager,int[])
-onUpdated()} may be the only callback method you need to define. For example, if you want an App Widget
-with a button that launches an Activity when clicked, you could use the following
+{@link android.appwidget.AppWidgetProvider#onUpdate(android.content.Context, android.appwidget.AppWidgetManager, int[]) onUpdate()} 
+because it is called when
+each App Widget is added to a host (unless you use a configuration Activity). If
+your App Widget accepts any user interaction events, then you need to register
+the event handlers in this callback. If your App Widget doesn't create temporary
+files or databases, or perform other work that requires clean-up, then 
+{@link android.appwidget.AppWidgetProvider#onUpdate(android.content.Context, android.appwidget.AppWidgetManager, int[]) onUpdate()} 
+may be the only callback
+method you need to define. For example, if you want an App Widget with a button
+that launches an Activity when clicked, you could use the following
 implementation of AppWidgetProvider:</p>
 
 <pre>
@@ -306,11 +431,12 @@
             Intent intent = new Intent(context, ExampleActivity.class);
             PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
 
-            // Get the layout for the App Widget and attach an on-click listener to the button
+            // Get the layout for the App Widget and attach an on-click listener
+            // to the button
             RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
             views.setOnClickPendingIntent(R.id.button, pendingIntent);
 
-            // Tell the AppWidgetManager to perform an update on the current App Widget
+            // Tell the AppWidgetManager to perform an update on the current app widget
             appWidgetManager.updateAppWidget(appWidgetId, views);
         }
     }
@@ -318,43 +444,51 @@
 </pre>
 
 <p>This AppWidgetProvider defines only the 
-{@link android.appwidget.AppWidgetProvider#onUpdate(Context,AppWidgetManager,int[])
-onUpdated()} method for the purpose
-of defining a {@link android.app.PendingIntent} that launches an {@link android.app.Activity}
-and attaching it to the App Widget's button
-with {@link android.widget.RemoteViews#setOnClickPendingIntent(int,PendingIntent)}.
-Notice that it includes a loop that iterates through each entry in <code>appWidgetIds</code>, which
-is an array of IDs that identify each App Widget created by this provider.
-In this way, if the user creates more than one instance of the App Widget, then they are
-all updated simultaneously. However, only one <code>updatePeriodMillis</code> schedule will be 
-managed for all instances of the App Widget. For example, if the update schedule is defined 
-to be every two hours, and a second instance 
-of the App Widget is added one hour after the first one, then they will both be updated 
-on the period defined by the first one and the second update period will be ignored 
-(they'll both be updated every two hours, not every hour).</p>
+{@link
+android.appwidget.AppWidgetProvider#onUpdate(android.content.Context, android.appwidget.AppWidgetManager, int[]) onUpdate()} 
+method for the purpose of
+defining a {@link android.app.PendingIntent} that launches an {@link
+android.app.Activity} and attaching it to the App Widget's button with {@link
+android.widget.RemoteViews#setOnClickPendingIntent(int,PendingIntent)}. Notice
+that it includes a loop that iterates through each entry in
+<code>appWidgetIds</code>, which is an array of IDs that identify each App
+Widget created by this provider. In this way, if the user creates more than one
+instance of the App Widget, then they are all updated simultaneously. However,
+only one <code>updatePeriodMillis</code> schedule will be managed for all
+instances of the App Widget. For example, if the update schedule is defined to
+be every two hours, and a second instance of the App Widget is added one hour
+after the first one, then they will both be updated on the period defined by the
+first one and the second update period will be ignored (they'll both be updated
+every two hours, not every hour).</p>
 
-<p class="note"><strong>Note:</strong> Because {@link android.appwidget.AppWidgetProvider} is an
-extension of {@link android.content.BroadcastReceiver}, your process is not guaranteed to keep
-running after the callback methods return (see {@link android.content.BroadcastReceiver} for
-information about the broadcast lifecycle). If your App Widget setup process can take several
-seconds (perhaps while performing web requests) and you require that your process continues, 
-consider starting a {@link android.app.Service} 
-in the {@link android.appwidget.AppWidgetProvider#onUpdate(Context,AppWidgetManager,int[])
-onUpdated()} method. From within the Service, you can perform your own updates to the App Widget
-without worrying about the AppWidgetProvider closing down due to an 
-<a href="{@docRoot}guide/practices/design/responsiveness.html">Application Not Responding</a> 
-(ANR) error. See the
-<a href="http://code.google.com/p/wiktionary-android/source/browse/trunk/Wiktionary/src/com/example/android/wiktionary/WordWidget.java">Wiktionary
-sample's AppWidgetProvider</a> for an example of an App Widget running a {@link android.app.Service}.</p>
+<p class="note"><strong>Note:</strong> Because {@link
+android.appwidget.AppWidgetProvider} is an extension of {@link
+android.content.BroadcastReceiver}, your process is not guaranteed to keep
+running after the callback methods return (see {@link
+android.content.BroadcastReceiver} for information about the broadcast
+lifecycle). If your App Widget setup process can take several seconds (perhaps
+while performing web requests) and you require that your process continues,
+consider starting a {@link android.app.Service} in the 
+{@link android.appwidget.AppWidgetProvider#onUpdate(Context,AppWidgetManager,int[]) onUpdate()} 
+method. From within the Service, you can perform your own updates
+to the App Widget without worrying about the AppWidgetProvider closing down due
+to an <a href="{@docRoot}guide/practices/design/responsiveness.html">Application
+Not Responding</a> (ANR) error. See the <a
+href="http://code.google.com/p/wiktionary-android/source/browse/trunk/Wiktionary
+/src/com/example/android/wiktionary/WordWidget.java">Wiktionary sample's
+AppWidgetProvider</a> for an example of an App Widget running a {@link
+android.app.Service}.</p>
 
 <p>Also see the <a 
-href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetProvider.html">
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/
+appwidget/ExampleAppWidgetProvider.html">
 ExampleAppWidgetProvider.java</a> sample class.</p>
 
 
 <h3 id="ProviderBroadcasts">Receiving App Widget broadcast Intents</h3>
 
-<p>{@link android.appwidget.AppWidgetProvider} is just a convenience class.  If you would like
+<p>{@link android.appwidget.AppWidgetProvider} is just a convenience class.  If
+you would like
 to receive the App Widget broadcasts directly, you can implement your own 
 {@link android.content.BroadcastReceiver} or override the 
 {@link android.appwidget.AppWidgetProvider#onReceive(Context,Intent)} callback. 
@@ -370,28 +504,36 @@
 
 <h2 id="Configuring">Creating an App Widget Configuration Activity</h2>
 
-<p>If you would like the user to configure settings when he or she adds a new App Widget,
-you can create an App Widget configuration Activity. This {@link android.app.Activity} 
-will be automatically launched by the App Widget host and allows the user to configure
-available settings for the App Widget at create-time, such as the App Widget color, size, 
+<p>If you would like the user to configure settings when he or she adds a new
+App Widget,
+you can create an App Widget configuration Activity. This {@link
+android.app.Activity} 
+will be automatically launched by the App Widget host and allows the user to
+configure
+available settings for the App Widget at create-time, such as the App Widget
+color, size, 
 update period or other functionality settings.</p>
 
-<p>The configuration Activity should be declared as a normal Activity in the Android manifest file.
+<p>The configuration Activity should be declared as a normal Activity in the
+Android manifest file.
 However, it will be launched by the App Widget host with the {@link
-android.appwidget.AppWidgetManager#ACTION_APPWIDGET_CONFIGURE ACTION_APPWIDGET_CONFIGURE} action,
+android.appwidget.AppWidgetManager#ACTION_APPWIDGET_CONFIGURE
+ACTION_APPWIDGET_CONFIGURE} action,
 so the Activity needs to accept this Intent. For example:</p>
 
 <pre>
 &lt;activity android:name=".ExampleAppWidgetConfigure">
     &lt;intent-filter>
-        &lt;action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
+        &lt;action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
     &lt;/intent-filter>
 &lt;/activity>
 </pre>
 
-<p>Also, the Activity must be declared in the AppWidgetProviderInfo XML file, with the 
+<p>Also, the Activity must be declared in the AppWidgetProviderInfo XML file,
+with the 
 <code>android:configure</code> attribute (see <a href="#MetaData">Adding 
-the AppWidgetProviderInfo Metadata</a> above). For example, the configuration Activity
+the AppWidgetProviderInfo Metadata</a> above). For example, the configuration
+Activity
 can be declared like this:</p>
 
 <pre>
@@ -402,32 +544,45 @@
 &lt;/appwidget-provider>
 </pre>
 
-<p>Notice that the Activity is declared with a fully-qualified namespace, because 
+<p>Notice that the Activity is declared with a fully-qualified namespace,
+because 
 it will be referenced from outside your package scope.</p>
 
-<p>That's all you need to get started with a configuration Activity. Now all you need is the actual
-Activity. There are, however, two important things to remember when you implement the Activity:</p>
+<p>That's all you need to get started with a configuration Activity. Now all you
+need is the actual
+Activity. There are, however, two important things to remember when you
+implement the Activity:</p>
 <ul>
-  <li>The App Widget host calls the configuration Activity and the configuration Activity should always 
+  <li>The App Widget host calls the configuration Activity and the configuration
+Activity should always 
     return a result. The result should include the App Widget ID
-    passed by the Intent that launched the Activity (saved in the Intent extras as
+    passed by the Intent that launched the Activity (saved in the Intent extras
+as
     {@link android.appwidget.AppWidgetManager#EXTRA_APPWIDGET_ID}).</li>
-  <li>The {@link android.appwidget.AppWidgetProvider#onUpdate(Context,AppWidgetManager,int[])
-    onUpdate()} method <strong>will not be called</strong> when the App Widget is created
-    (the system will not send the ACTION_APPWIDGET_UPDATE broadcast when a configuration Activity
-    is launched). It is the responsibility of the configuration Activity to request an update from the 
+  <li>The 
+  {@link android.appwidget.AppWidgetProvider#onUpdate(Context,AppWidgetManager,int[]) onUpdate()} 
+    method <strong>will not be called</strong> when the App Widget
+is created
+    (the system will not send the ACTION_APPWIDGET_UPDATE broadcast when a
+configuration Activity
+    is launched). It is the responsibility of the configuration Activity to
+request an update from the 
     AppWidgetManager when the App Widget is first created. However, 
-    {@link android.appwidget.AppWidgetProvider#onUpdate(Context,AppWidgetManager,int[])
-    onUpdate()} will be called for subsequent updates&mdash;it is only skipped the first time.</li>
+{@link android.appwidget.AppWidgetProvider#onUpdate(Context,AppWidgetManager,int[]) onUpdate()} 
+    will be called for subsequent updates&mdash;it is only skipped
+the first time.</li>
 </ul>
 
-<p>See the code snippets in the following section for an example of how to return a result
+<p>See the code snippets in the following section for an example of how to
+return a result
 from the configuration and update the App Widget.</p>
 
 
-<h3 id="UpdatingFromTheConfiguration">Updating the App Widget from the configuration Activity</h3>
+<h3 id="UpdatingFromTheConfiguration">Updating the App Widget from the
+configuration Activity</h3>
 
-<p>When an App Widget uses a configuration Activity, it is the responsibility of the Activity
+<p>When an App Widget uses a configuration Activity, it is the responsibility of
+the Activity
 to update the App Widget when configuration is complete. 
 You can do so by requesting an update directly from the 
 {@link android.appwidget.AppWidgetManager}.</p>
@@ -448,20 +603,24 @@
 </pre>
   </li>
   <li>Perform your App Widget configuration.</li>
-  <li>When the configuration is complete, get an instance of the AppWidgetManager by calling
+  <li>When the configuration is complete, get an instance of the
+AppWidgetManager by calling
     {@link android.appwidget.AppWidgetManager#getInstance(Context)}:
 <pre>
 AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
 </pre>
   </li>
-  <li>Update the App Widget with a {@link android.widget.RemoteViews} layout by calling
+  <li>Update the App Widget with a {@link android.widget.RemoteViews} layout by
+calling
     {@link android.appwidget.AppWidgetManager#updateAppWidget(int,RemoteViews)}:
 <pre>
-RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_appwidget);
+RemoteViews views = new RemoteViews(context.getPackageName(),
+R.layout.example_appwidget);
 appWidgetManager.updateAppWidget(mAppWidgetId, views);
 </pre>
   </li>
-  <li>Finally, create the return Intent, set it with the Activity result, and finish the Activity:</li>
+  <li>Finally, create the return Intent, set it with the Activity result, and
+finish the Activity:</li>
 <pre>
 Intent resultValue = new Intent();
 resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
@@ -471,14 +630,657 @@
   </li>
 </ol>
 
-<p class="note"><strong>Tip:</strong> When your configuration Activity first opens, set
-the Activity result to RESULT_CANCELED. This way, if the user backs-out of the Activity before
-reaching the end, the App Widget host is notified that the configuration was cancelled and the
+<p class="note"><strong>Tip:</strong> When your configuration Activity first
+opens, set
+the Activity result to RESULT_CANCELED. This way, if the user backs-out of the
+Activity before
+reaching the end, the App Widget host is notified that the configuration was
+cancelled and the
 App Widget will not be added.</p>
 
 <p>See the <a 
-href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/appwidget/ExampleAppWidgetConfigure.html">
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/
+appwidget/ExampleAppWidgetConfigure.html">
 ExampleAppWidgetConfigure.java</a> sample class in ApiDemos for an example.</p>
 
+<h2 id="preview">Setting a Preview Image</h2>
+
+<p>Android 3.0 introduces the {@link
+
+
+android.appwidget.AppWidgetProviderInfo#previewImage} field, which specifies a
+preview of what the app widget looks like. This preview is shown to the user from the
+widget picker. If this field is not supplied, the app widget's icon is used for
+the preview.</p> 
+
+<p>This is how you specify this setting in XML:</p>
+
+<pre>&lt;appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
+  ...
+  android:previewImage="@drawable/preview">
+&lt;/appwidget-provider></pre>
+
+<p>To help create a preview image for your app widget (to specify in the {@link
+android.appwidget.AppWidgetProviderInfo#previewImage} field), the Android
+emulator includes an application called &quot;Widget Preview.&quot; To create a
+preview image, launch this application, select the app widget for your
+application and set it up how you'd like your preview image to appear, then save
+it and place it in your application's drawable resources.</p>
+
+<h2 id="collections">Using App Widgets with Collections</h2>
+
+<p>Android 3.0 introduces App Widgets with collections. These kinds of App
+Widgets use the {@link android.widget.RemoteViewsService} to display collections
+that are backed by remote data, such as from a <a
+href="{@docRoot}guide/topics/providers/content-providers.html">content
+provider</a>. The data provided by the {@link android.widget.RemoteViewsService}
+is presented in the App Widget using one of the following view types, which
+we’ll refer to as “collection views:”</p>
+
+<dl>
+  <dt>{@link android.widget.ListView}</dt>
+  <dd>A view that shows items in a
+vertically scrolling
+list. For an example, see the Gmail app widget. </dd>
+<dt>{@link android.widget.GridView}</dt>
+<dd>A view that shows items in
+two-dimensional scrolling grid. For an example, see the Bookmarks app
+widget.</dd> 
+<dt>{@link android.widget.StackView}</dt>
+<dd>A
+stacked card view (kind of like a rolodex), where the user can flick the  front
+card up/down to see the previous/next card, respectively.  Examples include
+the YouTube and Books app widgets. </dd> 
+<dt>{@link android.widget.AdapterViewFlipper}</dt>
+<dd>An adapter-backed simple
+{@link
+android.widget.ViewAnimator} that  animates between two or more views. Only one
+child is shown at a time.  </dd>
+</dl>
+
+<p>As stated above, these collection views display collections backed by remote
+data. This means that they use an {@link android.widget.Adapter} to bind their
+user interface to their data. An {@link android.widget.Adapter} binds individual
+items from a set of data into individual {@link android.view.View} objects.
+Because these collection views are backed by adapters, the Android framework
+must include extra architecture to support their use in app widgets. In the
+context of an app widget, the {@link android.widget.Adapter} is replaced by a
+{@link android.widget.RemoteViewsService.RemoteViewsFactory RemoteViewsFactory},
+which is simply a thin wrapper around  the {@link android.widget.Adapter}
+interface. 
+ When
+requested for a specific item in the collection, the {@link
+android.widget.RemoteViewsService.RemoteViewsFactory RemoteViewsFactory} creates
+and returns the item for the collection as a {@link android.widget.RemoteViews}
+object.
+In order to include a collection view in your app widget, you
+must implement {@link android.widget.RemoteViewsService} and {@link
+android.widget.RemoteViewsService.RemoteViewsFactory RemoteViewsFactory}.</p>
+
+<p> {@link android.widget.RemoteViewsService} is a service that allows a remote
+adapter to request {@link
+android.widget.RemoteViews} objects. {@link
+android.widget.RemoteViewsService.RemoteViewsFactory RemoteViewsFactory} is an
+interface for an adapter between a collection view (such as {@link
+android.widget.ListView}, {@link android.widget.GridView}, and so on) and the
+underlying data for that view. From the  <a
+href="{@docRoot}resources/samples/StackWidget/index.html">StackView Widget
+sample</a>, here is an example of the boilerplate code you use to implement 
+this service and interface:
+</p>
+
+<pre>
+public class StackWidgetService extends RemoteViewsService {
+    &#64;Override
+    public RemoteViewsFactory onGetViewFactory(Intent intent) {
+        return new StackRemoteViewsFactory(this.getApplicationContext(), intent);
+    }
+}
+
+class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
+
+//... include adapter-like methods here. See the StackView Widget sample.
+
+}
+</pre>
+
+<h3 id="collection_sample">Sample application</h3>
+
+<p>The code excerpts in this section are drawn from the <a
+href="{@docRoot}resources/samples/StackWidget/index.html">StackView Widget
+sample</a>:</p>
+
+<p>
+<img src="{@docRoot}resources/samples/images/StackWidget.png" alt="StackView
+Widget" />
+</p>
+
+<p>This sample consists of a stack of 10 views, which  display the values
+<code>&quot;0!&quot;</code> through <code>&quot;9!&quot;</code> The sample
+app widget has these primary behaviors:</p> 
+
+<ul>
+
+  <li>The user can vertically fling the top view in the
+app widget to display the next or previous view. This is a built-in StackView
+behavior.</li> 
+
+  <li>Without any user interaction, the app widget automatically advances
+through
+its views in sequence, like a slide show. This is due to the setting
+<code>android:autoAdvanceViewId=&quot;@id/stack_view&quot;</code> in the
+<code>res/xml/stackwidgetinfo.xml</code> file. This setting applies to the view
+ID,
+which in this case is the view ID of the stack view.</li>
+  
+  <li>If the user touches the top view, the app widget displays the {@link
+android.widget.Toast} message &quot;Touched view <em>n</em>,&quot; where
+<em>n</em> is the index (position) of the touched view. For more discussion of
+how this is implemented, see  
+<a href="#behavior">Adding behavior to individual items</a>.</li>
+
+</ul>
+<h3 id="implementing_collections">Implementing app widgets with collections</h3>
+
+<p>To implement an App Widget with collections, you follow the same basic steps 
+you would use to implement any app widget. The following sections  describe the
+additional steps you need to perform to implement an App Widget with
+collections.</p>
+
+<h4>Manifest for app widgets with collections</h4>
+
+<p> In addition to the requirements listed in <a href="#Manifest">Declaring an
+App Widget in the Manifest</a>, to make it possible for App Widgets with
+collections to bind to your {@link android.widget.RemoteViewsService}, you must
+declare the service in your manifest file with the permission {@link
+android.Manifest.permission#BIND_REMOTEVIEWS}. This prevents other applications
+from freely accessing your app widget's data. For example, when creating an App
+Widget that uses {@link android.widget.RemoteViewsService} to populate a
+collection view, the manifest entry may look like this:</p>
+
+<pre>&lt;service android:name=&quot;MyWidgetService&quot;
+...
+android:permission=&quot;android.permission.BIND_REMOTEVIEWS&quot; /&gt;</pre>
+
+<p>The line <code>android:name=&quot;MyWidgetService&quot;</code>
+refers to your subclass of {@link android.widget.RemoteViewsService}. </p>
+
+<h4>Layout for app widgets with collections</h4>
+
+<p>The main requirement for your app widget layout XML file is that it
+include one of the collection views: {@link android.widget.ListView},
+{@link android.widget.GridView}, {@link android.widget.StackView}, or
+{@link android.widget.AdapterViewFlipper}. Here is the
+<code>widget_layout.xml</code> for
+the <a href="{@docRoot}resources/samples/StackWidget/index.html">StackView
+Widget sample</a>:</p>
+
+<pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
+
+&lt;FrameLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
+    android:layout_width=&quot;match_parent&quot;
+    android:layout_height=&quot;match_parent&quot;&gt;
+    &lt;StackView xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
+        android:id=&quot;&#64;+id/stack_view&quot;
+        android:layout_width=&quot;match_parent&quot;
+        android:layout_height=&quot;match_parent&quot;
+        android:gravity=&quot;center&quot;
+        android:loopViews=&quot;true&quot; /&gt;
+    &lt;TextView xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
+        android:id=&quot;&#64;+id/empty_view&quot;
+        android:layout_width=&quot;match_parent&quot;
+        android:layout_height=&quot;match_parent&quot;
+        android:gravity=&quot;center&quot;
+        android:background=&quot;&#64;drawable/widget_item_background&quot;
+        android:textColor=&quot;#ffffff&quot;
+        android:textStyle=&quot;bold&quot;
+        android:text=&quot;&#64;string/empty_view_text&quot;
+        android:textSize=&quot;20sp&quot; /&gt;
+&lt;/FrameLayout&gt;</pre>
+
+<p> Note that empty views must be siblings of the collection view for which the
+empty view represents empty state. </p>
+
+<p>In addition to the layout file for your entire app widget, you must create
+another layout file that defines the layout for each item in the collection (for
+example, a layout for each book in a collection of books). For example, the <a
+href="{@docRoot}resources/samples/StackWidget/index.html">StackView Widget
+sample</a> only has one layout file, <code>widget_item.xml</code>, since all
+items use the same layout. But the <a
+href="{@docRoot}resources/samples/WeatherListWidget/index.html">
+WeatherListWidget sample</a> has two layout files:
+<code>dark_widget_item.xml</code> and <code>light_widget_item.xml</code>.</p>
+
+
+
+<h4 id="AppWidgetProvider-collections">AppWidgetProvider class for app widgets with collections</h4>
+
+<p>As with a regular app widget, the bulk of your code in your {@link
+android.appwidget.AppWidgetProvider} subclass typically goes in {@link
+android.appwidget.AppWidgetProvider#onUpdate(android.content.Context,
+android.appwidget.AppWidgetManager, int[]) onUpdate()}. The major difference in
+your implementation for {@link
+android.appwidget.AppWidgetProvider#onUpdate(android.content.Context,
+android.appwidget.AppWidgetManager, int[]) onUpdate()} when creating an app
+widget with collections is that you must call {@link
+android.widget.RemoteViews#setRemoteAdapter setRemoteAdapter()}. This tells the
+collection view where to get its data. The {@link
+android.widget.RemoteViewsService} can then return your implementation of {@link
+android.widget.RemoteViewsService.RemoteViewsFactory RemoteViewsFactory}, and
+the widget can serve up the appropriate data. When you call this method, you
+must pass an intent that  points to your implementation of {@link
+android.widget.RemoteViewsService} and the App Widget ID that specifies the app
+widget to update.</p>
+
+
+<p>For example, here's how the StackView Widget sample implements the {@link
+android.appwidget.AppWidgetProvider#onUpdate(android.content.Context,
+android.appwidget.AppWidgetManager, int[]) onUpdate()} callback method to set
+the {@link
+android.widget.RemoteViewsService} as the remote adapter for the app widget
+collection:</p>
+
+<pre>public void onUpdate(Context context, AppWidgetManager appWidgetManager,
+int[] appWidgetIds) {
+    // update each of the app widgets with the remote adapter
+    for (int i = 0; i &lt; appWidgetIds.length; ++i) {
+        
+        // Set up the intent that starts the StackViewService, which will
+        // provide the views for this collection.
+        Intent intent = new Intent(context, StackWidgetService.class);
+        // Add the app widget ID to the intent extras.
+        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
+        intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
+        // Instantiate the RemoteViews object for the App Widget layout.
+        RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
+        // Set up the RemoteViews object to use a RemoteViews adapter. 
+        // This adapter connects
+        // to a RemoteViewsService  through the specified intent.
+        // This is how you populate the data.
+        rv.setRemoteAdapter(appWidgetIds[i], R.id.stack_view, intent);
+        
+        // The empty view is displayed when the collection has no items. 
+        // It should be in the same layout used to instantiate the RemoteViews
+        // object above.
+        rv.setEmptyView(R.id.stack_view, R.id.empty_view);
+
+        //
+        // Do additional processing specific to this app widget...
+        //
+        
+        appWidgetManager.updateAppWidget(appWidgetIds[i], rv);   
+    }
+    super.onUpdate(context, appWidgetManager, appWidgetIds);
+}</pre>
+            
+<h4>RemoteViewsService class</h4>
+
+<div class="sidebox-wrapper">
+<div class="sidebox">
+<h3>Persisting data</h3>
+   <p>You can’t rely on a single instance of your service, or any data it
+contains, to persist. You should therefore not store any data in your {@link
+android.widget.RemoteViewsService} (unless it is static). If you want your
+app widget’s data to persist, the best approach is to use a {@link
+android.content.ContentProvider} whose data persists beyond the process
+lifecycle.</p> </div>
+</div>
+
+<p>As described above, your {@link android.widget.RemoteViewsService} subclass
+provides the {@link android.widget.RemoteViewsService.RemoteViewsFactory
+RemoteViewsFactory} used to  populate the remote collection view.</p> 
+
+<p>Specifically, you need to
+perform these steps:</p>
+
+<ol>
+  <li>Subclass {@link android.widget.RemoteViewsService}. {@link
+android.widget.RemoteViewsService} is the service through which
+a remote adapter can request {@link android.widget.RemoteViews}.  </li>
+  
+  <li>In your {@link android.widget.RemoteViewsService} subclass, include a
+class that implements the {@link
+android.widget.RemoteViewsService.RemoteViewsFactory RemoteViewsFactory}
+interface. {@link android.widget.RemoteViewsService.RemoteViewsFactory
+RemoteViewsFactory} is an interface for an adapter between a remote collection
+view (such as {@link android.widget.ListView}, {@link android.widget.GridView},
+and so on) and  the underlying data for that view.  Your implementation is
+responsible for making a {@link android.widget.RemoteViews} object  for each
+item in the data set. This interface is a thin wrapper around {@link
+android.widget.Adapter}.</li>
+</ol>
+
+<p>The primary contents of the {@link android.widget.RemoteViewsService}
+implementation is its {@link
+android.widget.RemoteViewsService.RemoteViewsFactory RemoteViewsFactory},
+described below.</p>
+
+<h4>RemoteViewsFactory interface</h4>
+
+<p>Your custom class that implements the {@link
+android.widget.RemoteViewsService.RemoteViewsFactory RemoteViewsFactory}
+interface provides the app widget with the data for the items in its collection.
+To
+do this, it combines your app widget item XML layout file with a source of data.
+This source of data could be anything from a database to a simple array. In the
+<a href="{@docRoot}resources/samples/StackWidget/index.html">StackView Widget
+sample</a>, the data source is an array of <code>WidgetItems</code>. The {@link
+android.widget.RemoteViewsService.RemoteViewsFactory RemoteViewsFactory}
+functions as an adapter to glue the data to the remote collection view.</p>
+
+<p>The two most important methods you need to implement for your
+
+{@link android.widget.RemoteViewsService.RemoteViewsFactory RemoteViewsFactory}
+subclass are 
+{@link android.widget.RemoteViewsService.RemoteViewsFactory#onCreate()
+onCreate()} and
+{@link android.widget.RemoteViewsService.RemoteViewsFactory#getViewAt(int)
+getViewAt()}
+.</p> 
+
+<p>The system calls {@link
+android.widget.RemoteViewsService.RemoteViewsFactory#onCreate() onCreate()} when
+creating your factory for the first time. This is where you set up any
+connections and/or cursors to your data source. For example, the <a
+href="{@docRoot}resources/samples/StackWidget/index.html">StackView Widget
+sample</a> uses {@link
+android.widget.RemoteViewsService.RemoteViewsFactory#onCreate() onCreate()} to
+initialize an array of <code>WidgetItem</code> objects. When your app widget is
+active, the system accesses these objects using their index position in the
+array and the text they contain is displayed  </p>
+
+<p>Here is an excerpt from the the <a
+href="{@docRoot}resources/samples/StackWidget/index.html">StackView Widget</a>
+sample's 
+{@link android.widget.RemoteViewsService.RemoteViewsFactory
+RemoteViewsFactory} implementation that shows portions of the {@link
+android.widget.RemoteViewsService.RemoteViewsFactory#onCreate() onCreate()}
+method:</p>
+
+<pre>class StackRemoteViewsFactory implements
+RemoteViewsService.RemoteViewsFactory {
+    private static final int mCount = 10;
+    private List&lt;WidgetItem&gt; mWidgetItems = new ArrayList&lt;WidgetItem&gt;();
+    private Context mContext;
+    private int mAppWidgetId;
+
+    public StackRemoteViewsFactory(Context context, Intent intent) {
+        mContext = context;
+        mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
+                AppWidgetManager.INVALID_APPWIDGET_ID);
+    }
+
+    public void onCreate() {
+        // In onCreate() you setup any connections / cursors to your data source. Heavy lifting,
+        // for example downloading or creating content etc, should be deferred to onDataSetChanged()
+        // or getViewAt(). Taking more than 20 seconds in this call will result in an ANR.
+        for (int i = 0; i &lt; mCount; i++) {
+            mWidgetItems.add(new WidgetItem(i + &quot;!&quot;));
+        }
+        ...
+    }
+...</pre>
+
+<p>The {@link android.widget.RemoteViewsService.RemoteViewsFactory
+RemoteViewsFactory} method {@link
+android.widget.RemoteViewsService.RemoteViewsFactory#getViewAt(int) getViewAt()}
+returns a {@link android.widget.RemoteViews} object corresponding to the data at
+the specified <code>position</code> in the data set. Here is an excerpt from 
+the <a
+href="http://developer.android.com/resources/samples/StackWidget/index.html">
+StackView Widget</a> sample's {@link
+android.widget.RemoteViewsService.RemoteViewsFactory RemoteViewsFactory}
+implementation:</p>
+
+<pre>public RemoteViews getViewAt(int position) {
+   
+    // Construct a remote views item based on the app widget item XML file, 
+    // and set the text based on the position.
+    RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_item);
+    rv.setTextViewText(R.id.widget_item, mWidgetItems.get(position).text);
+
+    ...
+    // Return the remote views object.
+    return rv;
+}</pre>
+
+<h4 id="behavior">Adding behavior to individual items</h4>
+
+<p>The above sections show you how to bind your data to your app widget
+collection. But what if you want to add dynamic behavior to the individual items
+in your collection view?</p> 
+
+<p> As described in <a href="#AppWidgetProvider">Using the AppWidgetProvider
+Class</a>, you  normally use {@link
+android.widget.RemoteViews#setOnClickPendingIntent(int,
+android.app.PendingIntent) setOnClickPendingIntent()} to set an object's click
+behavior&mdash;such as to cause a button to launch an {@link
+android.app.Activity}. But this approach is not allowed for child views in an
+individual collection item (to clarify, you could use {@link
+android.widget.RemoteViews#setOnClickPendingIntent(int,
+android.app.PendingIntent) setOnClickPendingIntent()} to set up a global button
+in the Gmail app widget that launches the app, for example, but not on the
+individual list items). Instead, to add click behavior to individual items in a
+collection, you  use {@link
+android.widget.RemoteViews#setOnClickFillInIntent(int, android.content.Intent)
+setOnClickFillInIntent()}. This entails setting up up a pending intent template
+for your collection view, and then setting a fill-in intent on each item in the
+collection via your {@link android.widget.RemoteViewsService.RemoteViewsFactory
+RemoteViewsFactory}.</p> 
+<p>This section uses the <a
+href="{@docRoot}resources/samples/StackWidget/index.html">StackView Widget
+sample</a> to describe how to add behavior to individual items. In the <a
+href="{@docRoot}resources/samples/StackWidget/index.html">StackView Widget
+sample</a>, if the user touches the top view, the app widget displays the {@link
+android.widget.Toast} message &quot;Touched view <em>n</em>,&quot; where
+<em>n</em> is the index (position) of the touched view. This is how it
+works:</p>
+
+<ul>
+  <li>The <code>StackWidgetProvider</code> (an {@link
+android.appwidget.AppWidgetProvider} subclass) creates a pending intent that has
+a custom action called <code>TOAST_ACTION</code>.</li>
+  <li>When the user touches a view, the intent is fired and it broadcasts
+<code>TOAST_ACTION</code>.</li>
+  
+  <li>This broadcast is intercepted by the <code>StackWidgetProvider</code>'s
+{@link android.appwidget.AppWidgetProvider#onReceive(android.content.Context,
+android.content.Intent) onReceive()} method, and the app widget displays the
+{@link
+android.widget.Toast} message for the touched view. The data for the collection
+items is provided by the {@link
+android.widget.RemoteViewsService.RemoteViewsFactory RemoteViewsFactory}, via
+the {@link android.widget.RemoteViewsService}.</li>
+</ul>
+
+<p class="note"><strong>Note:</strong> The <a
+href="{@docRoot}resources/samples/StackWidget/index.html">StackView Widget
+sample</a> uses a broadcast, but typically an app widget would simply launch an
+activity in a scenario like this one.</p>
+
+<h5>Setting up the pending intent template</h5> 
+
+<p>The <code>StackWidgetProvider</code> ({@link
+android.appwidget.AppWidgetProvider} subclass) sets up a pending intent.
+Individuals items of a collection cannot set up their own pending intents.
+Instead, the collection as a whole sets up a pending intent template, and the
+individual items set a fill-in intent to create unique behavior on an
+item-by-item
+basis.</p> 
+
+<p>This class  also receives the broadcast that is sent when the user touches a
+view. It processes this event in its {@link
+android.appwidget.AppWidgetProvider#onReceive(android.content.Context,
+android.content.Intent) onReceive()} method. If the intent's action is
+<code>TOAST_ACTION</code>, the app widget displays a {@link
+android.widget.Toast}
+message for the current view.</p>
+
+<pre>public class StackWidgetProvider extends AppWidgetProvider {
+    public static final String TOAST_ACTION = &quot;com.example.android.stackwidget.TOAST_ACTION&quot;;
+    public static final String EXTRA_ITEM = &quot;com.example.android.stackwidget.EXTRA_ITEM&quot;;
+
+    ...
+
+    // Called when the BroadcastReceiver receives an Intent broadcast.
+    // Checks to see whether the intent's action is TOAST_ACTION. If it is, the app widget 
+    // displays a Toast message for the current item.
+    &#64;Override
+    public void onReceive(Context context, Intent intent) {
+        AppWidgetManager mgr = AppWidgetManager.getInstance(context);
+        if (intent.getAction().equals(TOAST_ACTION)) {
+            int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
+                AppWidgetManager.INVALID_APPWIDGET_ID);
+            int viewIndex = intent.getIntExtra(EXTRA_ITEM, 0);
+            Toast.makeText(context, &quot;Touched view &quot; + viewIndex, Toast.LENGTH_SHORT).show();
+        }
+        super.onReceive(context, intent);
+    }
+    
+    &#64;Override
+    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
+        // update each of the app widgets with the remote adapter
+        for (int i = 0; i &lt; appWidgetIds.length; ++i) {
+    
+            // Sets up the intent that points to the StackViewService that will
+            // provide the views for this collection.
+            Intent intent = new Intent(context, StackWidgetService.class);
+            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
+            // When intents are compared, the extras are ignored, so we need to embed the extras
+            // into the data so that the extras will not be ignored.
+            intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
+            RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
+            rv.setRemoteAdapter(appWidgetIds[i], R.id.stack_view, intent);
+    
+            // The empty view is displayed when the collection has no items. It should be a sibling
+            // of the collection view.
+            rv.setEmptyView(R.id.stack_view, R.id.empty_view);
+
+            // This section makes it possible for items to have individualized behavior.
+            // It does this by setting up a pending intent template. Individuals items of a collection
+            // cannot set up their own pending intents. Instead, the collection as a whole sets
+            // up a pending intent template, and the individual items set a fillInIntent
+            // to create unique behavior on an item-by-item basis.
+            Intent toastIntent = new Intent(context, StackWidgetProvider.class);
+            // Set the action for the intent.
+            // When the user touches a particular view, it will have the effect of
+            // broadcasting TOAST_ACTION.
+            toastIntent.setAction(StackWidgetProvider.TOAST_ACTION);
+            toastIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
+            intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
+            PendingIntent toastPendingIntent = PendingIntent.getBroadcast(context, 0, toastIntent,
+                PendingIntent.FLAG_UPDATE_CURRENT);
+            rv.setPendingIntentTemplate(R.id.stack_view, toastPendingIntent);
+            
+            appWidgetManager.updateAppWidget(appWidgetIds[i], rv);
+        }
+    super.onUpdate(context, appWidgetManager, appWidgetIds);
+    }
+}</pre>
+            
+<h5><strong>Setting the fill-in Intent</strong></h5>
+
+<p>Your {@link android.widget.RemoteViewsService.RemoteViewsFactory
+RemoteViewsFactory} must set a fill-in intent on each item in the collection.
+This makes it possible to distinguish the individual on-click action of a given
+item. The fill-in intent is then combined with the {@link
+android.app.PendingIntent} template in order to determine the final intent that
+will be executed when the item is clicked. </p>
+
+<pre>
+public class StackWidgetService extends RemoteViewsService {
+    &#64;Override
+    public RemoteViewsFactory onGetViewFactory(Intent intent) {
+        return new StackRemoteViewsFactory(this.getApplicationContext(), intent);
+    }
+}
+
+class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
+    private static final int mCount = 10;
+    private List&lt;WidgetItem&gt; mWidgetItems = new ArrayList&lt;WidgetItem&gt;();
+    private Context mContext;
+    private int mAppWidgetId;
+
+    public StackRemoteViewsFactory(Context context, Intent intent) {
+        mContext = context;
+        mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
+                AppWidgetManager.INVALID_APPWIDGET_ID);
+    }
+
+    // Initialize the data set.
+        public void onCreate() {
+            // In onCreate() you set up any connections / cursors to your data source. Heavy lifting,
+            // for example downloading or creating content etc, should be deferred to onDataSetChanged()
+            // or getViewAt(). Taking more than 20 seconds in this call will result in an ANR.
+            for (int i = 0; i &lt; mCount; i++) {
+                mWidgetItems.add(new WidgetItem(i + &quot;!&quot;));
+            }
+           ...
+        }
+        ...
+    
+        // Given the position (index) of a WidgetItem in the array, use the item's text value in 
+        // combination with the app widget item XML file to construct a RemoteViews object.
+        public RemoteViews getViewAt(int position) {
+            // position will always range from 0 to getCount() - 1.
+    
+            // Construct a RemoteViews item based on the app widget item XML file, and set the
+            // text based on the position.
+            RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_item);
+            rv.setTextViewText(R.id.widget_item, mWidgetItems.get(position).text);
+    
+            // Next, set a fill-intent, which will be used to fill in the pending intent template
+            // that is set on the collection view in StackWidgetProvider.
+            Bundle extras = new Bundle();
+            extras.putInt(StackWidgetProvider.EXTRA_ITEM, position);
+            Intent fillInIntent = new Intent();
+            fillInIntent.putExtras(extras);
+            // Make it possible to distinguish the individual on-click
+            // action of a given item
+            rv.setOnClickFillInIntent(R.id.widget_item, fillInIntent);
+        
+            ...
+        
+            // Return the RemoteViews object.
+            return rv;
+        }
+    ...
+    }</pre>
+
+<h3 id="fresh">Keeping Collection Data Fresh</h3>
+
+<p>The following figure illustrates the flow that occurs in an App Widget that
+uses
+collections when updates occur. It shows how the App Widget code interacts with
+the  {@link android.widget.RemoteViewsService.RemoteViewsFactory
+RemoteViewsFactory}, and how you can trigger updates:</p>
+
+<img src="{@docRoot}images/appwidget_collections.png" alt="" />
+
+<p>One feature of App Widgets that use collections is the ability to provide
+users with up-to-date content. For example, consider the Android 3.0 Gmail
+app widget, which provides users with a snapshot of their inbox. To make this
+possible, you need to be able to trigger your {@link
+android.widget.RemoteViewsService.RemoteViewsFactory RemoteViewsFactory} and
+collection view to fetch and display new data. You achieve this with the {@link
+android.appwidget.AppWidgetManager} call {@link
+android.appwidget.AppWidgetManager#notifyAppWidgetViewDataChanged(int, int)
+notifyAppWidgetViewDataChanged()}. This call results in a callback to your
+<code>RemoteViewsFactory</code>’s {@link
+android.widget.RemoteViewsService.RemoteViewsFactory#onDataSetChanged()
+onDataSetChanged()} method, which gives you the opportunity to fetch any new
+data. Note that you can perform
+processing-intensive operations synchronously within the  {@link
+android.widget.RemoteViewsService.RemoteViewsFactory#onDataSetChanged()
+onDataSetChanged()} callback. You are guaranteed that this call will be
+completed before the metadata or view data is fetched from the {@link
+android.widget.RemoteViewsService.RemoteViewsFactory RemoteViewsFactory}. In
+addition, you can perform processing-intensive operations within the {@link
+android.widget.RemoteViewsService.RemoteViewsFactory#getViewAt(int) getViewAt()}
+method. If this call takes a long time, the loading view (specified by the
+<code>RemoteViewsFactory</code>’s  {@link
+android.widget.RemoteViewsService.RemoteViewsFactory#getLoadingView()} method)
+will be displayed in the corresponding position of the collection view until it
+returns.</p>
 
 
diff --git a/docs/html/guide/topics/manifest/manifest-element.jd b/docs/html/guide/topics/manifest/manifest-element.jd
index a8125b3..598e88f 100644
--- a/docs/html/guide/topics/manifest/manifest-element.jd
+++ b/docs/html/guide/topics/manifest/manifest-element.jd
@@ -141,9 +141,14 @@
 </tr>
 </table>
 
+<p class="caution"><strong>Caution:</strong> If your application uses the Android Market's Copy 
+  Protection feature, it cannot be installed to a device's SD card. However, if you use Android 
+  Market's <a href="{@docRoot}guide/publishing/licensing.html">Application Licensing</a> instead, 
+  your application <em>can</em> be installed to internal or external storage, including SD cards.</p>
+
 <p class="note"><strong>Note:</strong> By default, your application will be installed on the
-internal storage and cannot be installed on the external storage unless you define this attribute
-to be either "{@code auto}" or "{@code preferExternal}".</p>
+  internal storage and cannot be installed on the external storage unless you define this attribute
+  to be either "{@code auto}" or "{@code preferExternal}".</p>
 
 <p>When an application is installed on the external storage:</p>
 <ul>
diff --git a/docs/html/images/appwidget.png b/docs/html/images/appwidget.png
index b72b80b..ab6e3de 100644
--- a/docs/html/images/appwidget.png
+++ b/docs/html/images/appwidget.png
Binary files differ
diff --git a/docs/html/images/appwidget_collections.png b/docs/html/images/appwidget_collections.png
new file mode 100644
index 0000000..4bce4a7
--- /dev/null
+++ b/docs/html/images/appwidget_collections.png
Binary files differ
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index 781c24f..60b39b0 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -190,14 +190,14 @@
 {
     LOG_API("nContextSetSurface, con(%p), width(%i), height(%i), surface(%p)", con, width, height, (Surface *)wnd);
 
-    Surface * window = NULL;
+    ANativeWindow * window = NULL;
     if (wnd == NULL) {
 
     } else {
-        window = (Surface*) android_Surface_getNativeWindow(_env, wnd).get();
+        window = android_Surface_getNativeWindow(_env, wnd).get();
     }
 
-    rsContextSetSurface(con, width, height, window, 1);
+    rsContextSetSurface(con, width, height, window);
 }
 
 static void
diff --git a/include/android_runtime/AndroidRuntime.h b/include/android_runtime/AndroidRuntime.h
index b02a057..32cd4f5 100644
--- a/include/android_runtime/AndroidRuntime.h
+++ b/include/android_runtime/AndroidRuntime.h
@@ -39,6 +39,13 @@
     AndroidRuntime();
     virtual ~AndroidRuntime();
 
+    enum StartMode {
+        Zygote,
+        SystemServer,
+        Application,
+        Tool,
+    };
+
     /**
      * Register a set of methods in the specified class.
      */
@@ -59,8 +66,7 @@
 
     int addVmArguments(int argc, const char* const argv[]);
 
-    void start(const char *classname, const bool startSystemServer);
-    void start();       // start in android.util.RuntimeInit
+    void start(const char *classname, const char* options);
 
     static AndroidRuntime* getRuntime();
 
diff --git a/include/camera/CameraParameters.h b/include/camera/CameraParameters.h
index 513239f..dc5fc84 100644
--- a/include/camera/CameraParameters.h
+++ b/include/camera/CameraParameters.h
@@ -309,25 +309,54 @@
     // 0.3333, EV is -2.
     // Example value: "0.333333333" or "0.5". Read only.
     static const char KEY_EXPOSURE_COMPENSATION_STEP[];
-    // The state of the auto-exposure lock. "true" means that auto-exposure is
-    // locked to its current value and will not change. "false" means the
-    // auto-exposure routine is free to change exposure settings. Changing
-    // exposure compensation settings will still affect the exposure settings
-    // while auto-exposure is locked. Stopping preview or taking a still image
-    // will release the lock. However, the lock can be re-enabled prior to
-    // preview being re-started, to keep the exposure values from the previous
-    // lock. In conjunction with exposure compensation, this allows for
-    // capturing multi-exposure brackets with known relative exposure
-    // values. Locking auto-exposure after open but before the first cal to
-    // startPreview may result in severly over- or under-exposed images.  The
-    // driver may independently enable the AE lock after auto-focus
-    // completes. If it does so, this key must have its value updated to reflect
-    // the lock's existence. Applications are free to release such a lock, to
-    // re-enable AE without restarting preview.
+    // The state of the auto-exposure lock. "true" means that
+    // auto-exposure is locked to its current value and will not
+    // change. "false" means the auto-exposure routine is free to
+    // change exposure values. If auto-exposure is already locked,
+    // setting this to true again has no effect (the driver will not
+    // recalculate exposure values). Changing exposure compensation
+    // settings will still affect the exposure settings while
+    // auto-exposure is locked. Stopping preview or taking a still
+    // image will release the lock. However, the lock can be
+    // re-enabled prior to preview being re-started, to keep the
+    // exposure values from the previous lock. In conjunction with
+    // exposure compensation, this allows for capturing multi-exposure
+    // brackets with known relative exposure values. Locking
+    // auto-exposure after open but before the first call to
+    // startPreview may result in severely over- or under-exposed
+    // images.  The driver may independently enable the AE lock after
+    // auto-focus completes. If it does so, this key must have its
+    // value updated to reflect the lock's existence. Applications are
+    // free to release such a lock, to re-enable AE without restarting
+    // preview.
     static const char KEY_AUTO_EXPOSURE_LOCK[];
     // Whether locking the auto-exposure is supported. "true" means it is, and
     // "false" or this key not existing means it is not supported.
     static const char KEY_AUTO_EXPOSURE_LOCK_SUPPORTED[];
+    // The state of the auto-white balance lock. "true" means that
+    // auto-white balance is locked to its current value and will not
+    // change. "false" means the auto-white balance routine is free to
+    // change white balance values. If auto-white balance is already
+    // locked, setting this to true again has no effect (the driver
+    // will not recalculate white balance values). Stopping preview or
+    // taking a still image will release the lock. However, the lock
+    // can be re-enabled prior to preview being re-started, to keep
+    // the white balance values from the previous lock. In conjunction
+    // with exposure compensation, this allows for capturing
+    // multi-exposure brackets with fixed white balance. Locking
+    // auto-white balance after open but before the first call to
+    // startPreview may result in severely incorrect color.  The
+    // driver may independently enable the AWB lock after auto-focus
+    // completes. If it does so, this key must have its value updated
+    // to reflect the lock's existence. Applications are free to
+    // release such a lock, to re-enable AWB without restarting
+    // preview.
+    static const char KEY_AUTO_WHITEBALANCE_LOCK[];
+    // Whether locking the auto-white balance is supported. "true"
+    // means it is, and "false" or this key not existing means it is
+    // not supported.
+    static const char KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED[];
+
     // The maximum number of metering areas supported. This is the maximum
     // length of KEY_METERING_AREAS.
     // Example value: "0" or "2". Read only.
diff --git a/include/gui/SurfaceTexture.h b/include/gui/SurfaceTexture.h
index 43b2fa9..2b31462 100644
--- a/include/gui/SurfaceTexture.h
+++ b/include/gui/SurfaceTexture.h
@@ -197,8 +197,9 @@
               mEglDisplay(EGL_NO_DISPLAY),
               mBufferState(BufferSlot::FREE),
               mRequestBufferCalled(false),
-              mLastQueuedTransform(0),
-              mLastQueuedTimestamp(0) {
+              mTransform(0),
+              mTimestamp(0) {
+            mCrop.makeInvalid();
         }
 
         // mGraphicBuffer points to the buffer allocated for this slot or is NULL
@@ -211,32 +212,56 @@
         // mEglDisplay is the EGLDisplay used to create mEglImage.
         EGLDisplay mEglDisplay;
 
-        // mBufferState indicates whether the slot is currently accessible to a
-        // client and should not be used by the SurfaceTexture object. It gets
-        // set to true when dequeueBuffer returns the slot and is reset to false
-        // when the client calls either queueBuffer or cancelBuffer on the slot.
-        enum { DEQUEUED=-2, FREE=-1, QUEUED=0 };
-        int8_t mBufferState;
+        // BufferState represents the different states in which a buffer slot
+        // can be.
+        enum BufferState {
+            // FREE indicates that the buffer is not currently being used and
+            // will not be used in the future until it gets dequeued and
+            // subseqently queued by the client.
+            FREE = 0,
 
+            // DEQUEUED indicates that the buffer has been dequeued by the
+            // client, but has not yet been queued or canceled. The buffer is
+            // considered 'owned' by the client, and the server should not use
+            // it for anything.
+            //
+            // Note that when in synchronous-mode (mSynchronousMode == true),
+            // the buffer that's currently attached to the texture may be
+            // dequeued by the client.  That means that the current buffer can
+            // be in either the DEQUEUED or QUEUED state.  In asynchronous mode,
+            // however, the current buffer is always in the QUEUED state.
+            DEQUEUED = 1,
+
+            // QUEUED indicates that the buffer has been queued by the client,
+            // and has not since been made available for the client to dequeue.
+            // Attaching the buffer to the texture does NOT transition the
+            // buffer away from the QUEUED state. However, in Synchronous mode
+            // the current buffer may be dequeued by the client under some
+            // circumstances. See the note about the current buffer in the
+            // documentation for DEQUEUED.
+            QUEUED = 2,
+        };
+
+        // mBufferState is the current state of this buffer slot.
+        BufferState mBufferState;
 
         // mRequestBufferCalled is used for validating that the client did
         // call requestBuffer() when told to do so. Technically this is not
         // needed but useful for debugging and catching client bugs.
         bool mRequestBufferCalled;
 
-        // mLastQueuedCrop is the crop rectangle for the buffer that was most
-        // recently queued. This gets set to mNextCrop each time queueBuffer gets
-        // called.
-        Rect mLastQueuedCrop;
+        // mCrop is the current crop rectangle for this buffer slot. This gets
+        // set to mNextCrop each time queueBuffer gets called for this buffer.
+        Rect mCrop;
 
-        // mLastQueuedTransform is the transform identifier for the buffer that was
-        // most recently queued. This gets set to mNextTransform each time
-        // queueBuffer gets called.
-        uint32_t mLastQueuedTransform;
+        // mTransform is the current transform flags for this buffer slot. This
+        // gets set to mNextTransform each time queueBuffer gets called for this
+        // slot.
+        uint32_t mTransform;
 
-        // mLastQueuedTimestamp is the timestamp for the buffer that was most
-        // recently queued. This gets set by queueBuffer.
-        int64_t mLastQueuedTimestamp;
+        // mTimestamp is the current timestamp for this buffer slot. This gets
+        // to set by queueBuffer each time this slot is queued.
+        int64_t mTimestamp;
     };
 
     // mSlots is the array of buffer slots that must be mirrored on the client
diff --git a/include/media/mediaplayer.h b/include/media/mediaplayer.h
index cfa4cfd..50a378f 100644
--- a/include/media/mediaplayer.h
+++ b/include/media/mediaplayer.h
@@ -127,6 +127,7 @@
 
 enum media_set_parameter_keys {
     KEY_PARAMETER_TIMED_TEXT_TRACK_INDEX = 1000,
+    KEY_PARAMETER_TIMED_TEXT_ADD_OUT_OF_BAND_SOURCE = 1001,
 };
 // ----------------------------------------------------------------------------
 // ref-counted object for callbacks
diff --git a/include/media/stagefright/MPEG4Writer.h b/include/media/stagefright/MPEG4Writer.h
index 1764306..904ce2a 100644
--- a/include/media/stagefright/MPEG4Writer.h
+++ b/include/media/stagefright/MPEG4Writer.h
@@ -176,7 +176,7 @@
     void writeCompositionMatrix(int32_t degrees);
     void writeMvhdBox(int64_t durationUs);
     void writeMoovBox(int64_t durationUs);
-    void writeFtypBox(const MetaData *param);
+    void writeFtypBox(MetaData *param);
     void writeUdtaBox();
     void writeGeoDataBox();
     void writeLatitude(int degreex10000);
diff --git a/include/media/stagefright/MetaData.h b/include/media/stagefright/MetaData.h
index a300f0e..4044c5d 100644
--- a/include/media/stagefright/MetaData.h
+++ b/include/media/stagefright/MetaData.h
@@ -154,16 +154,16 @@
             int32_t left, int32_t top,
             int32_t right, int32_t bottom);
 
-    bool findCString(uint32_t key, const char **value) const;
-    bool findInt32(uint32_t key, int32_t *value) const;
-    bool findInt64(uint32_t key, int64_t *value) const;
-    bool findFloat(uint32_t key, float *value) const;
-    bool findPointer(uint32_t key, void **value) const;
+    bool findCString(uint32_t key, const char **value);
+    bool findInt32(uint32_t key, int32_t *value);
+    bool findInt64(uint32_t key, int64_t *value);
+    bool findFloat(uint32_t key, float *value);
+    bool findPointer(uint32_t key, void **value);
 
     bool findRect(
             uint32_t key,
             int32_t *left, int32_t *top,
-            int32_t *right, int32_t *bottom) const;
+            int32_t *right, int32_t *bottom);
 
     bool setData(uint32_t key, uint32_t type, const void *data, size_t size);
 
diff --git a/include/utils/RefBase.h b/include/utils/RefBase.h
index f355087..4126225 100644
--- a/include/utils/RefBase.h
+++ b/include/utils/RefBase.h
@@ -51,7 +51,6 @@
 }
 
 // ---------------------------------------------------------------------------
-
 class ReferenceMover;
 class ReferenceConverterBase {
 public:
@@ -120,7 +119,14 @@
 protected:
                             RefBase();
     virtual                 ~RefBase();
-    
+
+    // called when the last reference goes away. this is responsible for
+    // calling the destructor. The default implementation just does
+    // "delete this;".
+    // Make sure to never acquire a strong reference from this function. The
+    // same restrictions than for destructors apply.
+    virtual void            destroy() const;
+
     //! Flags for extendObjectLifetime()
     enum {
         OBJECT_LIFETIME_WEAK    = 0x0001,
diff --git a/include/utils/ResourceTypes.h b/include/utils/ResourceTypes.h
index 173412e..2c7cf75 100644
--- a/include/utils/ResourceTypes.h
+++ b/include/utils/ResourceTypes.h
@@ -953,6 +953,7 @@
         UI_MODE_TYPE_NORMAL = ACONFIGURATION_UI_MODE_TYPE_NORMAL,
         UI_MODE_TYPE_DESK = ACONFIGURATION_UI_MODE_TYPE_DESK,
         UI_MODE_TYPE_CAR = ACONFIGURATION_UI_MODE_TYPE_CAR,
+        UI_MODE_TYPE_TELEVISION = ACONFIGURATION_UI_MODE_TYPE_TELEVISION,
 
         // uiMode bits for the night switch.
         MASK_UI_MODE_NIGHT = 0x30,
@@ -966,8 +967,7 @@
         struct {
             uint8_t screenLayout;
             uint8_t uiMode;
-            uint8_t screenConfigPad1;
-            uint8_t screenConfigPad2;
+            uint16_t smallestScreenWidthDp;
         };
         uint32_t screenConfig;
     };
@@ -1000,6 +1000,7 @@
         screenHeight = dtohs(screenHeight);
         sdkVersion = dtohs(sdkVersion);
         minorVersion = dtohs(minorVersion);
+        smallestScreenWidthDp = dtohs(smallestScreenWidthDp);
         screenWidthDp = dtohs(screenWidthDp);
         screenHeightDp = dtohs(screenHeightDp);
     }
@@ -1013,6 +1014,7 @@
         screenHeight = htods(screenHeight);
         sdkVersion = htods(sdkVersion);
         minorVersion = htods(minorVersion);
+        smallestScreenWidthDp = htods(smallestScreenWidthDp);
         screenWidthDp = htods(screenWidthDp);
         screenHeightDp = htods(screenHeightDp);
     }
@@ -1034,6 +1036,8 @@
         if (diff != 0) return diff;
         diff = (int32_t)(uiMode - o.uiMode);
         if (diff != 0) return diff;
+        diff = (int32_t)(smallestScreenWidthDp - o.smallestScreenWidthDp);
+        if (diff != 0) return diff;
         diff = (int32_t)(screenSizeDp - o.screenSizeDp);
         return (int)diff;
     }
@@ -1052,6 +1056,7 @@
         CONFIG_ORIENTATION = ACONFIGURATION_ORIENTATION,
         CONFIG_DENSITY = ACONFIGURATION_DENSITY,
         CONFIG_SCREEN_SIZE = ACONFIGURATION_SCREEN_SIZE,
+        CONFIG_SMALLEST_SCREEN_SIZE = ACONFIGURATION_SMALLEST_SCREEN_SIZE,
         CONFIG_VERSION = ACONFIGURATION_VERSION,
         CONFIG_SCREEN_LAYOUT = ACONFIGURATION_SCREEN_LAYOUT,
         CONFIG_UI_MODE = ACONFIGURATION_UI_MODE
@@ -1075,6 +1080,7 @@
         if (version != o.version) diffs |= CONFIG_VERSION;
         if (screenLayout != o.screenLayout) diffs |= CONFIG_SCREEN_LAYOUT;
         if (uiMode != o.uiMode) diffs |= CONFIG_UI_MODE;
+        if (smallestScreenWidthDp != o.smallestScreenWidthDp) diffs |= CONFIG_SMALLEST_SCREEN_SIZE;
         if (screenSizeDp != o.screenSizeDp) diffs |= CONFIG_SCREEN_SIZE;
         return diffs;
     }
@@ -1109,14 +1115,10 @@
             }
         }
 
-        if (screenLayout || o.screenLayout) {
-            if (((screenLayout^o.screenLayout) & MASK_SCREENSIZE) != 0) {
-                if (!(screenLayout & MASK_SCREENSIZE)) return false;
-                if (!(o.screenLayout & MASK_SCREENSIZE)) return true;
-            }
-            if (((screenLayout^o.screenLayout) & MASK_SCREENLONG) != 0) {
-                if (!(screenLayout & MASK_SCREENLONG)) return false;
-                if (!(o.screenLayout & MASK_SCREENLONG)) return true;
+        if (smallestScreenWidthDp || o.smallestScreenWidthDp) {
+            if (smallestScreenWidthDp != o.smallestScreenWidthDp) {
+                if (!smallestScreenWidthDp) return false;
+                if (!o.smallestScreenWidthDp) return true;
             }
         }
 
@@ -1132,6 +1134,17 @@
             }
         }
 
+        if (screenLayout || o.screenLayout) {
+            if (((screenLayout^o.screenLayout) & MASK_SCREENSIZE) != 0) {
+                if (!(screenLayout & MASK_SCREENSIZE)) return false;
+                if (!(o.screenLayout & MASK_SCREENSIZE)) return true;
+            }
+            if (((screenLayout^o.screenLayout) & MASK_SCREENLONG) != 0) {
+                if (!(screenLayout & MASK_SCREENLONG)) return false;
+                if (!(o.screenLayout & MASK_SCREENLONG)) return true;
+            }
+        }
+
         if (orientation != o.orientation) {
             if (!orientation) return false;
             if (!o.orientation) return true;
@@ -1238,6 +1251,37 @@
                 }
             }
 
+            if (smallestScreenWidthDp || o.smallestScreenWidthDp) {
+                // The configuration closest to the actual size is best.
+                // We assume that larger configs have already been filtered
+                // out at this point.  That means we just want the largest one.
+                return smallestScreenWidthDp >= o.smallestScreenWidthDp;
+            }
+
+            if (screenSizeDp || o.screenSizeDp) {
+                // "Better" is based on the sum of the difference between both
+                // width and height from the requested dimensions.  We are
+                // assuming the invalid configs (with smaller dimens) have
+                // already been filtered.  Note that if a particular dimension
+                // is unspecified, we will end up with a large value (the
+                // difference between 0 and the requested dimension), which is
+                // good since we will prefer a config that has specified a
+                // dimension value.
+                int myDelta = 0, otherDelta = 0;
+                if (requested->screenWidthDp) {
+                    myDelta += requested->screenWidthDp - screenWidthDp;
+                    otherDelta += requested->screenWidthDp - o.screenWidthDp;
+                }
+                if (requested->screenHeightDp) {
+                    myDelta += requested->screenHeightDp - screenHeightDp;
+                    otherDelta += requested->screenHeightDp - o.screenHeightDp;
+                }
+                //LOGI("Comparing this %dx%d to other %dx%d in %dx%d: myDelta=%d otherDelta=%d",
+                //    screenWidthDp, screenHeightDp, o.screenWidthDp, o.screenHeightDp,
+                //    requested->screenWidthDp, requested->screenHeightDp, myDelta, otherDelta);
+                return (myDelta <= otherDelta);
+            }
+
             if (screenLayout || o.screenLayout) {
                 if (((screenLayout^o.screenLayout) & MASK_SCREENSIZE) != 0
                         && (requested->screenLayout & MASK_SCREENSIZE)) {
@@ -1270,30 +1314,6 @@
                 }
             }
 
-            if (screenSizeDp || o.screenSizeDp) {
-                // Better is based on the sum of the difference between both
-                // width and height from the requested dimensions.  We are
-                // assuming the invalid configs (with smaller dimens) have
-                // already been filtered.  Note that if a particular dimension
-                // is unspecified, we will end up with a large value (the
-                // difference between 0 and the requested dimension), which is
-                // good since we will prefer a config that has specified a
-                // dimension value.
-                int myDelta = 0, otherDelta = 0;
-                if (requested->screenWidthDp) {
-                    myDelta += requested->screenWidthDp - screenWidthDp;
-                    otherDelta += requested->screenWidthDp - o.screenWidthDp;
-                }
-                if (requested->screenHeightDp) {
-                    myDelta += requested->screenHeightDp - screenHeightDp;
-                    otherDelta += requested->screenHeightDp - o.screenHeightDp;
-                }
-                //LOGI("Comparing this %dx%d to other %dx%d in %dx%d: myDelta=%d otherDelta=%d",
-                //    screenWidthDp, screenHeightDp, o.screenWidthDp, o.screenHeightDp,
-                //    requested->screenWidthDp, requested->screenHeightDp, myDelta, otherDelta);
-                return (myDelta <= otherDelta);
-            }
-
             if ((orientation != o.orientation) && requested->orientation) {
                 return (orientation);
             }
@@ -1388,14 +1408,24 @@
             }
 
             if (screenSize || o.screenSize) {
-                if ((screenWidth != o.screenWidth) && requested->screenWidth) {
-                    return (screenWidth);
+                // "Better" is based on the sum of the difference between both
+                // width and height from the requested dimensions.  We are
+                // assuming the invalid configs (with smaller sizes) have
+                // already been filtered.  Note that if a particular dimension
+                // is unspecified, we will end up with a large value (the
+                // difference between 0 and the requested dimension), which is
+                // good since we will prefer a config that has specified a
+                // size value.
+                int myDelta = 0, otherDelta = 0;
+                if (requested->screenWidth) {
+                    myDelta += requested->screenWidth - screenWidth;
+                    otherDelta += requested->screenWidth - o.screenWidth;
                 }
-
-                if ((screenHeight != o.screenHeight) &&
-                        requested->screenHeight) {
-                    return (screenHeight);
+                if (requested->screenHeight) {
+                    myDelta += requested->screenHeight - screenHeight;
+                    otherDelta += requested->screenHeight - o.screenHeight;
                 }
+                return (myDelta <= otherDelta);
             }
 
             if (version || o.version) {
@@ -1476,15 +1506,20 @@
                     && uiModeNight != setUiModeNight) {
                 return false;
             }
+
+            if (settings.smallestScreenWidthDp != 0 && smallestScreenWidthDp != 0
+                    && smallestScreenWidthDp > settings.smallestScreenWidthDp) {
+                return false;
+            }
         }
         if (screenSizeDp != 0) {
             if (settings.screenWidthDp != 0 && screenWidthDp != 0
-                && screenWidthDp > settings.screenWidthDp) {
+                    && screenWidthDp > settings.screenWidthDp) {
                 //LOGI("Filtering out width %d in requested %d", screenWidthDp, settings.screenWidthDp);
                 return false;
             }
             if (settings.screenHeightDp != 0 && screenHeightDp != 0
-                && screenHeightDp > settings.screenHeightDp) {
+                    && screenHeightDp > settings.screenHeightDp) {
                 //LOGI("Filtering out height %d in requested %d", screenHeightDp, settings.screenHeightDp);
                 return false;
             }
@@ -1531,11 +1566,11 @@
         }
         if (screenSize != 0) {
             if (settings.screenWidth != 0 && screenWidth != 0
-                && screenWidth != settings.screenWidth) {
+                && screenWidth > settings.screenWidth) {
                 return false;
             }
             if (settings.screenHeight != 0 && screenHeight != 0
-                && screenHeight != settings.screenHeight) {
+                && screenHeight > settings.screenHeight) {
                 return false;
             }
         }
@@ -1568,13 +1603,13 @@
     String8 toString() const {
         char buf[200];
         sprintf(buf, "imsi=%d/%d lang=%c%c reg=%c%c orient=%d touch=%d dens=%d "
-                "kbd=%d nav=%d input=%d ssz=%dx%d %ddp x %ddp sz=%d long=%d "
+                "kbd=%d nav=%d input=%d ssz=%dx%d sw%ddp w%ddp h%ddp sz=%d long=%d "
                 "ui=%d night=%d vers=%d.%d",
                 mcc, mnc,
                 language[0] ? language[0] : '-', language[1] ? language[1] : '-',
                 country[0] ? country[0] : '-', country[1] ? country[1] : '-',
                 orientation, touchscreen, density, keyboard, navigation, inputFlags,
-                screenWidth, screenHeight, screenWidthDp, screenHeightDp,
+                screenWidth, screenHeight, smallestScreenWidthDp, screenWidthDp, screenHeightDp,
                 screenLayout&MASK_SCREENSIZE, screenLayout&MASK_SCREENLONG,
                 uiMode&MASK_UI_MODE_TYPE, uiMode&MASK_UI_MODE_NIGHT,
                 sdkVersion, minorVersion);
diff --git a/keystore/java/android/security/IKeyChainAliasResponse.aidl b/keystore/java/android/security/IKeyChainAliasResponse.aidl
new file mode 100644
index 0000000..e042001
--- /dev/null
+++ b/keystore/java/android/security/IKeyChainAliasResponse.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2011 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.security;
+
+/**
+ * Used by the {@code KeyChainActivity} to return alias for {@link KeyStore#chooseAlias}.
+ *
+ * @hide
+ */
+interface IKeyChainAliasResponse {
+
+    void alias(String alias);
+}
diff --git a/keystore/java/android/security/IKeyChainService.aidl b/keystore/java/android/security/IKeyChainService.aidl
index be59f23..2763e46 100644
--- a/keystore/java/android/security/IKeyChainService.aidl
+++ b/keystore/java/android/security/IKeyChainService.aidl
@@ -15,8 +15,6 @@
  */
 package android.security;
 
-import android.os.Bundle;
-
 /**
  * Caller is required to ensure that {@link KeyStore#unlock
  * KeyStore.unlock} was successful.
diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java
index 08e05ef..ec820cf 100644
--- a/keystore/java/android/security/KeyChain.java
+++ b/keystore/java/android/security/KeyChain.java
@@ -17,9 +17,11 @@
 
 import android.accounts.Account;
 import android.accounts.AccountManager;
+import android.accounts.AccountManagerCallback;
 import android.accounts.AccountManagerFuture;
 import android.accounts.AuthenticatorException;
 import android.accounts.OperationCanceledException;
+import android.app.Activity;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -56,64 +58,123 @@
     public static final String ACCOUNT_TYPE = "com.android.keychain";
 
     /**
-     * Returns an {@code Intent} for use with {@link
-     * android.app.Activity#startActivityForResult
-     * startActivityForResult}. The result will be returned via {@link
-     * android.app.Activity#onActivityResult onActivityResult} with
-     * {@link android.app.Activity#RESULT_OK RESULT_OK} and the alias
-     * in the returned {@code Intent}'s extra data with key {@link
-     * android.content.Intent#EXTRA_TEXT Intent.EXTRA_TEXT}.
+     * @hide Also used by KeyChainActivity implementation
      */
-    public static Intent chooseAlias() {
-        return new Intent("com.android.keychain.CHOOSER");
+    public static final String EXTRA_RESPONSE = "response";
+
+    /**
+     * Launches an {@code Activity} for the user to select the alias
+     * for a private key and certificate pair for authentication. The
+     * selected alias or null will be returned via the
+     * IKeyChainAliasResponse callback.
+     */
+    public static void choosePrivateKeyAlias(Activity activity, KeyChainAliasResponse response) {
+        if (activity == null) {
+            throw new NullPointerException("activity == null");
+        }
+        if (response == null) {
+            throw new NullPointerException("response == null");
+        }
+        Intent intent = new Intent("com.android.keychain.CHOOSER");
+        intent.putExtra(EXTRA_RESPONSE, new AliasResponse(activity, response));
+        activity.startActivity(intent);
+    }
+
+    private static class AliasResponse extends IKeyChainAliasResponse.Stub {
+        private final Activity activity;
+        private final KeyChainAliasResponse keyChainAliasResponse;
+        private AliasResponse(Activity activity, KeyChainAliasResponse keyChainAliasResponse) {
+            this.activity = activity;
+            this.keyChainAliasResponse = keyChainAliasResponse;
+        }
+        @Override public void alias(String alias) {
+            if (alias == null) {
+                keyChainAliasResponse.alias(null);
+                return;
+            }
+            AccountManager accountManager = AccountManager.get(activity);
+            accountManager.getAuthToken(getAccount(activity),
+                                        alias,
+                                        null,
+                                        activity,
+                                        new AliasAccountManagerCallback(keyChainAliasResponse,
+                                                                        alias),
+                                        null);
+        }
+    }
+
+    private static class AliasAccountManagerCallback implements AccountManagerCallback<Bundle> {
+        private final KeyChainAliasResponse keyChainAliasResponse;
+        private final String alias;
+        private AliasAccountManagerCallback(KeyChainAliasResponse keyChainAliasResponse,
+                                            String alias) {
+            this.keyChainAliasResponse = keyChainAliasResponse;
+            this.alias = alias;
+        }
+        @Override public void run(AccountManagerFuture<Bundle> future) {
+            Bundle bundle;
+            try {
+                bundle = future.getResult();
+            } catch (OperationCanceledException e) {
+                keyChainAliasResponse.alias(null);
+                return;
+            } catch (IOException e) {
+                keyChainAliasResponse.alias(null);
+                return;
+            } catch (AuthenticatorException e) {
+                keyChainAliasResponse.alias(null);
+                return;
+            }
+            String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);
+            if (authToken != null) {
+                keyChainAliasResponse.alias(alias);
+            } else {
+                keyChainAliasResponse.alias(null);
+            }
+        }
     }
 
     /**
-     * Returns a new {@code KeyChainResult} instance.
+     * Returns the {@code PrivateKey} for the requested alias, or null
+     * if no there is no result.
      */
-    public static KeyChainResult get(Context context, String alias)
+    public static PrivateKey getPrivateKey(Context context, String alias)
             throws InterruptedException, RemoteException {
         if (alias == null) {
             throw new NullPointerException("alias == null");
         }
         KeyChainConnection keyChainConnection = bind(context);
         try {
-            // Account is created if necessary during binding of the IKeyChainService
-            AccountManager accountManager = AccountManager.get(context);
-            Account account = accountManager.getAccountsByType(ACCOUNT_TYPE)[0];
-            AccountManagerFuture<Bundle> future = accountManager.getAuthToken(account,
-                                                                              alias,
-                                                                              false,
-                                                                              null,
-                                                                              null);
-            Bundle bundle;
-            try {
-                bundle = future.getResult();
-            } catch (OperationCanceledException e) {
-                throw new AssertionError(e);
-            } catch (IOException e) {
-                throw new AssertionError(e);
-            } catch (AuthenticatorException e) {
-                throw new AssertionError(e);
-            }
-            Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT);
-            if (intent != null) {
-                Bundle result = new Bundle();
-                // we don't want this Eclair compatability flag,
-                // it will prevent onActivityResult from being called
-                intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
-                return new KeyChainResult(intent);
-            }
-
-            String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);
+            String authToken = authToken(context, alias);
             if (authToken == null) {
-                throw new AssertionError("Invalid authtoken");
+                return null;
             }
             IKeyChainService keyChainService = keyChainConnection.getService();
             byte[] privateKeyBytes = keyChainService.getPrivateKey(alias, authToken);
+            return toPrivateKey(privateKeyBytes);
+        } finally {
+            keyChainConnection.close();
+        }
+    }
+
+    /**
+     * Returns the {@code X509Certificate} chain for the requested
+     * alias, or null if no there is no result.
+     */
+    public static X509Certificate[] getCertificateChain(Context context, String alias)
+            throws InterruptedException, RemoteException {
+        if (alias == null) {
+            throw new NullPointerException("alias == null");
+        }
+        KeyChainConnection keyChainConnection = bind(context);
+        try {
+            String authToken = authToken(context, alias);
+            if (authToken == null) {
+                return null;
+            }
+            IKeyChainService keyChainService = keyChainConnection.getService();
             byte[] certificateBytes = keyChainService.getCertificate(alias, authToken);
-            return new KeyChainResult(toPrivateKey(privateKeyBytes),
-                                      toCertificate(certificateBytes));
+            return new X509Certificate[] { toCertificate(certificateBytes) };
         } finally {
             keyChainConnection.close();
         }
@@ -146,6 +207,50 @@
         }
     }
 
+    private static String authToken(Context context, String alias) {
+        AccountManager accountManager = AccountManager.get(context);
+        AccountManagerFuture<Bundle> future = accountManager.getAuthToken(getAccount(context),
+                                                                          alias,
+                                                                          false,
+                                                                          null,
+                                                                          null);
+        Bundle bundle;
+        try {
+            bundle = future.getResult();
+        } catch (OperationCanceledException e) {
+            throw new AssertionError(e);
+        } catch (IOException e) {
+            // KeyChainAccountAuthenticator doesn't do I/O
+            throw new AssertionError(e);
+        } catch (AuthenticatorException e) {
+            throw new AssertionError(e);
+        }
+        Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT);
+        if (intent != null) {
+            return null;
+        }
+        String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);
+        if (authToken == null) {
+            throw new AssertionError("Invalid authtoken");
+        }
+        return authToken;
+    }
+
+    private static Account getAccount(Context context) {
+        AccountManager accountManager = AccountManager.get(context);
+        Account[] accounts = accountManager.getAccountsByType(ACCOUNT_TYPE);
+        if (accounts.length == 0) {
+            try {
+                // Account is created if necessary during binding of the IKeyChainService
+                bind(context).close();
+            } catch (InterruptedException e) {
+                throw new AssertionError(e);
+            }
+            accounts = accountManager.getAccountsByType(ACCOUNT_TYPE);
+        }
+        return accounts[0];
+    }
+
     /**
      * @hide for reuse by CertInstaller and Settings.
      * @see KeyChain#bind
diff --git a/keystore/java/android/security/KeyChainAliasResponse.java b/keystore/java/android/security/KeyChainAliasResponse.java
new file mode 100644
index 0000000..bcca123
--- /dev/null
+++ b/keystore/java/android/security/KeyChainAliasResponse.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2011 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.security;
+
+import android.content.Intent;
+import java.security.PrivateKey;
+import java.security.cert.X509Certificate;
+
+/**
+ * The KeyChainAliasResponse is the callback for {@link
+ * KeyChain#chooseAlias}.
+ *
+ * @hide
+ */
+public interface KeyChainAliasResponse {
+
+    /**
+     * Called with the alias of the certificate chosen by the user, or
+     * null if no value was chosen.
+     */
+    public void alias(String alias);
+}
diff --git a/keystore/java/android/security/KeyChainResult.java b/keystore/java/android/security/KeyChainResult.java
deleted file mode 100644
index 85a2921..0000000
--- a/keystore/java/android/security/KeyChainResult.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2011 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.security;
-
-import android.content.Intent;
-import java.security.PrivateKey;
-import java.security.cert.X509Certificate;
-
-/**
- * The KeyChainResult is the complex result value from {@link
- * KeyChain#get}. The caller should first inspect {@link #getIntent}
- * to determine if the user needs to grant the application access to
- * the protected contents. If {@code getIntent} returns null, access
- * has been granted and the methods {@link #getPrivateKey} and {@link
- * #getCertificate} can be used to access the credentials.
- *
- * @hide
- */
-public final class KeyChainResult {
-
-    private final Intent intent;
-    private final PrivateKey privateKey;
-    private final X509Certificate certificate;
-
-    KeyChainResult(Intent intent) {
-        this(intent, null, null);
-    }
-
-    KeyChainResult(PrivateKey privateKey, X509Certificate certificate) {
-        this(null, privateKey, certificate);
-    }
-
-    private KeyChainResult(Intent intent, PrivateKey privateKey, X509Certificate certificate) {
-        this.intent = intent;
-        this.privateKey = privateKey;
-        this.certificate = certificate;
-    }
-
-    public Intent getIntent() {
-        return intent;
-    }
-
-    public PrivateKey getPrivateKey() {
-        checkIntent();
-        return privateKey;
-    }
-
-    public X509Certificate getCertificate() {
-        checkIntent();
-        return certificate;
-    }
-
-    private void checkIntent() {
-        if (intent != null) {
-            throw new IllegalStateException("non-null Intent, check getIntent()");
-        }
-    }
-
-}
diff --git a/libs/camera/CameraParameters.cpp b/libs/camera/CameraParameters.cpp
index 4f3da40..c295315 100644
--- a/libs/camera/CameraParameters.cpp
+++ b/libs/camera/CameraParameters.cpp
@@ -70,6 +70,8 @@
 const char CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP[] = "exposure-compensation-step";
 const char CameraParameters::KEY_AUTO_EXPOSURE_LOCK[] = "auto-exposure-lock";
 const char CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED[] = "auto-exposure-lock-supported";
+const char CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK[] = "auto-whitebalance-lock";
+const char CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED[] = "auto-whitebalance-lock-supported";
 const char CameraParameters::KEY_MAX_NUM_METERING_AREAS[] = "max-num-metering-areas";
 const char CameraParameters::KEY_METERING_AREAS[] = "metering-areas";
 const char CameraParameters::KEY_ZOOM[] = "zoom";
diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp
index d7c449c..ee97dcf 100644
--- a/libs/gui/SurfaceTexture.cpp
+++ b/libs/gui/SurfaceTexture.cpp
@@ -285,14 +285,19 @@
             return -EINVAL;
         }
 
-        // make sure the client is not trying to dequeue more buffers
-        // than allowed.
-        const int avail = mBufferCount - (dequeuedCount+1);
-        if (avail < (MIN_UNDEQUEUED_BUFFERS-int(mSynchronousMode))) {
-            LOGE("dequeueBuffer: MIN_UNDEQUEUED_BUFFERS=%d exceeded (dequeued=%d)",
-                    MIN_UNDEQUEUED_BUFFERS-int(mSynchronousMode),
-                    dequeuedCount);
-            return -EBUSY;
+        // See whether a buffer has been queued since the last setBufferCount so
+        // we know whether to perform the MIN_UNDEQUEUED_BUFFERS check below.
+        bool bufferHasBeenQueued = mCurrentTexture != INVALID_BUFFER_SLOT;
+        if (bufferHasBeenQueued) {
+            // make sure the client is not trying to dequeue more buffers
+            // than allowed.
+            const int avail = mBufferCount - (dequeuedCount+1);
+            if (avail < (MIN_UNDEQUEUED_BUFFERS-int(mSynchronousMode))) {
+                LOGE("dequeueBuffer: MIN_UNDEQUEUED_BUFFERS=%d exceeded (dequeued=%d)",
+                        MIN_UNDEQUEUED_BUFFERS-int(mSynchronousMode),
+                        dequeuedCount);
+                return -EBUSY;
+            }
         }
 
         // we're in synchronous mode and didn't find a buffer, we need to wait
@@ -389,49 +394,49 @@
     sp<FrameAvailableListener> listener;
 
     { // scope for the lock
-    Mutex::Autolock lock(mMutex);
-    if (buf < 0 || buf >= mBufferCount) {
-        LOGE("queueBuffer: slot index out of range [0, %d]: %d",
-                mBufferCount, buf);
-        return -EINVAL;
-    } else if (mSlots[buf].mBufferState != BufferSlot::DEQUEUED) {
-        LOGE("queueBuffer: slot %d is not owned by the client (state=%d)",
-                buf, mSlots[buf].mBufferState);
-        return -EINVAL;
-    } else if (buf == mCurrentTexture) {
-        LOGE("queueBuffer: slot %d is current!", buf);
-        return -EINVAL;
-    } else if (!mSlots[buf].mRequestBufferCalled) {
-        LOGE("queueBuffer: slot %d was enqueued without requesting a buffer",
-                buf);
-        return -EINVAL;
-    }
+        Mutex::Autolock lock(mMutex);
+        if (buf < 0 || buf >= mBufferCount) {
+            LOGE("queueBuffer: slot index out of range [0, %d]: %d",
+                    mBufferCount, buf);
+            return -EINVAL;
+        } else if (mSlots[buf].mBufferState != BufferSlot::DEQUEUED) {
+            LOGE("queueBuffer: slot %d is not owned by the client (state=%d)",
+                    buf, mSlots[buf].mBufferState);
+            return -EINVAL;
+        } else if (buf == mCurrentTexture) {
+            LOGE("queueBuffer: slot %d is current!", buf);
+            return -EINVAL;
+        } else if (!mSlots[buf].mRequestBufferCalled) {
+            LOGE("queueBuffer: slot %d was enqueued without requesting a "
+                    "buffer", buf);
+            return -EINVAL;
+        }
 
-    if (mQueue.empty()) {
-        listener = mFrameAvailableListener;
-    }
-
-    if (mSynchronousMode) {
-        // in synchronous mode we queue all buffers in a FIFO
-        mQueue.push_back(buf);
-    } else {
-        // in asynchronous mode we only keep the most recent buffer
         if (mQueue.empty()) {
+            listener = mFrameAvailableListener;
+        }
+
+        if (mSynchronousMode) {
+            // in synchronous mode we queue all buffers in a FIFO
             mQueue.push_back(buf);
         } else {
-            Fifo::iterator front(mQueue.begin());
-            // buffer currently queued is freed
-            mSlots[*front].mBufferState = BufferSlot::FREE;
-            // and we record the new buffer index in the queued list
-            *front = buf;
+            // in asynchronous mode we only keep the most recent buffer
+            if (mQueue.empty()) {
+                mQueue.push_back(buf);
+            } else {
+                Fifo::iterator front(mQueue.begin());
+                // buffer currently queued is freed
+                mSlots[*front].mBufferState = BufferSlot::FREE;
+                // and we record the new buffer index in the queued list
+                *front = buf;
+            }
         }
-    }
 
-    mSlots[buf].mBufferState = BufferSlot::QUEUED;
-    mSlots[buf].mLastQueuedCrop = mNextCrop;
-    mSlots[buf].mLastQueuedTransform = mNextTransform;
-    mSlots[buf].mLastQueuedTimestamp = timestamp;
-    mDequeueCondition.signal();
+        mSlots[buf].mBufferState = BufferSlot::QUEUED;
+        mSlots[buf].mCrop = mNextCrop;
+        mSlots[buf].mTransform = mNextTransform;
+        mSlots[buf].mTimestamp = timestamp;
+        mDequeueCondition.signal();
     } // scope for the lock
 
     // call back without lock held
@@ -539,9 +544,9 @@
         mCurrentTexture = buf;
         mCurrentTextureTarget = target;
         mCurrentTextureBuf = mSlots[buf].mGraphicBuffer;
-        mCurrentCrop = mSlots[buf].mLastQueuedCrop;
-        mCurrentTransform = mSlots[buf].mLastQueuedTransform;
-        mCurrentTimestamp = mSlots[buf].mLastQueuedTimestamp;
+        mCurrentCrop = mSlots[buf].mCrop;
+        mCurrentTransform = mSlots[buf].mTransform;
+        mCurrentTimestamp = mSlots[buf].mTimestamp;
         mDequeueCondition.signal();
     } else {
         // We always bind the texture even if we don't update its contents.
@@ -825,12 +830,10 @@
         const BufferSlot& slot(mSlots[i]);
         snprintf(buffer, SIZE,
                 "%s%s[%02d] state=%-8s, crop=[%d,%d,%d,%d], transform=0x%02x, "
-                "timestamp=%lld\n"
-                ,
+                "timestamp=%lld\n",
                 prefix, (i==mCurrentTexture)?">":" ", i, stateName(slot.mBufferState),
-                slot.mLastQueuedCrop.left, slot.mLastQueuedCrop.top,
-                slot.mLastQueuedCrop.right, slot.mLastQueuedCrop.bottom,
-                slot.mLastQueuedTransform, slot.mLastQueuedTimestamp
+                slot.mCrop.left, slot.mCrop.top, slot.mCrop.right, slot.mCrop.bottom,
+                slot.mTransform, slot.mTimestamp
         );
         result.append(buffer);
     }
diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp
index 6f10320..c20fcf27 100644
--- a/libs/gui/SurfaceTextureClient.cpp
+++ b/libs/gui/SurfaceTextureClient.cpp
@@ -117,7 +117,8 @@
             mReqFormat, mReqUsage);
     if (result < 0) {
         LOGV("dequeueBuffer: ISurfaceTexture::dequeueBuffer(%d, %d, %d, %d)"
-             "failed: %d", result, mReqWidth, mReqHeight, mReqFormat, mReqUsage);
+             "failed: %d", mReqWidth, mReqHeight, mReqFormat, mReqUsage,
+             result);
         return result;
     }
     sp<GraphicBuffer>& gbuf(mSlots[buf]);
diff --git a/libs/gui/tests/SurfaceTextureClient_test.cpp b/libs/gui/tests/SurfaceTextureClient_test.cpp
index 59a4cc5..2f704c8 100644
--- a/libs/gui/tests/SurfaceTextureClient_test.cpp
+++ b/libs/gui/tests/SurfaceTextureClient_test.cpp
@@ -400,7 +400,9 @@
     EXPECT_EQ(st->getCurrentBuffer().get(), buf[2]);
 }
 
-TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeDequeueCurrent) {
+// XXX: We currently have no hardware that properly handles dequeuing the
+// buffer that is currently bound to the texture.
+TEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeDequeueCurrent) {
     sp<ANativeWindow> anw(mSTC);
     sp<SurfaceTexture> st(mST);
     android_native_buffer_t* buf[3];
@@ -429,10 +431,13 @@
     android_native_buffer_t* buf[3];
     ASSERT_EQ(OK, st->setSynchronousMode(true));
     ASSERT_EQ(OK, native_window_set_buffer_count(anw.get(), 3));
+
+    // We should be able to dequeue all the buffers before we've queued any.
     EXPECT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
     EXPECT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[1]));
-    EXPECT_EQ(-EBUSY, anw->dequeueBuffer(anw.get(), &buf[2]));
+    EXPECT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[2]));
 
+    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf[2]));
     ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[1]));
 
     EXPECT_EQ(OK, st->updateTexImage());
@@ -440,11 +445,17 @@
 
     EXPECT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[2]));
 
+    // Once we've queued a buffer, however we should not be able to dequeue more
+    // than (buffer-count - MIN_UNDEQUEUED_BUFFERS), which is 2 in this case.
+    EXPECT_EQ(-EBUSY, anw->dequeueBuffer(anw.get(), &buf[1]));
+
     ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf[0]));
     ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf[2]));
 }
 
-TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeWaitRetire) {
+// XXX: This is not expected to pass until the synchronization hacks are removed
+// from the SurfaceTexture class.
+TEST_F(SurfaceTextureClientTest, DISABLED_SurfaceTextureSyncModeWaitRetire) {
     sp<ANativeWindow> anw(mSTC);
     sp<SurfaceTexture> st(mST);
 
diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp
index aa9b40e..1ca0a19 100644
--- a/libs/hwui/FontRenderer.cpp
+++ b/libs/hwui/FontRenderer.cpp
@@ -35,6 +35,9 @@
 #define DEFAULT_TEXT_CACHE_WIDTH 1024
 #define DEFAULT_TEXT_CACHE_HEIGHT 256
 
+#define MAX_TEXT_CACHE_WIDTH 2048
+#define MAX_TEXT_CACHE_HEIGHT 2048
+
 ///////////////////////////////////////////////////////////////////////////////
 // Font
 ///////////////////////////////////////////////////////////////////////////////
@@ -386,9 +389,17 @@
 bool FontRenderer::cacheBitmap(const SkGlyph& glyph, uint32_t* retOriginX, uint32_t* retOriginY) {
     // If the glyph is too tall, don't cache it
     if (glyph.fHeight > mCacheLines[mCacheLines.size() - 1]->mMaxHeight) {
-        LOGE("Font size to large to fit in cache. width, height = %i, %i",
-                (int) glyph.fWidth, (int) glyph.fHeight);
-        return false;
+        if (mCacheHeight < MAX_TEXT_CACHE_HEIGHT) {
+            // Default cache not large enough for large glyphs - resize cache to
+            // max size and try again
+            flushAllAndInvalidate();
+            initTextTexture(true);
+        }
+        if (glyph.fHeight > mCacheLines[mCacheLines.size() - 1]->mMaxHeight) {
+            LOGE("Font size to large to fit in cache. width, height = %i, %i",
+                    (int) glyph.fWidth, (int) glyph.fHeight);
+            return false;
+        }
     }
 
     // Now copy the bitmap into the cache texture
@@ -446,16 +457,25 @@
     return true;
 }
 
-void FontRenderer::initTextTexture() {
+void FontRenderer::initTextTexture(bool largeFonts) {
+    mCacheLines.clear();
+    if (largeFonts) {
+        mCacheWidth = MAX_TEXT_CACHE_WIDTH;
+        mCacheHeight = MAX_TEXT_CACHE_HEIGHT;
+    }
+
     mTextTexture = new uint8_t[mCacheWidth * mCacheHeight];
     memset(mTextTexture, 0, mCacheWidth * mCacheHeight * sizeof(uint8_t));
 
     mUploadTexture = false;
 
+    if (mTextureId != 0) {
+        glDeleteTextures(1, &mTextureId);
+    }
     glGenTextures(1, &mTextureId);
     glBindTexture(GL_TEXTURE_2D, mTextureId);
     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-    // Initialize texture dimentions
+    // Initialize texture dimensions
     glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, mCacheWidth, mCacheHeight, 0,
             GL_ALPHA, GL_UNSIGNED_BYTE, 0);
 
@@ -480,6 +500,15 @@
     nextLine += mCacheLines.top()->mMaxHeight;
     mCacheLines.push(new CacheTextureLine(mCacheWidth, 42, nextLine, 0));
     nextLine += mCacheLines.top()->mMaxHeight;
+    if (largeFonts) {
+        int nextSize = 76;
+        // Make several new lines with increasing font sizes
+        while (nextSize < (int)(mCacheHeight - nextLine - (2 * nextSize))) {
+            mCacheLines.push(new CacheTextureLine(mCacheWidth, nextSize, nextLine, 0));
+            nextLine += mCacheLines.top()->mMaxHeight;
+            nextSize += 50;
+        }
+    }
     mCacheLines.push(new CacheTextureLine(mCacheWidth, mCacheHeight - nextLine, nextLine, 0));
 }
 
diff --git a/libs/hwui/FontRenderer.h b/libs/hwui/FontRenderer.h
index f685d5f..95f714f 100644
--- a/libs/hwui/FontRenderer.h
+++ b/libs/hwui/FontRenderer.h
@@ -229,7 +229,7 @@
         }
     };
 
-    void initTextTexture();
+    void initTextTexture(bool largeFonts = false);
     bool cacheBitmap(const SkGlyph& glyph, uint32_t *retOriginX, uint32_t *retOriginY);
 
     void flushAllAndInvalidate();
diff --git a/libs/rs/RenderScript.h b/libs/rs/RenderScript.h
index f4e3f57..3f2d67a 100644
--- a/libs/rs/RenderScript.h
+++ b/libs/rs/RenderScript.h
@@ -49,6 +49,12 @@
 void rsaElementGetNativeData(RsContext, RsElement, uint32_t *elemData, uint32_t elemDataSize);
 void rsaElementGetSubElements(RsContext, RsElement, uint32_t *ids, const char **names, uint32_t dataSize);
 
+RsDevice rsDeviceCreate();
+void rsDeviceDestroy(RsDevice dev);
+void rsDeviceSetConfig(RsDevice dev, RsDeviceParam p, int32_t value);
+RsContext rsContextCreate(RsDevice dev, uint32_t version);
+RsContext rsContextCreateGL(RsDevice dev, uint32_t version, RsSurfaceConfig sc, uint32_t dpi);
+
 
 
 #ifdef ANDROID_RS_SERIALIZE
diff --git a/libs/rs/RenderScriptDefines.h b/libs/rs/RenderScriptDefines.h
index 308437d..ee9645c 100644
--- a/libs/rs/RenderScriptDefines.h
+++ b/libs/rs/RenderScriptDefines.h
@@ -50,6 +50,8 @@
 typedef void * RsProgramStore;
 typedef void * RsProgramRaster;
 
+typedef void * RsNativeWindow;
+
 typedef void (* RsBitmapCallback_t)(void *);
 
 typedef struct {
diff --git a/libs/rs/driver/rsdGL.cpp b/libs/rs/driver/rsdGL.cpp
index de9fb51..a70589b 100644
--- a/libs/rs/driver/rsdGL.cpp
+++ b/libs/rs/driver/rsdGL.cpp
@@ -300,7 +300,7 @@
 }
 
 
-bool rsdGLSetSurface(const Context *rsc, uint32_t w, uint32_t h, ANativeWindow *sur) {
+bool rsdGLSetSurface(const Context *rsc, uint32_t w, uint32_t h, RsNativeWindow sur) {
     RsdHal *dc = (RsdHal *)rsc->mHal.drv;
 
     EGLBoolean ret;
@@ -319,7 +319,7 @@
         dc->gl.height = 1;
     }
 
-    dc->gl.wndSurface = sur;
+    dc->gl.wndSurface = (ANativeWindow *)sur;
     if (dc->gl.wndSurface != NULL) {
         dc->gl.width = w;
         dc->gl.height = h;
diff --git a/libs/rs/driver/rsdGL.h b/libs/rs/driver/rsdGL.h
index 90cbe04..01c8438 100644
--- a/libs/rs/driver/rsdGL.h
+++ b/libs/rs/driver/rsdGL.h
@@ -18,6 +18,7 @@
 #define RSD_GL_H
 
 #include <rs_hal.h>
+#include <EGL/egl.h>
 
 class RsdShaderCache;
 class RsdVertexArrayState;
@@ -74,7 +75,7 @@
 bool rsdGLInit(const android::renderscript::Context *rsc);
 void rsdGLShutdown(const android::renderscript::Context *rsc);
 bool rsdGLSetSurface(const android::renderscript::Context *rsc,
-                     uint32_t w, uint32_t h, ANativeWindow *sur);
+                     uint32_t w, uint32_t h, RsNativeWindow sur);
 void rsdGLSwap(const android::renderscript::Context *rsc);
 void rsdGLCheckError(const android::renderscript::Context *rsc,
                      const char *msg, bool isFatal = false);
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index 29de5f0..87d764d 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -1,42 +1,4 @@
 
-DeviceCreate {
-    direct
-    nocontext
-    ret RsDevice
-}
-
-DeviceDestroy {
-    direct
-    nocontext
-    param RsDevice dev
-}
-
-DeviceSetConfig {
-    direct
-    nocontext
-    param RsDevice dev
-    param RsDeviceParam p
-    param int32_t value
-}
-
-ContextCreate {
-    direct
-    nocontext
-    param RsDevice dev
-    param uint32_t version
-    ret RsContext
-}
-
-ContextCreateGL {
-    direct
-    nocontext
-    param RsDevice dev
-    param uint32_t version
-    param RsSurfaceConfig sc
-    param uint32_t dpi
-    ret RsContext
-}
-
 ContextDestroy {
     direct
 }
@@ -140,7 +102,7 @@
 ContextSetSurface {
 	param uint32_t width
 	param uint32_t height
-	param ANativeWindow *sur
+	param RsNativeWindow sur
 	}
 
 ContextDump {
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index a4e1b72..bab5c58 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -18,8 +18,6 @@
 #include "rsContext.h"
 #include "rsThreadIO.h"
 #include <ui/FramebufferNativeWindow.h>
-#include <ui/PixelFormat.h>
-#include <ui/egl/android_natives.h>
 
 #include <sys/types.h>
 #include <sys/resource.h>
@@ -246,7 +244,7 @@
     while (!rsc->mExit) {
         mDraw |= rsc->mIO.playCoreCommands(rsc, !mDraw);
         mDraw &= (rsc->mRootScript.get() != NULL);
-        mDraw &= (rsc->mWndSurface != NULL);
+        mDraw &= rsc->mHasSurface;
 
         uint32_t targetTime = 0;
         if (mDraw && rsc->mIsGraphicsContext) {
@@ -371,7 +369,7 @@
         return false;
     }
 
-    mWndSurface = NULL;
+    mHasSurface = false;
 
     timerInit();
     timerSet(RS_TIMER_INTERNAL);
@@ -406,7 +404,6 @@
     mIO.shutdown();
     int status = pthread_join(mThreadId, &res);
 
-
     if (mHal.funcs.shutdownDriver) {
         mHal.funcs.shutdownDriver(this);
     }
@@ -421,11 +418,11 @@
     LOGV("Context::~Context done");
 }
 
-void Context::setSurface(uint32_t w, uint32_t h, ANativeWindow *sur) {
+void Context::setSurface(uint32_t w, uint32_t h, RsNativeWindow sur) {
     rsAssert(mIsGraphicsContext);
     mHal.funcs.setSurface(this, w, h, sur);
 
-    mWndSurface = sur;
+    mHasSurface = sur != NULL;
     mWidth = w;
     mHeight = h;
 
@@ -617,7 +614,7 @@
     rsc->resume();
 }
 
-void rsi_ContextSetSurface(Context *rsc, uint32_t w, uint32_t h, ANativeWindow *sur, size_t sur_length) {
+void rsi_ContextSetSurface(Context *rsc, uint32_t w, uint32_t h, RsNativeWindow sur) {
     rsc->setSurface(w, h, sur);
 }
 
@@ -640,22 +637,6 @@
     LOGV("rsContextDestroy 2 %p", rsc);
 }
 
-RsContext rsi_ContextCreate(RsDevice vdev, uint32_t version) {
-    LOGV("rsContextCreate %p", vdev);
-    Device * dev = static_cast<Device *>(vdev);
-    Context *rsc = Context::createContext(dev, NULL);
-    return rsc;
-}
-
-RsContext rsi_ContextCreateGL(RsDevice vdev, uint32_t version,
-                            RsSurfaceConfig sc, uint32_t dpi) {
-    LOGV("rsContextCreateGL %p", vdev);
-    Device * dev = static_cast<Device *>(vdev);
-    Context *rsc = Context::createContext(dev, &sc);
-    rsc->setDPI(dpi);
-    LOGV("rsContextCreateGL ret %p ", rsc);
-    return rsc;
-}
 
 RsMessageToClientType rsi_ContextPeekMessage(Context *rsc,
                                            size_t * receiveLen, size_t receiveLen_length,
@@ -682,6 +663,23 @@
 }
 }
 
+RsContext rsContextCreate(RsDevice vdev, uint32_t version) {
+    LOGV("rsContextCreate %p", vdev);
+    Device * dev = static_cast<Device *>(vdev);
+    Context *rsc = Context::createContext(dev, NULL);
+    return rsc;
+}
+
+RsContext rsContextCreateGL(RsDevice vdev, uint32_t version,
+                            RsSurfaceConfig sc, uint32_t dpi) {
+    LOGV("rsContextCreateGL %p", vdev);
+    Device * dev = static_cast<Device *>(vdev);
+    Context *rsc = Context::createContext(dev, &sc);
+    rsc->setDPI(dpi);
+    LOGV("rsContextCreateGL ret %p ", rsc);
+    return rsc;
+}
+
 // Only to be called at a3d load time, before object is visible to user
 // not thread safe
 void rsaGetName(RsContext con, void * obj, const char **name) {
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h
index 6336210..be615a3 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -44,8 +44,6 @@
 
 #endif // ANDROID_RS_SERIALIZE
 
-class ANativeWindow;
-
 // ---------------------------------------------------------------------------
 namespace android {
 
@@ -136,7 +134,7 @@
 
     void pause();
     void resume();
-    void setSurface(uint32_t w, uint32_t h, ANativeWindow *sur);
+    void setSurface(uint32_t w, uint32_t h, RsNativeWindow sur);
     void setPriority(int32_t p);
     void destroyWorkerThreadResources();
 
@@ -244,7 +242,7 @@
     static void * threadProc(void *);
     static void * helperThreadProc(void *);
 
-    ANativeWindow *mWndSurface;
+    bool mHasSurface;
 
     Vector<ObjectBase *> mNames;
 
diff --git a/libs/rs/rsDevice.cpp b/libs/rs/rsDevice.cpp
index 849fd98..d7d03f6 100644
--- a/libs/rs/rsDevice.cpp
+++ b/libs/rs/rsDevice.cpp
@@ -40,20 +40,17 @@
     }
 }
 
-namespace android {
-namespace renderscript {
-
-RsDevice rsi_DeviceCreate() {
+RsDevice rsDeviceCreate() {
     Device * d = new Device();
     return d;
 }
 
-void rsi_DeviceDestroy(RsDevice dev) {
+void rsDeviceDestroy(RsDevice dev) {
     Device * d = static_cast<Device *>(dev);
     delete d;
 }
 
-void rsi_DeviceSetConfig(RsDevice dev, RsDeviceParam p, int32_t value) {
+void rsDeviceSetConfig(RsDevice dev, RsDeviceParam p, int32_t value) {
     Device * d = static_cast<Device *>(dev);
     if (p == RS_DEVICE_PARAM_FORCE_SOFTWARE_GL) {
         d->mForceSW = value != 0;
@@ -62,5 +59,3 @@
     rsAssert(0);
 }
 
-}
-}
diff --git a/libs/rs/rsUtils.h b/libs/rs/rsUtils.h
index 3b60af5..3a6c85a 100644
--- a/libs/rs/rsUtils.h
+++ b/libs/rs/rsUtils.h
@@ -32,10 +32,6 @@
 #include <time.h>
 #include <cutils/atomic.h>
 
-#ifndef ANDROID_RS_SERIALIZE
-#include <EGL/egl.h>
-#endif
-
 #include <math.h>
 
 #include "RenderScript.h"
diff --git a/libs/rs/rs_hal.h b/libs/rs/rs_hal.h
index cfa4e74..9d8c906 100644
--- a/libs/rs/rs_hal.h
+++ b/libs/rs/rs_hal.h
@@ -47,7 +47,7 @@
 typedef struct {
     bool (*initGraphics)(const Context *);
     void (*shutdownGraphics)(const Context *);
-    bool (*setSurface)(const Context *, uint32_t w, uint32_t h, ANativeWindow *);
+    bool (*setSurface)(const Context *, uint32_t w, uint32_t h, RsNativeWindow);
     void (*swap)(const Context *);
 
     void (*shutdownDriver)(Context *);
diff --git a/libs/utils/RefBase.cpp b/libs/utils/RefBase.cpp
index 2034486..dd0052a 100644
--- a/libs/utils/RefBase.cpp
+++ b/libs/utils/RefBase.cpp
@@ -345,6 +345,10 @@
     const_cast<RefBase*>(this)->onFirstRef();
 }
 
+void RefBase::destroy() const {
+    delete this;
+}
+
 void RefBase::decStrong(const void* id) const
 {
     weakref_impl* const refs = mRefs;
@@ -357,7 +361,7 @@
     if (c == 1) {
         const_cast<RefBase*>(this)->onLastStrongRef(id);
         if ((refs->mFlags&OBJECT_LIFETIME_WEAK) != OBJECT_LIFETIME_WEAK) {
-            delete this;
+            destroy();
         }
     }
     refs->decWeak(id);
@@ -415,7 +419,8 @@
     
     if ((impl->mFlags&OBJECT_LIFETIME_WEAK) != OBJECT_LIFETIME_WEAK) {
         if (impl->mStrong == INITIAL_STRONG_VALUE)
-            delete impl->mBase;
+            if (impl->mBase)
+                impl->mBase->destroy();
         else {
             // LOGV("Freeing refs %p of old RefBase %p\n", this, impl->mBase);
             delete impl;
@@ -423,7 +428,8 @@
     } else {
         impl->mBase->onLastWeakRef(id);
         if ((impl->mFlags&OBJECT_LIFETIME_FOREVER) != OBJECT_LIFETIME_FOREVER) {
-            delete impl->mBase;
+            if (impl->mBase)
+                impl->mBase->destroy();
         }
     }
 }
diff --git a/libs/utils/ResourceTypes.cpp b/libs/utils/ResourceTypes.cpp
index 784c9d2..4a6a3db 100644
--- a/libs/utils/ResourceTypes.cpp
+++ b/libs/utils/ResourceTypes.cpp
@@ -2588,7 +2588,7 @@
 {
     mLock.lock();
     TABLE_GETENTRY(LOGI("Setting parameters: imsi:%d/%d lang:%c%c cnt:%c%c "
-                        "orien:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d %ddp x %ddp\n",
+                        "orien:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d sw%ddp w%ddp h%ddp\n",
                        params->mcc, params->mnc,
                        params->language[0] ? params->language[0] : '-',
                        params->language[1] ? params->language[1] : '-',
@@ -2602,6 +2602,7 @@
                        params->navigation,
                        params->screenWidth,
                        params->screenHeight,
+                       params->smallestScreenWidthDp,
                        params->screenWidthDp,
                        params->screenHeightDp));
     mParams = *params;
@@ -3927,7 +3928,7 @@
         TABLE_GETENTRY(LOGI("Match entry 0x%x in type 0x%x (sz 0x%x): imsi:%d/%d=%d/%d "
                             "lang:%c%c=%c%c cnt:%c%c=%c%c orien:%d=%d touch:%d=%d "
                             "density:%d=%d key:%d=%d inp:%d=%d nav:%d=%d w:%d=%d h:%d=%d "
-                            "wdp:%d=%d hdp:%d=%d\n",
+                            "swdp:%d=%d wdp:%d=%d hdp:%d=%d\n",
                            entryIndex, typeIndex+1, dtohl(thisType->config.size),
                            thisConfig.mcc, thisConfig.mnc,
                            config ? config->mcc : 0, config ? config->mnc : 0,
@@ -3955,6 +3956,8 @@
                            config ? config->screenWidth : 0,
                            thisConfig.screenHeight,
                            config ? config->screenHeight : 0,
+                           thisConfig.smallestScreenWidthDp,
+                           config ? config->smallestScreenWidthDp : 0,
                            thisConfig.screenWidthDp,
                            config ? config->screenWidthDp : 0,
                            thisConfig.screenHeightDp,
@@ -4244,7 +4247,7 @@
                 thisConfig.copyFromDtoH(type->config);
                 LOGI("Adding config to type %d: imsi:%d/%d lang:%c%c cnt:%c%c "
                      "orien:%d touch:%d density:%d key:%d inp:%d nav:%d w:%d h:%d "
-                     "wdp:%d hdp:%d\n",
+                     "swdp:%d wdp:%d hdp:%d\n",
                       type->id,
                       thisConfig.mcc, thisConfig.mnc,
                       thisConfig.language[0] ? thisConfig.language[0] : '-',
@@ -4259,6 +4262,7 @@
                       thisConfig.navigation,
                       thisConfig.screenWidth,
                       thisConfig.screenHeight,
+                      thisConfig.smallestScreenWidthDp,
                       thisConfig.screenWidthDp,
                       thisConfig.screenHeightDp));
             t->configs.add(type);
@@ -4753,6 +4757,9 @@
                     if (type->config.screenHeight != 0) {
                         printf(" h=%d", dtohs(type->config.screenHeight));
                     }
+                    if (type->config.smallestScreenWidthDp != 0) {
+                        printf(" swdp=%d", dtohs(type->config.smallestScreenWidthDp));
+                    }
                     if (type->config.screenWidthDp != 0) {
                         printf(" wdp=%d", dtohs(type->config.screenWidthDp));
                     }
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index e1daede..253010c 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -828,29 +828,64 @@
      * or {@link #SCO_AUDIO_STATE_CONNECTED}
      *
      * @see #startBluetoothSco()
+     * @deprecated Use  {@link #ACTION_SCO_AUDIO_STATE_UPDATED} instead
      */
+    @Deprecated
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_SCO_AUDIO_STATE_CHANGED =
             "android.media.SCO_AUDIO_STATE_CHANGED";
+
+     /**
+     * Sticky broadcast intent action indicating that the bluetoooth SCO audio
+     * connection state has been updated.
+     * <p>This intent has two extras:
+     * <ul>
+     *   <li> {@link #EXTRA_SCO_AUDIO_STATE} - The new SCO audio state. </li>
+     *   <li> {@link #EXTRA_SCO_AUDIO_PREVIOUS_STATE}- The previous SCO audio state. </li>
+     * </ul>
+     * <p> EXTRA_SCO_AUDIO_STATE or EXTRA_SCO_AUDIO_PREVIOUS_STATE can be any of:
+     * <ul>
+     *   <li> {@link #SCO_AUDIO_STATE_DISCONNECTED}, </li>
+     *   <li> {@link #SCO_AUDIO_STATE_CONNECTING} or </li>
+     *   <li> {@link #SCO_AUDIO_STATE_CONNECTED}, </li>
+     * </ul>
+     * @see #startBluetoothSco()
+     */
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+    public static final String ACTION_SCO_AUDIO_STATE_UPDATED =
+            "android.media.ACTION_SCO_AUDIO_STATE_UPDATED";
+
     /**
-     * Extra for intent {@link #ACTION_SCO_AUDIO_STATE_CHANGED} containing the new
-     * bluetooth SCO connection state.
+     * Extra for intent {@link #ACTION_SCO_AUDIO_STATE_CHANGED} or
+     * {@link #ACTION_SCO_AUDIO_STATE_UPDATED} containing the new bluetooth SCO connection state.
      */
     public static final String EXTRA_SCO_AUDIO_STATE =
             "android.media.extra.SCO_AUDIO_STATE";
 
     /**
-     * Value for extra {@link #EXTRA_SCO_AUDIO_STATE} indicating that the
-     * SCO audio channel is not established
+     * Extra for intent {@link #ACTION_SCO_AUDIO_STATE_UPDATED} containing the previous
+     * bluetooth SCO connection state.
+     */
+    public static final String EXTRA_SCO_AUDIO_PREVIOUS_STATE =
+            "android.media.extra.SCO_AUDIO_PREVIOUS_STATE";
+
+    /**
+     * Value for extra EXTRA_SCO_AUDIO_STATE or EXTRA_SCO_AUDIO_PREVIOUS_STATE
+     * indicating that the SCO audio channel is not established
      */
     public static final int SCO_AUDIO_STATE_DISCONNECTED = 0;
     /**
-     * Value for extra {@link #EXTRA_SCO_AUDIO_STATE} indicating that the
-     * SCO audio channel is established
+     * Value for extra {@link #EXTRA_SCO_AUDIO_STATE} or {@link #EXTRA_SCO_AUDIO_PREVIOUS_STATE}
+     * indicating that the SCO audio channel is established
      */
     public static final int SCO_AUDIO_STATE_CONNECTED = 1;
     /**
-     * Value for extra {@link #EXTRA_SCO_AUDIO_STATE} indicating that
+     * Value for extra EXTRA_SCO_AUDIO_STATE or EXTRA_SCO_AUDIO_PREVIOUS_STATE
+     * indicating that the SCO audio channel is being established
+     */
+    public static final int SCO_AUDIO_STATE_CONNECTING = 2;
+    /**
+     * Value for extra EXTRA_SCO_AUDIO_STATE indicating that
      * there was an error trying to obtain the state
      */
     public static final int SCO_AUDIO_STATE_ERROR = -1;
@@ -878,29 +913,37 @@
      * to/from a bluetooth SCO headset while the phone is not in call.
      * <p>As the SCO connection establishment can take several seconds,
      * applications should not rely on the connection to be available when the method
-     * returns but instead register to receive the intent {@link #ACTION_SCO_AUDIO_STATE_CHANGED}
+     * returns but instead register to receive the intent {@link #ACTION_SCO_AUDIO_STATE_UPDATED}
      * and wait for the state to be {@link #SCO_AUDIO_STATE_CONNECTED}.
-     * <p>As the connection is not guaranteed to succeed, applications must wait for this intent with
-     * a timeout.
-     * <p>When finished with the SCO connection or if the establishment times out,
-     * the application must call {@link #stopBluetoothSco()} to clear the request and turn
-     * down the bluetooth connection.
+     * <p>As the ACTION_SCO_AUDIO_STATE_UPDATED intent is sticky, the application can check the SCO
+     * audio state before calling startBluetoothSco() by reading the intent returned by the receiver
+     * registration. If the state is already CONNECTED, no state change will be received via the
+     * intent after calling startBluetoothSco(). It is however useful to call startBluetoothSco()
+     * so that the connection stays active in case the current initiator stops the connection.
+     * <p>Unless the connection is already active as described above, the state will always
+     * transition from DISCONNECTED to CONNECTING and then either to CONNECTED if the connection
+     * succeeds or back to DISCONNECTED if the connection fails (e.g no headset is connected).
+     * <p>When finished with the SCO connection or if the establishment fails, the application must
+     * call {@link #stopBluetoothSco()} to clear the request and turn down the bluetooth connection.
      * <p>Even if a SCO connection is established, the following restrictions apply on audio
      * output streams so that they can be routed to SCO headset:
-     * - the stream type must be {@link #STREAM_VOICE_CALL}
-     * - the format must be mono
-     * - the sampling must be 16kHz or 8kHz
+     * <ul>
+     *   <li> the stream type must be {@link #STREAM_VOICE_CALL} </li>
+     *   <li> the format must be mono </li>
+     *   <li> the sampling must be 16kHz or 8kHz </li>
+     * </ul>
      * <p>The following restrictions apply on input streams:
-     * - the format must be mono
-     * - the sampling must be 8kHz
-     *
+     * <ul>
+     *   <li> the format must be mono </li>
+     *   <li> the sampling must be 8kHz </li>
+     * </ul>
      * <p>Note that the phone application always has the priority on the usage of the SCO
      * connection for telephony. If this method is called while the phone is in call
      * it will be ignored. Similarly, if a call is received or sent while an application
      * is using the SCO connection, the connection will be lost for the application and NOT
      * returned automatically when the call ends.
      * @see #stopBluetoothSco()
-     * @see #ACTION_SCO_AUDIO_STATE_CHANGED
+     * @see #ACTION_SCO_AUDIO_STATE_UPDATED
      */
     public void startBluetoothSco(){
         IAudioService service = getService();
@@ -917,7 +960,7 @@
      *   {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}.
      * <p>This method must be called by applications having requested the use of
      * bluetooth SCO audio with {@link #startBluetoothSco()}
-     * when finished with the SCO connection or if the establishment times out.
+     * when finished with the SCO connection or if connection fails.
      * @see #startBluetoothSco()
      */
     public void stopBluetoothSco(){
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 504cfde..0876bbf 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -112,9 +112,12 @@
     private static final int MSG_LOAD_SOUND_EFFECTS = 9;
     private static final int MSG_SET_FORCE_USE = 10;
     private static final int MSG_PERSIST_MEDIABUTTONRECEIVER = 11;
-
+    private static final int MSG_BT_HEADSET_CNCT_FAILED = 12;
 
     private static final int BTA2DP_DOCK_TIMEOUT_MILLIS = 8000;
+    // Timeout for connection to bluetooth headset service
+    private static final int BT_HEADSET_CNCT_TIMEOUT_MS = 3000;
+
 
     /** @see AudioSystemThread */
     private AudioSystemThread mAudioSystemThread;
@@ -273,11 +276,22 @@
     private int mScoAudioState;
     // SCO audio state is not active
     private static final int SCO_STATE_INACTIVE = 0;
+    // SCO audio activation request waiting for headset service to connect
+    private static final int SCO_STATE_ACTIVATE_REQ = 1;
     // SCO audio state is active or starting due to a local request to start a virtual call
-    private static final int SCO_STATE_ACTIVE_INTERNAL = 1;
+    private static final int SCO_STATE_ACTIVE_INTERNAL = 3;
+    // SCO audio deactivation request waiting for headset service to connect
+    private static final int SCO_STATE_DEACTIVATE_REQ = 5;
+
     // SCO audio state is active due to an action in BT handsfree (either voice recognition or
     // in call audio)
     private static final int SCO_STATE_ACTIVE_EXTERNAL = 2;
+    // Deactivation request for all SCO connections (initiated by audio mode change)
+    // waiting for headset service to connect
+    private static final int SCO_STATE_DEACTIVATE_EXT_REQ = 4;
+
+    // Current connection state indicated by bluetooth headset
+    private int mScoConnectionState;
 
     // true if boot sequence has been completed
     private boolean mBootCompleted;
@@ -335,13 +349,6 @@
 
         AudioSystem.setErrorCallback(mAudioSystemCallback);
 
-        mBluetoothHeadsetDevice = null;
-        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
-        if (adapter != null) {
-            adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener,
-                                    BluetoothProfile.HEADSET);
-        }
-
         // Register for device connection intent broadcasts.
         IntentFilter intentFilter =
                 new IntentFilter(Intent.ACTION_HEADSET_PLUG);
@@ -768,17 +775,7 @@
                             if (AudioSystem.setPhoneState(mode) == AudioSystem.AUDIO_STATUS_OK) {
                                 AudioService.this.mMode = mode;
                                 if (mode != AudioSystem.MODE_NORMAL) {
-                                    synchronized(mScoClients) {
-                                        checkScoAudioState();
-                                        if (mScoAudioState == SCO_STATE_ACTIVE_EXTERNAL) {
-                                            mBluetoothHeadset.stopVoiceRecognition(
-                                                    mBluetoothHeadsetDevice);
-                                            mBluetoothHeadset.stopScoUsingVirtualVoiceCall(
-                                                    mBluetoothHeadsetDevice);
-                                        } else {
-                                            clearAllScoClients(mCb, true);
-                                        }
-                                    }
+                                    disconnectBluetoothSco(mCb);
                                 }
                             }
                         }
@@ -856,16 +853,7 @@
                     // when entering RINGTONE, IN_CALL or IN_COMMUNICATION mode, clear all
                     // SCO connections not started by the application changing the mode
                     if (mode != AudioSystem.MODE_NORMAL) {
-                        synchronized(mScoClients) {
-                            checkScoAudioState();
-                            if (mScoAudioState == SCO_STATE_ACTIVE_EXTERNAL) {
-                                mBluetoothHeadset.stopVoiceRecognition(mBluetoothHeadsetDevice);
-                                mBluetoothHeadset.stopScoUsingVirtualVoiceCall(
-                                    mBluetoothHeadsetDevice);
-                            } else {
-                                clearAllScoClients(cb, true);
-                            }
-                        }
+                        disconnectBluetoothSco(cb);
                     }
                 }
             }
@@ -1213,7 +1201,8 @@
 
     /** @see AudioManager#startBluetoothSco() */
     public void startBluetoothSco(IBinder cb){
-        if (!checkAudioSettingsPermission("startBluetoothSco()")) {
+        if (!checkAudioSettingsPermission("startBluetoothSco()") ||
+                !mBootCompleted) {
             return;
         }
         ScoClient client = getScoClient(cb, true);
@@ -1222,7 +1211,8 @@
 
     /** @see AudioManager#stopBluetoothSco() */
     public void stopBluetoothSco(IBinder cb){
-        if (!checkAudioSettingsPermission("stopBluetoothSco()")) {
+        if (!checkAudioSettingsPermission("stopBluetoothSco()") ||
+                !mBootCompleted) {
             return;
         }
         ScoClient client = getScoClient(cb, false);
@@ -1322,25 +1312,57 @@
         }
 
         private void requestScoState(int state) {
-            if (mBluetoothHeadset == null) {
-                return;
-            }
-
             checkScoAudioState();
-
-            if (totalCount() == 0 &&
-                mBluetoothHeadsetDevice != null) {
-                // Accept SCO audio activation only in NORMAL audio mode or if the mode is
-                // currently controlled by the same client.
-                if ((AudioService.this.mMode == AudioSystem.MODE_NORMAL ||
-                        mSetModeDeathHandlers.get(0).getBinder() == mCb) &&
-                        state == BluetoothHeadset.STATE_AUDIO_CONNECTED &&
-                        mScoAudioState == SCO_STATE_INACTIVE) {
-                    mScoAudioState = SCO_STATE_ACTIVE_INTERNAL;
-                    mBluetoothHeadset.startScoUsingVirtualVoiceCall(mBluetoothHeadsetDevice);
+            if (totalCount() == 0) {
+                if (state == BluetoothHeadset.STATE_AUDIO_CONNECTED) {
+                    // Make sure that the state transitions to CONNECTING even if we cannot initiate
+                    // the connection.
+                    broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_CONNECTING);
+                    // Accept SCO audio activation only in NORMAL audio mode or if the mode is
+                    // currently controlled by the same client.
+                    if ((AudioService.this.mMode == AudioSystem.MODE_NORMAL ||
+                            mSetModeDeathHandlers.get(0).getBinder() == mCb) &&
+                            mBluetoothHeadsetDevice != null &&
+                            (mScoAudioState == SCO_STATE_INACTIVE ||
+                             mScoAudioState == SCO_STATE_DEACTIVATE_REQ)) {
+                        if (mScoAudioState == SCO_STATE_INACTIVE) {
+                            if (mBluetoothHeadset != null) {
+                                if (mBluetoothHeadset.startScoUsingVirtualVoiceCall(
+                                        mBluetoothHeadsetDevice)) {
+                                    mScoAudioState = SCO_STATE_ACTIVE_INTERNAL;
+                                } else {
+                                    broadcastScoConnectionState(
+                                            AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
+                                }
+                            } else if (getBluetoothHeadset()) {
+                                mScoAudioState = SCO_STATE_ACTIVATE_REQ;
+                            }
+                        } else {
+                            mScoAudioState = SCO_STATE_ACTIVE_INTERNAL;
+                            broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_CONNECTED);
+                        }
+                    } else {
+                        broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
+                    }
                 } else if (state == BluetoothHeadset.STATE_AUDIO_DISCONNECTED &&
-                        mScoAudioState == SCO_STATE_ACTIVE_INTERNAL){
-                    mBluetoothHeadset.stopScoUsingVirtualVoiceCall(mBluetoothHeadsetDevice);
+                              mBluetoothHeadsetDevice != null &&
+                              (mScoAudioState == SCO_STATE_ACTIVE_INTERNAL ||
+                               mScoAudioState == SCO_STATE_ACTIVATE_REQ)) {
+                    if (mScoAudioState == SCO_STATE_ACTIVE_INTERNAL) {
+                        if (mBluetoothHeadset != null) {
+                            if (!mBluetoothHeadset.stopScoUsingVirtualVoiceCall(
+                                    mBluetoothHeadsetDevice)) {
+                                mScoAudioState = SCO_STATE_INACTIVE;
+                                broadcastScoConnectionState(
+                                        AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
+                            }
+                        } else if (getBluetoothHeadset()) {
+                            mScoAudioState = SCO_STATE_DEACTIVATE_REQ;
+                        }
+                    } else {
+                        mScoAudioState = SCO_STATE_INACTIVE;
+                        broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
+                    }
                 }
             }
         }
@@ -1348,7 +1370,7 @@
 
     private void checkScoAudioState() {
         if (mBluetoothHeadset != null && mBluetoothHeadsetDevice != null &&
-                mScoAudioState != SCO_STATE_ACTIVE_INTERNAL &&
+                mScoAudioState == SCO_STATE_INACTIVE &&
                 mBluetoothHeadset.getAudioState(mBluetoothHeadsetDevice)
                 != BluetoothHeadset.STATE_AUDIO_DISCONNECTED) {
             mScoAudioState = SCO_STATE_ACTIVE_EXTERNAL;
@@ -1391,10 +1413,70 @@
         }
     }
 
+    private boolean getBluetoothHeadset() {
+        boolean result = false;
+        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+        if (adapter != null) {
+            result = adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener,
+                                    BluetoothProfile.HEADSET);
+        }
+        // If we could not get a bluetooth headset proxy, send a failure message
+        // without delay to reset the SCO audio state and clear SCO clients.
+        // If we could get a proxy, send a delayed failure message that will reset our state
+        // in case we don't receive onServiceConnected().
+        sendMsg(mAudioHandler, MSG_BT_HEADSET_CNCT_FAILED, 0,
+                SENDMSG_REPLACE, 0, 0, null, result ? BT_HEADSET_CNCT_TIMEOUT_MS : 0);
+        return result;
+    }
+
+    private void disconnectBluetoothSco(IBinder exceptBinder) {
+        synchronized(mScoClients) {
+            checkScoAudioState();
+            if (mScoAudioState == SCO_STATE_ACTIVE_EXTERNAL ||
+                    mScoAudioState == SCO_STATE_DEACTIVATE_EXT_REQ) {
+                if (mBluetoothHeadsetDevice != null) {
+                    if (mBluetoothHeadset != null) {
+                        if (!mBluetoothHeadset.stopVoiceRecognition(
+                                mBluetoothHeadsetDevice)) {
+                            sendMsg(mAudioHandler, MSG_BT_HEADSET_CNCT_FAILED, 0,
+                                    SENDMSG_REPLACE, 0, 0, null, 0);
+                        }
+                    } else if (mScoAudioState == SCO_STATE_ACTIVE_EXTERNAL &&
+                            getBluetoothHeadset()) {
+                        mScoAudioState = SCO_STATE_DEACTIVATE_EXT_REQ;
+                    }
+                }
+            } else {
+                clearAllScoClients(exceptBinder, true);
+            }
+        }
+    }
+
+    private void resetBluetoothSco() {
+        synchronized(mScoClients) {
+            clearAllScoClients(null, false);
+            mScoAudioState = SCO_STATE_INACTIVE;
+            broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
+        }
+    }
+
+    private void broadcastScoConnectionState(int state) {
+        if (state != mScoConnectionState) {
+            Intent newIntent = new Intent(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED);
+            newIntent.putExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, state);
+            newIntent.putExtra(AudioManager.EXTRA_SCO_AUDIO_PREVIOUS_STATE,
+                    mScoConnectionState);
+            mContext.sendStickyBroadcast(newIntent);
+            mScoConnectionState = state;
+        }
+    }
+
     private BluetoothProfile.ServiceListener mBluetoothProfileServiceListener =
         new BluetoothProfile.ServiceListener() {
         public void onServiceConnected(int profile, BluetoothProfile proxy) {
             synchronized (mScoClients) {
+                // Discard timeout message
+                mAudioHandler.removeMessages(MSG_BT_HEADSET_CNCT_FAILED);
                 mBluetoothHeadset = (BluetoothHeadset) proxy;
                 List<BluetoothDevice> deviceList = mBluetoothHeadset.getConnectedDevices();
                 if (deviceList.size() > 0) {
@@ -1402,19 +1484,39 @@
                 } else {
                     mBluetoothHeadsetDevice = null;
                 }
+                // Refresh SCO audio state
+                checkScoAudioState();
+                // Continue pending action if any
+                if (mScoAudioState == SCO_STATE_ACTIVATE_REQ ||
+                        mScoAudioState == SCO_STATE_DEACTIVATE_REQ ||
+                        mScoAudioState == SCO_STATE_DEACTIVATE_EXT_REQ) {
+                    boolean status = false;
+                    if (mBluetoothHeadsetDevice != null) {
+                        switch (mScoAudioState) {
+                        case SCO_STATE_ACTIVATE_REQ:
+                            mScoAudioState = SCO_STATE_ACTIVE_INTERNAL;
+                            status = mBluetoothHeadset.startScoUsingVirtualVoiceCall(
+                                    mBluetoothHeadsetDevice);
+                            break;
+                        case SCO_STATE_DEACTIVATE_REQ:
+                            status = mBluetoothHeadset.stopScoUsingVirtualVoiceCall(
+                                    mBluetoothHeadsetDevice);
+                            break;
+                        case SCO_STATE_DEACTIVATE_EXT_REQ:
+                            status = mBluetoothHeadset.stopVoiceRecognition(
+                                    mBluetoothHeadsetDevice);
+                        }
+                    }
+                    if (!status) {
+                        sendMsg(mAudioHandler, MSG_BT_HEADSET_CNCT_FAILED, 0,
+                                SENDMSG_REPLACE, 0, 0, null, 0);
+                    }
+                }
             }
         }
         public void onServiceDisconnected(int profile) {
             synchronized (mScoClients) {
-                if (mBluetoothHeadset != null) {
-                    List<BluetoothDevice> devices = mBluetoothHeadset.getConnectedDevices();
-                    if (devices.size() == 0) {
-                        mBluetoothHeadsetDevice = null;
-                        clearAllScoClients(null, false);
-                        mScoAudioState = SCO_STATE_INACTIVE;
-                    }
-                    mBluetoothHeadset = null;
-                }
+                mBluetoothHeadset = null;
             }
         }
     };
@@ -2041,6 +2143,10 @@
                 case MSG_PERSIST_MEDIABUTTONRECEIVER:
                     persistMediaButtonReceiver( (ComponentName) msg.obj );
                     break;
+
+                case MSG_BT_HEADSET_CNCT_FAILED:
+                    resetBluetoothSco();
+                    break;
             }
         }
     }
@@ -2241,8 +2347,7 @@
                                                              address);
                         mConnectedDevices.remove(device);
                         mBluetoothHeadsetDevice = null;
-                        clearAllScoClients(null, false);
-                        mScoAudioState = SCO_STATE_INACTIVE;
+                        resetBluetoothSco();
                     } else if (!isConnected && state == BluetoothProfile.STATE_CONNECTED) {
                         AudioSystem.setDeviceConnectionState(device,
                                                              AudioSystem.DEVICE_STATE_AVAILABLE,
@@ -2332,26 +2437,34 @@
                 }
             } else if (action.equals(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED)) {
                 boolean broadcast = false;
-                int audioState = AudioManager.SCO_AUDIO_STATE_ERROR;
+                int state = AudioManager.SCO_AUDIO_STATE_ERROR;
                 synchronized (mScoClients) {
                     int btState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1);
-                    if (!mScoClients.isEmpty() && mScoAudioState == SCO_STATE_ACTIVE_INTERNAL) {
+                    // broadcast intent if the connection was initated by AudioService
+                    if (!mScoClients.isEmpty() &&
+                            (mScoAudioState == SCO_STATE_ACTIVE_INTERNAL ||
+                             mScoAudioState == SCO_STATE_ACTIVATE_REQ ||
+                             mScoAudioState == SCO_STATE_DEACTIVATE_REQ)) {
                         broadcast = true;
                     }
                     switch (btState) {
                     case BluetoothHeadset.STATE_AUDIO_CONNECTED:
-                        audioState = AudioManager.SCO_AUDIO_STATE_CONNECTED;
-                        if (mScoAudioState != SCO_STATE_ACTIVE_INTERNAL) {
+                        state = AudioManager.SCO_AUDIO_STATE_CONNECTED;
+                        if (mScoAudioState != SCO_STATE_ACTIVE_INTERNAL &&
+                            mScoAudioState != SCO_STATE_DEACTIVATE_REQ &&
+                            mScoAudioState != SCO_STATE_DEACTIVATE_EXT_REQ) {
                             mScoAudioState = SCO_STATE_ACTIVE_EXTERNAL;
                         }
                         break;
                     case BluetoothHeadset.STATE_AUDIO_DISCONNECTED:
-                        audioState = AudioManager.SCO_AUDIO_STATE_DISCONNECTED;
+                        state = AudioManager.SCO_AUDIO_STATE_DISCONNECTED;
                         mScoAudioState = SCO_STATE_INACTIVE;
                         clearAllScoClients(null, false);
                         break;
                     case BluetoothHeadset.STATE_AUDIO_CONNECTING:
-                        if (mScoAudioState != SCO_STATE_ACTIVE_INTERNAL) {
+                        if (mScoAudioState != SCO_STATE_ACTIVE_INTERNAL &&
+                            mScoAudioState != SCO_STATE_DEACTIVATE_REQ &&
+                            mScoAudioState != SCO_STATE_DEACTIVATE_EXT_REQ) {
                             mScoAudioState = SCO_STATE_ACTIVE_EXTERNAL;
                         }
                     default:
@@ -2361,14 +2474,23 @@
                     }
                 }
                 if (broadcast) {
+                    broadcastScoConnectionState(state);
+                    //FIXME: this is to maintain compatibility with deprecated intent
+                    // AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED. Remove when appropriate.
                     Intent newIntent = new Intent(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED);
-                    newIntent.putExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, audioState);
+                    newIntent.putExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, state);
                     mContext.sendStickyBroadcast(newIntent);
                 }
             } else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
                 mBootCompleted = true;
                 sendMsg(mAudioHandler, MSG_LOAD_SOUND_EFFECTS, SHARED_MSG, SENDMSG_NOOP,
                         0, 0, null, 0);
+
+                mScoConnectionState = AudioManager.SCO_AUDIO_STATE_ERROR;
+                resetBluetoothSco();
+                getBluetoothHeadset();
+                //FIXME: this is to maintain compatibility with deprecated intent
+                // AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED. Remove when appropriate.
                 Intent newIntent = new Intent(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED);
                 newIntent.putExtra(AudioManager.EXTRA_SCO_AUDIO_STATE,
                         AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
diff --git a/media/java/android/media/MediaFile.java b/media/java/android/media/MediaFile.java
index 352579a..a54cf28 100644
--- a/media/java/android/media/MediaFile.java
+++ b/media/java/android/media/MediaFile.java
@@ -176,6 +176,7 @@
         addFileType("OGG", FILE_TYPE_OGG, "application/ogg", MtpConstants.FORMAT_OGG);
         addFileType("OGA", FILE_TYPE_OGG, "application/ogg", MtpConstants.FORMAT_OGG);
         addFileType("AAC", FILE_TYPE_AAC, "audio/aac", MtpConstants.FORMAT_AAC);
+        addFileType("AAC", FILE_TYPE_AAC, "audio/aac-adts", MtpConstants.FORMAT_AAC);
         addFileType("MKA", FILE_TYPE_MKA, "audio/x-matroska");
  
         addFileType("MID", FILE_TYPE_MID, "audio/midi");
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index 84f588e..8f7dd60 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -628,9 +628,11 @@
      * and cannot be directly compared between different media sources or different
      * instances of the same media source, or across multiple runs of the same
      * program.
-     * @hide
      */
     public void setTexture(SurfaceTexture st) {
+        if (mScreenOnWhilePlaying && st != null && mSurfaceTexture == null) {
+            Log.w(TAG, "setScreenOnWhilePlaying(true) is ineffective for SurfaceTexture");
+        }
         mSurfaceHolder = null;
         mSurface = null;
         mSurfaceTexture = st;
@@ -960,6 +962,9 @@
      */
     public void setScreenOnWhilePlaying(boolean screenOn) {
         if (mScreenOnWhilePlaying != screenOn) {
+            if (screenOn && mSurfaceTexture != null) {
+                Log.w(TAG, "setScreenOnWhilePlaying(true) is ineffective for SurfaceTexture");
+            }
             mScreenOnWhilePlaying = screenOn;
             updateSurfaceScreenOn();
         }
@@ -1248,14 +1253,26 @@
      */
     public native void attachAuxEffect(int effectId);
 
-    /* Do not change these values without updating their counterparts
-     * in include/media/mediaplayer.h!
+    /* Do not change these values (starting with KEY_PARAMETER) without updating
+     * their counterparts in include/media/mediaplayer.h!
      */
-    /**
+    /*
      * Key used in setParameter method.
-     * Indicates the index of the timed text track to be enabled/disabled
+     * Indicates the index of the timed text track to be enabled/disabled.
+     * The index includes both the in-band and out-of-band timed text.
+     * The index should start from in-band text if any. Application can retrieve the number
+     * of in-band text tracks by using MediaMetadataRetriever::extractMetadata().
+     * Note it might take a few hundred ms to scan an out-of-band text file
+     * before displaying it.
      */
     private static final int KEY_PARAMETER_TIMED_TEXT_TRACK_INDEX = 1000;
+    /*
+     * Key used in setParameter method.
+     * Used to add out-of-band timed text source path.
+     * Application can add multiple text sources by calling setParameter() with
+     * KEY_PARAMETER_TIMED_TEXT_ADD_OUT_OF_BAND_SOURCE multiple times.
+     */
+    private static final int KEY_PARAMETER_TIMED_TEXT_ADD_OUT_OF_BAND_SOURCE = 1001;
 
     /**
      * Sets the parameter indicated by key.
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 0f5a440..38202f2 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -347,7 +347,7 @@
     }
 
     /**
-     * Store the geodata (latitude and longitude) in the output file.
+     * Set and store the geodata (latitude and longitude) in the output file.
      * This method should be called before prepare(). The geodata is
      * stored in udta box if the output format is OutputFormat.THREE_GPP
      * or OutputFormat.MPEG_4, and is ignored for other output formats.
@@ -361,18 +361,17 @@
      * @throws IllegalArgumentException if the given latitude or
      * longitude is out of range.
      *
-     * {@hide}
      */
-    public void setGeoData(float latitude, float longitude) {
+    public void setLocation(float latitude, float longitude) {
         int latitudex10000  = (int) (latitude * 10000 + 0.5);
         int longitudex10000 = (int) (longitude * 10000 + 0.5);
 
         if (latitudex10000 > 900000 || latitudex10000 < -900000) {
-            String msg = "Unsupported latitude: " + latitude;
+            String msg = "Latitude: " + latitude + " out of range.";
             throw new IllegalArgumentException(msg);
         }
         if (longitudex10000 > 1800000 || longitudex10000 < -1800000) {
-            String msg = "Unsupported longitude: " + longitude;
+            String msg = "Longitude: " + longitude + " out of range";
             throw new IllegalArgumentException(msg);
         }
 
diff --git a/media/java/android/mtp/MtpStorage.java b/media/java/android/mtp/MtpStorage.java
index 21a18ca..7932d34 100644
--- a/media/java/android/mtp/MtpStorage.java
+++ b/media/java/android/mtp/MtpStorage.java
@@ -16,6 +16,8 @@
 
 package android.mtp;
 
+import android.os.storage.StorageVolume;
+
 /**
  * This class represents a storage unit on an MTP device.
  * Used only for MTP support in USB responder mode.
@@ -31,13 +33,12 @@
     private final long mReserveSpace;
     private final boolean mRemovable;
 
-    public MtpStorage(int id, String path, String description,
-            long reserveSpace, boolean removable) {
-        mStorageId = id;
-        mPath = path;
-        mDescription = description;
-        mReserveSpace = reserveSpace;
-        mRemovable = removable;
+    public MtpStorage(StorageVolume volume) {
+        mStorageId = volume.getStorageId();
+        mPath = volume.getPath();
+        mDescription = volume.getDescription();
+        mReserveSpace = volume.getMtpReserveSpace();
+        mRemovable = volume.isRemovable();
     }
 
     /**
diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk
index f731dfb..8c4b274 100644
--- a/media/libstagefright/Android.mk
+++ b/media/libstagefright/Android.mk
@@ -50,7 +50,6 @@
         ThrottledSource.cpp               \
         TimeSource.cpp                    \
         TimedEventQueue.cpp               \
-        TimedTextPlayer.cpp               \
         Utils.cpp                         \
         VBRISeeker.cpp                    \
         WAVExtractor.cpp                  \
@@ -89,6 +88,7 @@
         libstagefright_avcenc \
         libstagefright_m4vh263enc \
         libstagefright_matroska \
+        libstagefright_timedtext \
         libvpx \
         libstagefright_mpeg2ts \
         libstagefright_httplive \
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index b45e5d3..3d270f89 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -24,11 +24,14 @@
 
 #include "include/ARTSPController.h"
 #include "include/AwesomePlayer.h"
+#include "include/DRMExtractor.h"
 #include "include/SoftwareRenderer.h"
 #include "include/NuCachedSource2.h"
 #include "include/ThrottledSource.h"
 #include "include/MPEG2TSExtractor.h"
-#include "include/TimedTextPlayer.h"
+#include "include/WVMExtractor.h"
+
+#include "timedtext/TimedTextPlayer.h"
 
 #include <binder/IPCThreadState.h>
 #include <binder/IServiceManager.h>
@@ -398,6 +401,7 @@
 }
 
 void AwesomePlayer::reset() {
+    LOGI("reset");
     Mutex::Autolock autoLock(mLock);
     reset_l();
 }
@@ -411,8 +415,10 @@
                     Playback::STOP, 0);
             mDecryptHandle = NULL;
             mDrmManagerClient = NULL;
+            LOGI("DRM manager client stopped");
     }
 
+
     if (mFlags & PLAYING) {
         uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder;
         if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) {
@@ -445,8 +451,10 @@
         mPreparedCondition.wait(mLock);
     }
 
+    LOGI("cancel player events");
     cancelPlayerEvents();
 
+    mWVMExtractor.clear();
     mCachedSource.clear();
     mAudioTrack.clear();
     mVideoTrack.clear();
@@ -545,6 +553,11 @@
         *durationUs = cachedDataRemaining * 8000000ll / bitrate;
         *eos = (finalStatus != OK);
         return true;
+    } else if (mWVMExtractor != NULL) {
+        status_t finalStatus;
+        *durationUs = mWVMExtractor->getCachedDurationUs(&finalStatus);
+        *eos = (finalStatus != OK);
+        return true;
     }
 
     return false;
@@ -637,6 +650,30 @@
                 }
             }
         }
+    } else if (mWVMExtractor != NULL) {
+        status_t finalStatus;
+
+        int64_t cachedDurationUs
+            = mWVMExtractor->getCachedDurationUs(&finalStatus);
+
+        bool eos = (finalStatus != OK);
+
+        if (eos) {
+            if (finalStatus == ERROR_END_OF_STREAM) {
+                notifyListener_l(MEDIA_BUFFERING_UPDATE, 100);
+            }
+            if (mFlags & PREPARING) {
+                LOGV("cache has reached EOS, prepare is done.");
+                finishAsyncPrepare_l();
+            }
+        } else {
+            int percentage = 100.0 * (double)cachedDurationUs / mDurationUs;
+            if (percentage > 100) {
+                percentage = 100;
+            }
+
+            notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage);
+        }
     }
 
     int64_t cachedDurationUs;
@@ -1049,6 +1086,7 @@
         usleep(1000);
     }
     IPCThreadState::self()->flushCommands();
+    LOGI("video decoder shutdown completed");
 }
 
 void AwesomePlayer::setNativeWindow_l(const sp<ANativeWindow> &native) {
@@ -1245,6 +1283,7 @@
 }
 
 void AwesomePlayer::addTextSource(sp<MediaSource> source) {
+    Mutex::Autolock autoLock(mTimedTextLock);
     CHECK(source != NULL);
 
     if (mTextPlayer == NULL) {
@@ -1425,7 +1464,7 @@
             mVideoBuffer = NULL;
         }
 
-        if (mSeeking == SEEK && mCachedSource != NULL && mAudioSource != NULL
+        if (mSeeking == SEEK && isStreamingHTTP() && mAudioSource != NULL
                 && !(mFlags & SEEK_PREVIEW)) {
             // We're going to seek the video source first, followed by
             // the audio source.
@@ -1760,8 +1799,19 @@
 status_t AwesomePlayer::finishSetDataSource_l() {
     sp<DataSource> dataSource;
 
+    bool isWidevineStreaming = false;
+    if (!strncasecmp("widevine://", mUri.string(), 11)) {
+        isWidevineStreaming = true;
+
+        String8 newURI = String8("http://");
+        newURI.append(mUri.string() + 11);
+
+        mUri = newURI;
+    }
+
     if (!strncasecmp("http://", mUri.string(), 7)
-            || !strncasecmp("https://", mUri.string(), 8)) {
+            || !strncasecmp("https://", mUri.string(), 8)
+            || isWidevineStreaming) {
         mConnectingDataSource = HTTPBase::Create(
                 (mFlags & INCOGNITO)
                     ? HTTPBase::kFlagIncognito
@@ -1778,16 +1828,24 @@
             return err;
         }
 
+        if (!isWidevineStreaming) {
+            // The widevine extractor does its own caching.
+
 #if 0
-        mCachedSource = new NuCachedSource2(
-                new ThrottledSource(
-                    mConnectingDataSource, 50 * 1024 /* bytes/sec */));
+            mCachedSource = new NuCachedSource2(
+                    new ThrottledSource(
+                        mConnectingDataSource, 50 * 1024 /* bytes/sec */));
 #else
-        mCachedSource = new NuCachedSource2(mConnectingDataSource);
+            mCachedSource = new NuCachedSource2(mConnectingDataSource);
 #endif
+
+            dataSource = mCachedSource;
+        } else {
+            dataSource = mConnectingDataSource;
+        }
+
         mConnectingDataSource.clear();
 
-        dataSource = mCachedSource;
 
         String8 contentType = dataSource->getMIMEType();
 
@@ -1801,28 +1859,35 @@
             // could block on the datasource for a significant amount of time.
             // During that time we'd be unable to abort the preparation phase
             // without this prefill.
+            if (mCachedSource != NULL) {
+                // We're going to prefill the cache before trying to instantiate
+                // the extractor below, as the latter is an operation that otherwise
+                // could block on the datasource for a significant amount of time.
+                // During that time we'd be unable to abort the preparation phase
+                // without this prefill.
 
-            mLock.unlock();
+                mLock.unlock();
 
-            for (;;) {
-                status_t finalStatus;
-                size_t cachedDataRemaining =
-                    mCachedSource->approxDataRemaining(&finalStatus);
+                for (;;) {
+                    status_t finalStatus;
+                    size_t cachedDataRemaining =
+                        mCachedSource->approxDataRemaining(&finalStatus);
 
-                if (finalStatus != OK || cachedDataRemaining >= kHighWaterMarkBytes
-                        || (mFlags & PREPARE_CANCELLED)) {
-                    break;
+                    if (finalStatus != OK || cachedDataRemaining >= kHighWaterMarkBytes
+                            || (mFlags & PREPARE_CANCELLED)) {
+                        break;
+                    }
+
+                    usleep(200000);
                 }
 
-                usleep(200000);
+                mLock.lock();
             }
 
-            mLock.lock();
-        }
-
-        if (mFlags & PREPARE_CANCELLED) {
-            LOGI("Prepare cancelled while waiting for initial cache fill.");
-            return UNKNOWN_ERROR;
+            if (mFlags & PREPARE_CANCELLED) {
+                LOGI("Prepare cancelled while waiting for initial cache fill.");
+                return UNKNOWN_ERROR;
+            }
         }
     } else if (!strncasecmp("rtsp://", mUri.string(), 7)) {
         if (mLooper == NULL) {
@@ -1856,10 +1921,29 @@
         return UNKNOWN_ERROR;
     }
 
-    sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);
+    sp<MediaExtractor> extractor;
 
-    if (extractor == NULL) {
-        return UNKNOWN_ERROR;
+    if (isWidevineStreaming) {
+        String8 mimeType;
+        float confidence;
+        sp<AMessage> dummy;
+        bool success = SniffDRM(dataSource, &mimeType, &confidence, &dummy);
+
+        if (!success
+                || strcasecmp(
+                    mimeType.string(), MEDIA_MIMETYPE_CONTAINER_WVM)) {
+            return ERROR_UNSUPPORTED;
+        }
+
+        mWVMExtractor = new WVMExtractor(dataSource);
+        mWVMExtractor->setAdaptiveStreamingMode(true);
+        extractor = mWVMExtractor;
+    } else {
+        extractor = MediaExtractor::Create(dataSource);
+
+        if (extractor == NULL) {
+            return UNKNOWN_ERROR;
+        }
     }
 
     dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient);
@@ -1871,7 +1955,15 @@
         }
     }
 
-    return setDataSource_l(extractor);
+    status_t err = setDataSource_l(extractor);
+
+    if (err != OK) {
+        mWVMExtractor.clear();
+
+        return err;
+    }
+
+    return OK;
 }
 
 void AwesomePlayer::abortPrepare(status_t err) {
@@ -1932,7 +2024,7 @@
 
     mFlags |= PREPARING_CONNECTED;
 
-    if (mCachedSource != NULL || mRTSPController != NULL) {
+    if (isStreamingHTTP() || mRTSPController != NULL) {
         postBufferingEvent_l();
     } else {
         finishAsyncPrepare_l();
@@ -1976,13 +2068,34 @@
 }
 
 status_t AwesomePlayer::setParameter(int key, const Parcel &request) {
-    if (key == KEY_PARAMETER_TIMED_TEXT_TRACK_INDEX) {
-        return setTimedTextTrackIndex(request.readInt32());
+    switch (key) {
+        case KEY_PARAMETER_TIMED_TEXT_TRACK_INDEX:
+        {
+            Mutex::Autolock autoLock(mTimedTextLock);
+            return setTimedTextTrackIndex(request.readInt32());
+        }
+        case KEY_PARAMETER_TIMED_TEXT_ADD_OUT_OF_BAND_SOURCE:
+        {
+            Mutex::Autolock autoLock(mTimedTextLock);
+            if (mTextPlayer == NULL) {
+                mTextPlayer = new TimedTextPlayer(this, mListener, &mQueue);
+            }
+
+            return mTextPlayer->setParameter(key, request);
+        }
+        default:
+        {
+            return ERROR_UNSUPPORTED;
+        }
     }
-    return ERROR_UNSUPPORTED;
 }
 
 status_t AwesomePlayer::getParameter(int key, Parcel *reply) {
     return OK;
 }
+
+bool AwesomePlayer::isStreamingHTTP() const {
+    return mCachedSource != NULL || mWVMExtractor != NULL;
+}
+
 }  // namespace android
diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp
index 6692809..98ac044 100644
--- a/media/libstagefright/MPEG4Extractor.cpp
+++ b/media/libstagefright/MPEG4Extractor.cpp
@@ -20,7 +20,7 @@
 #include "include/MPEG4Extractor.h"
 #include "include/SampleTable.h"
 #include "include/ESDS.h"
-#include "include/TimedTextPlayer.h"
+#include "timedtext/TimedTextPlayer.h"
 
 #include <arpa/inet.h>
 
diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp
index 988392e..f6a8b17 100644
--- a/media/libstagefright/MPEG4Writer.cpp
+++ b/media/libstagefright/MPEG4Writer.cpp
@@ -744,7 +744,7 @@
     endBox();  // moov
 }
 
-void MPEG4Writer::writeFtypBox(const MetaData *param) {
+void MPEG4Writer::writeFtypBox(MetaData *param) {
     beginBox("ftyp");
 
     int32_t fileType;
diff --git a/media/libstagefright/MetaData.cpp b/media/libstagefright/MetaData.cpp
index aac94a6..884f3b4 100644
--- a/media/libstagefright/MetaData.cpp
+++ b/media/libstagefright/MetaData.cpp
@@ -83,7 +83,7 @@
     return setData(key, TYPE_RECT, &r, sizeof(r));
 }
 
-bool MetaData::findCString(uint32_t key, const char **value) const {
+bool MetaData::findCString(uint32_t key, const char **value) {
     uint32_t type;
     const void *data;
     size_t size;
@@ -96,7 +96,7 @@
     return true;
 }
 
-bool MetaData::findInt32(uint32_t key, int32_t *value) const {
+bool MetaData::findInt32(uint32_t key, int32_t *value) {
     uint32_t type;
     const void *data;
     size_t size;
@@ -111,7 +111,7 @@
     return true;
 }
 
-bool MetaData::findInt64(uint32_t key, int64_t *value) const {
+bool MetaData::findInt64(uint32_t key, int64_t *value) {
     uint32_t type;
     const void *data;
     size_t size;
@@ -126,7 +126,7 @@
     return true;
 }
 
-bool MetaData::findFloat(uint32_t key, float *value) const {
+bool MetaData::findFloat(uint32_t key, float *value) {
     uint32_t type;
     const void *data;
     size_t size;
@@ -141,7 +141,7 @@
     return true;
 }
 
-bool MetaData::findPointer(uint32_t key, void **value) const {
+bool MetaData::findPointer(uint32_t key, void **value) {
     uint32_t type;
     const void *data;
     size_t size;
@@ -159,7 +159,7 @@
 bool MetaData::findRect(
         uint32_t key,
         int32_t *left, int32_t *top,
-        int32_t *right, int32_t *bottom) const {
+        int32_t *right, int32_t *bottom) {
     uint32_t type;
     const void *data;
     size_t size;
diff --git a/media/libstagefright/NuHTTPDataSource.cpp b/media/libstagefright/NuHTTPDataSource.cpp
index 821ba9b..ce30fc8 100644
--- a/media/libstagefright/NuHTTPDataSource.cpp
+++ b/media/libstagefright/NuHTTPDataSource.cpp
@@ -392,6 +392,13 @@
 
     Mutex::Autolock autoLock(mLock);
 
+    // if it's a DRM container based streaming, call pread() of the DRM plugin
+    // to get the decrypted data
+    if (mDecryptHandle != NULL && DecryptApiType::CONTAINER_BASED
+            == mDecryptHandle->decryptApiType) {
+        return mDrmManagerClient->pread(mDecryptHandle, data, size, offset);
+    }
+
     if (offset != mOffset) {
         String8 host = mHost;
         String8 path = mPath;
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index cd5bdfb..ba495cc 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -3443,7 +3443,7 @@
 }
 
 status_t OMXCodec::stop() {
-    CODEC_LOGV("stop mState=%d", mState);
+    CODEC_LOGI("stop mState=%d", mState);
 
     Mutex::Autolock autoLock(mLock);
 
@@ -3505,6 +3505,7 @@
         mLeftOverBuffer = NULL;
     }
 
+    CODEC_LOGI("stopping video source");
     mSource->stop();
 
     CODEC_LOGI("stopped in state %d", mState);
@@ -4077,10 +4078,10 @@
                          numChannels, params.nChannels);
                 }
 
-                if (sampleRate != params.nSamplingRate) {
+                if (sampleRate != (int32_t)params.nSamplingRate) {
                     LOGW("Codec outputs at different sampling rate than "
                          "what the input stream contains (contains data at "
-                         "%d Hz, codec outputs %d Hz)",
+                         "%d Hz, codec outputs %lu Hz)",
                          sampleRate, params.nSamplingRate);
                 }
 
@@ -4203,6 +4204,14 @@
             break;
         }
     }
+
+    // If the input format contains rotation information, flag the output
+    // format accordingly.
+
+    int32_t rotationDegrees;
+    if (mSource->getFormat()->findInt32(kKeyRotation, &rotationDegrees)) {
+        mOutputFormat->setInt32(kKeyRotation, rotationDegrees);
+    }
 }
 
 status_t OMXCodec::pause() {
diff --git a/media/libstagefright/TimedTextPlayer.cpp b/media/libstagefright/TimedTextPlayer.cpp
deleted file mode 100644
index 1ac22cb..0000000
--- a/media/libstagefright/TimedTextPlayer.cpp
+++ /dev/null
@@ -1,252 +0,0 @@
- /*
- * Copyright (C) 2011 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.
- */
-
-//#define LOG_NDEBUG 0
-#define LOG_TAG "TimedTextPlayer"
-#include <utils/Log.h>
-
-#include <binder/IPCThreadState.h>
-#include <media/stagefright/MediaDebug.h>
-#include <media/stagefright/MediaDefs.h>
-#include <media/stagefright/MediaErrors.h>
-#include <media/stagefright/MediaSource.h>
-#include <media/stagefright/MetaData.h>
-#include <media/stagefright/MediaBuffer.h>
-#include <media/stagefright/Utils.h>
-#include "include/AwesomePlayer.h"
-#include "include/TimedTextPlayer.h"
-
-namespace android {
-
-struct TimedTextEvent : public TimedEventQueue::Event {
-    TimedTextEvent(
-            TimedTextPlayer *player,
-            void (TimedTextPlayer::*method)())
-        : mPlayer(player),
-          mMethod(method) {
-    }
-
-protected:
-    virtual ~TimedTextEvent() {}
-
-    virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) {
-        (mPlayer->*mMethod)();
-    }
-
-private:
-    TimedTextPlayer *mPlayer;
-    void (TimedTextPlayer::*mMethod)();
-
-    TimedTextEvent(const TimedTextEvent &);
-    TimedTextEvent &operator=(const TimedTextEvent &);
-};
-
-TimedTextPlayer::TimedTextPlayer(
-        AwesomePlayer *observer,
-        const wp<MediaPlayerBase> &listener,
-        TimedEventQueue *queue)
-    : mSource(NULL),
-      mSeekTimeUs(0),
-      mStarted(false),
-      mTextEventPending(false),
-      mQueue(queue),
-      mListener(listener),
-      mObserver(observer),
-      mTextBuffer(NULL) {
-    mTextEvent = new TimedTextEvent(this, &TimedTextPlayer::onTextEvent);
-}
-
-TimedTextPlayer::~TimedTextPlayer() {
-    if (mStarted) {
-        reset();
-    }
-
-    mTextTrackVector.clear();
-}
-
-status_t TimedTextPlayer::start(uint8_t index) {
-    CHECK(!mStarted);
-
-    if (index >= mTextTrackVector.size()) {
-        LOGE("Incorrect text track index");
-        return BAD_VALUE;
-    }
-
-    mSource = mTextTrackVector.itemAt(index);
-
-    status_t err = mSource->start();
-
-    if (err != OK) {
-        return err;
-    }
-
-    int64_t positionUs;
-    mObserver->getPosition(&positionUs);
-    seekTo(positionUs);
-
-    postTextEvent();
-
-    mStarted = true;
-
-    return OK;
-}
-
-void TimedTextPlayer::pause() {
-    CHECK(mStarted);
-
-    cancelTextEvent();
-}
-
-void TimedTextPlayer::resume() {
-    CHECK(mStarted);
-
-    postTextEvent();
-}
-
-void TimedTextPlayer::reset() {
-    CHECK(mStarted);
-
-    // send an empty text to clear the screen
-    notifyListener(MEDIA_TIMED_TEXT);
-
-    cancelTextEvent();
-
-    mSeeking = false;
-    mStarted = false;
-
-    if (mTextBuffer != NULL) {
-        mTextBuffer->release();
-        mTextBuffer = NULL;
-    }
-
-    if (mSource != NULL) {
-        mSource->stop();
-        mSource.clear();
-        mSource = NULL;
-    }
-}
-
-status_t TimedTextPlayer::seekTo(int64_t time_us) {
-    Mutex::Autolock autoLock(mLock);
-
-    mSeeking = true;
-    mSeekTimeUs = time_us;
-
-    return OK;
-}
-
-status_t TimedTextPlayer::setTimedTextTrackIndex(int32_t index) {
-    if (index >= (int)(mTextTrackVector.size())) {
-        return BAD_VALUE;
-    }
-
-    if (mStarted) {
-        reset();
-    }
-
-    if (index >= 0) {
-        return start(index);
-    }
-    return OK;
-}
-
-void TimedTextPlayer::onTextEvent() {
-    Mutex::Autolock autoLock(mLock);
-
-    if (!mTextEventPending) {
-        return;
-    }
-    mTextEventPending = false;
-
-    MediaSource::ReadOptions options;
-    if (mSeeking) {
-        options.setSeekTo(mSeekTimeUs,
-                MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC);
-        mSeeking = false;
-
-        if (mTextBuffer != NULL) {
-            mTextBuffer->release();
-            mTextBuffer = NULL;
-        }
-
-        notifyListener(MEDIA_TIMED_TEXT); //empty text to clear the screen
-    }
-
-    if (mTextBuffer != NULL) {
-        uint8_t *tmp = (uint8_t *)(mTextBuffer->data());
-        size_t len = (*tmp) << 8 | (*(tmp + 1));
-
-        notifyListener(MEDIA_TIMED_TEXT,
-                       tmp + 2,
-                       len);
-
-        mTextBuffer->release();
-        mTextBuffer = NULL;
-
-    }
-
-    if (mSource->read(&mTextBuffer, &options) != OK) {
-        return;
-    }
-
-    int64_t positionUs, timeUs;
-    mObserver->getPosition(&positionUs);
-    mTextBuffer->meta_data()->findInt64(kKeyTime, &timeUs);
-
-    //send the text now
-    if (timeUs <= positionUs + 100000ll) {
-        postTextEvent();
-    } else {
-        postTextEvent(timeUs - positionUs - 100000ll);
-    }
-}
-
-void TimedTextPlayer::postTextEvent(int64_t delayUs) {
-    if (mTextEventPending) {
-        return;
-    }
-
-    mTextEventPending = true;
-    mQueue->postEventWithDelay(mTextEvent, delayUs < 0 ? 10000 : delayUs);
-}
-
-void TimedTextPlayer::cancelTextEvent() {
-    mQueue->cancelEvent(mTextEvent->eventID());
-    mTextEventPending = false;
-}
-
-void TimedTextPlayer::addTextSource(sp<MediaSource> source) {
-    mTextTrackVector.add(source);
-}
-
-void TimedTextPlayer::notifyListener(
-        int msg, const void *data, size_t size) {
-    if (mListener != NULL) {
-        sp<MediaPlayerBase> listener = mListener.promote();
-
-        if (listener != NULL) {
-            if (size > 0) {
-                mData.freeData();
-                mData.write(data, size);
-
-                listener->sendEvent(msg, 0, 0, &mData);
-            } else { // send an empty timed text to clear the screen
-                listener->sendEvent(msg);
-            }
-        }
-    }
-}
-}
diff --git a/media/libstagefright/WVMExtractor.cpp b/media/libstagefright/WVMExtractor.cpp
index 7c72852..26eda0c 100644
--- a/media/libstagefright/WVMExtractor.cpp
+++ b/media/libstagefright/WVMExtractor.cpp
@@ -58,13 +58,12 @@
         }
     }
 
-    typedef MediaExtractor *(*GetInstanceFunc)(sp<DataSource>);
+    typedef WVMLoadableExtractor *(*GetInstanceFunc)(sp<DataSource>);
     GetInstanceFunc getInstanceFunc =
         (GetInstanceFunc) dlsym(gVendorLibHandle,
                 "_ZN7android11GetInstanceENS_2spINS_10DataSourceEEE");
 
     if (getInstanceFunc) {
-        LOGD("Calling GetInstanceFunc");
         mImpl = (*getInstanceFunc)(source);
         CHECK(mImpl != NULL);
     } else {
@@ -100,5 +99,19 @@
     return mImpl->getMetaData();
 }
 
+int64_t WVMExtractor::getCachedDurationUs(status_t *finalStatus) {
+    if (mImpl == NULL) {
+        return 0;
+    }
+
+    return mImpl->getCachedDurationUs(finalStatus);
+}
+
+void WVMExtractor::setAdaptiveStreamingMode(bool adaptive) {
+    if (mImpl != NULL) {
+        mImpl->setAdaptiveStreamingMode(adaptive);
+    }
+}
+
 } //namespace android
 
diff --git a/media/libstagefright/chromium_http/support.cpp b/media/libstagefright/chromium_http/support.cpp
index af2f6ac..805bd48 100644
--- a/media/libstagefright/chromium_http/support.cpp
+++ b/media/libstagefright/chromium_http/support.cpp
@@ -23,7 +23,8 @@
 #include "support.h"
 
 #include "android/net/android_network_library_impl.h"
-#include "base/thread.h"
+#include "base/threading/thread.h"
+#include "net/base/cert_verifier.h"
 #include "net/base/host_resolver.h"
 #include "net/base/ssl_config_service.h"
 #include "net/http/http_auth_handler_factory.h"
@@ -127,6 +128,7 @@
 
     http_transaction_factory_ = new net::HttpCache(
             host_resolver_,
+            new net::CertVerifier(),
             dnsrr_resolver_,
             dns_cert_checker_.get(),
             proxy_service_.get(),
@@ -174,44 +176,44 @@
 }
 
 void SfDelegate::OnReceivedRedirect(
-            URLRequest *request, const GURL &new_url, bool *defer_redirect) {
+            net::URLRequest *request, const GURL &new_url, bool *defer_redirect) {
     MY_LOGI("OnReceivedRedirect");
 }
 
 void SfDelegate::OnAuthRequired(
-            URLRequest *request, net::AuthChallengeInfo *auth_info) {
+            net::URLRequest *request, net::AuthChallengeInfo *auth_info) {
     MY_LOGI("OnAuthRequired");
 
     inherited::OnAuthRequired(request, auth_info);
 }
 
 void SfDelegate::OnCertificateRequested(
-            URLRequest *request, net::SSLCertRequestInfo *cert_request_info) {
+            net::URLRequest *request, net::SSLCertRequestInfo *cert_request_info) {
     MY_LOGI("OnCertificateRequested");
 
     inherited::OnCertificateRequested(request, cert_request_info);
 }
 
 void SfDelegate::OnSSLCertificateError(
-            URLRequest *request, int cert_error, net::X509Certificate *cert) {
+            net::URLRequest *request, int cert_error, net::X509Certificate *cert) {
     fprintf(stderr, "OnSSLCertificateError cert_error=%d\n", cert_error);
 
     inherited::OnSSLCertificateError(request, cert_error, cert);
 }
 
-void SfDelegate::OnGetCookies(URLRequest *request, bool blocked_by_policy) {
+void SfDelegate::OnGetCookies(net::URLRequest *request, bool blocked_by_policy) {
     MY_LOGI("OnGetCookies");
 }
 
 void SfDelegate::OnSetCookie(
-        URLRequest *request,
+        net::URLRequest *request,
         const std::string &cookie_line,
         const net::CookieOptions &options,
         bool blocked_by_policy) {
     MY_LOGI("OnSetCookie");
 }
 
-void SfDelegate::OnResponseStarted(URLRequest *request) {
+void SfDelegate::OnResponseStarted(net::URLRequest *request) {
     if (request->status().status() != URLRequestStatus::SUCCESS) {
         MY_LOGI(StringPrintf(
                     "Request failed with status %d and os_error %d",
@@ -260,7 +262,7 @@
             request->GetExpectedContentSize(), contentType.c_str());
 }
 
-void SfDelegate::OnReadCompleted(URLRequest *request, int bytes_read) {
+void SfDelegate::OnReadCompleted(net::URLRequest *request, int bytes_read) {
     if (bytes_read == -1) {
         MY_LOGI(StringPrintf(
                     "OnReadCompleted, read failed, status %d",
@@ -297,7 +299,7 @@
     readMore(request);
 }
 
-void SfDelegate::readMore(URLRequest *request) {
+void SfDelegate::readMore(net::URLRequest *request) {
     while (mNumBytesRead < mNumBytesTotal) {
         size_t copy = mNumBytesTotal - mNumBytesRead;
         if (copy > mReadBuffer->size()) {
@@ -371,7 +373,7 @@
         off64_t offset) {
     CHECK(mURLRequest == NULL);
 
-    mURLRequest = new URLRequest(url, this);
+    mURLRequest = new net::URLRequest(url, this);
     mAtEOS = false;
 
     mRangeRequested = false;
diff --git a/media/libstagefright/chromium_http/support.h b/media/libstagefright/chromium_http/support.h
index 634ac93..4d03493 100644
--- a/media/libstagefright/chromium_http/support.h
+++ b/media/libstagefright/chromium_http/support.h
@@ -77,7 +77,7 @@
 
 struct ChromiumHTTPDataSource;
 
-struct SfDelegate : public URLRequest::Delegate {
+struct SfDelegate : public net::URLRequest::Delegate {
     SfDelegate();
     virtual ~SfDelegate();
 
@@ -92,35 +92,35 @@
     void setOwner(ChromiumHTTPDataSource *mOwner);
 
     virtual void OnReceivedRedirect(
-            URLRequest *request, const GURL &new_url, bool *defer_redirect);
+            net::URLRequest *request, const GURL &new_url, bool *defer_redirect);
 
     virtual void OnAuthRequired(
-            URLRequest *request, net::AuthChallengeInfo *auth_info);
+            net::URLRequest *request, net::AuthChallengeInfo *auth_info);
 
     virtual void OnCertificateRequested(
-            URLRequest *request, net::SSLCertRequestInfo *cert_request_info);
+            net::URLRequest *request, net::SSLCertRequestInfo *cert_request_info);
 
     virtual void OnSSLCertificateError(
-            URLRequest *request, int cert_error, net::X509Certificate *cert);
+            net::URLRequest *request, int cert_error, net::X509Certificate *cert);
 
-    virtual void OnGetCookies(URLRequest *request, bool blocked_by_policy);
+    virtual void OnGetCookies(net::URLRequest *request, bool blocked_by_policy);
 
     virtual void OnSetCookie(
-            URLRequest *request,
+            net::URLRequest *request,
             const std::string &cookie_line,
             const net::CookieOptions &options,
             bool blocked_by_policy);
 
-    virtual void OnResponseStarted(URLRequest *request);
+    virtual void OnResponseStarted(net::URLRequest *request);
 
-    virtual void OnReadCompleted(URLRequest *request, int bytes_read);
+    virtual void OnReadCompleted(net::URLRequest *request, int bytes_read);
 
 private:
     typedef Delegate inherited;
 
     ChromiumHTTPDataSource *mOwner;
 
-    URLRequest *mURLRequest;
+    net::URLRequest *mURLRequest;
     scoped_refptr<net::IOBufferWithSize> mReadBuffer;
 
     size_t mNumBytesRead;
@@ -130,7 +130,7 @@
     bool mRangeRequested;
     bool mAtEOS;
 
-    void readMore(URLRequest *request);
+    void readMore(net::URLRequest *request);
 
     static void OnInitiateConnectionWrapper(
             SfDelegate *me,
diff --git a/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c b/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c
index 774da7b..2ea9449 100644
--- a/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c
+++ b/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c
@@ -1,283 +1,283 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		AAC_E_SAMPLES.h

-

-	Content:	sample code for AAC encoder

-

-*******************************************************************************/

-

-#include		<dlfcn.h>

-#include		<stdio.h>

-#include		<stdlib.h>

-#include		<string.h>

-#include		<time.h>

-#include		"voAAC.h"

-#include		"cmnMemory.h"

-

-#define  VO_AAC_E_OUTPUT	  1

-#define READ_SIZE	(1024*8)	

-unsigned char outBuf[1024*8];

-unsigned char inBuf[READ_SIZE];

-

-const char* HelpString = 

-"VisualOn AAC encoder Usage:\n"

-"voAACEncTest -if <inputfile.pcm> -of <outputfile.aac> -sr <samplerate> -ch <channel> -br <bitrate> -adts <adts> \n"

-"-if input file name \n"

-"-of output file name \n"

-"-sr input pcm samplerate, default 44100 \n"

-"-ch input pcm channel, default 2 channel \n"

-"-br encoded aac bitrate, default 64000 * (samplerate/100)*channel/441(480)\n"

-"-adts add or no adts header, default add adts header\n"

-"For example: \n"

-"./voAACEncTest -if raw.pcm -of raw.aac -sr 44100 -ch 2 -br 128000\n";

-

-static int parsecmdline(int argc, char **argv,char  **input_filename, char  **output_filename, AACENC_PARAM *param)

-{

-	// notice that:

-	// bitRate/nChannels > 8000

-	// bitRate/nChannels < 160000 

-	// bitRate/nChannels < sampleRate*6

-	param->adtsUsed = 1;

-	param->bitRate = 0;

-	param->nChannels = 2;

-	param->sampleRate = 44100;

-

-	if(argc < 5 || argc > 13)

-	{

-		return -1;

-	}

-

-	argc--;

-	argv++;

-	while (argc > 0)

-	{

-		if (!strcmp(*argv, "-if"))

-		{

-			argv++;

-			argc--;

-			*input_filename = *argv; 

-		}

-		else if (!strcmp(*argv, "-of"))

-		{

-			argv++;

-			argc--;

-			*output_filename = *argv;

-		}

-		else if (!strcmp(*argv, "-sr"))

-		{

-			argv++;

-			argc--;

-			param->sampleRate = atoi(*argv);

-		}

-		else if (!strcmp(*argv, "-ch"))

-		{

-			argv++;

-			argc--;

-			param->nChannels = atoi(*argv);

-		}

-		else if (!strcmp(*argv, "-br"))

-		{

-			argv++;

-			argc--;

-			param->bitRate = atoi(*argv);

-		}

-		else if(!strcmp(*argv, "-adts"))

-		{

-			argv++;

-			argc--;

-			param->adtsUsed = atoi(*argv);

-		}

-		else

-		{

-			return -1;

-		}

-

-		argv++;

-		argc--;

-	}

-

-	if(param->bitRate == 0)

-	{

-		int scale = 441;

-		if(param->sampleRate%8000 == 0)

-			scale = 480;

-		param->bitRate = 640*param->nChannels*param->sampleRate/scale;

-	}

-

-	return 0;

-}

-

-int ReadFile2Buf(FILE* infile,unsigned char* dest,int readSize)

-{

-	int readBytes = 0;

-	readBytes = fread(dest, 1, readSize, infile);

-	return readBytes;

-}

-

-typedef int (VO_API * VOGETAUDIODECAPI) (VO_AUDIO_CODECAPI * pDecHandle);

-

-int main(int argc, char **argv)

-{

-	FILE						*infile, *outfile;

-	int							t1, t2;

-	VO_AUDIO_CODECAPI			AudioAPI;

-	VO_MEM_OPERATOR				moper;

-	VO_CODEC_INIT_USERDATA		useData;

-	VO_HANDLE					hCodec;

-	VO_CODECBUFFER				inData;

-	VO_CODECBUFFER				outData;

-	VO_AUDIO_OUTPUTINFO			outInfo;

-    int							firstWrite = 1;

-	int							eofFile = 0;

-	int							*info=(int*)inBuf;

-	int							bytesLeft, nRead;

-	int							EncoderdFrame = 0;

-	int							total = 0;

-	int							isOutput = 1;

-	int							returnCode;

-	AACENC_PARAM				aacpara;

-	void						*handle;

-	void						*pfunc;

-	VOGETAUDIODECAPI			pGetAPI;

-	const char					*infileName = NULL;

-    const char					*outfileName = NULL;

-

-	returnCode = parsecmdline(argc,argv, &infileName, &outfileName, &aacpara);

-	if(returnCode)

-	{

-		printf("%s", HelpString);

-		return 0;

-	}

-

-	/* open input file */

-	infile = fopen(infileName, "rb");

-	if (!infile) {

-		printf("Open input file fail...");

-		return -1;

-	}

-

-	/* open output file */

-	if(isOutput)

-	{

-		outfile = fopen(outfileName, "wb"); 

-		if (!outfile) {

-			printf("Open output file fail...");

-			return -1;

-		}

-	}

-	// set memory operators;

-	moper.Alloc = cmnMemAlloc;

-	moper.Copy = cmnMemCopy;

-	moper.Free = cmnMemFree;

-	moper.Set = cmnMemSet;

-	moper.Check = cmnMemCheck;

-	useData.memflag = VO_IMF_USERMEMOPERATOR;

-	useData.memData = (VO_PTR)(&moper);

-	// open encoder dll;

-	handle = dlopen("libstagefright.so", RTLD_NOW);

-	if(handle == 0)

-	{

-		printf("open dll error......");

-		return -1;

-	}

-	// Get API;

-	pfunc = dlsym(handle, "voGetAACEncAPI");	

-	if(pfunc == 0)

-	{

-		printf("open function error......");

-		return -1;

-	}

-	pGetAPI = (VOGETAUDIODECAPI)pfunc;

-	returnCode  = pGetAPI(&AudioAPI);

-	if(returnCode)

-		return -1;

-

-

-//#######################################   Init Encoding Section   #########################################

-	returnCode = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAAC, &useData);

-	if(returnCode < 0)

-	{

-		printf("#### VOI_Error2:fail to initialize the Encoderr###\n");

-		return -1;

-	}

-

-	returnCode = AudioAPI.SetParam(hCodec, VO_PID_AAC_ENCPARAM, &aacpara);	

-	

-	inData.Buffer = inBuf;

-	bytesLeft = ReadFile2Buf(infile,inData.Buffer,READ_SIZE);

-

-//#######################################    Encoding Section   #########################################

-	

-	do {

-

-		inData.Length    = bytesLeft;

-		outData.Buffer   = outBuf;

-		outData.Length = 1024*8;

-

-		t1 = clock();

-		

-		returnCode = AudioAPI.SetInputData(hCodec,&inData);

-		

-		do {

-			outData.Buffer   = outBuf;

-			outData.Length = 1024*8;

-

-			returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outInfo);

-

-			if(returnCode == 0)

-				EncoderdFrame++;

-			if(returnCode == VO_ERR_LICENSE_ERROR)

-				break;

-

-#if VO_AAC_E_OUTPUT

-			if (isOutput && returnCode == 0)

-			{

-				fwrite(outData.Buffer, 1, outData.Length, outfile);

-			}

-#endif

-		} while(returnCode != (VO_ERR_INPUT_BUFFER_SMALL));

-

-		if(returnCode == VO_ERR_LICENSE_ERROR)

-			break;

-

-		t2 = clock();

-		total += t2 - t1;

-

-		if (!eofFile) {

-			nRead = ReadFile2Buf(infile, inBuf,READ_SIZE);

-			bytesLeft = nRead;

-			inData.Buffer = inBuf;

-			if (feof(infile))

-				eofFile = 1;

-		}

-

-	} while (!eofFile && returnCode);

-

-

-//################################################  End Encoding Section  #######################################################

-	returnCode = AudioAPI.Uninit(hCodec);

-

-	fclose(infile);

-	if (outfile)

-    {

-        fclose(outfile);

-    }

-	dlclose(handle);

-	return 0;

-}

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		AAC_E_SAMPLES.h
+
+	Content:	sample code for AAC encoder
+
+*******************************************************************************/
+
+#include		<dlfcn.h>
+#include		<stdio.h>
+#include		<stdlib.h>
+#include		<string.h>
+#include		<time.h>
+#include		"voAAC.h"
+#include		"cmnMemory.h"
+
+#define  VO_AAC_E_OUTPUT	  1
+#define READ_SIZE	(1024*8)	
+unsigned char outBuf[1024*8];
+unsigned char inBuf[READ_SIZE];
+
+const char* HelpString = 
+"VisualOn AAC encoder Usage:\n"
+"voAACEncTest -if <inputfile.pcm> -of <outputfile.aac> -sr <samplerate> -ch <channel> -br <bitrate> -adts <adts> \n"
+"-if input file name \n"
+"-of output file name \n"
+"-sr input pcm samplerate, default 44100 \n"
+"-ch input pcm channel, default 2 channel \n"
+"-br encoded aac bitrate, default 64000 * (samplerate/100)*channel/441(480)\n"
+"-adts add or no adts header, default add adts header\n"
+"For example: \n"
+"./voAACEncTest -if raw.pcm -of raw.aac -sr 44100 -ch 2 -br 128000\n";
+
+static int parsecmdline(int argc, char **argv,char  **input_filename, char  **output_filename, AACENC_PARAM *param)
+{
+	// notice that:
+	// bitRate/nChannels > 8000
+	// bitRate/nChannels < 160000 
+	// bitRate/nChannels < sampleRate*6
+	param->adtsUsed = 1;
+	param->bitRate = 0;
+	param->nChannels = 2;
+	param->sampleRate = 44100;
+
+	if(argc < 5 || argc > 13)
+	{
+		return -1;
+	}
+
+	argc--;
+	argv++;
+	while (argc > 0)
+	{
+		if (!strcmp(*argv, "-if"))
+		{
+			argv++;
+			argc--;
+			*input_filename = *argv; 
+		}
+		else if (!strcmp(*argv, "-of"))
+		{
+			argv++;
+			argc--;
+			*output_filename = *argv;
+		}
+		else if (!strcmp(*argv, "-sr"))
+		{
+			argv++;
+			argc--;
+			param->sampleRate = atoi(*argv);
+		}
+		else if (!strcmp(*argv, "-ch"))
+		{
+			argv++;
+			argc--;
+			param->nChannels = atoi(*argv);
+		}
+		else if (!strcmp(*argv, "-br"))
+		{
+			argv++;
+			argc--;
+			param->bitRate = atoi(*argv);
+		}
+		else if(!strcmp(*argv, "-adts"))
+		{
+			argv++;
+			argc--;
+			param->adtsUsed = atoi(*argv);
+		}
+		else
+		{
+			return -1;
+		}
+
+		argv++;
+		argc--;
+	}
+
+	if(param->bitRate == 0)
+	{
+		int scale = 441;
+		if(param->sampleRate%8000 == 0)
+			scale = 480;
+		param->bitRate = 640*param->nChannels*param->sampleRate/scale;
+	}
+
+	return 0;
+}
+
+int ReadFile2Buf(FILE* infile,unsigned char* dest,int readSize)
+{
+	int readBytes = 0;
+	readBytes = fread(dest, 1, readSize, infile);
+	return readBytes;
+}
+
+typedef int (VO_API * VOGETAUDIODECAPI) (VO_AUDIO_CODECAPI * pDecHandle);
+
+int main(int argc, char **argv)
+{
+	FILE						*infile, *outfile;
+	int							t1, t2;
+	VO_AUDIO_CODECAPI			AudioAPI;
+	VO_MEM_OPERATOR				moper;
+	VO_CODEC_INIT_USERDATA		useData;
+	VO_HANDLE					hCodec;
+	VO_CODECBUFFER				inData;
+	VO_CODECBUFFER				outData;
+	VO_AUDIO_OUTPUTINFO			outInfo;
+    int							firstWrite = 1;
+	int							eofFile = 0;
+	int							*info=(int*)inBuf;
+	int							bytesLeft, nRead;
+	int							EncoderdFrame = 0;
+	int							total = 0;
+	int							isOutput = 1;
+	int							returnCode;
+	AACENC_PARAM				aacpara;
+	void						*handle;
+	void						*pfunc;
+	VOGETAUDIODECAPI			pGetAPI;
+	const char					*infileName = NULL;
+    const char					*outfileName = NULL;
+
+	returnCode = parsecmdline(argc,argv, &infileName, &outfileName, &aacpara);
+	if(returnCode)
+	{
+		printf("%s", HelpString);
+		return 0;
+	}
+
+	/* open input file */
+	infile = fopen(infileName, "rb");
+	if (!infile) {
+		printf("Open input file fail...");
+		return -1;
+	}
+
+	/* open output file */
+	if(isOutput)
+	{
+		outfile = fopen(outfileName, "wb");
+		if (!outfile) {
+			printf("Open output file fail...");
+			return -1;
+		}
+	}
+	// set memory operators;
+	moper.Alloc = cmnMemAlloc;
+	moper.Copy = cmnMemCopy;
+	moper.Free = cmnMemFree;
+	moper.Set = cmnMemSet;
+	moper.Check = cmnMemCheck;
+	useData.memflag = VO_IMF_USERMEMOPERATOR;
+	useData.memData = (VO_PTR)(&moper);
+	// open encoder dll;
+	handle = dlopen("libstagefright.so", RTLD_NOW);
+	if(handle == 0)
+	{
+		printf("open dll error......");
+		return -1;
+	}
+	// Get API;
+	pfunc = dlsym(handle, "voGetAACEncAPI");
+	if(pfunc == 0)
+	{
+		printf("open function error......");
+		return -1;
+	}
+	pGetAPI = (VOGETAUDIODECAPI)pfunc;
+	returnCode  = pGetAPI(&AudioAPI);
+	if(returnCode)
+		return -1;
+
+
+//#######################################   Init Encoding Section   #########################################
+	returnCode = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAAC, &useData);
+	if(returnCode < 0)
+	{
+		printf("#### VOI_Error2:fail to initialize the Encoderr###\n");
+		return -1;
+	}
+
+	returnCode = AudioAPI.SetParam(hCodec, VO_PID_AAC_ENCPARAM, &aacpara);
+
+	inData.Buffer = inBuf;
+	bytesLeft = ReadFile2Buf(infile,inData.Buffer,READ_SIZE);
+
+//#######################################    Encoding Section   #########################################
+
+	do {
+
+		inData.Length    = bytesLeft;
+		outData.Buffer   = outBuf;
+		outData.Length = 1024*8;
+
+		t1 = clock();
+
+		returnCode = AudioAPI.SetInputData(hCodec,&inData);
+
+		do {
+			outData.Buffer   = outBuf;
+			outData.Length = 1024*8;
+
+			returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outInfo);
+
+			if(returnCode == 0)
+				EncoderdFrame++;
+			if(returnCode == VO_ERR_LICENSE_ERROR)
+				break;
+
+#if VO_AAC_E_OUTPUT
+			if (isOutput && returnCode == 0)
+			{
+				fwrite(outData.Buffer, 1, outData.Length, outfile);
+			}
+#endif
+		} while(returnCode != (VO_ERR_INPUT_BUFFER_SMALL));
+
+		if(returnCode == VO_ERR_LICENSE_ERROR)
+			break;
+
+		t2 = clock();
+		total += t2 - t1;
+
+		if (!eofFile) {
+			nRead = ReadFile2Buf(infile, inBuf,READ_SIZE);
+			bytesLeft = nRead;
+			inData.Buffer = inBuf;
+			if (feof(infile))
+				eofFile = 1;
+		}
+
+	} while (!eofFile && returnCode);
+
+
+//################################################  End Encoding Section  #######################################################
+	returnCode = AudioAPI.Uninit(hCodec);
+
+	fclose(infile);
+	if (outfile)
+    {
+        fclose(outfile);
+    }
+	dlclose(handle);
+	return 0;
+}
+
+
diff --git a/media/libstagefright/codecs/aacenc/basic_op/basic_op.h b/media/libstagefright/codecs/aacenc/basic_op/basic_op.h
index 5457f33..8291684 100644
--- a/media/libstagefright/codecs/aacenc/basic_op/basic_op.h
+++ b/media/libstagefright/codecs/aacenc/basic_op/basic_op.h
@@ -1,27 +1,27 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		basicop2.h

-

-	Content:	Constants , Globals and Basic arithmetic operators.

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		basicop2.h
+
+	Content:	Constants , Globals and Basic arithmetic operators.
+
 *******************************************************************************/
 
 #ifndef __BASIC_OP_H
-#define __BASIC_OP_H

+#define __BASIC_OP_H
 
 #include "typedef.h"
 
@@ -30,1137 +30,1137 @@
 
 #define MAX_16 (Word16)0x7fff
 #define MIN_16 (Word16)0x8000
-#define ABS(a)	((a) >= 0) ? (a) : (-(a))

-

-/* Short abs,           1   */

-#define abs_s(x)       ((Word16)(((x) != MIN_16) ? (((x) >= 0) ? (x) : (-(x))) : MAX_16))

-

-/* 16 bit var1 -> MSB,     2 */

-#define L_deposit_h(x) (((Word32)(x)) << 16)

-

-

-/* 16 bit var1 -> LSB,     2 */

-#define L_deposit_l(x) ((Word32)(x))

-

-

-/* Long abs,              3  */

-#define L_abs(x) (((x) != MIN_32) ? (((x) >= 0) ? (x) : (-(x))) : MAX_32)

-

-

-/* Short negate,        1   */

-#define negate(var1) ((Word16)(((var1) == MIN_16) ? MAX_16 : (-(var1))))

-

-

-/* Long negate,     2 */

-#define L_negate(L_var1) (((L_var1) == (MIN_32)) ? (MAX_32) : (-(L_var1)))

-

-

-#define MULHIGH(A,B) (int)(((Word64)(A)*(Word64)(B)) >> 32)

-#define fixmul(a, b) (int)((((Word64)(a)*(Word64)(b)) >> 32) << 1)

-

-

-#if  (SATRUATE_IS_INLINE)

-__inline Word16 saturate(Word32 L_var1);

-#else

-Word16 saturate(Word32 L_var1);

-#endif

-

-/* Short shift left,    1   */

-#if (SHL_IS_INLINE)

-__inline Word16 shl (Word16 var1, Word16 var2);

-#else

-Word16 shl (Word16 var1, Word16 var2);

-#endif

-

-/* Short shift right,   1   */

-#if (SHR_IS_INLINE)

-__inline Word16 shr (Word16 var1, Word16 var2);

-#else

-Word16 shr (Word16 var1, Word16 var2);

-#endif

-

-#if (L_MULT_IS_INLINE)

-__inline Word32 L_mult(Word16 var1, Word16 var2);

-#else

-Word32 L_mult(Word16 var1, Word16 var2);

-#endif

-

-/* Msu,  1  */

-#if (L_MSU_IS_INLINE)

-__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);

-#else

-Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);

-#endif

-    

-/* Long sub,        2 */

-#if (L_SUB_IS_INLINE)

-__inline Word32 L_sub(Word32 L_var1, Word32 L_var2);

-#else

-Word32 L_sub(Word32 L_var1, Word32 L_var2);

-#endif

-

-/* Long shift left, 2 */

-#if (L_SHL_IS_INLINE)

-__inline Word32 L_shl (Word32 L_var1, Word16 var2);

-#else

-Word32 L_shl (Word32 L_var1, Word16 var2);

-#endif

-

-/* Long shift right, 2*/

-#if (L_SHR_IS_INLINE)

-__inline Word32 L_shr (Word32 L_var1, Word16 var2);

-#else

-Word32 L_shr (Word32 L_var1, Word16 var2);

-#endif

-

-/* Short add,           1   */

-#if (ADD_IS_INLINE)

-__inline Word16 add (Word16 var1, Word16 var2);

-#else

-Word16 add (Word16 var1, Word16 var2);

-#endif

-    

-/* Short sub,           1   */

-#if (SUB_IS_INLINE)

-__inline Word16 sub(Word16 var1, Word16 var2);

-#else

-Word16 sub(Word16 var1, Word16 var2);

-#endif

-

-/* Short division,       18  */

-#if (DIV_S_IS_INLINE)

-__inline Word16 div_s (Word16 var1, Word16 var2);

-#else

-Word16 div_s (Word16 var1, Word16 var2);

-#endif

-

-/* Short mult,          1   */

-#if (MULT_IS_INLINE)

-__inline Word16 mult (Word16 var1, Word16 var2);

-#else

-Word16 mult (Word16 var1, Word16 var2);

-#endif

-

-/* Short norm,           15  */

-#if (NORM_S_IS_INLINE)

-__inline Word16 norm_s (Word16 var1);

-#else

-Word16 norm_s (Word16 var1);

-#endif

-

-/* Long norm,            30  */

-#if (NORM_L_IS_INLINE)

-__inline Word16 norm_l (Word32 L_var1);

-#else

-Word16 norm_l (Word32 L_var1);

-#endif

-

-/* Round,               1   */

-#if (ROUND_IS_INLINE)

-__inline Word16 round16(Word32 L_var1);

-#else

-Word16 round16(Word32 L_var1);

-#endif

-

-/* Mac,  1  */

-#if (L_MAC_IS_INLINE)

-__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2);

-#else

-Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2);

-#endif

-

-#if (L_ADD_IS_INLINE)

-__inline Word32 L_add (Word32 L_var1, Word32 L_var2);

-#else

-Word32 L_add (Word32 L_var1, Word32 L_var2);

-#endif

-

-/* Extract high,        1   */

-#if (EXTRACT_H_IS_INLINE)

-__inline Word16 extract_h (Word32 L_var1);

-#else

-Word16 extract_h (Word32 L_var1);

-#endif

-

-/* Extract low,         1   */

-#if (EXTRACT_L_IS_INLINE)

-__inline Word16 extract_l(Word32 L_var1);

-#else

-Word16 extract_l(Word32 L_var1);

-#endif

-

-/* Mult with round, 2 */

-#if (MULT_R_IS_INLINE)

-__inline Word16 mult_r(Word16 var1, Word16 var2);

-#else

-Word16 mult_r(Word16 var1, Word16 var2);

-#endif

-

-/* Shift right with round, 2           */

-#if (SHR_R_IS_INLINE)

-__inline Word16 shr_r (Word16 var1, Word16 var2);

-#else

-Word16 shr_r (Word16 var1, Word16 var2);

-#endif

-

-/* Mac with rounding,2 */

-#if (MAC_R_IS_INLINE)

-__inline Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2);

-#else

-Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2);

-#endif

-

-/* Msu with rounding,2 */

-#if (MSU_R_IS_INLINE)

-__inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2);

-#else

-Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2);

-#endif

-

-/* Long shift right with round,  3             */

-#if (L_SHR_R_IS_INLINE)

-__inline Word32 L_shr_r (Word32 L_var1, Word16 var2);

-#else

-Word32 L_shr_r (Word32 L_var1, Word16 var2);

-#endif

-

-#if ARMV4_INASM

-__inline Word32 ASM_L_shr(Word32 L_var1, Word16 var2)

-{

-	Word32 result; 

-	asm volatile( 

-		"MOV %[result], %[L_var1], ASR %[var2] \n" 

-		:[result]"=r"(result)

-		:[L_var1]"r"(L_var1), [var2]"r"(var2)

-		); 

-	return result;	

-}

- 

-__inline Word32 ASM_L_shl(Word32 L_var1, Word16 var2)

-{

-	Word32 result; 

-	asm volatile( 

-		"MOV	r2, %[L_var1] \n"

-		"MOV	r3, #0x7fffffff\n"

-		"MOV	%[result], %[L_var1], ASL %[var2] \n" 

-		"TEQ	r2, %[result], ASR %[var2]\n"

-		"EORNE  %[result],r3,r2,ASR#31\n"

-		:[result]"+r"(result)

-		:[L_var1]"r"(L_var1), [var2]"r"(var2)

-		:"r2", "r3"

-		); 

-	return result;	

-}

-

-__inline Word32 ASM_shr(Word32 L_var1, Word16 var2)

-{

-	Word32 result; 

-	asm volatile( 

-		"CMP	%[var2], #15\n"

-		"MOVGE  %[var2], #15\n"

-		"MOV	%[result], %[L_var1], ASR %[var2]\n"

-		:[result]"=r"(result)

-		:[L_var1]"r"(L_var1), [var2]"r"(var2) 

-		); 

-	return result;	

-} 

-

-__inline Word32 ASM_shl(Word32 L_var1, Word16 var2)

-{

-	Word32 result; 

-	asm volatile( 

-		"CMP	%[var2], #16\n"

-		"MOVGE  %[var2], #16\n"

-		"MOV    %[result], %[L_var1], ASL %[var2]\n"

-		"MOV    r3, #1\n"

-        "MOV    r2, %[result], ASR #15\n"

-        "RSB    r3,r3,r3,LSL #15 \n"

-        "TEQ    r2, %[result], ASR #31 \n"

-        "EORNE  %[result], r3, %[result],ASR #31"

-		:[result]"+r"(result)

-		:[L_var1]"r"(L_var1), [var2]"r"(var2)

-		:"r2", "r3"

-		); 

-	return result;	

-} 

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   definitions for inline basic arithmetic operators                       |

- |___________________________________________________________________________|

-*/

-#if (SATRUATE_IS_INLINE)

-__inline Word16 saturate(Word32 L_var1)

-{

-#if ARMV5TE_SAT

-	Word16 result;

-	asm volatile (

-		"MOV	%[result], %[L_var1]\n"

-		"MOV	r3, #1\n"

-		"MOV	r2,%[L_var1],ASR#15\n"

-		"RSB	r3, r3, r3, LSL #15\n"

-		"TEQ	r2,%[L_var1],ASR#31\n"	

-		"EORNE	%[result],r3,%[L_var1],ASR#31\n"

-		:[result]"+r"(result)

-		:[L_var1]"r"(L_var1)

-		:"r2", "r3"			

-	);

-

-	return result;

-#else

-    Word16 var_out;

-    

-    //var_out = (L_var1 > (Word32)0X00007fffL) ? (MAX_16) : ((L_var1 < (Word32)0xffff8000L) ? (MIN_16) : ((Word16)L_var1));

-

-    if (L_var1 > 0X00007fffL)

-    {

-        var_out = MAX_16;

-    }

-    else if (L_var1 < (Word32) 0xffff8000L)

-    {

-        var_out = MIN_16;

-    }

-    else

-    {

-        var_out = extract_l(L_var1);

-    }

-

-    return (var_out);

-#endif

-}

-#endif

-

-/* Short shift left,    1   */

-#if (SHL_IS_INLINE)

-__inline Word16 shl (Word16 var1, Word16 var2)

-{

-#if ARMV5TE_SHL

-	if(var2>=0)

-	{

-		return ASM_shl( var1, var2);

-	}

-	else

-	{

-		return ASM_shr( var1, -var2);

-	}

-#else

-    Word16 var_out;

-    Word32 result;

-

-    if (var2 < 0)

-    {

-        var_out = shr (var1, (Word16)-var2);

-    }

-    else

-    {

-        result = (Word32) var1 *((Word32) 1 << var2);

-

-        if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result)))

-        {

-            var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16);

-        }

-        else

-        {

-            var_out = extract_l(result);

-        }

-    }

-    return (var_out);

-#endif

-}

-#endif

-

-/* Short shift right,   1   */

-#if (SHR_IS_INLINE)

-__inline Word16 shr (Word16 var1, Word16 var2)

-{

-#if ARMV5TE_SHR

-	if(var2>=0)

-	{

-		return  ASM_shr( var1, var2);

-	}

-	else

-	{

-		return  ASM_shl( var1, -var2);

-	}

-#else

-    Word16 var_out;

-

-    if (var2 < 0)

-    {

-        var_out = shl (var1, (Word16)-var2);

-    }

-    else

-    {

-        if (var2 >= 15)

-        {

-            var_out = (Word16)((var1 < 0) ? -1 : 0);

-        }

-        else

-        {

-            if (var1 < 0)

-            {

-                var_out = (Word16)(~((~var1) >> var2));

-            }

-            else

-            {

-                var_out = (Word16)(var1 >> var2);

-            }

-        }

-    }

-

-    return (var_out);

-#endif

-}

-#endif

-

-

-#if (L_MULT_IS_INLINE)

-__inline Word32 L_mult(Word16 var1, Word16 var2)

-{

-#if ARMV5TE_L_MULT

-	Word32 result; 

-	asm volatile( 

-		"SMULBB %[result], %[var1], %[var2] \n" 

-		"QADD %[result], %[result], %[result] \n" 

-		:[result]"+r"(result)

-		:[var1]"r"(var1), [var2]"r"(var2)

-		); 

-	return result;

-#else

-    Word32 L_var_out;

-

-    L_var_out = (Word32) var1 *(Word32) var2;

-

-    if (L_var_out != (Word32) 0x40000000L)

-    {

-        L_var_out <<= 1;

-    }

-    else

-    {

-        L_var_out = MAX_32;

-    }

-    return (L_var_out);

-#endif

-}

-#endif

-

-#if (L_MSU_IS_INLINE)

-__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)

-{

-#if ARMV5TE_L_MSU

-	Word32 result; 

-	asm volatile( 

-		"SMULBB %[result], %[var1], %[var2] \n" 

-		"QADD %[result], %[result], %[result] \n"

-		"QSUB %[result], %[L_var3], %[result]\n"

-		:[result]"+r"(result)

-		:[L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)

-		); 

-	return result;

-#else

-    Word32 L_var_out;

-    Word32 L_product;

-

-    L_product = L_mult(var1, var2);

-    L_var_out = L_sub(L_var3, L_product);

-    return (L_var_out);

-#endif

-}

-#endif

-

-#if (L_SUB_IS_INLINE)

-__inline Word32 L_sub(Word32 L_var1, Word32 L_var2)

-{

-#if ARMV5TE_L_SUB

-	Word32 result; 

-	asm volatile( 

-		"QSUB %[result], %[L_var1], %[L_var2]\n"

-		:[result]"+r"(result)

-		:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)

-		); 

-	return result;

-#else

-    Word32 L_var_out;

-

-    L_var_out = L_var1 - L_var2;

-

-    if (((L_var1 ^ L_var2) & MIN_32) != 0)

-    {

-        if ((L_var_out ^ L_var1) & MIN_32)

-        {

-            L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;

-        }

-    }

-

-    return (L_var_out);

-#endif

-}

-#endif

-

-#if (L_SHL_IS_INLINE)

-__inline Word32 L_shl(Word32 L_var1, Word16 var2)

-{

-#if ARMV5TE_L_SHL

-    if(var2>=0)

-    {

-        return  ASM_L_shl( L_var1, var2);

-    }

-    else

-    {

-        return  ASM_L_shr( L_var1, -var2);

-    }

-#else

-    Word32 L_var_out = 0L;

-

-    if (var2 <= 0)

-    {

-        L_var1 = L_shr(L_var1, (Word16)-var2);

-    }

-    else

-    {

-        for (; var2 > 0; var2--)

-        {

-            if (L_var1 > (Word32) 0X3fffffffL)

-            {

-                return MAX_32;

-            }

-            else

-            {

-                if (L_var1 < (Word32) 0xc0000000L)

-                {

-                    return MIN_32;

-                }

-            }

-            L_var1 <<= 1;

-            L_var_out = L_var1;

-        }

-    }

-    return (L_var1);

-#endif

-}

-#endif

-

-#if (L_SHR_IS_INLINE)

-__inline Word32 L_shr (Word32 L_var1, Word16 var2)

-{

-#if ARMV5TE_L_SHR

-	if(var2>=0)

-	{

-		return ASM_L_shr( L_var1, var2);

-	}

-	else

-	{

-		return ASM_L_shl( L_var1, -var2);

-	}

-#else

-    Word32 L_var_out;

-

-    if (var2 < 0)

-    {

-        L_var_out = L_shl (L_var1, (Word16)-var2);

-    }

-    else

-    {

-        if (var2 >= 31)

-        {

-            L_var_out = (L_var1 < 0L) ? -1 : 0;

-        }

-        else

-        {

-            if (L_var1 < 0)

-            {

-                L_var_out = ~((~L_var1) >> var2);

-            }

-            else

-            {

-                L_var_out = L_var1 >> var2;

-            }

-        }

-    }

-    return (L_var_out);

-#endif

-}

-#endif

-

-/* Short add,           1   */

-#if (ADD_IS_INLINE)

-__inline Word16 add (Word16 var1, Word16 var2)

-{

-#if ARMV5TE_ADD

-	Word32 result; 

-	asm volatile( 

-		"ADD  %[result], %[var1], %[var2] \n" 

-		"MOV  r3, #0x1\n"

-		"MOV  r2, %[result], ASR #15\n"

-		"RSB  r3, r3, r3, LSL, #15\n"

-		"TEQ  r2, %[result], ASR #31\n"

-		"EORNE %[result], r3, %[result], ASR #31"

-		:[result]"+r"(result)

-		:[var1]"r"(var1), [var2]"r"(var2)

-		:"r2", "r3"

-		); 

-	return result;

-#else

-    Word16 var_out;

-    Word32 L_sum;

-

-    L_sum = (Word32) var1 + var2;

-    var_out = saturate(L_sum);

-

-    return (var_out);

-#endif

-}

-#endif

-

-/* Short sub,           1   */

-#if (SUB_IS_INLINE)

-__inline Word16 sub(Word16 var1, Word16 var2)

-{

-#if ARMV5TE_SUB

-	Word32 result; 

-	asm volatile( 

-		"MOV   r3, #1\n"

-		"SUB   %[result], %[var1], %[var2] \n"		

-		"RSB   r3,r3,r3,LSL#15\n"

-		"MOV   r2, %[var1], ASR #15 \n" 

-		"TEQ   r2, %[var1], ASR #31 \n"

-		"EORNE %[result], r3, %[result], ASR #31 \n"

-		:[result]"+r"(result)

-		:[var1]"r"(var1), [var2]"r"(var2)

-		:"r2", "r3"

-		); 

-	return result;

-#else

-    Word16 var_out;

-    Word32 L_diff;

-

-    L_diff = (Word32) var1 - var2;

-    var_out = saturate(L_diff);

-   

-    return (var_out);

-#endif

-}

-#endif

-

-/* Short division,       18  */

-#if (DIV_S_IS_INLINE)

-__inline Word16 div_s (Word16 var1, Word16 var2)

-{

-    Word16 var_out = 0;

-    Word16 iteration;

-    Word32 L_num;

-    Word32 L_denom;

-

-    var_out = MAX_16;

-    if (var1!= var2)//var1!= var2

-    {

-    	var_out = 0;

-    	L_num = (Word32) var1;

-    

-    	L_denom = (Word32) var2;

-    	

-		//return (L_num<<15)/var2;

-

-    	for (iteration = 0; iteration < 15; iteration++)

-    	{

-    		var_out <<= 1;

-    		L_num <<= 1;

-    		

-    		if (L_num >= L_denom)

-    		{

-    			L_num -= L_denom;

-    			var_out++;

-    		}

-    	}

-    }

-    return (var_out);

-}

-#endif

-

-/* Short mult,          1   */

-#if (MULT_IS_INLINE)

-__inline Word16 mult (Word16 var1, Word16 var2)

-{

-#if ARMV5TE_MULT

-	Word32 result; 

-	asm volatile( 

-		"SMULBB r2, %[var1], %[var2] \n"

-		"MOV	r3, #1\n"

-		"MOV	%[result], r2, ASR #15\n"

-		"RSB	r3, r3, r3, LSL #15\n"

-		"MOV	r2, %[result], ASR #15\n"

-		"TEQ	r2, %[result], ASR #31\n"

-		"EORNE  %[result], r3, %[result], ASR #31 \n"

-		:[result]"+r"(result)

-		:[var1]"r"(var1), [var2]"r"(var2)

-		:"r2", "r3"

-		); 

-	return result;

-#else

-    Word16 var_out;

-    Word32 L_product;

-

-    L_product = (Word32) var1 *(Word32) var2;

-    L_product = (L_product & (Word32) 0xffff8000L) >> 15;

-    if (L_product & (Word32) 0x00010000L)

-        L_product = L_product | (Word32) 0xffff0000L;

-    var_out = saturate(L_product);

-

-    return (var_out);

-#endif

-}

-#endif

-

-

-/* Short norm,           15  */

-#if (NORM_S_IS_INLINE)

-__inline Word16 norm_s (Word16 var1)

-{

-#if ARMV5TE_NORM_S

-	Word16 result; 

-	asm volatile( 

-		"MOV   r2,%[var1] \n"

-		"CMP   r2, #0\n"

-		"RSBLT %[var1], %[var1], #0 \n"

-		"CLZNE %[result], %[var1]\n"

-		"SUBNE %[result], %[result], #17\n"

-		"MOVEQ %[result], #0\n"

-		"CMP   r2, #-1\n"

-		"MOVEQ %[result], #15\n" 

-		:[result]"+r"(result)

-		:[var1]"r"(var1)

-		:"r2"

-		); 

-	return result;

-#else

-    Word16 var_out;

-

-    if (var1 == 0)

-    {

-        var_out = 0;

-    }

-    else

-    {

-        if (var1 == -1)

-        {

-            var_out = 15;

-        }

-        else

-        {

-            if (var1 < 0)

-            {

-                var1 = (Word16)~var1;

-            }

-            for (var_out = 0; var1 < 0x4000; var_out++)

-            {

-                var1 <<= 1;

-            }

-        }

-    }

-    return (var_out);

-#endif

-}

-#endif

-

-/* Long norm,            30  */

-#if (NORM_L_IS_INLINE)

-__inline Word16 norm_l (Word32 L_var1)

-{

-#if ARMV5TE_NORM_L

-	Word16 result; 

-	asm volatile( 

-		"CMP    %[L_var1], #0\n"

-		"CLZNE  %[result], %[L_var1]\n"

-		"SUBNE  %[result], %[result], #1\n" 

-		"MOVEQ  %[result], #0\n"

-		:[result]"+r"(result)

-		:[L_var1]"r"(L_var1)

-		); 

-	return result;

-#else

-    //Word16 var_out;

-

-    //if (L_var1 == 0)

-    //{

-    //    var_out = 0;

-    //}

-    //else

-    //{

-    //    if (L_var1 == (Word32) 0xffffffffL)

-    //    {

-    //        var_out = 31;

-    //    }

-    //    else

-    //    {

-    //        if (L_var1 < 0)

-    //        {

-    //            L_var1 = ~L_var1;

-    //        }

-    //        for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)

-    //        {

-    //            L_var1 <<= 1;

-    //        }

-    //    }

-    //}

-    //return (var_out);

-  Word16 a16;

-  Word16 r = 0 ;       

-

-   

-  if ( L_var1 < 0 ) {

-    L_var1 = ~L_var1; 

-  }

-

-  if (0 == (L_var1 & 0x7fff8000)) {

-    a16 = extract_l(L_var1);

-    r += 16;

-       

-    if (0 == (a16 & 0x7f80)) {

-      r += 8;

-         

-      if (0 == (a16 & 0x0078)) {

-        r += 4;

-           

-        if (0 == (a16 & 0x0006)) {

-          r += 2;

-             

-          if (0 == (a16 & 0x0001)) {

-            r += 1;

-          }

-        }

-        else {

-             

-          if (0 == (a16 & 0x0004)) {

-            r += 1;

-          }

-        }

-      }

-      else {

-           

-        if (0 == (a16 & 0x0060)) {

-          r += 2;

-             

-          if (0 == (a16 & 0x0010)) {

-            r += 1;

-          }

-        }

-        else {

-             

-          if (0 == (a16 & 0x0040)) {

-            r += 1;

-          }

-        }

-      }

-    } 

-    else { 

-         

-      if (0 == (a16 & 0x7800)) {

-        r += 4;

-           

-        if (0 == (a16 & 0x0600)) {

-          r += 2;

-             

-          if (0 == (a16 & 0x0100)) {

-            r += 1;

-          }

-        }

-        else {

-             

-          if (0 == (a16 & 0x0400)) {

-            r += 1;

-          }

-        }

-      }

-      else {

-           

-        if (0 == (a16 & 0x6000)) {

-          r += 2;

-             

-          if (0 == (a16 & 0x1000)) {

-            r += 1;

-          }

-        }

-        else {

-             

-          if (0 == (a16 & 0x4000)) {

-            r += 1;

-          }

-        }

-      }

-    }

-  }

-  else {

-    a16 = extract_h(L_var1);

-       

-    if (0 == (a16 & 0x7f80)) {

-      r += 8;

-         

-      if (0 == (a16 & 0x0078)) {

-        r += 4 ;

-           

-        if (0 == (a16 & 0x0006)) {

-          r += 2;

-             

-          if (0 == (a16 & 0x0001)) {

-            r += 1;

-          }

-        }

-        else {

-             

-          if (0 == (a16 & 0x0004)) {

-            r += 1;

-          }

-        }

-      }

-      else {

-           

-        if (0 == (a16 & 0x0060)) {

-          r += 2;

-             

-          if (0 == (a16 & 0x0010)) {

-            r += 1;

-          }

-        }

-        else {

-             

-          if (0 == (a16 & 0x0040)) {

-            r += 1;

-          }

-        }

-      }

-    }

-    else {

-         

-      if (0 == (a16 & 0x7800)) {

-        r += 4;

-           

-        if (0 == (a16 & 0x0600)) {

-          r += 2;

-             

-          if (0 == (a16 & 0x0100)) {

-            r += 1;

-          }

-        }

-        else {

-             

-          if (0 == (a16 & 0x0400)) {

-            r += 1;

-          }

-        }

-      }

-      else {

-           

-        if (0 == (a16 & 0x6000)) {

-          r += 2;

-             

-          if (0 == (a16 & 0x1000)) {

-            r += 1;

-          }

-        }

-        else {

-             

-          if (0 == (a16 & 0x4000)) {

-            return 1;

-          }

-        }

-      }

-    }

-  }

-  

-  return r ;

-#endif

-}

-#endif

-

-/* Round,               1   */

-#if (ROUND_IS_INLINE)

-__inline Word16 round16(Word32 L_var1)

-{

-#if ARMV5TE_ROUND

-	Word16 result; 

-	asm volatile( 

-		"MOV   r1,#0x00008000\n"

-		"QADD  %[result], %[L_var1], r1\n"

-		"MOV   %[result], %[result], ASR #16 \n" 

-		:[result]"+r"(result)

-		:[L_var1]"r"(L_var1)

-		:"r1"

-		); 

-	return result;

-#else   

-    Word16 var_out;

-    Word32 L_rounded;

-

-    L_rounded = L_add (L_var1, (Word32) 0x00008000L);

-    var_out = extract_h (L_rounded);

-    return (var_out);

-#endif

-}

-#endif

-

-/* Mac,  1  */

-#if (L_MAC_IS_INLINE)

-__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)

-{

-#if ARMV5TE_L_MAC

-	Word32 result; 

-	asm volatile( 

-		"SMULBB %[result], %[var1], %[var2]\n"

-		"QADD	%[result], %[result], %[result]\n"

-		"QADD   %[result], %[result], %[L_var3]\n"

-		:[result]"+r"(result)

-		: [L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)

-		); 

-	return result;

-#else

-    Word32 L_var_out;

-    Word32 L_product;

-

-    L_product = L_mult(var1, var2);

-    L_var_out = L_add (L_var3, L_product);

-    return (L_var_out);

-#endif

-}

-#endif

-

-#if (L_ADD_IS_INLINE)

-__inline Word32 L_add (Word32 L_var1, Word32 L_var2)

-{

-#if ARMV5TE_L_ADD

-	Word32 result; 

-	asm volatile( 

-		"QADD %[result], %[L_var1], %[L_var2]\n"

-		:[result]"+r"(result)

-		:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)

-		); 

-	return result;

-#else

-    Word32 L_var_out;

-

-    L_var_out = L_var1 + L_var2;

-    if (((L_var1 ^ L_var2) & MIN_32) == 0)

-    {

-        if ((L_var_out ^ L_var1) & MIN_32)

-        {

-            L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;

-        }

-    }

-    return (L_var_out);

-#endif

-}

-#endif

-

-

-

-#if (MULT_R_IS_INLINE)

-__inline Word16 mult_r (Word16 var1, Word16 var2)

-{

-    Word16 var_out;

-    Word32 L_product_arr;

-

-    L_product_arr = (Word32)var1 *(Word32)var2;       /* product */

-    L_product_arr += (Word32)0x00004000L;      /* round */

-    L_product_arr >>= 15;       /* shift */

-

-    var_out = saturate(L_product_arr);

-

-    return (var_out);

-}

-#endif

-

-#if (SHR_R_IS_INLINE)

-__inline Word16 shr_r (Word16 var1, Word16 var2)

-{

-    Word16 var_out;

-

-    if (var2 > 15)

-    {

-        var_out = 0;

-    }

-    else

-    {

-        var_out = shr(var1, var2);

-

-        if (var2 > 0)

-        {

-            if ((var1 & ((Word16) 1 << (var2 - 1))) != 0)

-            {

-                var_out++;

-            }

-        }

-    }

-

-    return (var_out);

-}

-#endif

-

-#if (MAC_R_IS_INLINE)

-__inline Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2)

-{

-    Word16 var_out;

-

-    L_var3 = L_mac (L_var3, var1, var2);

-    var_out = (Word16)((L_var3 + 0x8000L) >> 16);

-

-    return (var_out);

-}

-#endif

-

-#if (MSU_R_IS_INLINE)

-__inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2)

-{

-    Word16 var_out;

-

-    L_var3 = L_msu (L_var3, var1, var2);

-    var_out = (Word16)((L_var3 + 0x8000L) >> 16);

-    

-    return (var_out);

-}

-#endif

-

-#if (L_SHR_R_IS_INLINE)

-__inline Word32 L_shr_r (Word32 L_var1, Word16 var2)

-{

-    Word32 L_var_out;

-

-    if (var2 > 31)

-    {

-        L_var_out = 0;

-    }

-    else

-    {

-        L_var_out = L_shr(L_var1, var2);

-

-        if (var2 > 0)

-        {

-            if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)

-            {

-                L_var_out++;

-            }

-        }

-    }

-

-    return (L_var_out);

-}

-#endif

-

-#if (EXTRACT_H_IS_INLINE)

-__inline Word16 extract_h (Word32 L_var1)

-{

-    Word16 var_out;

-

-    var_out = (Word16) (L_var1 >> 16);

-

-    return (var_out);

-}

-#endif

-

-#if (EXTRACT_L_IS_INLINE)

-__inline Word16 extract_l(Word32 L_var1)

-{

-	return (Word16) L_var1;

-}

-#endif

-

+#define ABS(a)	((a) >= 0) ? (a) : (-(a))
+
+/* Short abs,           1   */
+#define abs_s(x)       ((Word16)(((x) != MIN_16) ? (((x) >= 0) ? (x) : (-(x))) : MAX_16))
+
+/* 16 bit var1 -> MSB,     2 */
+#define L_deposit_h(x) (((Word32)(x)) << 16)
+
+
+/* 16 bit var1 -> LSB,     2 */
+#define L_deposit_l(x) ((Word32)(x))
+
+
+/* Long abs,              3  */
+#define L_abs(x) (((x) != MIN_32) ? (((x) >= 0) ? (x) : (-(x))) : MAX_32)
+
+
+/* Short negate,        1   */
+#define negate(var1) ((Word16)(((var1) == MIN_16) ? MAX_16 : (-(var1))))
+
+
+/* Long negate,     2 */
+#define L_negate(L_var1) (((L_var1) == (MIN_32)) ? (MAX_32) : (-(L_var1)))
+
+
+#define MULHIGH(A,B) (int)(((Word64)(A)*(Word64)(B)) >> 32)
+#define fixmul(a, b) (int)((((Word64)(a)*(Word64)(b)) >> 32) << 1)
+
+
+#if  (SATRUATE_IS_INLINE)
+__inline Word16 saturate(Word32 L_var1);
+#else
+Word16 saturate(Word32 L_var1);
+#endif
+
+/* Short shift left,    1   */
+#if (SHL_IS_INLINE)
+__inline Word16 shl (Word16 var1, Word16 var2);
+#else
+Word16 shl (Word16 var1, Word16 var2);
+#endif
+
+/* Short shift right,   1   */
+#if (SHR_IS_INLINE)
+__inline Word16 shr (Word16 var1, Word16 var2);
+#else
+Word16 shr (Word16 var1, Word16 var2);
+#endif
+
+#if (L_MULT_IS_INLINE)
+__inline Word32 L_mult(Word16 var1, Word16 var2);
+#else
+Word32 L_mult(Word16 var1, Word16 var2);
+#endif
+
+/* Msu,  1  */
+#if (L_MSU_IS_INLINE)
+__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);
+#else
+Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);
+#endif
+    
+/* Long sub,        2 */
+#if (L_SUB_IS_INLINE)
+__inline Word32 L_sub(Word32 L_var1, Word32 L_var2);
+#else
+Word32 L_sub(Word32 L_var1, Word32 L_var2);
+#endif
+
+/* Long shift left, 2 */
+#if (L_SHL_IS_INLINE)
+__inline Word32 L_shl (Word32 L_var1, Word16 var2);
+#else
+Word32 L_shl (Word32 L_var1, Word16 var2);
+#endif
+
+/* Long shift right, 2*/
+#if (L_SHR_IS_INLINE)
+__inline Word32 L_shr (Word32 L_var1, Word16 var2);
+#else
+Word32 L_shr (Word32 L_var1, Word16 var2);
+#endif
+
+/* Short add,           1   */
+#if (ADD_IS_INLINE)
+__inline Word16 add (Word16 var1, Word16 var2);
+#else
+Word16 add (Word16 var1, Word16 var2);
+#endif
+    
+/* Short sub,           1   */
+#if (SUB_IS_INLINE)
+__inline Word16 sub(Word16 var1, Word16 var2);
+#else
+Word16 sub(Word16 var1, Word16 var2);
+#endif
+
+/* Short division,       18  */
+#if (DIV_S_IS_INLINE)
+__inline Word16 div_s (Word16 var1, Word16 var2);
+#else
+Word16 div_s (Word16 var1, Word16 var2);
+#endif
+
+/* Short mult,          1   */
+#if (MULT_IS_INLINE)
+__inline Word16 mult (Word16 var1, Word16 var2);
+#else
+Word16 mult (Word16 var1, Word16 var2);
+#endif
+
+/* Short norm,           15  */
+#if (NORM_S_IS_INLINE)
+__inline Word16 norm_s (Word16 var1);
+#else
+Word16 norm_s (Word16 var1);
+#endif
+
+/* Long norm,            30  */
+#if (NORM_L_IS_INLINE)
+__inline Word16 norm_l (Word32 L_var1);
+#else
+Word16 norm_l (Word32 L_var1);
+#endif
+
+/* Round,               1   */
+#if (ROUND_IS_INLINE)
+__inline Word16 round16(Word32 L_var1);
+#else
+Word16 round16(Word32 L_var1);
+#endif
+
+/* Mac,  1  */
+#if (L_MAC_IS_INLINE)
+__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2);
+#else
+Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2);
+#endif
+
+#if (L_ADD_IS_INLINE)
+__inline Word32 L_add (Word32 L_var1, Word32 L_var2);
+#else
+Word32 L_add (Word32 L_var1, Word32 L_var2);
+#endif
+
+/* Extract high,        1   */
+#if (EXTRACT_H_IS_INLINE)
+__inline Word16 extract_h (Word32 L_var1);
+#else
+Word16 extract_h (Word32 L_var1);
+#endif
+
+/* Extract low,         1   */
+#if (EXTRACT_L_IS_INLINE)
+__inline Word16 extract_l(Word32 L_var1);
+#else
+Word16 extract_l(Word32 L_var1);
+#endif
+
+/* Mult with round, 2 */
+#if (MULT_R_IS_INLINE)
+__inline Word16 mult_r(Word16 var1, Word16 var2);
+#else
+Word16 mult_r(Word16 var1, Word16 var2);
+#endif
+
+/* Shift right with round, 2           */
+#if (SHR_R_IS_INLINE)
+__inline Word16 shr_r (Word16 var1, Word16 var2);
+#else
+Word16 shr_r (Word16 var1, Word16 var2);
+#endif
+
+/* Mac with rounding,2 */
+#if (MAC_R_IS_INLINE)
+__inline Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2);
+#else
+Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2);
+#endif
+
+/* Msu with rounding,2 */
+#if (MSU_R_IS_INLINE)
+__inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2);
+#else
+Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2);
+#endif
+
+/* Long shift right with round,  3             */
+#if (L_SHR_R_IS_INLINE)
+__inline Word32 L_shr_r (Word32 L_var1, Word16 var2);
+#else
+Word32 L_shr_r (Word32 L_var1, Word16 var2);
+#endif
+
+#if ARMV4_INASM
+__inline Word32 ASM_L_shr(Word32 L_var1, Word16 var2)
+{
+	Word32 result; 
+	asm volatile( 
+		"MOV %[result], %[L_var1], ASR %[var2] \n" 
+		:[result]"=r"(result)
+		:[L_var1]"r"(L_var1), [var2]"r"(var2)
+		); 
+	return result;	
+}
+ 
+__inline Word32 ASM_L_shl(Word32 L_var1, Word16 var2)
+{
+	Word32 result; 
+	asm volatile( 
+		"MOV	r2, %[L_var1] \n"
+		"MOV	r3, #0x7fffffff\n"
+		"MOV	%[result], %[L_var1], ASL %[var2] \n" 
+		"TEQ	r2, %[result], ASR %[var2]\n"
+		"EORNE  %[result],r3,r2,ASR#31\n"
+		:[result]"+r"(result)
+		:[L_var1]"r"(L_var1), [var2]"r"(var2)
+		:"r2", "r3"
+		); 
+	return result;	
+}
+
+__inline Word32 ASM_shr(Word32 L_var1, Word16 var2)
+{
+	Word32 result; 
+	asm volatile( 
+		"CMP	%[var2], #15\n"
+		"MOVGE  %[var2], #15\n"
+		"MOV	%[result], %[L_var1], ASR %[var2]\n"
+		:[result]"=r"(result)
+		:[L_var1]"r"(L_var1), [var2]"r"(var2) 
+		); 
+	return result;	
+} 
+
+__inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
+{
+	Word32 result; 
+	asm volatile( 
+		"CMP	%[var2], #16\n"
+		"MOVGE  %[var2], #16\n"
+		"MOV    %[result], %[L_var1], ASL %[var2]\n"
+		"MOV    r3, #1\n"
+        "MOV    r2, %[result], ASR #15\n"
+        "RSB    r3,r3,r3,LSL #15 \n"
+        "TEQ    r2, %[result], ASR #31 \n"
+        "EORNE  %[result], r3, %[result],ASR #31"
+		:[result]"+r"(result)
+		:[L_var1]"r"(L_var1), [var2]"r"(var2)
+		:"r2", "r3"
+		); 
+	return result;	
+} 
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   definitions for inline basic arithmetic operators                       |
+ |___________________________________________________________________________|
+*/
+#if (SATRUATE_IS_INLINE)
+__inline Word16 saturate(Word32 L_var1)
+{
+#if ARMV5TE_SAT
+	Word16 result;
+	asm volatile (
+		"MOV	%[result], %[L_var1]\n"
+		"MOV	r3, #1\n"
+		"MOV	r2,%[L_var1],ASR#15\n"
+		"RSB	r3, r3, r3, LSL #15\n"
+		"TEQ	r2,%[L_var1],ASR#31\n"	
+		"EORNE	%[result],r3,%[L_var1],ASR#31\n"
+		:[result]"+r"(result)
+		:[L_var1]"r"(L_var1)
+		:"r2", "r3"			
+	);
+
+	return result;
+#else
+    Word16 var_out;
+    
+    //var_out = (L_var1 > (Word32)0X00007fffL) ? (MAX_16) : ((L_var1 < (Word32)0xffff8000L) ? (MIN_16) : ((Word16)L_var1));
+
+    if (L_var1 > 0X00007fffL)
+    {
+        var_out = MAX_16;
+    }
+    else if (L_var1 < (Word32) 0xffff8000L)
+    {
+        var_out = MIN_16;
+    }
+    else
+    {
+        var_out = extract_l(L_var1);
+    }
+
+    return (var_out);
+#endif
+}
+#endif
+
+/* Short shift left,    1   */
+#if (SHL_IS_INLINE)
+__inline Word16 shl (Word16 var1, Word16 var2)
+{
+#if ARMV5TE_SHL
+	if(var2>=0)
+	{
+		return ASM_shl( var1, var2);
+	}
+	else
+	{
+		return ASM_shr( var1, -var2);
+	}
+#else
+    Word16 var_out;
+    Word32 result;
+
+    if (var2 < 0)
+    {
+        var_out = shr (var1, (Word16)-var2);
+    }
+    else
+    {
+        result = (Word32) var1 *((Word32) 1 << var2);
+
+        if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result)))
+        {
+            var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16);
+        }
+        else
+        {
+            var_out = extract_l(result);
+        }
+    }
+    return (var_out);
+#endif
+}
+#endif
+
+/* Short shift right,   1   */
+#if (SHR_IS_INLINE)
+__inline Word16 shr (Word16 var1, Word16 var2)
+{
+#if ARMV5TE_SHR
+	if(var2>=0)
+	{
+		return  ASM_shr( var1, var2);
+	}
+	else
+	{
+		return  ASM_shl( var1, -var2);
+	}
+#else
+    Word16 var_out;
+
+    if (var2 < 0)
+    {
+        var_out = shl (var1, (Word16)-var2);
+    }
+    else
+    {
+        if (var2 >= 15)
+        {
+            var_out = (Word16)((var1 < 0) ? -1 : 0);
+        }
+        else
+        {
+            if (var1 < 0)
+            {
+                var_out = (Word16)(~((~var1) >> var2));
+            }
+            else
+            {
+                var_out = (Word16)(var1 >> var2);
+            }
+        }
+    }
+
+    return (var_out);
+#endif
+}
+#endif
+
+
+#if (L_MULT_IS_INLINE)
+__inline Word32 L_mult(Word16 var1, Word16 var2)
+{
+#if ARMV5TE_L_MULT
+	Word32 result; 
+	asm volatile( 
+		"SMULBB %[result], %[var1], %[var2] \n" 
+		"QADD %[result], %[result], %[result] \n" 
+		:[result]"+r"(result)
+		:[var1]"r"(var1), [var2]"r"(var2)
+		); 
+	return result;
+#else
+    Word32 L_var_out;
+
+    L_var_out = (Word32) var1 *(Word32) var2;
+
+    if (L_var_out != (Word32) 0x40000000L)
+    {
+        L_var_out <<= 1;
+    }
+    else
+    {
+        L_var_out = MAX_32;
+    }
+    return (L_var_out);
+#endif
+}
+#endif
+
+#if (L_MSU_IS_INLINE)
+__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
+{
+#if ARMV5TE_L_MSU
+	Word32 result; 
+	asm volatile( 
+		"SMULBB %[result], %[var1], %[var2] \n" 
+		"QADD %[result], %[result], %[result] \n"
+		"QSUB %[result], %[L_var3], %[result]\n"
+		:[result]"+r"(result)
+		:[L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
+		); 
+	return result;
+#else
+    Word32 L_var_out;
+    Word32 L_product;
+
+    L_product = L_mult(var1, var2);
+    L_var_out = L_sub(L_var3, L_product);
+    return (L_var_out);
+#endif
+}
+#endif
+
+#if (L_SUB_IS_INLINE)
+__inline Word32 L_sub(Word32 L_var1, Word32 L_var2)
+{
+#if ARMV5TE_L_SUB
+	Word32 result; 
+	asm volatile( 
+		"QSUB %[result], %[L_var1], %[L_var2]\n"
+		:[result]"+r"(result)
+		:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
+		); 
+	return result;
+#else
+    Word32 L_var_out;
+
+    L_var_out = L_var1 - L_var2;
+
+    if (((L_var1 ^ L_var2) & MIN_32) != 0)
+    {
+        if ((L_var_out ^ L_var1) & MIN_32)
+        {
+            L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
+        }
+    }
+
+    return (L_var_out);
+#endif
+}
+#endif
+
+#if (L_SHL_IS_INLINE)
+__inline Word32 L_shl(Word32 L_var1, Word16 var2)
+{
+#if ARMV5TE_L_SHL
+    if(var2>=0)
+    {
+        return  ASM_L_shl( L_var1, var2);
+    }
+    else
+    {
+        return  ASM_L_shr( L_var1, -var2);
+    }
+#else
+    Word32 L_var_out = 0L;
+
+    if (var2 <= 0)
+    {
+        L_var1 = L_shr(L_var1, (Word16)-var2);
+    }
+    else
+    {
+        for (; var2 > 0; var2--)
+        {
+            if (L_var1 > (Word32) 0X3fffffffL)
+            {
+                return MAX_32;
+            }
+            else
+            {
+                if (L_var1 < (Word32) 0xc0000000L)
+                {
+                    return MIN_32;
+                }
+            }
+            L_var1 <<= 1;
+            L_var_out = L_var1;
+        }
+    }
+    return (L_var1);
+#endif
+}
+#endif
+
+#if (L_SHR_IS_INLINE)
+__inline Word32 L_shr (Word32 L_var1, Word16 var2)
+{
+#if ARMV5TE_L_SHR
+	if(var2>=0)
+	{
+		return ASM_L_shr( L_var1, var2);
+	}
+	else
+	{
+		return ASM_L_shl( L_var1, -var2);
+	}
+#else
+    Word32 L_var_out;
+
+    if (var2 < 0)
+    {
+        L_var_out = L_shl (L_var1, (Word16)-var2);
+    }
+    else
+    {
+        if (var2 >= 31)
+        {
+            L_var_out = (L_var1 < 0L) ? -1 : 0;
+        }
+        else
+        {
+            if (L_var1 < 0)
+            {
+                L_var_out = ~((~L_var1) >> var2);
+            }
+            else
+            {
+                L_var_out = L_var1 >> var2;
+            }
+        }
+    }
+    return (L_var_out);
+#endif
+}
+#endif
+
+/* Short add,           1   */
+#if (ADD_IS_INLINE)
+__inline Word16 add (Word16 var1, Word16 var2)
+{
+#if ARMV5TE_ADD
+	Word32 result; 
+	asm volatile( 
+		"ADD  %[result], %[var1], %[var2] \n" 
+		"MOV  r3, #0x1\n"
+		"MOV  r2, %[result], ASR #15\n"
+		"RSB  r3, r3, r3, LSL, #15\n"
+		"TEQ  r2, %[result], ASR #31\n"
+		"EORNE %[result], r3, %[result], ASR #31"
+		:[result]"+r"(result)
+		:[var1]"r"(var1), [var2]"r"(var2)
+		:"r2", "r3"
+		); 
+	return result;
+#else
+    Word16 var_out;
+    Word32 L_sum;
+
+    L_sum = (Word32) var1 + var2;
+    var_out = saturate(L_sum);
+
+    return (var_out);
+#endif
+}
+#endif
+
+/* Short sub,           1   */
+#if (SUB_IS_INLINE)
+__inline Word16 sub(Word16 var1, Word16 var2)
+{
+#if ARMV5TE_SUB
+	Word32 result; 
+	asm volatile( 
+		"MOV   r3, #1\n"
+		"SUB   %[result], %[var1], %[var2] \n"		
+		"RSB   r3,r3,r3,LSL#15\n"
+		"MOV   r2, %[var1], ASR #15 \n" 
+		"TEQ   r2, %[var1], ASR #31 \n"
+		"EORNE %[result], r3, %[result], ASR #31 \n"
+		:[result]"+r"(result)
+		:[var1]"r"(var1), [var2]"r"(var2)
+		:"r2", "r3"
+		); 
+	return result;
+#else
+    Word16 var_out;
+    Word32 L_diff;
+
+    L_diff = (Word32) var1 - var2;
+    var_out = saturate(L_diff);
+   
+    return (var_out);
+#endif
+}
+#endif
+
+/* Short division,       18  */
+#if (DIV_S_IS_INLINE)
+__inline Word16 div_s (Word16 var1, Word16 var2)
+{
+    Word16 var_out = 0;
+    Word16 iteration;
+    Word32 L_num;
+    Word32 L_denom;
+
+    var_out = MAX_16;
+    if (var1!= var2)//var1!= var2
+    {
+    	var_out = 0;
+    	L_num = (Word32) var1;
+    
+    	L_denom = (Word32) var2;
+    	
+		//return (L_num<<15)/var2;
+
+    	for (iteration = 0; iteration < 15; iteration++)
+    	{
+    		var_out <<= 1;
+    		L_num <<= 1;
+    		
+    		if (L_num >= L_denom)
+    		{
+    			L_num -= L_denom;
+    			var_out++;
+    		}
+    	}
+    }
+    return (var_out);
+}
+#endif
+
+/* Short mult,          1   */
+#if (MULT_IS_INLINE)
+__inline Word16 mult (Word16 var1, Word16 var2)
+{
+#if ARMV5TE_MULT
+	Word32 result; 
+	asm volatile( 
+		"SMULBB r2, %[var1], %[var2] \n"
+		"MOV	r3, #1\n"
+		"MOV	%[result], r2, ASR #15\n"
+		"RSB	r3, r3, r3, LSL #15\n"
+		"MOV	r2, %[result], ASR #15\n"
+		"TEQ	r2, %[result], ASR #31\n"
+		"EORNE  %[result], r3, %[result], ASR #31 \n"
+		:[result]"+r"(result)
+		:[var1]"r"(var1), [var2]"r"(var2)
+		:"r2", "r3"
+		); 
+	return result;
+#else
+    Word16 var_out;
+    Word32 L_product;
+
+    L_product = (Word32) var1 *(Word32) var2;
+    L_product = (L_product & (Word32) 0xffff8000L) >> 15;
+    if (L_product & (Word32) 0x00010000L)
+        L_product = L_product | (Word32) 0xffff0000L;
+    var_out = saturate(L_product);
+
+    return (var_out);
+#endif
+}
+#endif
+
+
+/* Short norm,           15  */
+#if (NORM_S_IS_INLINE)
+__inline Word16 norm_s (Word16 var1)
+{
+#if ARMV5TE_NORM_S
+	Word16 result; 
+	asm volatile( 
+		"MOV   r2,%[var1] \n"
+		"CMP   r2, #0\n"
+		"RSBLT %[var1], %[var1], #0 \n"
+		"CLZNE %[result], %[var1]\n"
+		"SUBNE %[result], %[result], #17\n"
+		"MOVEQ %[result], #0\n"
+		"CMP   r2, #-1\n"
+		"MOVEQ %[result], #15\n" 
+		:[result]"+r"(result)
+		:[var1]"r"(var1)
+		:"r2"
+		); 
+	return result;
+#else
+    Word16 var_out;
+
+    if (var1 == 0)
+    {
+        var_out = 0;
+    }
+    else
+    {
+        if (var1 == -1)
+        {
+            var_out = 15;
+        }
+        else
+        {
+            if (var1 < 0)
+            {
+                var1 = (Word16)~var1;
+            }
+            for (var_out = 0; var1 < 0x4000; var_out++)
+            {
+                var1 <<= 1;
+            }
+        }
+    }
+    return (var_out);
+#endif
+}
+#endif
+
+/* Long norm,            30  */
+#if (NORM_L_IS_INLINE)
+__inline Word16 norm_l (Word32 L_var1)
+{
+#if ARMV5TE_NORM_L
+	Word16 result; 
+	asm volatile( 
+		"CMP    %[L_var1], #0\n"
+		"CLZNE  %[result], %[L_var1]\n"
+		"SUBNE  %[result], %[result], #1\n" 
+		"MOVEQ  %[result], #0\n"
+		:[result]"+r"(result)
+		:[L_var1]"r"(L_var1)
+		); 
+	return result;
+#else
+    //Word16 var_out;
+
+    //if (L_var1 == 0)
+    //{
+    //    var_out = 0;
+    //}
+    //else
+    //{
+    //    if (L_var1 == (Word32) 0xffffffffL)
+    //    {
+    //        var_out = 31;
+    //    }
+    //    else
+    //    {
+    //        if (L_var1 < 0)
+    //        {
+    //            L_var1 = ~L_var1;
+    //        }
+    //        for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)
+    //        {
+    //            L_var1 <<= 1;
+    //        }
+    //    }
+    //}
+    //return (var_out);
+  Word16 a16;
+  Word16 r = 0 ;       
+
+   
+  if ( L_var1 < 0 ) {
+    L_var1 = ~L_var1; 
+  }
+
+  if (0 == (L_var1 & 0x7fff8000)) {
+    a16 = extract_l(L_var1);
+    r += 16;
+       
+    if (0 == (a16 & 0x7f80)) {
+      r += 8;
+         
+      if (0 == (a16 & 0x0078)) {
+        r += 4;
+           
+        if (0 == (a16 & 0x0006)) {
+          r += 2;
+             
+          if (0 == (a16 & 0x0001)) {
+            r += 1;
+          }
+        }
+        else {
+             
+          if (0 == (a16 & 0x0004)) {
+            r += 1;
+          }
+        }
+      }
+      else {
+           
+        if (0 == (a16 & 0x0060)) {
+          r += 2;
+             
+          if (0 == (a16 & 0x0010)) {
+            r += 1;
+          }
+        }
+        else {
+             
+          if (0 == (a16 & 0x0040)) {
+            r += 1;
+          }
+        }
+      }
+    } 
+    else { 
+         
+      if (0 == (a16 & 0x7800)) {
+        r += 4;
+           
+        if (0 == (a16 & 0x0600)) {
+          r += 2;
+             
+          if (0 == (a16 & 0x0100)) {
+            r += 1;
+          }
+        }
+        else {
+             
+          if (0 == (a16 & 0x0400)) {
+            r += 1;
+          }
+        }
+      }
+      else {
+           
+        if (0 == (a16 & 0x6000)) {
+          r += 2;
+             
+          if (0 == (a16 & 0x1000)) {
+            r += 1;
+          }
+        }
+        else {
+             
+          if (0 == (a16 & 0x4000)) {
+            r += 1;
+          }
+        }
+      }
+    }
+  }
+  else {
+    a16 = extract_h(L_var1);
+       
+    if (0 == (a16 & 0x7f80)) {
+      r += 8;
+         
+      if (0 == (a16 & 0x0078)) {
+        r += 4 ;
+           
+        if (0 == (a16 & 0x0006)) {
+          r += 2;
+             
+          if (0 == (a16 & 0x0001)) {
+            r += 1;
+          }
+        }
+        else {
+             
+          if (0 == (a16 & 0x0004)) {
+            r += 1;
+          }
+        }
+      }
+      else {
+           
+        if (0 == (a16 & 0x0060)) {
+          r += 2;
+             
+          if (0 == (a16 & 0x0010)) {
+            r += 1;
+          }
+        }
+        else {
+             
+          if (0 == (a16 & 0x0040)) {
+            r += 1;
+          }
+        }
+      }
+    }
+    else {
+         
+      if (0 == (a16 & 0x7800)) {
+        r += 4;
+           
+        if (0 == (a16 & 0x0600)) {
+          r += 2;
+             
+          if (0 == (a16 & 0x0100)) {
+            r += 1;
+          }
+        }
+        else {
+             
+          if (0 == (a16 & 0x0400)) {
+            r += 1;
+          }
+        }
+      }
+      else {
+           
+        if (0 == (a16 & 0x6000)) {
+          r += 2;
+             
+          if (0 == (a16 & 0x1000)) {
+            r += 1;
+          }
+        }
+        else {
+             
+          if (0 == (a16 & 0x4000)) {
+            return 1;
+          }
+        }
+      }
+    }
+  }
+  
+  return r ;
+#endif
+}
+#endif
+
+/* Round,               1   */
+#if (ROUND_IS_INLINE)
+__inline Word16 round16(Word32 L_var1)
+{
+#if ARMV5TE_ROUND
+	Word16 result; 
+	asm volatile( 
+		"MOV   r1,#0x00008000\n"
+		"QADD  %[result], %[L_var1], r1\n"
+		"MOV   %[result], %[result], ASR #16 \n" 
+		:[result]"+r"(result)
+		:[L_var1]"r"(L_var1)
+		:"r1"
+		); 
+	return result;
+#else   
+    Word16 var_out;
+    Word32 L_rounded;
+
+    L_rounded = L_add (L_var1, (Word32) 0x00008000L);
+    var_out = extract_h (L_rounded);
+    return (var_out);
+#endif
+}
+#endif
+
+/* Mac,  1  */
+#if (L_MAC_IS_INLINE)
+__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
+{
+#if ARMV5TE_L_MAC
+	Word32 result; 
+	asm volatile( 
+		"SMULBB %[result], %[var1], %[var2]\n"
+		"QADD	%[result], %[result], %[result]\n"
+		"QADD   %[result], %[result], %[L_var3]\n"
+		:[result]"+r"(result)
+		: [L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
+		); 
+	return result;
+#else
+    Word32 L_var_out;
+    Word32 L_product;
+
+    L_product = L_mult(var1, var2);
+    L_var_out = L_add (L_var3, L_product);
+    return (L_var_out);
+#endif
+}
+#endif
+
+#if (L_ADD_IS_INLINE)
+__inline Word32 L_add (Word32 L_var1, Word32 L_var2)
+{
+#if ARMV5TE_L_ADD
+	Word32 result; 
+	asm volatile( 
+		"QADD %[result], %[L_var1], %[L_var2]\n"
+		:[result]"+r"(result)
+		:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
+		); 
+	return result;
+#else
+    Word32 L_var_out;
+
+    L_var_out = L_var1 + L_var2;
+    if (((L_var1 ^ L_var2) & MIN_32) == 0)
+    {
+        if ((L_var_out ^ L_var1) & MIN_32)
+        {
+            L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;
+        }
+    }
+    return (L_var_out);
+#endif
+}
+#endif
+
+
+
+#if (MULT_R_IS_INLINE)
+__inline Word16 mult_r (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+    Word32 L_product_arr;
+
+    L_product_arr = (Word32)var1 *(Word32)var2;       /* product */
+    L_product_arr += (Word32)0x00004000L;      /* round */
+    L_product_arr >>= 15;       /* shift */
+
+    var_out = saturate(L_product_arr);
+
+    return (var_out);
+}
+#endif
+
+#if (SHR_R_IS_INLINE)
+__inline Word16 shr_r (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+
+    if (var2 > 15)
+    {
+        var_out = 0;
+    }
+    else
+    {
+        var_out = shr(var1, var2);
+
+        if (var2 > 0)
+        {
+            if ((var1 & ((Word16) 1 << (var2 - 1))) != 0)
+            {
+                var_out++;
+            }
+        }
+    }
+
+    return (var_out);
+}
+#endif
+
+#if (MAC_R_IS_INLINE)
+__inline Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+
+    L_var3 = L_mac (L_var3, var1, var2);
+    var_out = (Word16)((L_var3 + 0x8000L) >> 16);
+
+    return (var_out);
+}
+#endif
+
+#if (MSU_R_IS_INLINE)
+__inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+
+    L_var3 = L_msu (L_var3, var1, var2);
+    var_out = (Word16)((L_var3 + 0x8000L) >> 16);
+    
+    return (var_out);
+}
+#endif
+
+#if (L_SHR_R_IS_INLINE)
+__inline Word32 L_shr_r (Word32 L_var1, Word16 var2)
+{
+    Word32 L_var_out;
+
+    if (var2 > 31)
+    {
+        L_var_out = 0;
+    }
+    else
+    {
+        L_var_out = L_shr(L_var1, var2);
+
+        if (var2 > 0)
+        {
+            if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)
+            {
+                L_var_out++;
+            }
+        }
+    }
+
+    return (L_var_out);
+}
+#endif
+
+#if (EXTRACT_H_IS_INLINE)
+__inline Word16 extract_h (Word32 L_var1)
+{
+    Word16 var_out;
+
+    var_out = (Word16) (L_var1 >> 16);
+
+    return (var_out);
+}
+#endif
+
+#if (EXTRACT_L_IS_INLINE)
+__inline Word16 extract_l(Word32 L_var1)
+{
+	return (Word16) L_var1;
+}
+#endif
+
 #endif
diff --git a/media/libstagefright/codecs/aacenc/basic_op/basicop2.c b/media/libstagefright/codecs/aacenc/basic_op/basicop2.c
index a0d5dba..82d3f38 100644
--- a/media/libstagefright/codecs/aacenc/basic_op/basicop2.c
+++ b/media/libstagefright/codecs/aacenc/basic_op/basicop2.c
@@ -1,1624 +1,1624 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		basicop2.c

-

-	Content:	Basic arithmetic operators. 

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		basicop2.c
+
+	Content:	Basic arithmetic operators. 
+
 *******************************************************************************/
 
 #include "typedef.h"
-#include "basic_op.h"

-

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Functions                                                               |

- |___________________________________________________________________________|

-*/

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : saturate                                                |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |    Limit the 32 bit input to the range of a 16 bit word.                  |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    L_var1                                                                 |

- |             32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.                 |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

- |___________________________________________________________________________|

-*/

-

-#if (!SATRUATE_IS_INLINE)

-Word16 saturate(Word32 L_var1)

-{

-    Word16 var_out;

-

-    if (L_var1 > 0X00007fffL)

-    {

-        var_out = MAX_16;

-    }

-    else if (L_var1 < (Word32) 0xffff8000L)

-    {

-        var_out = MIN_16;

-    }

-    else

-    {

-        var_out = extract_l(L_var1);

-    }

-

-    return (var_out);

-}

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : add                                                     |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |    Performs the addition (var1+var2) with overflow control and saturation;|

- |    the 16 bit result is set at +32767 when overflow occurs or at -32768   |

- |    when underflow occurs.                                                 |

- |                                                                           |

- |   Complexity weight : 1                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |    var2                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

- |___________________________________________________________________________|

-*/

-

-#if (!ADD_IS_INLINE)

-Word16 add (Word16 var1, Word16 var2)

-{

-    Word16 var_out;

-    Word32 L_sum;

-

-    L_sum = (Word32)var1 + (Word32)var2;

-    var_out = saturate(L_sum);

-

-    return (var_out);

-}

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : sub                                                     |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |    Performs the subtraction (var1+var2) with overflow control and satu-   |

- |    ration; the 16 bit result is set at +32767 when overflow occurs or at  |

- |    -32768 when underflow occurs.                                          |

- |                                                                           |

- |   Complexity weight : 1                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |    var2                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

- |___________________________________________________________________________|

-*/

-#if (!SUB_IS_INLINE)

-Word16 sub(Word16 var1, Word16 var2)

-{

-    Word16 var_out;

-    Word32 L_diff;

-

-    L_diff = (Word32) var1 - var2;

-    var_out = saturate(L_diff);

-

-    return (var_out);

-}

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : abs_s                                                   |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |    Absolute value of var1; abs_s(-32768) = 32767.                         |

- |                                                                           |

- |   Complexity weight : 1                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0x0000 0000 <= var_out <= 0x0000 7fff.                |

- |___________________________________________________________________________|

-*/

-//Word16 abs_s (Word16 var1)

-//{

-//    Word16 var_out;

-//

-//    if (var1 == MIN_16)

-//    {

-//        var_out = MAX_16;

-//    }

-//    else

-//    {

-//        if (var1 < 0)

-//        {

-//            var_out = (Word16)-var1;

-//        }

-//        else

-//        {

-//            var_out = var1;

-//        }

-//    }

-//

-//    return (var_out);

-//}

-

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : shl                                                     |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill|

- |   the var2 LSB of the result. If var2 is negative, arithmetically shift   |

- |   var1 right by -var2 with sign extension. Saturate the result in case of |

- |   underflows or overflows.                                                |

- |                                                                           |

- |   Complexity weight : 1                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |    var2                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

- |___________________________________________________________________________|

-*/

-

-#if (!SHL_IS_INLINE)

-Word16 shl (Word16 var1, Word16 var2)

-{

-    Word16 var_out;

-    Word32 result;

-

-    if (var2 < 0)

-    {

-        if (var2 < -16)

-            var2 = -16;

-        var_out = shr (var1, (Word16)-var2);

-    }

-    else

-    {

-        result = (Word32) var1 *((Word32) 1 << var2);

-

-        if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result)))

-        {

-            //Overflow = 1;

-            var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16);

-        }

-        else

-        {

-            var_out = extract_l(result);

-        }

-    }

-

-    return (var_out);

-}

-#endif

-// end

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : shr                                                     |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Arithmetically shift the 16 bit input var1 right var2 positions with    |

- |   sign extension. If var2 is negative, arithmetically shift var1 left by  |

- |   -var2 with sign extension. Saturate the result in case of underflows or |

- |   overflows.                                                              |

- |                                                                           |

- |   Complexity weight : 1                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |    var2                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

- |___________________________________________________________________________|

-*/

-

-#if (!SHR_IS_INLINE)

-Word16 shr (Word16 var1, Word16 var2)

-{

-    Word16 var_out;

-

-    if (var2 < 0)

-    {

-        if (var2 < -16)

-            var2 = -16;

-        var_out = shl (var1, (Word16)-var2);

-    }

-    else

-    {

-        if (var2 >= 15)

-        {

-            var_out = (Word16)((var1 < 0) ? -1 : 0);

-        }

-        else

-        {

-            if (var1 < 0)

-            {

-                var_out = (Word16)(~((~var1) >> var2));

-            }

-            else

-            {

-                var_out = (Word16)(var1 >> var2);

-            }

-        }

-    }

-

-    return (var_out);

-}

-#endif

-

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : mult                                                    |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |    Performs the multiplication of var1 by var2 and gives a 16 bit result  |

- |    which is scaled i.e.:                                                  |

- |             mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and  |

- |             mult(-32768,-32768) = 32767.                                  |

- |                                                                           |

- |   Complexity weight : 1                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |    var2                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

- |___________________________________________________________________________|

-*/

-#if (!MULT_IS_INLINE)

-Word16 mult (Word16 var1, Word16 var2)

-{

-    Word16 var_out;

-    Word32 L_product;

-

-    L_product = (Word32) var1 *(Word32) var2;

-

-    L_product = (L_product & (Word32) 0xffff8000L) >> 15;

-

-    if (L_product & (Word32) 0x00010000L)

-        L_product = L_product | (Word32) 0xffff0000L;

-

-    var_out = saturate(L_product);

-

-    return (var_out);

-}

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : L_mult                                                  |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   L_mult is the 32 bit result of the multiplication of var1 times var2    |

- |   with one shift left i.e.:                                               |

- |        L_mult(var1,var2) = L_shl((var1 times var2),1) and                 |

- |        L_mult(-32768,-32768) = 2147483647.                                |

- |                                                                           |

- |   Complexity weight : 1                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |    var2                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    L_var_out                                                              |

- |             32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |

- |___________________________________________________________________________|

-*/

-

-#if (!L_MULT_IS_INLINE)

-Word32 L_mult(Word16 var1, Word16 var2)

-{

-    Word32 L_var_out;

-

-    L_var_out = (Word32) var1 *(Word32) var2;

-

-    if (L_var_out != (Word32) 0x40000000L)

-    {

-        L_var_out <<= 1;

-    }

-    else

-    {

-        L_var_out = MAX_32;

-    }

-        

-    return (L_var_out);

-}

-#endif

-// end

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : negate                                                  |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Negate var1 with saturation, saturate in the case where input is -32768:|

- |                negate(var1) = sub(0,var1).                                |

- |                                                                           |

- |   Complexity weight : 1                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

- |___________________________________________________________________________|

-*/

-//Word16 negate (Word16 var1)

-//{

-//    Word16 var_out;

-//

-//    var_out = (Word16)((var1 == MIN_16) ? MAX_16 : -var1);

-//

-//    return (var_out);

-//}

-

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : extract_h                                               |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Return the 16 MSB of L_var1.                                            |

- |                                                                           |

- |   Complexity weight : 1                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    L_var1                                                                 |

- |             32 bit long signed integer (Word32 ) whose value falls in the |

- |             range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.                 |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

- |___________________________________________________________________________|

-*/

-#if (!EXTRACT_H_IS_INLINE)

-Word16 extract_h (Word32 L_var1)

-{

-    Word16 var_out;

-

-    var_out = (Word16) (L_var1 >> 16);

-

-    return (var_out);

-}

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : extract_l                                               |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Return the 16 LSB of L_var1.                                            |

- |                                                                           |

- |   Complexity weight : 1                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    L_var1                                                                 |

- |             32 bit long signed integer (Word32 ) whose value falls in the |

- |             range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.                 |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

- |___________________________________________________________________________|

-*/

-#if (!EXTRACT_L_IS_INLINE)

-Word16 extract_l(Word32 L_var1)

-{

-    Word16 var_out;

-

-    var_out = (Word16) L_var1;

-

-    return (var_out);

-}

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : round                                                   |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Round the lower 16 bits of the 32 bit input number into the MS 16 bits  |

- |   with saturation. Shift the resulting bits right by 16 and return the 16 |

- |   bit number:                                                             |

- |               round(L_var1) = extract_h(L_add(L_var1,32768))              |

- |                                                                           |

- |   Complexity weight : 1                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    L_var1                                                                 |

- |             32 bit long signed integer (Word32 ) whose value falls in the |

- |             range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.                 |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

- |___________________________________________________________________________|

-*/

-

-#if (!ROUND_IS_INLINE)

-Word16 round16(Word32 L_var1)

-{

-    Word16 var_out;

-    Word32 L_rounded;

-

-    L_rounded = L_add (L_var1, (Word32) 0x00008000L);

-    var_out = extract_h (L_rounded);

-

-    return (var_out);

-}

-#endif

-// end

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : L_mac                                                   |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Multiply var1 by var2 and shift the result left by 1. Add the 32 bit    |

- |   result to L_var3 with saturation, return a 32 bit result:               |

- |        L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)).         |

- |                                                                           |

- |   Complexity weight : 1                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |    var2                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    L_var_out                                                              |

- |             32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |

- |___________________________________________________________________________|

-*/

-#if (!L_MSU_IS_INLINE)

-Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)

-{

-    Word32 L_var_out;

-    Word32 L_product;

-

-    L_product = L_mult(var1, var2);

-    L_var_out = L_add (L_var3, L_product);

-

-    return (L_var_out);

-}

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : L_msu                                                   |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Multiply var1 by var2 and shift the result left by 1. Subtract the 32   |

- |   bit result to L_var3 with saturation, return a 32 bit result:           |

- |        L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)).         |

- |                                                                           |

- |   Complexity weight : 1                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |    var2                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    L_var_out                                                              |

- |             32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |

- |___________________________________________________________________________|

-*/

-

-#if (!L_MSU_IS_INLINE)

-Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)

-{

-    Word32 L_var_out;

-    Word32 L_product;

-

-    L_product = L_mult(var1, var2);

-    L_var_out = L_sub (L_var3, L_product);

-

-    return (L_var_out);

-}

-#endif

-

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : L_add                                                   |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   32 bits addition of the two 32 bits variables (L_var1+L_var2) with      |

- |   overflow control and saturation; the result is set at +2147483647 when  |

- |   overflow occurs or at -2147483648 when underflow occurs.                |

- |                                                                           |

- |   Complexity weight : 2                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

- |                                                                           |

- |    L_var2   32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    L_var_out                                                              |

- |             32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |

- |___________________________________________________________________________|

-*/

-#if (!L_ADD_IS_INLINE)

-Word32 L_add (Word32 L_var1, Word32 L_var2)

-{

-    Word32 L_var_out;

-

-    L_var_out = L_var1 + L_var2;

-

-    if (((L_var1 ^ L_var2) & MIN_32) == 0)

-    {

-        if ((L_var_out ^ L_var1) & MIN_32)

-        {

-            L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;

-            //Overflow = 1;

-        }

-    }

-

-    return (L_var_out);

-}

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : L_sub                                                   |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with   |

- |   overflow control and saturation; the result is set at +2147483647 when  |

- |   overflow occurs or at -2147483648 when underflow occurs.                |

- |                                                                           |

- |   Complexity weight : 2                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

- |                                                                           |

- |    L_var2   32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    L_var_out                                                              |

- |             32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |

- |___________________________________________________________________________|

-*/

-#if (!L_SUB_IS_INLINE)

-Word32 L_sub(Word32 L_var1, Word32 L_var2)

-{

-    Word32 L_var_out;

-

-    L_var_out = L_var1 - L_var2;

-

-    if (((L_var1 ^ L_var2) & MIN_32) != 0)

-    {

-        if ((L_var_out ^ L_var1) & MIN_32)

-        {

-            L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;

-            //Overflow = 1;

-        }

-    }

-

-    return (L_var_out);

-}

-#endif

-

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : L_negate                                                |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Negate the 32 bit variable L_var1 with saturation; saturate in the case |

- |   where input is -2147483648 (0x8000 0000).                               |

- |                                                                           |

- |   Complexity weight : 2                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    L_var_out                                                              |

- |             32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |

- |___________________________________________________________________________|

-*/

-//Word32 L_negate (Word32 L_var1)

-//{

-//    Word32 L_var_out;

-//

-//    L_var_out = (L_var1 == MIN_32) ? MAX_32 : -L_var1;

-//

-//    return (L_var_out);

-//}

-

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : mult_r                                                  |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Same as mult with rounding, i.e.:                                       |

- |     mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and  |

- |     mult_r(-32768,-32768) = 32767.                                        |

- |                                                                           |

- |   Complexity weight : 2                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |    var2                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

- |___________________________________________________________________________|

-*/

-#if (!MULT_R_IS_INLINE)

-Word16 mult_r (Word16 var1, Word16 var2)

-{

-    Word16 var_out;

-    Word32 L_product_arr;

-

-    L_product_arr = (Word32) var1 *(Word32) var2;       /* product */

-    L_product_arr += (Word32) 0x00004000L;      /* round */

-    L_product_arr &= (Word32) 0xffff8000L;

-    L_product_arr >>= 15;       /* shift */

-

-    if (L_product_arr & (Word32) 0x00010000L)   /* sign extend when necessary */

-    {

-        L_product_arr |= (Word32) 0xffff0000L;

-    }

-    var_out = saturate(L_product_arr);

-

-    return (var_out);

-}

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : L_shl                                                   |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero  |

- |   fill the var2 LSB of the result. If var2 is negative, arithmetically    |

- |   shift L_var1 right by -var2 with sign extension. Saturate the result in |

- |   case of underflows or overflows.                                        |

- |                                                                           |

- |   Complexity weight : 2                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

- |                                                                           |

- |    var2                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    L_var_out                                                              |

- |             32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |

- |___________________________________________________________________________|

-*/

-

-#if (!L_SHL_IS_INLINE)

-Word32 L_shl (Word32 L_var1, Word16 var2)

-{

-    Word32 L_var_out = 0L;

-

-    if (var2 <= 0)

-    {

-        L_var1 = L_shr(L_var1, (Word16)-var2);

-    }

-    else

-    {

-        for (; var2 > 0; var2--)

-        {

-            if (L_var1 > (Word32) 0X3fffffffL)

-            {

-                return MAX_32;

-            }

-            else

-            {

-                if (L_var1 < (Word32) 0xc0000000L)

-                {

-                    return MIN_32;

-                }

-            }

-            L_var1 <<= 1;

-        }

-    }

-    return (L_var1);

-}

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : L_shr                                                   |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Arithmetically shift the 32 bit input L_var1 right var2 positions with  |

- |   sign extension. If var2 is negative, arithmetically shift L_var1 left   |

- |   by -var2 and zero fill the -var2 LSB of the result. Saturate the result |

- |   in case of underflows or overflows.                                     |

- |                                                                           |

- |   Complexity weight : 2                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

- |                                                                           |

- |    var2                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    L_var_out                                                              |

- |             32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |

- |___________________________________________________________________________|

-*/

-

-#if (!L_SHR_IS_INLINE)

-Word32 L_shr (Word32 L_var1, Word16 var2)

-{

-    Word32 L_var_out;

-

-    if (var2 < 0)

-    {

-        L_var_out = L_shl (L_var1, (Word16)-var2);

-    }

-    else

-    {

-        if (var2 >= 31)

-        {

-            L_var_out = (L_var1 < 0L) ? -1 : 0;

-        }

-        else

-        {

-            if (L_var1 < 0)

-            {

-                L_var_out = ~((~L_var1) >> var2);

-            }

-            else

-            {

-                L_var_out = L_var1 >> var2;

-            }

-        }

-    }

-    return (L_var_out);

-}

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : shr_r                                                   |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Same as shr(var1,var2) but with rounding. Saturate the result in case of|

- |   underflows or overflows :                                               |

- |    - If var2 is greater than zero :                                       |

- |          if (sub(shl(shr(var1,var2),1),shr(var1,sub(var2,1))))            |

- |          is equal to zero                                                 |

- |                     then                                                  |

- |                     shr_r(var1,var2) = shr(var1,var2)                     |

- |                     else                                                  |

- |                     shr_r(var1,var2) = add(shr(var1,var2),1)              |

- |    - If var2 is less than or equal to zero :                              |

- |                     shr_r(var1,var2) = shr(var1,var2).                    |

- |                                                                           |

- |   Complexity weight : 2                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |    var2                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

- |___________________________________________________________________________|

-*/

-#if (!SHR_R_IS_INLINE)

-Word16 shr_r (Word16 var1, Word16 var2)

-{

-    Word16 var_out;

-

-    if (var2 > 15)

-    {

-        var_out = 0;

-    }

-    else

-    {

-        var_out = shr (var1, var2);

-

-        if (var2 > 0)

-        {

-            if ((var1 & ((Word16) 1 << (var2 - 1))) != 0)

-            {

-                var_out++;

-            }

-        }

-    }

-

-    return (var_out);

-}

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : mac_r                                                   |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Multiply var1 by var2 and shift the result left by 1. Add the 32 bit    |

- |   result to L_var3 with saturation. Round the LS 16 bits of the result    |

- |   into the MS 16 bits with saturation and shift the result right by 16.   |

- |   Return a 16 bit result.                                                 |

- |            mac_r(L_var3,var1,var2) = round(L_mac(L_var3,var1,var2))       |

- |                                                                           |

- |   Complexity weight : 2                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |    var2                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0x0000 8000 <= L_var_out <= 0x0000 7fff.              |

- |___________________________________________________________________________|

-*/

-#if (!MAC_R_IS_INLINE)

-Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2)

-{

-    Word16 var_out;

-

-    L_var3 = L_mac (L_var3, var1, var2);

-    L_var3 = L_add (L_var3, (Word32) 0x00008000L);

-    var_out = extract_h (L_var3);

-

-    return (var_out);

-}

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : msu_r                                                   |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Multiply var1 by var2 and shift the result left by 1. Subtract the 32   |

- |   bit result to L_var3 with saturation. Round the LS 16 bits of the res-  |

- |   ult into the MS 16 bits with saturation and shift the result right by   |

- |   16. Return a 16 bit result.                                             |

- |            msu_r(L_var3,var1,var2) = round(L_msu(L_var3,var1,var2))       |

- |                                                                           |

- |   Complexity weight : 2                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |    var2                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0x0000 8000 <= L_var_out <= 0x0000 7fff.              |

- |___________________________________________________________________________|

-*/

-#if (!MSU_R_IS_INLINE)

-Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2)

-{

-    Word16 var_out;

-

-    L_var3 = L_msu (L_var3, var1, var2);

-    L_var3 = L_add (L_var3, (Word32) 0x00008000L);

-    var_out = extract_h (L_var3);

-

-    return (var_out);

-}

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : L_deposit_h                                             |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Deposit the 16 bit var1 into the 16 MS bits of the 32 bit output. The   |

- |   16 LS bits of the output are zeroed.                                    |

- |                                                                           |

- |   Complexity weight : 2                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    L_var_out                                                              |

- |             32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= var_out <= 0x7fff 0000.                |

- |___________________________________________________________________________|

-*/

-//Word32 L_deposit_h (Word16 var1)

-//{

-//    Word32 L_var_out;

-//

-//    L_var_out = (Word32) var1 << 16;

-//

-//    return (L_var_out);

-//}

-

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : L_deposit_l                                             |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Deposit the 16 bit var1 into the 16 LS bits of the 32 bit output. The   |

- |   16 MS bits of the output are sign extended.                             |

- |                                                                           |

- |   Complexity weight : 2                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    L_var_out                                                              |

- |             32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0xFFFF 8000 <= var_out <= 0x0000 7fff.                |

- |___________________________________________________________________________|

-*/

-//Word32 L_deposit_l (Word16 var1)

-//{

-//    Word32 L_var_out;

-//

-//    L_var_out = (Word32) var1;

-//

-//    return (L_var_out);

-//}

-

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : L_shr_r                                                 |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Same as L_shr(L_var1,var2) but with rounding. Saturate the result in    |

- |   case of underflows or overflows :                                       |

- |    - If var2 is greater than zero :                                       |

- |          if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))|

- |          is equal to zero                                                 |

- |                     then                                                  |

- |                     L_shr_r(L_var1,var2) = L_shr(L_var1,var2)             |

- |                     else                                                  |

- |                     L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1)    |

- |    - If var2 is less than or equal to zero :                              |

- |                     L_shr_r(L_var1,var2) = L_shr(L_var1,var2).            |

- |                                                                           |

- |   Complexity weight : 3                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    L_var1                                                                 |

- |             32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |

- |                                                                           |

- |    var2                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    L_var_out                                                              |

- |             32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= var_out <= 0x7fff ffff.                |

- |___________________________________________________________________________|

-*/

-#if (!L_SHR_R_IS_INLINE)

-Word32 L_shr_r (Word32 L_var1, Word16 var2)

-{

-    Word32 L_var_out;

-

-    if (var2 > 31)

-    {

-        L_var_out = 0;

-    }

-    else

-    {

-        L_var_out = L_shr (L_var1, var2);

-

-        if (var2 > 0)

-        {

-            if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)

-            {

-                L_var_out++;

-            }

-        }

-    }

-

-    return (L_var_out);

-}

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : L_abs                                                   |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |    Absolute value of L_var1; Saturate in case where the input is          |

- |                                                               -214783648  |

- |                                                                           |

- |   Complexity weight : 3                                                   |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    L_var1                                                                 |

- |             32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    L_var_out                                                              |

- |             32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x0000 0000 <= var_out <= 0x7fff ffff.                |

- |___________________________________________________________________________|

-*/

-//Word32 L_abs (Word32 L_var1)

-//{

-//    Word32 L_var_out;

-//

-//    if (L_var1 == MIN_32)

-//    {

-//        L_var_out = MAX_32;

-//    }

-//    else

-//    {

-//        if (L_var1 < 0)

-//        {

-//            L_var_out = -L_var1;

-//        }

-//        else

-//        {

-//            L_var_out = L_var1;

-//        }

-//    }

-//

-//    return (L_var_out);

-//}

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : norm_s                                                  |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Produces the number of left shift needed to normalize the 16 bit varia- |

- |   ble var1 for positive values on the interval with minimum of 16384 and  |

- |   maximum of 32767, and for negative values on the interval with minimum  |

- |   of -32768 and maximum of -16384; in order to normalize the result, the  |

- |   following operation must be done :                                      |

- |                    norm_var1 = shl(var1,norm_s(var1)).                    |

- |                                                                           |

- |   Complexity weight : 15                                                  |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0x0000 0000 <= var_out <= 0x0000 000f.                |

- |___________________________________________________________________________|

-*/

-

-#if (!NORM_S_IS_INLINE)

-Word16 norm_s (Word16 var1)

-{

-    Word16 var_out;

-

-    if (var1 == 0)

-    {

-        var_out = 0;

-    }

-    else

-    {

-        if (var1 == -1)

-        {

-            var_out = 15;

-        }

-        else

-        {

-            if (var1 < 0)

-            {

-                var1 = (Word16)~var1;

-            }

-            for (var_out = 0; var1 < 0x4000; var_out++)

-            {

-                var1 <<= 1;

-            }

-        }

-    }

-

-    return (var_out);

-}

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : div_s                                                   |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Produces a result which is the fractional integer division of var1  by  |

- |   var2; var1 and var2 must be positive and var2 must be greater or equal  |

- |   to var1; the result is positive (leading bit equal to 0) and truncated  |

- |   to 16 bits.                                                             |

- |   If var1 = var2 then div(var1,var2) = 32767.                             |

- |                                                                           |

- |   Complexity weight : 18                                                  |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    var1                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0x0000 0000 <= var1 <= var2 and var2 != 0.            |

- |                                                                           |

- |    var2                                                                   |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : var1 <= var2 <= 0x0000 7fff and var2 != 0.            |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0x0000 0000 <= var_out <= 0x0000 7fff.                |

- |             It's a Q15 value (point between b15 and b14).                 |

- |___________________________________________________________________________|

-*/

-

-#if (!DIV_S_IS_INLINE)

-Word16 div_s (Word16 var1, Word16 var2)

-{

-    Word16 var_out = 0;

-    Word16 iteration;

-    Word32 L_num;

-    Word32 L_denom;

-

-    if (var1 == 0)

-    {

-        var_out = 0;

-    }

-    else

-    {

-        if (var1 == var2)

-        {

-            var_out = MAX_16;

-        }

-        else

-        {

-            L_num = L_deposit_l (var1);

-            L_denom = L_deposit_l (var2);

-

-            for (iteration = 0; iteration < 15; iteration++)

-            {

-                var_out <<= 1;

-                L_num <<= 1;

-

-                if (L_num >= L_denom)

-                {

-                    L_num = L_sub(L_num, L_denom);

-                    var_out = add (var_out, 1);

-                }

-            }

-        }

-    }

-

-    return (var_out);

-}

-#endif

-

-/*___________________________________________________________________________

- |                                                                           |

- |   Function Name : norm_l                                                  |

- |                                                                           |

- |   Purpose :                                                               |

- |                                                                           |

- |   Produces the number of left shifts needed to normalize the 32 bit varia-|

- |   ble L_var1 for positive values on the interval with minimum of          |

- |   1073741824 and maximum of 2147483647, and for negative values on the in-|

- |   terval with minimum of -2147483648 and maximum of -1073741824; in order |

- |   to normalize the result, the following operation must be done :         |

- |                   norm_L_var1 = L_shl(L_var1,norm_l(L_var1)).             |

- |                                                                           |

- |   Complexity weight : 30                                                  |

- |                                                                           |

- |   Inputs :                                                                |

- |                                                                           |

- |    L_var1                                                                 |

- |             32 bit long signed integer (Word32) whose value falls in the  |

- |             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |

- |                                                                           |

- |   Outputs :                                                               |

- |                                                                           |

- |    none                                                                   |

- |                                                                           |

- |   Return Value :                                                          |

- |                                                                           |

- |    var_out                                                                |

- |             16 bit short signed integer (Word16) whose value falls in the |

- |             range : 0x0000 0000 <= var_out <= 0x0000 001f.                |

- |___________________________________________________________________________|

-*/

-

-#if (!NORM_L_IS_INLINE)

-Word16 norm_l (Word32 L_var1)

-{

-    Word16 var_out;

-

-    if (L_var1 == 0)

-    {

-        var_out = 0;

-    }

-    else

-    {

-        if (L_var1 == (Word32) 0xffffffffL)

-        {

-            var_out = 31;

-        }

-        else

-        {

-            if (L_var1 < 0)

-            {

-                L_var1 = ~L_var1;

-            }

-            for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)

-            {

-                L_var1 <<= 1;

-            }

-        }

-    }

-

-    return (var_out);

-}

-#endif

+#include "basic_op.h"
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Functions                                                               |
+ |___________________________________________________________________________|
+*/
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : saturate                                                |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |    Limit the 32 bit input to the range of a 16 bit word.                  |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1                                                                 |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+
+#if (!SATRUATE_IS_INLINE)
+Word16 saturate(Word32 L_var1)
+{
+    Word16 var_out;
+
+    if (L_var1 > 0X00007fffL)
+    {
+        var_out = MAX_16;
+    }
+    else if (L_var1 < (Word32) 0xffff8000L)
+    {
+        var_out = MIN_16;
+    }
+    else
+    {
+        var_out = extract_l(L_var1);
+    }
+
+    return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : add                                                     |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |    Performs the addition (var1+var2) with overflow control and saturation;|
+ |    the 16 bit result is set at +32767 when overflow occurs or at -32768   |
+ |    when underflow occurs.                                                 |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+
+#if (!ADD_IS_INLINE)
+Word16 add (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+    Word32 L_sum;
+
+    L_sum = (Word32)var1 + (Word32)var2;
+    var_out = saturate(L_sum);
+
+    return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : sub                                                     |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |    Performs the subtraction (var1+var2) with overflow control and satu-   |
+ |    ration; the 16 bit result is set at +32767 when overflow occurs or at  |
+ |    -32768 when underflow occurs.                                          |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+#if (!SUB_IS_INLINE)
+Word16 sub(Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+    Word32 L_diff;
+
+    L_diff = (Word32) var1 - var2;
+    var_out = saturate(L_diff);
+
+    return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : abs_s                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |    Absolute value of var1; abs_s(-32768) = 32767.                         |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0x0000 0000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+//Word16 abs_s (Word16 var1)
+//{
+//    Word16 var_out;
+//
+//    if (var1 == MIN_16)
+//    {
+//        var_out = MAX_16;
+//    }
+//    else
+//    {
+//        if (var1 < 0)
+//        {
+//            var_out = (Word16)-var1;
+//        }
+//        else
+//        {
+//            var_out = var1;
+//        }
+//    }
+//
+//    return (var_out);
+//}
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : shl                                                     |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill|
+ |   the var2 LSB of the result. If var2 is negative, arithmetically shift   |
+ |   var1 right by -var2 with sign extension. Saturate the result in case of |
+ |   underflows or overflows.                                                |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+
+#if (!SHL_IS_INLINE)
+Word16 shl (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+    Word32 result;
+
+    if (var2 < 0)
+    {
+        if (var2 < -16)
+            var2 = -16;
+        var_out = shr (var1, (Word16)-var2);
+    }
+    else
+    {
+        result = (Word32) var1 *((Word32) 1 << var2);
+
+        if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result)))
+        {
+            //Overflow = 1;
+            var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16);
+        }
+        else
+        {
+            var_out = extract_l(result);
+        }
+    }
+
+    return (var_out);
+}
+#endif
+// end
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : shr                                                     |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Arithmetically shift the 16 bit input var1 right var2 positions with    |
+ |   sign extension. If var2 is negative, arithmetically shift var1 left by  |
+ |   -var2 with sign extension. Saturate the result in case of underflows or |
+ |   overflows.                                                              |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+
+#if (!SHR_IS_INLINE)
+Word16 shr (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+
+    if (var2 < 0)
+    {
+        if (var2 < -16)
+            var2 = -16;
+        var_out = shl (var1, (Word16)-var2);
+    }
+    else
+    {
+        if (var2 >= 15)
+        {
+            var_out = (Word16)((var1 < 0) ? -1 : 0);
+        }
+        else
+        {
+            if (var1 < 0)
+            {
+                var_out = (Word16)(~((~var1) >> var2));
+            }
+            else
+            {
+                var_out = (Word16)(var1 >> var2);
+            }
+        }
+    }
+
+    return (var_out);
+}
+#endif
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : mult                                                    |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |    Performs the multiplication of var1 by var2 and gives a 16 bit result  |
+ |    which is scaled i.e.:                                                  |
+ |             mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and  |
+ |             mult(-32768,-32768) = 32767.                                  |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+#if (!MULT_IS_INLINE)
+Word16 mult (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+    Word32 L_product;
+
+    L_product = (Word32) var1 *(Word32) var2;
+
+    L_product = (L_product & (Word32) 0xffff8000L) >> 15;
+
+    if (L_product & (Word32) 0x00010000L)
+        L_product = L_product | (Word32) 0xffff0000L;
+
+    var_out = saturate(L_product);
+
+    return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_mult                                                  |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   L_mult is the 32 bit result of the multiplication of var1 times var2    |
+ |   with one shift left i.e.:                                               |
+ |        L_mult(var1,var2) = L_shl((var1 times var2),1) and                 |
+ |        L_mult(-32768,-32768) = 2147483647.                                |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+
+#if (!L_MULT_IS_INLINE)
+Word32 L_mult(Word16 var1, Word16 var2)
+{
+    Word32 L_var_out;
+
+    L_var_out = (Word32) var1 *(Word32) var2;
+
+    if (L_var_out != (Word32) 0x40000000L)
+    {
+        L_var_out <<= 1;
+    }
+    else
+    {
+        L_var_out = MAX_32;
+    }
+        
+    return (L_var_out);
+}
+#endif
+// end
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : negate                                                  |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Negate var1 with saturation, saturate in the case where input is -32768:|
+ |                negate(var1) = sub(0,var1).                                |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+//Word16 negate (Word16 var1)
+//{
+//    Word16 var_out;
+//
+//    var_out = (Word16)((var1 == MIN_16) ? MAX_16 : -var1);
+//
+//    return (var_out);
+//}
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : extract_h                                               |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Return the 16 MSB of L_var1.                                            |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1                                                                 |
+ |             32 bit long signed integer (Word32 ) whose value falls in the |
+ |             range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+#if (!EXTRACT_H_IS_INLINE)
+Word16 extract_h (Word32 L_var1)
+{
+    Word16 var_out;
+
+    var_out = (Word16) (L_var1 >> 16);
+
+    return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : extract_l                                               |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Return the 16 LSB of L_var1.                                            |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1                                                                 |
+ |             32 bit long signed integer (Word32 ) whose value falls in the |
+ |             range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+#if (!EXTRACT_L_IS_INLINE)
+Word16 extract_l(Word32 L_var1)
+{
+    Word16 var_out;
+
+    var_out = (Word16) L_var1;
+
+    return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : round                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Round the lower 16 bits of the 32 bit input number into the MS 16 bits  |
+ |   with saturation. Shift the resulting bits right by 16 and return the 16 |
+ |   bit number:                                                             |
+ |               round(L_var1) = extract_h(L_add(L_var1,32768))              |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1                                                                 |
+ |             32 bit long signed integer (Word32 ) whose value falls in the |
+ |             range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+
+#if (!ROUND_IS_INLINE)
+Word16 round16(Word32 L_var1)
+{
+    Word16 var_out;
+    Word32 L_rounded;
+
+    L_rounded = L_add (L_var1, (Word32) 0x00008000L);
+    var_out = extract_h (L_rounded);
+
+    return (var_out);
+}
+#endif
+// end
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_mac                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Multiply var1 by var2 and shift the result left by 1. Add the 32 bit    |
+ |   result to L_var3 with saturation, return a 32 bit result:               |
+ |        L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)).         |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+#if (!L_MSU_IS_INLINE)
+Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
+{
+    Word32 L_var_out;
+    Word32 L_product;
+
+    L_product = L_mult(var1, var2);
+    L_var_out = L_add (L_var3, L_product);
+
+    return (L_var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_msu                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Multiply var1 by var2 and shift the result left by 1. Subtract the 32   |
+ |   bit result to L_var3 with saturation, return a 32 bit result:           |
+ |        L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)).         |
+ |                                                                           |
+ |   Complexity weight : 1                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+
+#if (!L_MSU_IS_INLINE)
+Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
+{
+    Word32 L_var_out;
+    Word32 L_product;
+
+    L_product = L_mult(var1, var2);
+    L_var_out = L_sub (L_var3, L_product);
+
+    return (L_var_out);
+}
+#endif
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_add                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   32 bits addition of the two 32 bits variables (L_var1+L_var2) with      |
+ |   overflow control and saturation; the result is set at +2147483647 when  |
+ |   overflow occurs or at -2147483648 when underflow occurs.                |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    L_var2   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+#if (!L_ADD_IS_INLINE)
+Word32 L_add (Word32 L_var1, Word32 L_var2)
+{
+    Word32 L_var_out;
+
+    L_var_out = L_var1 + L_var2;
+
+    if (((L_var1 ^ L_var2) & MIN_32) == 0)
+    {
+        if ((L_var_out ^ L_var1) & MIN_32)
+        {
+            L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;
+            //Overflow = 1;
+        }
+    }
+
+    return (L_var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_sub                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with   |
+ |   overflow control and saturation; the result is set at +2147483647 when  |
+ |   overflow occurs or at -2147483648 when underflow occurs.                |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    L_var2   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+#if (!L_SUB_IS_INLINE)
+Word32 L_sub(Word32 L_var1, Word32 L_var2)
+{
+    Word32 L_var_out;
+
+    L_var_out = L_var1 - L_var2;
+
+    if (((L_var1 ^ L_var2) & MIN_32) != 0)
+    {
+        if ((L_var_out ^ L_var1) & MIN_32)
+        {
+            L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
+            //Overflow = 1;
+        }
+    }
+
+    return (L_var_out);
+}
+#endif
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_negate                                                |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Negate the 32 bit variable L_var1 with saturation; saturate in the case |
+ |   where input is -2147483648 (0x8000 0000).                               |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+//Word32 L_negate (Word32 L_var1)
+//{
+//    Word32 L_var_out;
+//
+//    L_var_out = (L_var1 == MIN_32) ? MAX_32 : -L_var1;
+//
+//    return (L_var_out);
+//}
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : mult_r                                                  |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Same as mult with rounding, i.e.:                                       |
+ |     mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and  |
+ |     mult_r(-32768,-32768) = 32767.                                        |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+#if (!MULT_R_IS_INLINE)
+Word16 mult_r (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+    Word32 L_product_arr;
+
+    L_product_arr = (Word32) var1 *(Word32) var2;       /* product */
+    L_product_arr += (Word32) 0x00004000L;      /* round */
+    L_product_arr &= (Word32) 0xffff8000L;
+    L_product_arr >>= 15;       /* shift */
+
+    if (L_product_arr & (Word32) 0x00010000L)   /* sign extend when necessary */
+    {
+        L_product_arr |= (Word32) 0xffff0000L;
+    }
+    var_out = saturate(L_product_arr);
+
+    return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_shl                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero  |
+ |   fill the var2 LSB of the result. If var2 is negative, arithmetically    |
+ |   shift L_var1 right by -var2 with sign extension. Saturate the result in |
+ |   case of underflows or overflows.                                        |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+
+#if (!L_SHL_IS_INLINE)
+Word32 L_shl (Word32 L_var1, Word16 var2)
+{
+    Word32 L_var_out = 0L;
+
+    if (var2 <= 0)
+    {
+        L_var1 = L_shr(L_var1, (Word16)-var2);
+    }
+    else
+    {
+        for (; var2 > 0; var2--)
+        {
+            if (L_var1 > (Word32) 0X3fffffffL)
+            {
+                return MAX_32;
+            }
+            else
+            {
+                if (L_var1 < (Word32) 0xc0000000L)
+                {
+                    return MIN_32;
+                }
+            }
+            L_var1 <<= 1;
+        }
+    }
+    return (L_var1);
+}
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_shr                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Arithmetically shift the 32 bit input L_var1 right var2 positions with  |
+ |   sign extension. If var2 is negative, arithmetically shift L_var1 left   |
+ |   by -var2 and zero fill the -var2 LSB of the result. Saturate the result |
+ |   in case of underflows or overflows.                                     |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+ |___________________________________________________________________________|
+*/
+
+#if (!L_SHR_IS_INLINE)
+Word32 L_shr (Word32 L_var1, Word16 var2)
+{
+    Word32 L_var_out;
+
+    if (var2 < 0)
+    {
+        L_var_out = L_shl (L_var1, (Word16)-var2);
+    }
+    else
+    {
+        if (var2 >= 31)
+        {
+            L_var_out = (L_var1 < 0L) ? -1 : 0;
+        }
+        else
+        {
+            if (L_var1 < 0)
+            {
+                L_var_out = ~((~L_var1) >> var2);
+            }
+            else
+            {
+                L_var_out = L_var1 >> var2;
+            }
+        }
+    }
+    return (L_var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : shr_r                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Same as shr(var1,var2) but with rounding. Saturate the result in case of|
+ |   underflows or overflows :                                               |
+ |    - If var2 is greater than zero :                                       |
+ |          if (sub(shl(shr(var1,var2),1),shr(var1,sub(var2,1))))            |
+ |          is equal to zero                                                 |
+ |                     then                                                  |
+ |                     shr_r(var1,var2) = shr(var1,var2)                     |
+ |                     else                                                  |
+ |                     shr_r(var1,var2) = add(shr(var1,var2),1)              |
+ |    - If var2 is less than or equal to zero :                              |
+ |                     shr_r(var1,var2) = shr(var1,var2).                    |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+#if (!SHR_R_IS_INLINE)
+Word16 shr_r (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+
+    if (var2 > 15)
+    {
+        var_out = 0;
+    }
+    else
+    {
+        var_out = shr (var1, var2);
+
+        if (var2 > 0)
+        {
+            if ((var1 & ((Word16) 1 << (var2 - 1))) != 0)
+            {
+                var_out++;
+            }
+        }
+    }
+
+    return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : mac_r                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Multiply var1 by var2 and shift the result left by 1. Add the 32 bit    |
+ |   result to L_var3 with saturation. Round the LS 16 bits of the result    |
+ |   into the MS 16 bits with saturation and shift the result right by 16.   |
+ |   Return a 16 bit result.                                                 |
+ |            mac_r(L_var3,var1,var2) = round(L_mac(L_var3,var1,var2))       |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0x0000 8000 <= L_var_out <= 0x0000 7fff.              |
+ |___________________________________________________________________________|
+*/
+#if (!MAC_R_IS_INLINE)
+Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+
+    L_var3 = L_mac (L_var3, var1, var2);
+    L_var3 = L_add (L_var3, (Word32) 0x00008000L);
+    var_out = extract_h (L_var3);
+
+    return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : msu_r                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Multiply var1 by var2 and shift the result left by 1. Subtract the 32   |
+ |   bit result to L_var3 with saturation. Round the LS 16 bits of the res-  |
+ |   ult into the MS 16 bits with saturation and shift the result right by   |
+ |   16. Return a 16 bit result.                                             |
+ |            msu_r(L_var3,var1,var2) = round(L_msu(L_var3,var1,var2))       |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0x0000 8000 <= L_var_out <= 0x0000 7fff.              |
+ |___________________________________________________________________________|
+*/
+#if (!MSU_R_IS_INLINE)
+Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+
+    L_var3 = L_msu (L_var3, var1, var2);
+    L_var3 = L_add (L_var3, (Word32) 0x00008000L);
+    var_out = extract_h (L_var3);
+
+    return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_deposit_h                                             |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Deposit the 16 bit var1 into the 16 MS bits of the 32 bit output. The   |
+ |   16 LS bits of the output are zeroed.                                    |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= var_out <= 0x7fff 0000.                |
+ |___________________________________________________________________________|
+*/
+//Word32 L_deposit_h (Word16 var1)
+//{
+//    Word32 L_var_out;
+//
+//    L_var_out = (Word32) var1 << 16;
+//
+//    return (L_var_out);
+//}
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_deposit_l                                             |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Deposit the 16 bit var1 into the 16 LS bits of the 32 bit output. The   |
+ |   16 MS bits of the output are sign extended.                             |
+ |                                                                           |
+ |   Complexity weight : 2                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0xFFFF 8000 <= var_out <= 0x0000 7fff.                |
+ |___________________________________________________________________________|
+*/
+//Word32 L_deposit_l (Word16 var1)
+//{
+//    Word32 L_var_out;
+//
+//    L_var_out = (Word32) var1;
+//
+//    return (L_var_out);
+//}
+
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_shr_r                                                 |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Same as L_shr(L_var1,var2) but with rounding. Saturate the result in    |
+ |   case of underflows or overflows :                                       |
+ |    - If var2 is greater than zero :                                       |
+ |          if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))|
+ |          is equal to zero                                                 |
+ |                     then                                                  |
+ |                     L_shr_r(L_var1,var2) = L_shr(L_var1,var2)             |
+ |                     else                                                  |
+ |                     L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1)    |
+ |    - If var2 is less than or equal to zero :                              |
+ |                     L_shr_r(L_var1,var2) = L_shr(L_var1,var2).            |
+ |                                                                           |
+ |   Complexity weight : 3                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1                                                                 |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= var_out <= 0x7fff ffff.                |
+ |___________________________________________________________________________|
+*/
+#if (!L_SHR_R_IS_INLINE)
+Word32 L_shr_r (Word32 L_var1, Word16 var2)
+{
+    Word32 L_var_out;
+
+    if (var2 > 31)
+    {
+        L_var_out = 0;
+    }
+    else
+    {
+        L_var_out = L_shr (L_var1, var2);
+
+        if (var2 > 0)
+        {
+            if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)
+            {
+                L_var_out++;
+            }
+        }
+    }
+
+    return (L_var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : L_abs                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |    Absolute value of L_var1; Saturate in case where the input is          |
+ |                                                               -214783648  |
+ |                                                                           |
+ |   Complexity weight : 3                                                   |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1                                                                 |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    L_var_out                                                              |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x0000 0000 <= var_out <= 0x7fff ffff.                |
+ |___________________________________________________________________________|
+*/
+//Word32 L_abs (Word32 L_var1)
+//{
+//    Word32 L_var_out;
+//
+//    if (L_var1 == MIN_32)
+//    {
+//        L_var_out = MAX_32;
+//    }
+//    else
+//    {
+//        if (L_var1 < 0)
+//        {
+//            L_var_out = -L_var1;
+//        }
+//        else
+//        {
+//            L_var_out = L_var1;
+//        }
+//    }
+//
+//    return (L_var_out);
+//}
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : norm_s                                                  |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Produces the number of left shift needed to normalize the 16 bit varia- |
+ |   ble var1 for positive values on the interval with minimum of 16384 and  |
+ |   maximum of 32767, and for negative values on the interval with minimum  |
+ |   of -32768 and maximum of -16384; in order to normalize the result, the  |
+ |   following operation must be done :                                      |
+ |                    norm_var1 = shl(var1,norm_s(var1)).                    |
+ |                                                                           |
+ |   Complexity weight : 15                                                  |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0x0000 0000 <= var_out <= 0x0000 000f.                |
+ |___________________________________________________________________________|
+*/
+
+#if (!NORM_S_IS_INLINE)
+Word16 norm_s (Word16 var1)
+{
+    Word16 var_out;
+
+    if (var1 == 0)
+    {
+        var_out = 0;
+    }
+    else
+    {
+        if (var1 == -1)
+        {
+            var_out = 15;
+        }
+        else
+        {
+            if (var1 < 0)
+            {
+                var1 = (Word16)~var1;
+            }
+            for (var_out = 0; var1 < 0x4000; var_out++)
+            {
+                var1 <<= 1;
+            }
+        }
+    }
+
+    return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : div_s                                                   |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Produces a result which is the fractional integer division of var1  by  |
+ |   var2; var1 and var2 must be positive and var2 must be greater or equal  |
+ |   to var1; the result is positive (leading bit equal to 0) and truncated  |
+ |   to 16 bits.                                                             |
+ |   If var1 = var2 then div(var1,var2) = 32767.                             |
+ |                                                                           |
+ |   Complexity weight : 18                                                  |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    var1                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0x0000 0000 <= var1 <= var2 and var2 != 0.            |
+ |                                                                           |
+ |    var2                                                                   |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : var1 <= var2 <= 0x0000 7fff and var2 != 0.            |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0x0000 0000 <= var_out <= 0x0000 7fff.                |
+ |             It's a Q15 value (point between b15 and b14).                 |
+ |___________________________________________________________________________|
+*/
+
+#if (!DIV_S_IS_INLINE)
+Word16 div_s (Word16 var1, Word16 var2)
+{
+    Word16 var_out = 0;
+    Word16 iteration;
+    Word32 L_num;
+    Word32 L_denom;
+
+    if (var1 == 0)
+    {
+        var_out = 0;
+    }
+    else
+    {
+        if (var1 == var2)
+        {
+            var_out = MAX_16;
+        }
+        else
+        {
+            L_num = L_deposit_l (var1);
+            L_denom = L_deposit_l (var2);
+
+            for (iteration = 0; iteration < 15; iteration++)
+            {
+                var_out <<= 1;
+                L_num <<= 1;
+
+                if (L_num >= L_denom)
+                {
+                    L_num = L_sub(L_num, L_denom);
+                    var_out = add (var_out, 1);
+                }
+            }
+        }
+    }
+
+    return (var_out);
+}
+#endif
+
+/*___________________________________________________________________________
+ |                                                                           |
+ |   Function Name : norm_l                                                  |
+ |                                                                           |
+ |   Purpose :                                                               |
+ |                                                                           |
+ |   Produces the number of left shifts needed to normalize the 32 bit varia-|
+ |   ble L_var1 for positive values on the interval with minimum of          |
+ |   1073741824 and maximum of 2147483647, and for negative values on the in-|
+ |   terval with minimum of -2147483648 and maximum of -1073741824; in order |
+ |   to normalize the result, the following operation must be done :         |
+ |                   norm_L_var1 = L_shl(L_var1,norm_l(L_var1)).             |
+ |                                                                           |
+ |   Complexity weight : 30                                                  |
+ |                                                                           |
+ |   Inputs :                                                                |
+ |                                                                           |
+ |    L_var1                                                                 |
+ |             32 bit long signed integer (Word32) whose value falls in the  |
+ |             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |
+ |                                                                           |
+ |   Outputs :                                                               |
+ |                                                                           |
+ |    none                                                                   |
+ |                                                                           |
+ |   Return Value :                                                          |
+ |                                                                           |
+ |    var_out                                                                |
+ |             16 bit short signed integer (Word16) whose value falls in the |
+ |             range : 0x0000 0000 <= var_out <= 0x0000 001f.                |
+ |___________________________________________________________________________|
+*/
+
+#if (!NORM_L_IS_INLINE)
+Word16 norm_l (Word32 L_var1)
+{
+    Word16 var_out;
+
+    if (L_var1 == 0)
+    {
+        var_out = 0;
+    }
+    else
+    {
+        if (L_var1 == (Word32) 0xffffffffL)
+        {
+            var_out = 31;
+        }
+        else
+        {
+            if (L_var1 < 0)
+            {
+                L_var1 = ~L_var1;
+            }
+            for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)
+            {
+                L_var1 <<= 1;
+            }
+        }
+    }
+
+    return (var_out);
+}
+#endif
 
diff --git a/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c b/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c
index 906a9df..0ad82f0 100644
--- a/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c
+++ b/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		oper_32b.c

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		oper_32b.c
+
 	Content:	  This file contains operations in double precision.
- 

+ 
 *******************************************************************************/
 
 #include "typedef.h"
@@ -198,164 +198,164 @@
 
     return (L_32);
 }
-

-/*!

- 

-  \brief  calculates the log dualis times 4 of argument 

-          iLog4(x) = (Word32)(4 * log(value)/log(2.0))

-

-  \return ilog4 value

- 

-*/

-Word16 iLog4(Word32 value)

-{

-  Word16 iLog4;

-

-  if(value != 0){

-    Word32 tmp;

-    Word16 tmp16;

-    iLog4 = norm_l(value);

-    tmp = (value << iLog4);

-    tmp16 = round16(tmp);

-    tmp = L_mult(tmp16, tmp16);

-    tmp16 = round16(tmp);

-    tmp = L_mult(tmp16, tmp16);

-    tmp16 = round16(tmp);

-

-    iLog4 = (-(iLog4 << 2) - norm_s(tmp16)) - 1;

-  }

-  else {

-    iLog4 = -128; /* -(INT_BITS*4); */                                          

-  }

-

-  return iLog4;

-}

-

-#define step(shift) \

-    if ((0x40000000l >> shift) + root <= value)       \

-    {                                                 \

-        value -= (0x40000000l >> shift) + root;       \

-        root = (root >> 1) | (0x40000000l >> shift);  \

-    } else {                                          \

-        root = root >> 1;                             \

-    }

-

-Word32 rsqrt(Word32 value,     /*!< Operand to square root (0.0 ... 1) */

-             Word32 accuracy)  /*!< Number of valid bits that will be calculated */

-{

-    Word32 root = 0;

-	Word32 scale;

-

-	if(value < 0)

-		return 0;

-

-	scale = norm_l(value);

-	if(scale & 1) scale--;

-

-	value <<= scale;

-

-	step( 0); step( 2); step( 4); step( 6);

-    step( 8); step(10); step(12); step(14);

-    step(16); step(18); step(20); step(22);

-    step(24); step(26); step(28); step(30);

-

-    scale >>= 1;

-	if (root < value)

-        ++root;

-

-	root >>= scale;

-    return root* 46334;

-}

-

-static const Word32 pow2Table[POW2_TABLE_SIZE] = {

-0x7fffffff, 0x7fa765ad, 0x7f4f08ae, 0x7ef6e8da, 

-0x7e9f0606, 0x7e476009, 0x7deff6b6, 0x7d98c9e6, 

-0x7d41d96e, 0x7ceb2523, 0x7c94acde, 0x7c3e7073, 

-0x7be86fb9, 0x7b92aa88, 0x7b3d20b6, 0x7ae7d21a, 

-0x7a92be8b, 0x7a3de5df, 0x79e947ef, 0x7994e492, 

-0x7940bb9e, 0x78ecccec, 0x78991854, 0x78459dac, 

-0x77f25cce, 0x779f5591, 0x774c87cc, 0x76f9f359, 

-0x76a7980f, 0x765575c8, 0x76038c5b, 0x75b1dba2, 

-0x75606374, 0x750f23ab, 0x74be1c20, 0x746d4cac, 

-0x741cb528, 0x73cc556d, 0x737c2d55, 0x732c3cba, 

-0x72dc8374, 0x728d015d, 0x723db650, 0x71eea226, 

-0x719fc4b9, 0x71511de4, 0x7102ad80, 0x70b47368, 

-0x70666f76, 0x7018a185, 0x6fcb096f, 0x6f7da710, 

-0x6f307a41, 0x6ee382de, 0x6e96c0c3, 0x6e4a33c9, 

-0x6dfddbcc, 0x6db1b8a8, 0x6d65ca38, 0x6d1a1057, 

-0x6cce8ae1, 0x6c8339b2, 0x6c381ca6, 0x6bed3398, 

-0x6ba27e66, 0x6b57fce9, 0x6b0daeff, 0x6ac39485, 

-0x6a79ad56, 0x6a2ff94f, 0x69e6784d, 0x699d2a2c, 

-0x69540ec9, 0x690b2601, 0x68c26fb1, 0x6879ebb6, 

-0x683199ed, 0x67e97a34, 0x67a18c68, 0x6759d065, 

-0x6712460b, 0x66caed35, 0x6683c5c3, 0x663ccf92, 

-0x65f60a80, 0x65af766a, 0x6569132f, 0x6522e0ad, 

-0x64dcdec3, 0x64970d4f, 0x64516c2e, 0x640bfb41, 

-0x63c6ba64, 0x6381a978, 0x633cc85b, 0x62f816eb, 

-0x62b39509, 0x626f4292, 0x622b1f66, 0x61e72b65, 

-0x61a3666d, 0x615fd05f, 0x611c6919, 0x60d9307b, 

-0x60962665, 0x60534ab7, 0x60109d51, 0x5fce1e12, 

-0x5f8bccdb, 0x5f49a98c, 0x5f07b405, 0x5ec5ec26, 

-0x5e8451d0, 0x5e42e4e3, 0x5e01a540, 0x5dc092c7, 

-0x5d7fad59, 0x5d3ef4d7, 0x5cfe6923, 0x5cbe0a1c, 

-0x5c7dd7a4, 0x5c3dd19c, 0x5bfdf7e5, 0x5bbe4a61, 

-0x5b7ec8f2, 0x5b3f7377, 0x5b0049d4, 0x5ac14bea, 

-0x5a82799a, 0x5a43d2c6, 0x5a055751, 0x59c7071c, 

-0x5988e209, 0x594ae7fb, 0x590d18d3, 0x58cf7474, 

-0x5891fac1, 0x5854ab9b, 0x581786e6, 0x57da8c83, 

-0x579dbc57, 0x57611642, 0x57249a29, 0x56e847ef, 

-0x56ac1f75, 0x567020a0, 0x56344b52, 0x55f89f70, 

-0x55bd1cdb, 0x5581c378, 0x55469329, 0x550b8bd4, 

-0x54d0ad5b, 0x5495f7a1, 0x545b6a8b, 0x542105fd, 

-0x53e6c9db, 0x53acb607, 0x5372ca68, 0x533906e0, 

-0x52ff6b55, 0x52c5f7aa, 0x528cabc3, 0x52538786, 

-0x521a8ad7, 0x51e1b59a, 0x51a907b4, 0x5170810b, 

-0x51382182, 0x50ffe8fe, 0x50c7d765, 0x508fec9c, 

-0x50582888, 0x50208b0e, 0x4fe91413, 0x4fb1c37c, 

-0x4f7a9930, 0x4f439514, 0x4f0cb70c, 0x4ed5ff00, 

-0x4e9f6cd4, 0x4e69006e, 0x4e32b9b4, 0x4dfc988c, 

-0x4dc69cdd, 0x4d90c68b, 0x4d5b157e, 0x4d25899c, 

-0x4cf022ca, 0x4cbae0ef, 0x4c85c3f1, 0x4c50cbb8, 

-0x4c1bf829, 0x4be7492b, 0x4bb2bea5, 0x4b7e587d, 

-0x4b4a169c, 0x4b15f8e6, 0x4ae1ff43, 0x4aae299b, 

-0x4a7a77d5, 0x4a46e9d6, 0x4a137f88, 0x49e038d0, 

-0x49ad1598, 0x497a15c4, 0x4947393f, 0x49147fee, 

-0x48e1e9ba, 0x48af768a, 0x487d2646, 0x484af8d6, 

-0x4818ee22, 0x47e70611, 0x47b5408c, 0x47839d7b, 

-0x47521cc6, 0x4720be55, 0x46ef8210, 0x46be67e0, 

-0x468d6fae, 0x465c9961, 0x462be4e2, 0x45fb521a, 

-0x45cae0f2, 0x459a9152, 0x456a6323, 0x453a564d, 

-0x450a6abb, 0x44daa054, 0x44aaf702, 0x447b6ead, 

-0x444c0740, 0x441cc0a3, 0x43ed9ac0, 0x43be9580, 

-0x438fb0cb, 0x4360ec8d, 0x433248ae, 0x4303c517, 

-0x42d561b4, 0x42a71e6c, 0x4278fb2b, 0x424af7da, 

-0x421d1462, 0x41ef50ae, 0x41c1aca8, 0x41942839, 

-0x4166c34c, 0x41397dcc, 0x410c57a2, 0x40df50b8, 

-0x40b268fa, 0x4085a051, 0x4058f6a8, 0x402c6be9 

-};

-

-/*!

- 

-  \brief calculates 2 ^ (x/y) for x<=0, y > 0, x <= 32768 * y 

-  

-  avoids integer division

-  

-  \return 

-*/

-Word32 pow2_xy(Word32 x, Word32 y)

-{

-  Word32 iPart;

-  Word32 fPart;

-  Word32 res;

-  Word32 tmp, tmp2;

-  Word32 shift, shift2;

-

-  tmp2 = -x;

-  iPart = tmp2 / y;

-  fPart = tmp2 - iPart*y;

-  iPart = min(iPart,INT_BITS-1);

-

-  res = pow2Table[(POW2_TABLE_SIZE*fPart)/y] >> iPart; 

- 

-  return(res);

+
+/*!
+ 
+  \brief  calculates the log dualis times 4 of argument 
+          iLog4(x) = (Word32)(4 * log(value)/log(2.0))
+
+  \return ilog4 value
+ 
+*/
+Word16 iLog4(Word32 value)
+{
+  Word16 iLog4;
+
+  if(value != 0){
+    Word32 tmp;
+    Word16 tmp16;
+    iLog4 = norm_l(value);
+    tmp = (value << iLog4);
+    tmp16 = round16(tmp);
+    tmp = L_mult(tmp16, tmp16);
+    tmp16 = round16(tmp);
+    tmp = L_mult(tmp16, tmp16);
+    tmp16 = round16(tmp);
+
+    iLog4 = (-(iLog4 << 2) - norm_s(tmp16)) - 1;
+  }
+  else {
+    iLog4 = -128; /* -(INT_BITS*4); */                                          
+  }
+
+  return iLog4;
+}
+
+#define step(shift) \
+    if ((0x40000000l >> shift) + root <= value)       \
+    {                                                 \
+        value -= (0x40000000l >> shift) + root;       \
+        root = (root >> 1) | (0x40000000l >> shift);  \
+    } else {                                          \
+        root = root >> 1;                             \
+    }
+
+Word32 rsqrt(Word32 value,     /*!< Operand to square root (0.0 ... 1) */
+             Word32 accuracy)  /*!< Number of valid bits that will be calculated */
+{
+    Word32 root = 0;
+	Word32 scale;
+
+	if(value < 0)
+		return 0;
+
+	scale = norm_l(value);
+	if(scale & 1) scale--;
+
+	value <<= scale;
+
+	step( 0); step( 2); step( 4); step( 6);
+    step( 8); step(10); step(12); step(14);
+    step(16); step(18); step(20); step(22);
+    step(24); step(26); step(28); step(30);
+
+    scale >>= 1;
+	if (root < value)
+        ++root;
+
+	root >>= scale;
+    return root* 46334;
+}
+
+static const Word32 pow2Table[POW2_TABLE_SIZE] = {
+0x7fffffff, 0x7fa765ad, 0x7f4f08ae, 0x7ef6e8da, 
+0x7e9f0606, 0x7e476009, 0x7deff6b6, 0x7d98c9e6, 
+0x7d41d96e, 0x7ceb2523, 0x7c94acde, 0x7c3e7073, 
+0x7be86fb9, 0x7b92aa88, 0x7b3d20b6, 0x7ae7d21a, 
+0x7a92be8b, 0x7a3de5df, 0x79e947ef, 0x7994e492, 
+0x7940bb9e, 0x78ecccec, 0x78991854, 0x78459dac, 
+0x77f25cce, 0x779f5591, 0x774c87cc, 0x76f9f359, 
+0x76a7980f, 0x765575c8, 0x76038c5b, 0x75b1dba2, 
+0x75606374, 0x750f23ab, 0x74be1c20, 0x746d4cac, 
+0x741cb528, 0x73cc556d, 0x737c2d55, 0x732c3cba, 
+0x72dc8374, 0x728d015d, 0x723db650, 0x71eea226, 
+0x719fc4b9, 0x71511de4, 0x7102ad80, 0x70b47368, 
+0x70666f76, 0x7018a185, 0x6fcb096f, 0x6f7da710, 
+0x6f307a41, 0x6ee382de, 0x6e96c0c3, 0x6e4a33c9, 
+0x6dfddbcc, 0x6db1b8a8, 0x6d65ca38, 0x6d1a1057, 
+0x6cce8ae1, 0x6c8339b2, 0x6c381ca6, 0x6bed3398, 
+0x6ba27e66, 0x6b57fce9, 0x6b0daeff, 0x6ac39485, 
+0x6a79ad56, 0x6a2ff94f, 0x69e6784d, 0x699d2a2c, 
+0x69540ec9, 0x690b2601, 0x68c26fb1, 0x6879ebb6, 
+0x683199ed, 0x67e97a34, 0x67a18c68, 0x6759d065, 
+0x6712460b, 0x66caed35, 0x6683c5c3, 0x663ccf92, 
+0x65f60a80, 0x65af766a, 0x6569132f, 0x6522e0ad, 
+0x64dcdec3, 0x64970d4f, 0x64516c2e, 0x640bfb41, 
+0x63c6ba64, 0x6381a978, 0x633cc85b, 0x62f816eb, 
+0x62b39509, 0x626f4292, 0x622b1f66, 0x61e72b65, 
+0x61a3666d, 0x615fd05f, 0x611c6919, 0x60d9307b, 
+0x60962665, 0x60534ab7, 0x60109d51, 0x5fce1e12, 
+0x5f8bccdb, 0x5f49a98c, 0x5f07b405, 0x5ec5ec26, 
+0x5e8451d0, 0x5e42e4e3, 0x5e01a540, 0x5dc092c7, 
+0x5d7fad59, 0x5d3ef4d7, 0x5cfe6923, 0x5cbe0a1c, 
+0x5c7dd7a4, 0x5c3dd19c, 0x5bfdf7e5, 0x5bbe4a61, 
+0x5b7ec8f2, 0x5b3f7377, 0x5b0049d4, 0x5ac14bea, 
+0x5a82799a, 0x5a43d2c6, 0x5a055751, 0x59c7071c, 
+0x5988e209, 0x594ae7fb, 0x590d18d3, 0x58cf7474, 
+0x5891fac1, 0x5854ab9b, 0x581786e6, 0x57da8c83, 
+0x579dbc57, 0x57611642, 0x57249a29, 0x56e847ef, 
+0x56ac1f75, 0x567020a0, 0x56344b52, 0x55f89f70, 
+0x55bd1cdb, 0x5581c378, 0x55469329, 0x550b8bd4, 
+0x54d0ad5b, 0x5495f7a1, 0x545b6a8b, 0x542105fd, 
+0x53e6c9db, 0x53acb607, 0x5372ca68, 0x533906e0, 
+0x52ff6b55, 0x52c5f7aa, 0x528cabc3, 0x52538786, 
+0x521a8ad7, 0x51e1b59a, 0x51a907b4, 0x5170810b, 
+0x51382182, 0x50ffe8fe, 0x50c7d765, 0x508fec9c, 
+0x50582888, 0x50208b0e, 0x4fe91413, 0x4fb1c37c, 
+0x4f7a9930, 0x4f439514, 0x4f0cb70c, 0x4ed5ff00, 
+0x4e9f6cd4, 0x4e69006e, 0x4e32b9b4, 0x4dfc988c, 
+0x4dc69cdd, 0x4d90c68b, 0x4d5b157e, 0x4d25899c, 
+0x4cf022ca, 0x4cbae0ef, 0x4c85c3f1, 0x4c50cbb8, 
+0x4c1bf829, 0x4be7492b, 0x4bb2bea5, 0x4b7e587d, 
+0x4b4a169c, 0x4b15f8e6, 0x4ae1ff43, 0x4aae299b, 
+0x4a7a77d5, 0x4a46e9d6, 0x4a137f88, 0x49e038d0, 
+0x49ad1598, 0x497a15c4, 0x4947393f, 0x49147fee, 
+0x48e1e9ba, 0x48af768a, 0x487d2646, 0x484af8d6, 
+0x4818ee22, 0x47e70611, 0x47b5408c, 0x47839d7b, 
+0x47521cc6, 0x4720be55, 0x46ef8210, 0x46be67e0, 
+0x468d6fae, 0x465c9961, 0x462be4e2, 0x45fb521a, 
+0x45cae0f2, 0x459a9152, 0x456a6323, 0x453a564d, 
+0x450a6abb, 0x44daa054, 0x44aaf702, 0x447b6ead, 
+0x444c0740, 0x441cc0a3, 0x43ed9ac0, 0x43be9580, 
+0x438fb0cb, 0x4360ec8d, 0x433248ae, 0x4303c517, 
+0x42d561b4, 0x42a71e6c, 0x4278fb2b, 0x424af7da, 
+0x421d1462, 0x41ef50ae, 0x41c1aca8, 0x41942839, 
+0x4166c34c, 0x41397dcc, 0x410c57a2, 0x40df50b8, 
+0x40b268fa, 0x4085a051, 0x4058f6a8, 0x402c6be9 
+};
+
+/*!
+ 
+  \brief calculates 2 ^ (x/y) for x<=0, y > 0, x <= 32768 * y 
+  
+  avoids integer division
+  
+  \return 
+*/
+Word32 pow2_xy(Word32 x, Word32 y)
+{
+  Word32 iPart;
+  Word32 fPart;
+  Word32 res;
+  Word32 tmp, tmp2;
+  Word32 shift, shift2;
+
+  tmp2 = -x;
+  iPart = tmp2 / y;
+  fPart = tmp2 - iPart*y;
+  iPart = min(iPart,INT_BITS-1);
+
+  res = pow2Table[(POW2_TABLE_SIZE*fPart)/y] >> iPart; 
+ 
+  return(res);
 }
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/basic_op/oper_32b.h b/media/libstagefright/codecs/aacenc/basic_op/oper_32b.h
index 4119bc3..1d35e5e 100644
--- a/media/libstagefright/codecs/aacenc/basic_op/oper_32b.h
+++ b/media/libstagefright/codecs/aacenc/basic_op/oper_32b.h
@@ -1,86 +1,86 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		oper_32b.h

-

-	Content:	Double precision operations

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		oper_32b.h
+
+	Content:	Double precision operations
+
 *******************************************************************************/
 
 #ifndef __OPER_32b_H
 #define __OPER_32b_H
-

-#include "typedef.h"

+
+#include "typedef.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
-

-#define POW2_TABLE_BITS 8

-#define POW2_TABLE_SIZE (1<<POW2_TABLE_BITS)

+
+#define POW2_TABLE_BITS 8
+#define POW2_TABLE_SIZE (1<<POW2_TABLE_BITS)
 
 void L_Extract (Word32 L_32, Word16 *hi, Word16 *lo);
 Word32 L_Comp (Word16 hi, Word16 lo);
 Word32 Mpy_32 (Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2);
 Word32 Mpy_32_16 (Word16 hi, Word16 lo, Word16 n);
 Word32 Div_32 (Word32 L_num, Word32 denom);
-Word16 iLog4(Word32 value);

-Word32 rsqrt(Word32 value,  Word32 accuracy);

-Word32 pow2_xy(Word32 x, Word32 y);

-

-__inline Word32 L_mpy_ls(Word32 L_var2, Word16 var1)

-{

-    unsigned short swLow1;

-    Word16 swHigh1;

-    Word32 l_var_out;

-

-    swLow1 = (unsigned short)(L_var2);

-    swHigh1 = (Word16)(L_var2 >> 16);

-

-    l_var_out = (long)swLow1 * (long)var1 >> 15;

-    

-    l_var_out += swHigh1 * var1 << 1;

-    

-    return(l_var_out);

-}

-

-__inline Word32 L_mpy_wx(Word32 L_var2, Word16 var1)

-{

-#if ARMV5TE_L_MPY_LS

-	Word32 result; 

-	asm volatile( 

-		"SMULWB  %[result], %[L_var2], %[var1] \n" 

-		:[result]"+r"(result)

-		:[L_var2]"r"(L_var2), [var1]"r"(var1)

-		); 

-	return result;

-#else

-    unsigned short swLow1;

-    Word16 swHigh1;

-    Word32 l_var_out;

-

-    swLow1 = (unsigned short)(L_var2);

-    swHigh1 = (Word16)(L_var2 >> 16);

-

-    l_var_out = (long)swLow1 * (long)var1 >> 16;    

-    l_var_out += swHigh1 * var1;

-    

-    return(l_var_out);

-#endif

-}

+Word16 iLog4(Word32 value);
+Word32 rsqrt(Word32 value,  Word32 accuracy);
+Word32 pow2_xy(Word32 x, Word32 y);
+
+__inline Word32 L_mpy_ls(Word32 L_var2, Word16 var1)
+{
+    unsigned short swLow1;
+    Word16 swHigh1;
+    Word32 l_var_out;
+
+    swLow1 = (unsigned short)(L_var2);
+    swHigh1 = (Word16)(L_var2 >> 16);
+
+    l_var_out = (long)swLow1 * (long)var1 >> 15;
+    
+    l_var_out += swHigh1 * var1 << 1;
+    
+    return(l_var_out);
+}
+
+__inline Word32 L_mpy_wx(Word32 L_var2, Word16 var1)
+{
+#if ARMV5TE_L_MPY_LS
+	Word32 result; 
+	asm volatile( 
+		"SMULWB  %[result], %[L_var2], %[var1] \n" 
+		:[result]"+r"(result)
+		:[L_var2]"r"(L_var2), [var1]"r"(var1)
+		); 
+	return result;
+#else
+    unsigned short swLow1;
+    Word16 swHigh1;
+    Word32 l_var_out;
+
+    swLow1 = (unsigned short)(L_var2);
+    swHigh1 = (Word16)(L_var2 >> 16);
+
+    l_var_out = (long)swLow1 * (long)var1 >> 16;    
+    l_var_out += swHigh1 * var1;
+    
+    return(l_var_out);
+#endif
+}
 
 #ifdef __cplusplus
 }
diff --git a/media/libstagefright/codecs/aacenc/basic_op/typedef.h b/media/libstagefright/codecs/aacenc/basic_op/typedef.h
index d3a626a..1030803 100644
--- a/media/libstagefright/codecs/aacenc/basic_op/typedef.h
+++ b/media/libstagefright/codecs/aacenc/basic_op/typedef.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		typedef.h

-

-	Content:	type defined for defferent paltform

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		typedef.h
+
+	Content:	type defined for defferent paltform
+
 *******************************************************************************/
 
 #ifndef typedef_h
@@ -54,7 +54,7 @@
 
 /*
  * use (improved) type definition file typdefs.h and add a "Flag" type
- */

+ */
 #include "typedefs.h"
 typedef int Flag;
 
diff --git a/media/libstagefright/codecs/aacenc/basic_op/typedefs.h b/media/libstagefright/codecs/aacenc/basic_op/typedefs.h
index 7d16fca..c7e774b 100644
--- a/media/libstagefright/codecs/aacenc/basic_op/typedefs.h
+++ b/media/libstagefright/codecs/aacenc/basic_op/typedefs.h
@@ -1,56 +1,56 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		typedefs.h

-

-	Content:	type defined or const defined

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		typedefs.h
+
+	Content:	type defined or const defined
+
 *******************************************************************************/
 
 #ifndef typedefs_h
 #define typedefs_h "$Id $"
 
-#ifndef CHAR_BIT

-#define CHAR_BIT      8         /* number of bits in a char */

-#endif

-

-#ifndef VOAAC_SHRT_MAX

-#define VOAAC_SHRT_MAX    (32767)        /* maximum (signed) short value */

-#endif

+#ifndef CHAR_BIT
+#define CHAR_BIT      8         /* number of bits in a char */
+#endif
 
-#ifndef VOAAC_SHRT_MIN

-#define VOAAC_SHRT_MIN    (-32768)        /* minimum (signed) short value */

-#endif

+#ifndef VOAAC_SHRT_MAX
+#define VOAAC_SHRT_MAX    (32767)        /* maximum (signed) short value */
+#endif
 
-/* Define NULL pointer value */

-#ifndef NULL

-#ifdef __cplusplus

-#define NULL    0

-#else

-#define NULL    ((void *)0)

-#endif

+#ifndef VOAAC_SHRT_MIN
+#define VOAAC_SHRT_MIN    (-32768)        /* minimum (signed) short value */
+#endif
+
+/* Define NULL pointer value */
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL    0
+#else
+#define NULL    ((void *)0)
+#endif
 #endif
 
 #ifndef assert
 #define assert(_Expression)     ((void)0)
 #endif
-

-#ifdef LINUX

-#define __inline static __inline__

-#endif

+
+#ifdef LINUX
+#define __inline static __inline__
+#endif
 
 #define INT_BITS   32
 /*
@@ -80,100 +80,100 @@
 typedef long Word32;
 typedef unsigned long UWord32;
 
-

-

+
+
 #ifdef LINUX
 typedef long long Word64;
 typedef unsigned long long UWord64;
 #else
-typedef __int64 Word64;

+typedef __int64 Word64;
 typedef unsigned __int64 UWord64;
 #endif
 
-#ifndef min

-#define min(a,b) ( a < b ? a : b)

-#endif

-

-#ifndef max

-#define max(a,b) ( a > b ? a : b)

-#endif

-

-#ifdef ARM_INASM

-#ifdef ARMV5_INASM

-#define ARMV5E_INASM	1

-#endif

-#define ARMV4_INASM		1

-#endif

-
-#if ARMV4_INASM

-	#define ARMV5TE_SAT           1

-    #define ARMV5TE_ADD           1

-    #define ARMV5TE_SUB           1

-	#define ARMV5TE_SHL           1

-    #define ARMV5TE_SHR           1

-	#define ARMV5TE_L_SHL         1

-    #define ARMV5TE_L_SHR         1

-#endif//ARMV4

-#if ARMV5E_INASM

-    #define ARMV5TE_L_ADD         1

-    #define ARMV5TE_L_SUB         1

-    #define ARMV5TE_L_MULT        1

-    #define ARMV5TE_L_MAC         1

-    #define ARMV5TE_L_MSU         1

-   

-    

-    #define ARMV5TE_DIV_S         1

-    #define ARMV5TE_ROUND         1

-    #define ARMV5TE_MULT          1

-    

-    #define ARMV5TE_NORM_S        1

-    #define ARMV5TE_NORM_L        1

-	#define ARMV5TE_L_MPY_LS	  1

+#ifndef min
+#define min(a,b) ( a < b ? a : b)
 #endif
-

-//basic operation functions optimization flags

-#define SATRUATE_IS_INLINE              1   //define saturate as inline function

-#define SHL_IS_INLINE                   1  //define shl as inline function

-#define SHR_IS_INLINE                   1   //define shr as inline function

-#define L_MULT_IS_INLINE                1   //define L_mult as inline function

-#define L_MSU_IS_INLINE                 1   //define L_msu as inline function

-#define L_SUB_IS_INLINE                 1   //define L_sub as inline function

-#define L_SHL_IS_INLINE                 1   //define L_shl as inline function

-#define L_SHR_IS_INLINE                 1   //define L_shr as inline function

-#define ADD_IS_INLINE                   1   //define add as inline function //add, inline is the best

-#define SUB_IS_INLINE                   1   //define sub as inline function //sub, inline is the best

-#define DIV_S_IS_INLINE                 1   //define div_s as inline function

-#define MULT_IS_INLINE                  1   //define mult as inline function

-#define NORM_S_IS_INLINE                1   //define norm_s as inline function

-#define NORM_L_IS_INLINE                1   //define norm_l as inline function

-#define ROUND_IS_INLINE                 1   //define round as inline function

-#define L_MAC_IS_INLINE                 1   //define L_mac as inline function

-#define L_ADD_IS_INLINE                 1   //define L_add as inline function

-#define EXTRACT_H_IS_INLINE             1   //define extract_h as inline function 

-#define EXTRACT_L_IS_INLINE             1   //define extract_l as inline function        //???

-#define MULT_R_IS_INLINE                1   //define mult_r as inline function

-#define SHR_R_IS_INLINE                 1   //define shr_r as inline function

-#define MAC_R_IS_INLINE                 1   //define mac_r as inline function

-#define MSU_R_IS_INLINE                 1   //define msu_r as inline function

-#define L_SHR_R_IS_INLINE               1   //define L_shr_r as inline function

-

-#define PREFIX				voAACEnc

-#define LINK0(x, y, z)		LINK1(x,y,z)

-#define LINK1(x,y,z)		x##y##z

-#define ADD_PREFIX(func)	LINK0(PREFIX, _, func)

-

-#define  L_Extract		ADD_PREFIX(L_Extract)

-#define  L_Comp			ADD_PREFIX(L_Comp)

-#define  Mpy_32			ADD_PREFIX(Mpy_32)

-#define  Mpy_32_16		ADD_PREFIX(Mpy_32_16)

-#define  Div_32			ADD_PREFIX(Div_32)

-#define  iLog4			ADD_PREFIX(iLog4)

-#define  rsqrt			ADD_PREFIX(rsqrt)

-#define  pow2_xy		ADD_PREFIX(pow2_xy)

-#define  L_mpy_ls		ADD_PREFIX(L_mpy_ls)

-#define  L_mpy_wx		ADD_PREFIX(L_mpy_wx)

-

-#define mem_malloc		ADD_PREFIX(mem_malloc)

-#define mem_free		ADD_PREFIX(mem_free)

-

+
+#ifndef max
+#define max(a,b) ( a > b ? a : b)
+#endif
+
+#ifdef ARM_INASM
+#ifdef ARMV5_INASM
+#define ARMV5E_INASM	1
+#endif
+#define ARMV4_INASM		1
+#endif
+
+#if ARMV4_INASM
+	#define ARMV5TE_SAT           1
+    #define ARMV5TE_ADD           1
+    #define ARMV5TE_SUB           1
+	#define ARMV5TE_SHL           1
+    #define ARMV5TE_SHR           1
+	#define ARMV5TE_L_SHL         1
+    #define ARMV5TE_L_SHR         1
+#endif//ARMV4
+#if ARMV5E_INASM
+    #define ARMV5TE_L_ADD         1
+    #define ARMV5TE_L_SUB         1
+    #define ARMV5TE_L_MULT        1
+    #define ARMV5TE_L_MAC         1
+    #define ARMV5TE_L_MSU         1
+   
+    
+    #define ARMV5TE_DIV_S         1
+    #define ARMV5TE_ROUND         1
+    #define ARMV5TE_MULT          1
+    
+    #define ARMV5TE_NORM_S        1
+    #define ARMV5TE_NORM_L        1
+	#define ARMV5TE_L_MPY_LS	  1
+#endif
+
+//basic operation functions optimization flags
+#define SATRUATE_IS_INLINE              1   //define saturate as inline function
+#define SHL_IS_INLINE                   1  //define shl as inline function
+#define SHR_IS_INLINE                   1   //define shr as inline function
+#define L_MULT_IS_INLINE                1   //define L_mult as inline function
+#define L_MSU_IS_INLINE                 1   //define L_msu as inline function
+#define L_SUB_IS_INLINE                 1   //define L_sub as inline function
+#define L_SHL_IS_INLINE                 1   //define L_shl as inline function
+#define L_SHR_IS_INLINE                 1   //define L_shr as inline function
+#define ADD_IS_INLINE                   1   //define add as inline function //add, inline is the best
+#define SUB_IS_INLINE                   1   //define sub as inline function //sub, inline is the best
+#define DIV_S_IS_INLINE                 1   //define div_s as inline function
+#define MULT_IS_INLINE                  1   //define mult as inline function
+#define NORM_S_IS_INLINE                1   //define norm_s as inline function
+#define NORM_L_IS_INLINE                1   //define norm_l as inline function
+#define ROUND_IS_INLINE                 1   //define round as inline function
+#define L_MAC_IS_INLINE                 1   //define L_mac as inline function
+#define L_ADD_IS_INLINE                 1   //define L_add as inline function
+#define EXTRACT_H_IS_INLINE             1   //define extract_h as inline function 
+#define EXTRACT_L_IS_INLINE             1   //define extract_l as inline function        //???
+#define MULT_R_IS_INLINE                1   //define mult_r as inline function
+#define SHR_R_IS_INLINE                 1   //define shr_r as inline function
+#define MAC_R_IS_INLINE                 1   //define mac_r as inline function
+#define MSU_R_IS_INLINE                 1   //define msu_r as inline function
+#define L_SHR_R_IS_INLINE               1   //define L_shr_r as inline function
+
+#define PREFIX				voAACEnc
+#define LINK0(x, y, z)		LINK1(x,y,z)
+#define LINK1(x,y,z)		x##y##z
+#define ADD_PREFIX(func)	LINK0(PREFIX, _, func)
+
+#define  L_Extract		ADD_PREFIX(L_Extract)
+#define  L_Comp			ADD_PREFIX(L_Comp)
+#define  Mpy_32			ADD_PREFIX(Mpy_32)
+#define  Mpy_32_16		ADD_PREFIX(Mpy_32_16)
+#define  Div_32			ADD_PREFIX(Div_32)
+#define  iLog4			ADD_PREFIX(iLog4)
+#define  rsqrt			ADD_PREFIX(rsqrt)
+#define  pow2_xy		ADD_PREFIX(pow2_xy)
+#define  L_mpy_ls		ADD_PREFIX(L_mpy_ls)
+#define  L_mpy_wx		ADD_PREFIX(L_mpy_wx)
+
+#define mem_malloc		ADD_PREFIX(mem_malloc)
+#define mem_free		ADD_PREFIX(mem_free)
+
 #endif
diff --git a/media/libstagefright/codecs/aacenc/inc/aac_rom.h b/media/libstagefright/codecs/aacenc/inc/aac_rom.h
index b0429fc..784bb70 100644
--- a/media/libstagefright/codecs/aacenc/inc/aac_rom.h
+++ b/media/libstagefright/codecs/aacenc/inc/aac_rom.h
@@ -1,28 +1,28 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		aac_rom.h

-

-	Content:	constant tables 

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		aac_rom.h
+
+	Content:	constant tables 
+
 *******************************************************************************/
 
 #ifndef ROM_H
 #define ROM_H
-

+
 #include "config.h"
 #include "psy_const.h"
 #include "tns_param.h"
@@ -31,16 +31,16 @@
   mdct
 */
 extern const int ShortWindowSine[FRAME_LEN_SHORT/2];
-extern const int LongWindowKBD[FRAME_LEN_LONG/2];

-

-extern const unsigned char bitrevTab[17 + 129];

-extern const int cossintab[128 + 1024];

-

-#if defined (ARMV5E) && !defined (ARMV7Neon)

-extern const int twidTab64[(4*6 + 16*6)/2];

-extern const int twidTab512[(8*6 + 32*6 + 128*6)/2];

-#else

-extern const int twidTab64[4*6 + 16*6];

+extern const int LongWindowKBD[FRAME_LEN_LONG/2];
+
+extern const unsigned char bitrevTab[17 + 129];
+extern const int cossintab[128 + 1024];
+
+#if defined (ARMV5E) && !defined (ARMV7Neon)
+extern const int twidTab64[(4*6 + 16*6)/2];
+extern const int twidTab512[(8*6 + 32*6 + 128*6)/2];
+#else
+extern const int twidTab64[4*6 + 16*6];
 extern const int twidTab512[8*6 + 32*6 + 128*6];
 #endif
 
@@ -61,7 +61,7 @@
 extern const UWord8 specExpTableComb_enc[4][14];
 
 extern const Word16 quantBorders[4][4];
-//extern const Word16 quantRecon[3][4];

+//extern const Word16 quantRecon[3][4];
 extern const Word16 quantRecon[4][3];
 
 /*
@@ -92,26 +92,26 @@
 /*
   misc
 */
-extern const int sampRateTab[NUM_SAMPLE_RATES];

-extern const int BandwithCoefTab[8][NUM_SAMPLE_RATES];

-extern const int rates[8];

-extern const UWord8 sfBandTotalShort[NUM_SAMPLE_RATES];

-extern const UWord8 sfBandTotalLong[NUM_SAMPLE_RATES];

-extern const int sfBandTabShortOffset[NUM_SAMPLE_RATES];

-extern const short sfBandTabShort[76];

-extern const int sfBandTabLongOffset[NUM_SAMPLE_RATES];

-extern const short sfBandTabLong[325];

+extern const int sampRateTab[NUM_SAMPLE_RATES];
+extern const int BandwithCoefTab[8][NUM_SAMPLE_RATES];
+extern const int rates[8];
+extern const UWord8 sfBandTotalShort[NUM_SAMPLE_RATES];
+extern const UWord8 sfBandTotalLong[NUM_SAMPLE_RATES];
+extern const int sfBandTabShortOffset[NUM_SAMPLE_RATES];
+extern const short sfBandTabShort[76];
+extern const int sfBandTabLongOffset[NUM_SAMPLE_RATES];
+extern const short sfBandTabLong[325];
 
 extern const Word32 m_log2_table[INT_BITS];
 
 /*
   TNS
 */
-extern const Word32 tnsCoeff3[8];

-extern const Word32 tnsCoeff3Borders[8];

-extern const Word32 tnsCoeff4[16];

-extern const Word32 tnsCoeff4Borders[16];

-extern const Word32 invSBF[24];

-extern const Word16 sideInfoTabLong[MAX_SFB_LONG + 1];

+extern const Word32 tnsCoeff3[8];
+extern const Word32 tnsCoeff3Borders[8];
+extern const Word32 tnsCoeff4[16];
+extern const Word32 tnsCoeff4Borders[16];
+extern const Word32 invSBF[24];
+extern const Word16 sideInfoTabLong[MAX_SFB_LONG + 1];
 extern const Word16 sideInfoTabShort[MAX_SFB_SHORT + 1];
 #endif
diff --git a/media/libstagefright/codecs/aacenc/inc/aacenc_core.h b/media/libstagefright/codecs/aacenc/inc/aacenc_core.h
index faa1d20..41ba756 100644
--- a/media/libstagefright/codecs/aacenc/inc/aacenc_core.h
+++ b/media/libstagefright/codecs/aacenc/inc/aacenc_core.h
@@ -1,37 +1,37 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		aacenc_core.h

-

-	Content:	aac encoder interface functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		aacenc_core.h
+
+	Content:	aac encoder interface functions
+
 *******************************************************************************/
 
 #ifndef _aacenc_core_h_
 #define _aacenc_core_h_
 
-

+
 #include "typedef.h"
-#include "config.h"

-#include "bitenc.h"

-

-#include "psy_configuration.h"

-#include "psy_main.h"

-#include "qc_main.h"

-#include "psy_main.h"

+#include "config.h"
+#include "bitenc.h"
+
+#include "psy_configuration.h"
+#include "psy_main.h"
+#include "qc_main.h"
+#include "psy_main.h"
 /*-------------------------- defines --------------------------------------*/
 
 
@@ -41,42 +41,42 @@
   Word32   bitRate;               /* encoder bit rate in bits/sec */
   Word16   nChannelsIn;           /* number of channels on input (1,2) */
   Word16   nChannelsOut;          /* number of channels on output (1,2) */
-  Word16   bandWidth;             /* targeted audio bandwidth in Hz */

+  Word16   bandWidth;             /* targeted audio bandwidth in Hz */
   Word16   adtsUsed;			  /* whether write adts header */
 } AACENC_CONFIG;
-

-

-typedef struct {

-	

-  AACENC_CONFIG config;     /* Word16 size: 8 */

-

-  ELEMENT_INFO elInfo;      /* Word16 size: 4 */

-

-  QC_STATE qcKernel;        /* Word16 size: 6 + 5(PADDING) + 7(ELEMENT_BITS) + 54(ADJ_THR_STATE) = 72 */

-  QC_OUT   qcOut;           /* Word16 size: MAX_CHANNELS*920(QC_OUT_CHANNEL) + 5(QC_OUT_ELEMENT) + 7 = 932 / 1852 */

-

-  PSY_OUT    psyOut;        /* Word16 size: MAX_CHANNELS*186 + 2 = 188 / 374 */

-  PSY_KERNEL psyKernel;     /* Word16 size:  2587 / 4491 */

-

-  struct BITSTREAMENCODER_INIT bseInit; /* Word16 size: 6 */

-  struct BIT_BUF  bitStream;            /* Word16 size: 8 */

-  HANDLE_BIT_BUF  hBitStream;

-  int			  initOK;

-

-  short			*intbuf;

-  short			*encbuf;

-  short			*inbuf;

-  int			enclen;

-  int			inlen;

-  int			intlen;

-  int			uselength;

-

-  void			*hCheck;

-  VO_MEM_OPERATOR *voMemop;

-  VO_MEM_OPERATOR voMemoprator;

-

-}AAC_ENCODER; /* Word16 size: 3809 / 6851 */

-

+
+
+typedef struct {
+	
+  AACENC_CONFIG config;     /* Word16 size: 8 */
+
+  ELEMENT_INFO elInfo;      /* Word16 size: 4 */
+
+  QC_STATE qcKernel;        /* Word16 size: 6 + 5(PADDING) + 7(ELEMENT_BITS) + 54(ADJ_THR_STATE) = 72 */
+  QC_OUT   qcOut;           /* Word16 size: MAX_CHANNELS*920(QC_OUT_CHANNEL) + 5(QC_OUT_ELEMENT) + 7 = 932 / 1852 */
+
+  PSY_OUT    psyOut;        /* Word16 size: MAX_CHANNELS*186 + 2 = 188 / 374 */
+  PSY_KERNEL psyKernel;     /* Word16 size:  2587 / 4491 */
+
+  struct BITSTREAMENCODER_INIT bseInit; /* Word16 size: 6 */
+  struct BIT_BUF  bitStream;            /* Word16 size: 8 */
+  HANDLE_BIT_BUF  hBitStream;
+  int			  initOK;
+
+  short			*intbuf;
+  short			*encbuf;
+  short			*inbuf;
+  int			enclen;
+  int			inlen;
+  int			intlen;
+  int			uselength;
+
+  void			*hCheck;
+  VO_MEM_OPERATOR *voMemop;
+  VO_MEM_OPERATOR voMemoprator;
+
+}AAC_ENCODER; /* Word16 size: 3809 / 6851 */
+
 /*-----------------------------------------------------------------------------
 
 functionname: AacInitDefaultConfig
diff --git a/media/libstagefright/codecs/aacenc/inc/adj_thr.h b/media/libstagefright/codecs/aacenc/inc/adj_thr.h
index 4057cbe..f7cb888 100644
--- a/media/libstagefright/codecs/aacenc/inc/adj_thr.h
+++ b/media/libstagefright/codecs/aacenc/inc/adj_thr.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		adj_thr.h

-

-	Content:	Threshold compensation function 

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		adj_thr.h
+
+	Content:	Threshold compensation function 
+
 *******************************************************************************/
 
 #ifndef __ADJ_THR_H
diff --git a/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h b/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h
index 25dd437..9ac4664 100644
--- a/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h
+++ b/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h
@@ -1,29 +1,29 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		adj_thr_data.h

-

-	Content:	Threshold compensation parameter 

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		adj_thr_data.h
+
+	Content:	Threshold compensation parameter 
+
 *******************************************************************************/
 
 #ifndef __ADJ_THR_DATA_H
 #define __ADJ_THR_DATA_H
 
-#include "typedef.h"

+#include "typedef.h"
 #include "psy_const.h"
 #include "line_pe.h"
 
diff --git a/media/libstagefright/codecs/aacenc/inc/band_nrg.h b/media/libstagefright/codecs/aacenc/inc/band_nrg.h
index 68509da..65453c0 100644
--- a/media/libstagefright/codecs/aacenc/inc/band_nrg.h
+++ b/media/libstagefright/codecs/aacenc/inc/band_nrg.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		band_nrg.h

-

-	Content:	Band/Line energy calculations functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		band_nrg.h
+
+	Content:	Band/Line energy calculations functions
+
 *******************************************************************************/
 
 
diff --git a/media/libstagefright/codecs/aacenc/inc/bit_cnt.h b/media/libstagefright/codecs/aacenc/inc/bit_cnt.h
index 808319e..266a219 100644
--- a/media/libstagefright/codecs/aacenc/inc/bit_cnt.h
+++ b/media/libstagefright/codecs/aacenc/inc/bit_cnt.h
@@ -1,29 +1,29 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		bit_cnt.h

-

-	Content:	Huffman Bitcounter & coder structure and functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		bit_cnt.h
+
+	Content:	Huffman Bitcounter & coder structure and functions
+
 *******************************************************************************/
 
 #ifndef __BITCOUNT_H
 #define __BITCOUNT_H
 
-#include "bitbuffer.h"

+#include "bitbuffer.h"
 #include "basic_op.h"
 #define INVALID_BITCOUNT (MAX_16/4)
 
diff --git a/media/libstagefright/codecs/aacenc/inc/bitbuffer.h b/media/libstagefright/codecs/aacenc/inc/bitbuffer.h
index cb850c9..e538064 100644
--- a/media/libstagefright/codecs/aacenc/inc/bitbuffer.h
+++ b/media/libstagefright/codecs/aacenc/inc/bitbuffer.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		bitbuffer.h

-

-	Content:	Bit Buffer Management structure and functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		bitbuffer.h
+
+	Content:	Bit Buffer Management structure and functions
+
 *******************************************************************************/
 
 #ifndef BITBUFFER_H
diff --git a/media/libstagefright/codecs/aacenc/inc/bitenc.h b/media/libstagefright/codecs/aacenc/inc/bitenc.h
index 1151057..6ded3c6 100644
--- a/media/libstagefright/codecs/aacenc/inc/bitenc.h
+++ b/media/libstagefright/codecs/aacenc/inc/bitenc.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		bitenc.h

-

-	Content:	Bitstream encoder structure and functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		bitenc.h
+
+	Content:	Bitstream encoder structure and functions
+
 *******************************************************************************/
 
 #ifndef _BITENC_H
@@ -42,8 +42,8 @@
                        ELEMENT_INFO elInfo,
                        QC_OUT *qcOut,
                        PSY_OUT *psyOut,
-                       Word16 *globUsedBits,

-                       const UWord8 *ancBytes,

+                       Word16 *globUsedBits,
+                       const UWord8 *ancBytes,
 					   Word16 samplerate
                        );
 
diff --git a/media/libstagefright/codecs/aacenc/inc/block_switch.h b/media/libstagefright/codecs/aacenc/inc/block_switch.h
index 3e35819..a4d3e8f 100644
--- a/media/libstagefright/codecs/aacenc/inc/block_switch.h
+++ b/media/libstagefright/codecs/aacenc/inc/block_switch.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		block_switch.h

-

-	Content:	Block switching structure and functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		block_switch.h
+
+	Content:	Block switching structure and functions
+
 *******************************************************************************/
 
 #ifndef _BLOCK_SWITCH_H
diff --git a/media/libstagefright/codecs/aacenc/inc/channel_map.h b/media/libstagefright/codecs/aacenc/inc/channel_map.h
index e3aa8dc..c361feb 100644
--- a/media/libstagefright/codecs/aacenc/inc/channel_map.h
+++ b/media/libstagefright/codecs/aacenc/inc/channel_map.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		channel_map.h

-

-	Content:	channel mapping functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		channel_map.h
+
+	Content:	channel mapping functions
+
 *******************************************************************************/
 
 #ifndef _CHANNEL_MAP_H
diff --git a/media/libstagefright/codecs/aacenc/inc/config.h b/media/libstagefright/codecs/aacenc/inc/config.h
index 6211c8f..3b29cef 100644
--- a/media/libstagefright/codecs/aacenc/inc/config.h
+++ b/media/libstagefright/codecs/aacenc/inc/config.h
@@ -1,36 +1,36 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		config.h

-

-	Content:	aac encoder parameter

-

-*******************************************************************************/

-

-#ifndef _AACENC_CONFIG_H_

-#define _AACENC_CONFIG_H_

-

-#define MAX_CHANNELS        2

-

-#define AACENC_BLOCKSIZE    1024   /*! encoder only takes BLOCKSIZE samples at a time */

-#define AACENC_TRANS_FAC    8      /*! encoder short long ratio */

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		config.h
+
+	Content:	aac encoder parameter
+
+*******************************************************************************/
+
+#ifndef _AACENC_CONFIG_H_
+#define _AACENC_CONFIG_H_
+
+#define MAX_CHANNELS        2
+
+#define AACENC_BLOCKSIZE    1024   /*! encoder only takes BLOCKSIZE samples at a time */
+#define AACENC_TRANS_FAC    8      /*! encoder short long ratio */
+
+
 #define MAXBITS_COEF		6144
-#define MINBITS_COEF		744

-

-

+#define MINBITS_COEF		744
+
+
 #endif
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/inc/dyn_bits.h b/media/libstagefright/codecs/aacenc/inc/dyn_bits.h
index 0468fa2..d3a8a67 100644
--- a/media/libstagefright/codecs/aacenc/inc/dyn_bits.h
+++ b/media/libstagefright/codecs/aacenc/inc/dyn_bits.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		dyn_bits.h

-

-	Content:	Noiseless coder module structure and functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		dyn_bits.h
+
+	Content:	Noiseless coder module structure and functions
+
 *******************************************************************************/
 
 #ifndef __DYN_BITS_H
diff --git a/media/libstagefright/codecs/aacenc/inc/grp_data.h b/media/libstagefright/codecs/aacenc/inc/grp_data.h
index 9666577..4c1b2cb 100644
--- a/media/libstagefright/codecs/aacenc/inc/grp_data.h
+++ b/media/libstagefright/codecs/aacenc/inc/grp_data.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		grp_data.h

-

-	Content:	Short block grouping function

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		grp_data.h
+
+	Content:	Short block grouping function
+
 *******************************************************************************/
 
 #ifndef __GRP_DATA_H__
diff --git a/media/libstagefright/codecs/aacenc/inc/interface.h b/media/libstagefright/codecs/aacenc/inc/interface.h
index b84334a..966ac99 100644
--- a/media/libstagefright/codecs/aacenc/inc/interface.h
+++ b/media/libstagefright/codecs/aacenc/inc/interface.h
@@ -1,29 +1,29 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		interface.h

-

-	Content:	psychoaccoustic/quantizer structures and interface

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		interface.h
+
+	Content:	psychoaccoustic/quantizer structures and interface
+
 *******************************************************************************/
 
 #ifndef _INTERFACE_H
 #define _INTERFACE_H
 
-#include "config.h"

+#include "config.h"
 #include "psy_const.h"
 #include "psy_data.h"
 #include "typedefs.h"
diff --git a/media/libstagefright/codecs/aacenc/inc/line_pe.h b/media/libstagefright/codecs/aacenc/inc/line_pe.h
index fed938b..038d5a3 100644
--- a/media/libstagefright/codecs/aacenc/inc/line_pe.h
+++ b/media/libstagefright/codecs/aacenc/inc/line_pe.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		line_pe.h

-

-	Content:	Perceptual entropie module structure and functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		line_pe.h
+
+	Content:	Perceptual entropie module structure and functions
+
 *******************************************************************************/
 
 #ifndef __LINE_PE_H
diff --git a/media/libstagefright/codecs/aacenc/inc/memalign.h b/media/libstagefright/codecs/aacenc/inc/memalign.h
index 3b302a7..30bbf45 100644
--- a/media/libstagefright/codecs/aacenc/inc/memalign.h
+++ b/media/libstagefright/codecs/aacenc/inc/memalign.h
@@ -1,35 +1,35 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		memalign.h

-

-	Content:	Memory alloc alignments functions

-

-*******************************************************************************/

-

-#ifndef __VO_AACENC_MEM_ALIGN_H__

-#define __VO_AACENC_MEM_ALIGN_H__

-

-#include "voMem.h"

-#include "typedef.h"

-

-extern void *mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID);

-extern void mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID);

-

-#endif	/* __VO_MEM_ALIGN_H__ */

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		memalign.h
+
+	Content:	Memory alloc alignments functions
+
+*******************************************************************************/
+
+#ifndef __VO_AACENC_MEM_ALIGN_H__
+#define __VO_AACENC_MEM_ALIGN_H__
+
+#include "voMem.h"
+#include "typedef.h"
+
+extern void *mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID);
+extern void mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID);
+
+#endif	/* __VO_MEM_ALIGN_H__ */
+
+
+
diff --git a/media/libstagefright/codecs/aacenc/inc/ms_stereo.h b/media/libstagefright/codecs/aacenc/inc/ms_stereo.h
index 6d43dec..3c03dea 100644
--- a/media/libstagefright/codecs/aacenc/inc/ms_stereo.h
+++ b/media/libstagefright/codecs/aacenc/inc/ms_stereo.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		ms_stereo.h

-

-	Content:	Declaration MS stereo processing structure and functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		ms_stereo.h
+
+	Content:	Declaration MS stereo processing structure and functions
+
 *******************************************************************************/
 
 #ifndef __MS_STEREO_H__
diff --git a/media/libstagefright/codecs/aacenc/inc/pre_echo_control.h b/media/libstagefright/codecs/aacenc/inc/pre_echo_control.h
index 35f36e8..e719ba7 100644
--- a/media/libstagefright/codecs/aacenc/inc/pre_echo_control.h
+++ b/media/libstagefright/codecs/aacenc/inc/pre_echo_control.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		pre_echo_control.h

-

-	Content:	Pre echo control functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		pre_echo_control.h
+
+	Content:	Pre echo control functions
+
 *******************************************************************************/
 
 #ifndef __PRE_ECHO_CONTROL_H
diff --git a/media/libstagefright/codecs/aacenc/inc/psy_configuration.h b/media/libstagefright/codecs/aacenc/inc/psy_configuration.h
index 53cf25b..9abfc99 100644
--- a/media/libstagefright/codecs/aacenc/inc/psy_configuration.h
+++ b/media/libstagefright/codecs/aacenc/inc/psy_configuration.h
@@ -1,28 +1,28 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		psy_configuration.h

-

-	Content:	Psychoaccoustic configuration structure and functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		psy_configuration.h
+
+	Content:	Psychoaccoustic configuration structure and functions
+
 *******************************************************************************/
 
 #ifndef _PSY_CONFIGURATION_H
 #define _PSY_CONFIGURATION_H
-

+
 #include "typedefs.h"
 #include "psy_const.h"
 #include "tns.h"
@@ -38,7 +38,7 @@
   Word16 maxAllowedIncreaseFactor;   /* preecho control */
   Word16 minRemainingThresholdFactor;
 
-  Word16 lowpassLine;

+  Word16 lowpassLine;
   Word16 sampRateIdx;
   Word32 clipEnergy;                 /* for level dependend tmn */
 
@@ -68,7 +68,7 @@
   Word16 maxAllowedIncreaseFactor;   /* preecho control */
   Word16 minRemainingThresholdFactor;
 
-  Word16 lowpassLine;

+  Word16 lowpassLine;
   Word16 sampRateIdx;
   Word32 clipEnergy;                 /* for level dependend tmn */
 
@@ -85,10 +85,10 @@
   TNS_CONFIG tnsConf;
 
 }PSY_CONFIGURATION_SHORT; /*Word16 size: 8 + 16 + 16 + 16 + 16 + 16 + 16 + 16 + 47 = 167 */
-

-

-/* Returns the sample rate index */

-Word32 GetSRIndex(Word32 sampleRate);

+
+
+/* Returns the sample rate index */
+Word32 GetSRIndex(Word32 sampleRate);
 
 
 Word16 InitPsyConfigurationLong(Word32 bitrate,
diff --git a/media/libstagefright/codecs/aacenc/inc/psy_const.h b/media/libstagefright/codecs/aacenc/inc/psy_const.h
index 5455ab1..b05d683 100644
--- a/media/libstagefright/codecs/aacenc/inc/psy_const.h
+++ b/media/libstagefright/codecs/aacenc/inc/psy_const.h
@@ -1,37 +1,37 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		psy_const.h

-

-	Content:	Global psychoacoustic constants structures

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		psy_const.h
+
+	Content:	Global psychoacoustic constants structures
+
 *******************************************************************************/
 
 #ifndef _PSYCONST_H
 #define _PSYCONST_H
 
-#include "config.h"

+#include "config.h"
 
 #define TRUE  1
 #define FALSE 0
 
 #define FRAME_LEN_LONG    AACENC_BLOCKSIZE
 #define TRANS_FAC         8
-#define FRAME_LEN_SHORT   (FRAME_LEN_LONG/TRANS_FAC)

-

+#define FRAME_LEN_SHORT   (FRAME_LEN_LONG/TRANS_FAC)
+
 
 
 /* Block types */
@@ -74,7 +74,7 @@
 #define TRANSFORM_OFFSET_SHORT   448
 
 #define LOG_NORM_PCM          -15
-

+
 #define NUM_SAMPLE_RATES	12
 
 #endif /* _PSYCONST_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/psy_data.h b/media/libstagefright/codecs/aacenc/inc/psy_data.h
index 1412d53..3ea6a84 100644
--- a/media/libstagefright/codecs/aacenc/inc/psy_data.h
+++ b/media/libstagefright/codecs/aacenc/inc/psy_data.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		psy_data.h

-

-	Content:	Psychoacoustic data and structures

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		psy_data.h
+
+	Content:	Psychoacoustic data and structures
+
 *******************************************************************************/
 
 #ifndef _PSY_DATA_H
diff --git a/media/libstagefright/codecs/aacenc/inc/psy_main.h b/media/libstagefright/codecs/aacenc/inc/psy_main.h
index ab0b8b1..5fcbe13 100644
--- a/media/libstagefright/codecs/aacenc/inc/psy_main.h
+++ b/media/libstagefright/codecs/aacenc/inc/psy_main.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		psy_main.h

-

-	Content:	Psychoacoustic major function block

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		psy_main.h
+
+	Content:	Psychoacoustic major function block
+
 *******************************************************************************/
 
 #ifndef _PSYMAIN_H
@@ -35,7 +35,7 @@
   PSY_CONFIGURATION_SHORT psyConfShort;          /* Word16 size: 167 */
   PSY_DATA                psyData[MAX_CHANNELS]; /* Word16 size: MAX_CHANNELS*1669*/
   TNS_DATA                tnsData[MAX_CHANNELS]; /* Word16 size: MAX_CHANNELS*235 */
-  Word32*                 pScratchTns;

+  Word32*                 pScratchTns;
   Word16				  sampleRateIdx;
 }PSY_KERNEL; /* Word16 size: 2587 / 4491 */
 
diff --git a/media/libstagefright/codecs/aacenc/inc/qc_data.h b/media/libstagefright/codecs/aacenc/inc/qc_data.h
index 81d4051..109922d 100644
--- a/media/libstagefright/codecs/aacenc/inc/qc_data.h
+++ b/media/libstagefright/codecs/aacenc/inc/qc_data.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		qc_data.h

-

-	Content:	Quantizing & coding structures

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		qc_data.h
+
+	Content:	Quantizing & coding structures
+
 *******************************************************************************/
 
 #ifndef _QC_DATA_H
@@ -89,7 +89,7 @@
 
 typedef struct
 {
-  Word16		  adtsUsed;

+  Word16		  adtsUsed;
   Word16          staticBitsUsed; /* for verification purposes */
   Word16          dynBitsUsed;    /* for verification purposes */
   Word16          pe;
diff --git a/media/libstagefright/codecs/aacenc/inc/qc_main.h b/media/libstagefright/codecs/aacenc/inc/qc_main.h
index e1138b2..924a06d 100644
--- a/media/libstagefright/codecs/aacenc/inc/qc_main.h
+++ b/media/libstagefright/codecs/aacenc/inc/qc_main.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		qc_main.h

-

-	Content:	Quantizing & coding functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		qc_main.h
+
+	Content:	Quantizing & coding functions
+
 *******************************************************************************/
 
 #ifndef _QC_MAIN_H
diff --git a/media/libstagefright/codecs/aacenc/inc/quantize.h b/media/libstagefright/codecs/aacenc/inc/quantize.h
index 88a95e1..7dac2bf 100644
--- a/media/libstagefright/codecs/aacenc/inc/quantize.h
+++ b/media/libstagefright/codecs/aacenc/inc/quantize.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		quantize.h

-

-	Content:	Quantization functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		quantize.h
+
+	Content:	Quantization functions
+
 *******************************************************************************/
 
 #ifndef _QUANTIZE_H_
diff --git a/media/libstagefright/codecs/aacenc/inc/sf_estim.h b/media/libstagefright/codecs/aacenc/inc/sf_estim.h
index b25ec3c..11436a2 100644
--- a/media/libstagefright/codecs/aacenc/inc/sf_estim.h
+++ b/media/libstagefright/codecs/aacenc/inc/sf_estim.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		sf_estim.h

-

-	Content:	Scale factor estimation functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		sf_estim.h
+
+	Content:	Scale factor estimation functions
+
 *******************************************************************************/
 
 #ifndef __SF_ESTIM_H__
diff --git a/media/libstagefright/codecs/aacenc/inc/spreading.h b/media/libstagefright/codecs/aacenc/inc/spreading.h
index 29cf63d..0c96fc7 100644
--- a/media/libstagefright/codecs/aacenc/inc/spreading.h
+++ b/media/libstagefright/codecs/aacenc/inc/spreading.h
@@ -1,29 +1,29 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		spreading.h

-

-	Content:	Spreading of energy functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		spreading.h
+
+	Content:	Spreading of energy functions
+
 *******************************************************************************/
 
 #ifndef _SPREADING_H
 #define _SPREADING_H
 #include "typedefs.h"
-

+
 
 void SpreadingMax(const Word16 pbCnt,
                   const Word16 *maskLowFactor,
diff --git a/media/libstagefright/codecs/aacenc/inc/stat_bits.h b/media/libstagefright/codecs/aacenc/inc/stat_bits.h
index 6e90b9c..fff3d14 100644
--- a/media/libstagefright/codecs/aacenc/inc/stat_bits.h
+++ b/media/libstagefright/codecs/aacenc/inc/stat_bits.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		stat_bits.h

-

-	Content:	Static bit counter functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		stat_bits.h
+
+	Content:	Static bit counter functions
+
 *******************************************************************************/
 
 #ifndef __STAT_BITS_H
@@ -28,7 +28,7 @@
 
 Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
                             PSY_OUT_ELEMENT *psyOutElement,
-                            Word16 nChannels, 

+                            Word16 nChannels, 
 							Word16 adtsUsed);
 
 #endif /* __STAT_BITS_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/tns.h b/media/libstagefright/codecs/aacenc/inc/tns.h
index 9ffcce9..40cfaee 100644
--- a/media/libstagefright/codecs/aacenc/inc/tns.h
+++ b/media/libstagefright/codecs/aacenc/inc/tns.h
@@ -1,28 +1,28 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		tns.h

-

-	Content:	TNS structures

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		tns.h
+
+	Content:	TNS structures
+
 *******************************************************************************/
 
 #ifndef _TNS_H
 #define _TNS_H
-

+
 #include "typedef.h"
 #include "psy_const.h"
 
diff --git a/media/libstagefright/codecs/aacenc/inc/tns_func.h b/media/libstagefright/codecs/aacenc/inc/tns_func.h
index 58b75b6..02df24d 100644
--- a/media/libstagefright/codecs/aacenc/inc/tns_func.h
+++ b/media/libstagefright/codecs/aacenc/inc/tns_func.h
@@ -1,30 +1,30 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		tns_func.h

-

-	Content:	TNS functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		tns_func.h
+
+	Content:	TNS functions
+
 *******************************************************************************/
 
 /*
    Temporal noise shaping
  */
 #ifndef _TNS_FUNC_H
-#define _TNS_FUNC_H

+#define _TNS_FUNC_H
 #include "typedef.h"
 #include "psy_configuration.h"
 
diff --git a/media/libstagefright/codecs/aacenc/inc/tns_param.h b/media/libstagefright/codecs/aacenc/inc/tns_param.h
index 26266ac..78265bb 100644
--- a/media/libstagefright/codecs/aacenc/inc/tns_param.h
+++ b/media/libstagefright/codecs/aacenc/inc/tns_param.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		tns_param.h

-

-	Content:	TNS parameters

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		tns_param.h
+
+	Content:	TNS parameters
+
 *******************************************************************************/
 
 /*
diff --git a/media/libstagefright/codecs/aacenc/inc/transform.h b/media/libstagefright/codecs/aacenc/inc/transform.h
index 2666914..93d5ffe 100644
--- a/media/libstagefright/codecs/aacenc/inc/transform.h
+++ b/media/libstagefright/codecs/aacenc/inc/transform.h
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		transform.h

-

-	Content:	MDCT Transform functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		transform.h
+
+	Content:	MDCT Transform functions
+
 *******************************************************************************/
 
 #ifndef  __TRANSFORM_H__
diff --git a/media/libstagefright/codecs/aacenc/src/aac_rom.c b/media/libstagefright/codecs/aacenc/src/aac_rom.c
index 2ce0352..16b44e0 100644
--- a/media/libstagefright/codecs/aacenc/src/aac_rom.c
+++ b/media/libstagefright/codecs/aacenc/src/aac_rom.c
@@ -1,358 +1,358 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		aac_rom.c

-

-	Content:	constant tables

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		aac_rom.c
+
+	Content:	constant tables
+
 *******************************************************************************/
 
-#include "aac_rom.h"

-

-#if defined (ARMV5E) && !defined (ARMV7Neon)

-

-/* 

- *  Q30 for 128 and 1024 

- *

- * for (i = 0; i < num/4; i++) {

- *   angle = (i + 0.125) * M_PI / num;

- *   x = cos(angle) * (1 << 30);

- *   x = sin(angle) * (1 << 30);

- * 

- *   angle = (num/2 - 1 - i + 0.125) * M_PI / num;

- *   x = cos(angle) * (1 << 30);

- *   x = sin(angle) * (1 << 30);

- * }

- */

-const int cossintab[128 + 1024] = {

-	/* 128 */

-	0x3fffec43, 0x003243f1, 0x015fd4d2, 0x3ffc38d1, 0x3ff9c13a, 0x01c454f5, 0x02f1b755, 0x3feea776, 

-	0x3fe9b8a9, 0x03562038, 0x0483259d, 0x3fd73a4a, 0x3fcfd50b, 0x04e767c5, 0x0613e1c5, 0x3fb5f4ea, 

-	0x3fac1a5b, 0x0677edbb, 0x07a3adff, 0x3f8adc77, 0x3f7e8e1e, 0x08077457, 0x09324ca7, 0x3f55f796, 

-	0x3f473759, 0x0995bdfd, 0x0abf8043, 0x3f174e70, 0x3f061e95, 0x0b228d42, 0x0c4b0b94, 0x3eceeaad, 

-	0x3ebb4ddb, 0x0cada4f5, 0x0dd4b19a, 0x3e7cd778, 0x3e66d0b4, 0x0e36c82a, 0x0f5c35a3, 0x3e212179, 

-	0x3e08b42a, 0x0fbdba40, 0x10e15b4e, 0x3dbbd6d4, 0x3da106bd, 0x11423ef0, 0x1263e699, 0x3d4d0728, 

-	0x3d2fd86c, 0x12c41a4f, 0x13e39be9, 0x3cd4c38b, 0x3cb53aaa, 0x144310dd, 0x15604013, 0x3c531e88, 

-	0x3c314060, 0x15bee78c, 0x16d99864, 0x3bc82c1f, 0x3ba3fde7, 0x173763c9, 0x184f6aab, 0x3b3401bb, 

-	0x3b0d8909, 0x18ac4b87, 0x19c17d44, 0x3a96b636, 0x3a6df8f8, 0x1a1d6544, 0x1b2f971e, 0x39f061d2, 

-	0x39c5664f, 0x1b8a7815, 0x1c997fc4, 0x39411e33, 0x3913eb0e, 0x1cf34baf, 0x1dfeff67, 0x38890663, 

-	0x3859a292, 0x1e57a86d, 0x1f5fdee6, 0x37c836c2, 0x3796a996, 0x1fb7575c, 0x20bbe7d8, 0x36fecd0e, 

-	0x36cb1e2a, 0x21122240, 0x2212e492, 0x362ce855, 0x35f71fb1, 0x2267d3a0, 0x2364a02e, 0x3552a8f4, 

-	0x351acedd, 0x23b836ca, 0x24b0e699, 0x34703095, 0x34364da6, 0x250317df, 0x25f78497, 0x3385a222, 

-	0x3349bf48, 0x264843d9, 0x273847c8, 0x329321c7, 0x32554840, 0x27878893, 0x2872feb6, 0x3198d4ea, 

-	0x31590e3e, 0x28c0b4d2, 0x29a778db, 0x3096e223, 0x30553828, 0x29f3984c, 0x2ad586a3, 0x2f8d713a, 

-	0x2f49ee0f, 0x2b2003ac, 0x2bfcf97c, 0x2e7cab1c, 0x2e37592c, 0x2c45c8a0, 0x2d1da3d5, 0x2d64b9da, 

-	/* 1024 */

-	0x3fffffb1, 0x0006487f, 0x002bfb74, 0x3ffff0e3, 0x3fffe705, 0x00388c6e, 0x005e3f4c, 0x3fffba9b, 

-	0x3fffa6de, 0x006ad03b, 0x009082ea, 0x3fff5cd8, 0x3fff3f3c, 0x009d13c5, 0x00c2c62f, 0x3ffed79b, 

-	0x3ffeb021, 0x00cf56ef, 0x00f508fc, 0x3ffe2ae5, 0x3ffdf98c, 0x01019998, 0x01274b31, 0x3ffd56b5, 

-	0x3ffd1b7e, 0x0133dba3, 0x01598cb1, 0x3ffc5b0c, 0x3ffc15f7, 0x01661cf0, 0x018bcd5b, 0x3ffb37ec, 

-	0x3ffae8f9, 0x01985d60, 0x01be0d11, 0x3ff9ed53, 0x3ff99483, 0x01ca9cd4, 0x01f04bb4, 0x3ff87b44, 

-	0x3ff81896, 0x01fcdb2e, 0x02228924, 0x3ff6e1bf, 0x3ff67534, 0x022f184d, 0x0254c544, 0x3ff520c5, 

-	0x3ff4aa5d, 0x02615414, 0x0286fff3, 0x3ff33858, 0x3ff2b813, 0x02938e62, 0x02b93914, 0x3ff12878, 

-	0x3ff09e56, 0x02c5c71a, 0x02eb7086, 0x3feef126, 0x3fee5d28, 0x02f7fe1c, 0x031da62b, 0x3fec9265, 

-	0x3febf48b, 0x032a3349, 0x034fd9e5, 0x3fea0c35, 0x3fe96480, 0x035c6682, 0x03820b93, 0x3fe75e98, 

-	0x3fe6ad08, 0x038e97a9, 0x03b43b17, 0x3fe48990, 0x3fe3ce26, 0x03c0c69e, 0x03e66852, 0x3fe18d1f, 

-	0x3fe0c7da, 0x03f2f342, 0x04189326, 0x3fde6945, 0x3fdd9a27, 0x04251d77, 0x044abb73, 0x3fdb1e06, 

-	0x3fda450f, 0x0457451d, 0x047ce11a, 0x3fd7ab64, 0x3fd6c894, 0x04896a16, 0x04af03fc, 0x3fd4115f, 

-	0x3fd324b7, 0x04bb8c42, 0x04e123fa, 0x3fd04ffc, 0x3fcf597c, 0x04edab83, 0x051340f6, 0x3fcc673b, 

-	0x3fcb66e4, 0x051fc7b9, 0x05455ad1, 0x3fc8571f, 0x3fc74cf3, 0x0551e0c7, 0x0577716b, 0x3fc41fac, 

-	0x3fc30baa, 0x0583f68c, 0x05a984a6, 0x3fbfc0e3, 0x3fbea30c, 0x05b608eb, 0x05db9463, 0x3fbb3ac7, 

-	0x3fba131b, 0x05e817c3, 0x060da083, 0x3fb68d5b, 0x3fb55bdc, 0x061a22f7, 0x063fa8e7, 0x3fb1b8a2, 

-	0x3fb07d50, 0x064c2a67, 0x0671ad71, 0x3facbc9f, 0x3fab777b, 0x067e2df5, 0x06a3ae00, 0x3fa79954, 

-	0x3fa64a5f, 0x06b02d81, 0x06d5aa77, 0x3fa24ec6, 0x3fa0f600, 0x06e228ee, 0x0707a2b7, 0x3f9cdcf7, 

-	0x3f9b7a62, 0x0714201b, 0x073996a1, 0x3f9743eb, 0x3f95d787, 0x074612eb, 0x076b8616, 0x3f9183a5, 

-	0x3f900d72, 0x0778013d, 0x079d70f7, 0x3f8b9c28, 0x3f8a1c29, 0x07a9eaf5, 0x07cf5726, 0x3f858d79, 

-	0x3f8403ae, 0x07dbcff2, 0x08013883, 0x3f7f579b, 0x3f7dc405, 0x080db016, 0x083314f1, 0x3f78fa92, 

-	0x3f775d31, 0x083f8b43, 0x0864ec4f, 0x3f727661, 0x3f70cf38, 0x08716159, 0x0896be80, 0x3f6bcb0e, 

-	0x3f6a1a1c, 0x08a3323a, 0x08c88b65, 0x3f64f89b, 0x3f633de2, 0x08d4fdc6, 0x08fa52de, 0x3f5dff0e, 

-	0x3f5c3a8f, 0x0906c3e0, 0x092c14ce, 0x3f56de6a, 0x3f551026, 0x09388469, 0x095dd116, 0x3f4f96b4, 

-	0x3f4dbeac, 0x096a3f42, 0x098f8796, 0x3f4827f0, 0x3f464626, 0x099bf44c, 0x09c13831, 0x3f409223, 

-	0x3f3ea697, 0x09cda368, 0x09f2e2c7, 0x3f38d552, 0x3f36e006, 0x09ff4c78, 0x0a24873a, 0x3f30f181, 

-	0x3f2ef276, 0x0a30ef5e, 0x0a56256c, 0x3f28e6b6, 0x3f26ddec, 0x0a628bfa, 0x0a87bd3d, 0x3f20b4f5, 

-	0x3f1ea26e, 0x0a94222f, 0x0ab94e8f, 0x3f185c43, 0x3f164001, 0x0ac5b1dc, 0x0aead944, 0x3f0fdca5, 

-	0x3f0db6a9, 0x0af73ae5, 0x0b1c5d3d, 0x3f073621, 0x3f05066d, 0x0b28bd2a, 0x0b4dda5c, 0x3efe68bc, 

-	0x3efc2f50, 0x0b5a388d, 0x0b7f5081, 0x3ef5747b, 0x3ef3315a, 0x0b8bacf0, 0x0bb0bf8f, 0x3eec5965, 

-	0x3eea0c8e, 0x0bbd1a33, 0x0be22766, 0x3ee3177e, 0x3ee0c0f4, 0x0bee8038, 0x0c1387e9, 0x3ed9aecc, 

-	0x3ed74e91, 0x0c1fdee1, 0x0c44e0f9, 0x3ed01f55, 0x3ecdb56a, 0x0c513610, 0x0c763278, 0x3ec66920, 

-	0x3ec3f585, 0x0c8285a5, 0x0ca77c47, 0x3ebc8c31, 0x3eba0ee9, 0x0cb3cd84, 0x0cd8be47, 0x3eb2888f, 

-	0x3eb0019c, 0x0ce50d8c, 0x0d09f85b, 0x3ea85e41, 0x3ea5cda3, 0x0d1645a0, 0x0d3b2a64, 0x3e9e0d4c, 

-	0x3e9b7306, 0x0d4775a1, 0x0d6c5443, 0x3e9395b7, 0x3e90f1ca, 0x0d789d71, 0x0d9d75db, 0x3e88f788, 

-	0x3e8649f5, 0x0da9bcf2, 0x0dce8f0d, 0x3e7e32c6, 0x3e7b7b90, 0x0ddad406, 0x0dff9fba, 0x3e734778, 

-	0x3e70869f, 0x0e0be28e, 0x0e30a7c5, 0x3e6835a4, 0x3e656b2b, 0x0e3ce86b, 0x0e61a70f, 0x3e5cfd51, 

-	0x3e5a2939, 0x0e6de580, 0x0e929d7a, 0x3e519e86, 0x3e4ec0d1, 0x0e9ed9af, 0x0ec38ae8, 0x3e46194a, 

-	0x3e4331fa, 0x0ecfc4d9, 0x0ef46f3b, 0x3e3a6da4, 0x3e377cbb, 0x0f00a6df, 0x0f254a53, 0x3e2e9b9c, 

-	0x3e2ba11b, 0x0f317fa5, 0x0f561c15, 0x3e22a338, 0x3e1f9f21, 0x0f624f0c, 0x0f86e460, 0x3e168480, 

-	0x3e1376d5, 0x0f9314f5, 0x0fb7a317, 0x3e0a3f7b, 0x3e07283f, 0x0fc3d143, 0x0fe8581d, 0x3dfdd432, 

-	0x3dfab365, 0x0ff483d7, 0x10190352, 0x3df142ab, 0x3dee1851, 0x10252c94, 0x1049a49a, 0x3de48aef, 

-	0x3de15708, 0x1055cb5b, 0x107a3bd5, 0x3dd7ad05, 0x3dd46f94, 0x1086600e, 0x10aac8e6, 0x3dcaa8f5, 

-	0x3dc761fc, 0x10b6ea90, 0x10db4baf, 0x3dbd7ec7, 0x3dba2e48, 0x10e76ac3, 0x110bc413, 0x3db02e84, 

-	0x3dacd481, 0x1117e088, 0x113c31f3, 0x3da2b834, 0x3d9f54af, 0x11484bc2, 0x116c9531, 0x3d951bde, 

-	0x3d91aed9, 0x1178ac53, 0x119cedaf, 0x3d87598c, 0x3d83e309, 0x11a9021d, 0x11cd3b50, 0x3d797145, 

-	0x3d75f147, 0x11d94d02, 0x11fd7df6, 0x3d6b6313, 0x3d67d99b, 0x12098ce5, 0x122db583, 0x3d5d2efe, 

-	0x3d599c0e, 0x1239c1a7, 0x125de1da, 0x3d4ed50f, 0x3d4b38aa, 0x1269eb2b, 0x128e02dc, 0x3d40554e, 

-	0x3d3caf76, 0x129a0954, 0x12be186c, 0x3d31afc5, 0x3d2e007c, 0x12ca1c03, 0x12ee226c, 0x3d22e47c, 

-	0x3d1f2bc5, 0x12fa231b, 0x131e20c0, 0x3d13f37e, 0x3d10315a, 0x132a1e7e, 0x134e1348, 0x3d04dcd2, 

-	0x3d011145, 0x135a0e0e, 0x137df9e7, 0x3cf5a082, 0x3cf1cb8e, 0x1389f1af, 0x13add481, 0x3ce63e98, 

-	0x3ce2603f, 0x13b9c943, 0x13dda2f7, 0x3cd6b71e, 0x3cd2cf62, 0x13e994ab, 0x140d652c, 0x3cc70a1c, 

-	0x3cc318ff, 0x141953cb, 0x143d1b02, 0x3cb7379c, 0x3cb33d22, 0x14490685, 0x146cc45c, 0x3ca73fa9, 

-	0x3ca33bd3, 0x1478acbc, 0x149c611d, 0x3c97224c, 0x3c93151d, 0x14a84652, 0x14cbf127, 0x3c86df8e, 

-	0x3c82c909, 0x14d7d32a, 0x14fb745e, 0x3c76777b, 0x3c7257a2, 0x15075327, 0x152aeaa3, 0x3c65ea1c, 

-	0x3c61c0f1, 0x1536c62b, 0x155a53d9, 0x3c55377b, 0x3c510501, 0x15662c18, 0x1589afe3, 0x3c445fa2, 

-	0x3c4023dd, 0x159584d3, 0x15b8fea4, 0x3c33629d, 0x3c2f1d8e, 0x15c4d03e, 0x15e83fff, 0x3c224075, 

-	0x3c1df21f, 0x15f40e3a, 0x161773d6, 0x3c10f935, 0x3c0ca19b, 0x16233eac, 0x16469a0d, 0x3bff8ce8, 

-	0x3bfb2c0c, 0x16526176, 0x1675b286, 0x3bedfb99, 0x3be9917e, 0x1681767c, 0x16a4bd25, 0x3bdc4552, 

-	0x3bd7d1fa, 0x16b07d9f, 0x16d3b9cc, 0x3bca6a1d, 0x3bc5ed8d, 0x16df76c3, 0x1702a85e, 0x3bb86a08, 

-	0x3bb3e440, 0x170e61cc, 0x173188be, 0x3ba6451b, 0x3ba1b620, 0x173d3e9b, 0x17605ad0, 0x3b93fb63, 

-	0x3b8f6337, 0x176c0d15, 0x178f1e76, 0x3b818ceb, 0x3b7ceb90, 0x179acd1c, 0x17bdd394, 0x3b6ef9be, 

-	0x3b6a4f38, 0x17c97e93, 0x17ec7a0d, 0x3b5c41e8, 0x3b578e39, 0x17f8215e, 0x181b11c4, 0x3b496574, 

-	0x3b44a8a0, 0x1826b561, 0x18499a9d, 0x3b36646e, 0x3b319e77, 0x18553a7d, 0x1878147a, 0x3b233ee1, 

-	0x3b1e6fca, 0x1883b097, 0x18a67f3f, 0x3b0ff4d9, 0x3b0b1ca6, 0x18b21791, 0x18d4dad0, 0x3afc8663, 

-	0x3af7a516, 0x18e06f50, 0x1903270f, 0x3ae8f38b, 0x3ae40926, 0x190eb7b7, 0x193163e1, 0x3ad53c5b, 

-	0x3ad048e3, 0x193cf0a9, 0x195f9128, 0x3ac160e1, 0x3abc6458, 0x196b1a09, 0x198daec8, 0x3aad6129, 

-	0x3aa85b92, 0x199933bb, 0x19bbbca6, 0x3a993d3e, 0x3a942e9d, 0x19c73da3, 0x19e9baa3, 0x3a84f52f, 

-	0x3a7fdd86, 0x19f537a4, 0x1a17a8a5, 0x3a708906, 0x3a6b6859, 0x1a2321a2, 0x1a45868e, 0x3a5bf8d1, 

-	0x3a56cf23, 0x1a50fb81, 0x1a735442, 0x3a47449c, 0x3a4211f0, 0x1a7ec524, 0x1aa111a6, 0x3a326c74, 

-	0x3a2d30cd, 0x1aac7e6f, 0x1acebe9d, 0x3a1d7066, 0x3a182bc8, 0x1ada2746, 0x1afc5b0a, 0x3a08507f, 

-	0x3a0302ed, 0x1b07bf8c, 0x1b29e6d2, 0x39f30ccc, 0x39edb649, 0x1b354727, 0x1b5761d8, 0x39dda55a, 

-	0x39d845e9, 0x1b62bdf8, 0x1b84cc01, 0x39c81a36, 0x39c2b1da, 0x1b9023e5, 0x1bb22530, 0x39b26b6d, 

-	0x39acfa2b, 0x1bbd78d2, 0x1bdf6d4a, 0x399c990d, 0x39971ee7, 0x1beabca1, 0x1c0ca432, 0x3986a324, 

-	0x3981201e, 0x1c17ef39, 0x1c39c9cd, 0x397089bf, 0x396afddc, 0x1c45107c, 0x1c66ddfe, 0x395a4ceb, 

-	0x3954b82e, 0x1c72204f, 0x1c93e0ab, 0x3943ecb6, 0x393e4f23, 0x1c9f1e96, 0x1cc0d1b6, 0x392d692f, 

-	0x3927c2c9, 0x1ccc0b35, 0x1cedb106, 0x3916c262, 0x3911132d, 0x1cf8e611, 0x1d1a7e7d, 0x38fff85e, 

-	0x38fa405e, 0x1d25af0d, 0x1d473a00, 0x38e90b31, 0x38e34a69, 0x1d52660f, 0x1d73e374, 0x38d1fae9, 

-	0x38cc315d, 0x1d7f0afb, 0x1da07abc, 0x38bac795, 0x38b4f547, 0x1dab9db5, 0x1dccffbf, 0x38a37142, 

-	0x389d9637, 0x1dd81e21, 0x1df9725f, 0x388bf7ff, 0x3886143b, 0x1e048c24, 0x1e25d282, 0x38745bdb, 

-	0x386e6f60, 0x1e30e7a4, 0x1e52200c, 0x385c9ce3, 0x3856a7b6, 0x1e5d3084, 0x1e7e5ae2, 0x3844bb28, 

-	0x383ebd4c, 0x1e8966a8, 0x1eaa82e9, 0x382cb6b7, 0x3826b030, 0x1eb589f7, 0x1ed69805, 0x38148f9f, 

-	0x380e8071, 0x1ee19a54, 0x1f029a1c, 0x37fc45ef, 0x37f62e1d, 0x1f0d97a5, 0x1f2e8911, 0x37e3d9b7, 

-	0x37ddb945, 0x1f3981ce, 0x1f5a64cb, 0x37cb4b04, 0x37c521f6, 0x1f6558b5, 0x1f862d2d, 0x37b299e7, 

-	0x37ac6841, 0x1f911c3d, 0x1fb1e21d, 0x3799c66f, 0x37938c34, 0x1fbccc4d, 0x1fdd8381, 0x3780d0aa, 

-	0x377a8ddf, 0x1fe868c8, 0x2009113c, 0x3767b8a9, 0x37616d51, 0x2013f196, 0x20348b35, 0x374e7e7b, 

-	0x37482a9a, 0x203f6699, 0x205ff14f, 0x3735222f, 0x372ec5c9, 0x206ac7b8, 0x208b4372, 0x371ba3d4, 

-	0x37153eee, 0x209614d9, 0x20b68181, 0x3702037c, 0x36fb9618, 0x20c14ddf, 0x20e1ab63, 0x36e84135, 

-	0x36e1cb58, 0x20ec72b1, 0x210cc0fc, 0x36ce5d10, 0x36c7debd, 0x21178334, 0x2137c232, 0x36b4571b, 

-	0x36add058, 0x21427f4d, 0x2162aeea, 0x369a2f69, 0x3693a038, 0x216d66e2, 0x218d870b, 0x367fe608, 

-	0x36794e6e, 0x219839d8, 0x21b84a79, 0x36657b08, 0x365edb09, 0x21c2f815, 0x21e2f91a, 0x364aee7b, 

-	0x3644461b, 0x21eda17f, 0x220d92d4, 0x36304070, 0x36298fb4, 0x221835fb, 0x2238178d, 0x361570f8, 

-	0x360eb7e3, 0x2242b56f, 0x22628729, 0x35fa8023, 0x35f3beba, 0x226d1fc1, 0x228ce191, 0x35df6e03, 

-	0x35d8a449, 0x229774d7, 0x22b726a8, 0x35c43aa7, 0x35bd68a1, 0x22c1b496, 0x22e15655, 0x35a8e621, 

-	0x35a20bd3, 0x22ebdee5, 0x230b707e, 0x358d7081, 0x35868def, 0x2315f3a8, 0x23357509, 0x3571d9d9, 

-	0x356aef08, 0x233ff2c8, 0x235f63dc, 0x35562239, 0x354f2f2c, 0x2369dc29, 0x23893cdd, 0x353a49b2, 

-	0x35334e6f, 0x2393afb2, 0x23b2fff3, 0x351e5056, 0x35174ce0, 0x23bd6d48, 0x23dcad03, 0x35023636, 

-	0x34fb2a92, 0x23e714d3, 0x240643f4, 0x34e5fb63, 0x34dee795, 0x2410a639, 0x242fc4ad, 0x34c99fef, 

-	0x34c283fb, 0x243a215f, 0x24592f13, 0x34ad23eb, 0x34a5ffd5, 0x2463862c, 0x2482830d, 0x34908768, 

-	0x34895b36, 0x248cd487, 0x24abc082, 0x3473ca79, 0x346c962f, 0x24b60c57, 0x24d4e757, 0x3456ed2f, 

-	0x344fb0d1, 0x24df2d81, 0x24fdf775, 0x3439ef9c, 0x3432ab2e, 0x250837ed, 0x2526f0c1, 0x341cd1d2, 

-	0x34158559, 0x25312b81, 0x254fd323, 0x33ff93e2, 0x33f83f62, 0x255a0823, 0x25789e80, 0x33e235df, 

-	0x33dad95e, 0x2582cdbc, 0x25a152c0, 0x33c4b7db, 0x33bd535c, 0x25ab7c30, 0x25c9efca, 0x33a719e8, 

-	0x339fad70, 0x25d41369, 0x25f27584, 0x33895c18, 0x3381e7ac, 0x25fc934b, 0x261ae3d6, 0x336b7e7e, 

-	0x33640223, 0x2624fbbf, 0x26433aa7, 0x334d812d, 0x3345fce6, 0x264d4cac, 0x266b79dd, 0x332f6435, 

-	0x3327d808, 0x267585f8, 0x2693a161, 0x331127ab, 0x3309939c, 0x269da78b, 0x26bbb119, 0x32f2cba1, 

-	0x32eb2fb5, 0x26c5b14c, 0x26e3a8ec, 0x32d45029, 0x32ccac64, 0x26eda322, 0x270b88c2, 0x32b5b557, 

-	0x32ae09be, 0x27157cf5, 0x27335082, 0x3296fb3d, 0x328f47d5, 0x273d3eac, 0x275b0014, 0x327821ee, 

-	0x327066bc, 0x2764e82f, 0x27829760, 0x3259297d, 0x32516686, 0x278c7965, 0x27aa164c, 0x323a11fe, 

-	0x32324746, 0x27b3f235, 0x27d17cc1, 0x321adb83, 0x3213090f, 0x27db5288, 0x27f8caa5, 0x31fb8620, 

-	0x31f3abf5, 0x28029a45, 0x281fffe2, 0x31dc11e8, 0x31d4300b, 0x2829c954, 0x28471c5e, 0x31bc7eee, 

-	0x31b49564, 0x2850df9d, 0x286e2002, 0x319ccd46, 0x3194dc14, 0x2877dd07, 0x28950ab6, 0x317cfd04, 

-	0x3175042e, 0x289ec17a, 0x28bbdc61, 0x315d0e3b, 0x31550dc6, 0x28c58cdf, 0x28e294eb, 0x313d00ff, 

-	0x3134f8f1, 0x28ec3f1e, 0x2909343e, 0x311cd564, 0x3114c5c0, 0x2912d81f, 0x292fba40, 0x30fc8b7d, 

-	0x30f47449, 0x293957c9, 0x295626da, 0x30dc235e, 0x30d404a0, 0x295fbe06, 0x297c79f5, 0x30bb9d1c, 

-	0x30b376d8, 0x29860abd, 0x29a2b378, 0x309af8ca, 0x3092cb05, 0x29ac3dd7, 0x29c8d34d, 0x307a367c, 

-	0x3072013c, 0x29d2573c, 0x29eed95b, 0x30595648, 0x30511991, 0x29f856d5, 0x2a14c58b, 0x30385840, 

-	0x30301418, 0x2a1e3c8a, 0x2a3a97c7, 0x30173c7a, 0x300ef0e5, 0x2a440844, 0x2a604ff5, 0x2ff6030a, 

-	0x2fedb00d, 0x2a69b9ec, 0x2a85ee00, 0x2fd4ac04, 0x2fcc51a5, 0x2a8f516b, 0x2aab71d0, 0x2fb3377c, 

-	0x2faad5c1, 0x2ab4cea9, 0x2ad0db4e, 0x2f91a589, 0x2f893c75, 0x2ada318e, 0x2af62a63, 0x2f6ff63d, 

-	0x2f6785d7, 0x2aff7a05, 0x2b1b5ef8, 0x2f4e29af, 0x2f45b1fb, 0x2b24a7f6, 0x2b4078f5, 0x2f2c3ff2, 

-	0x2f23c0f6, 0x2b49bb4a, 0x2b657844, 0x2f0a391d, 0x2f01b2de, 0x2b6eb3ea, 0x2b8a5cce, 0x2ee81543, 

-	0x2edf87c6, 0x2b9391c0, 0x2baf267d, 0x2ec5d479, 0x2ebd3fc4, 0x2bb854b4, 0x2bd3d53a, 0x2ea376d6, 

-	0x2e9adaee, 0x2bdcfcb0, 0x2bf868ed, 0x2e80fc6e, 0x2e785958, 0x2c01899e, 0x2c1ce181, 0x2e5e6556, 

-	0x2e55bb17, 0x2c25fb66, 0x2c413edf, 0x2e3bb1a4, 0x2e330042, 0x2c4a51f3, 0x2c6580f1, 0x2e18e16d, 

-	0x2e1028ed, 0x2c6e8d2e, 0x2c89a79f, 0x2df5f4c7, 0x2ded352f, 0x2c92ad01, 0x2cadb2d5, 0x2dd2ebc7, 

-	0x2dca251c, 0x2cb6b155, 0x2cd1a27b, 0x2dafc683, 0x2da6f8ca, 0x2cda9a14, 0x2cf5767c, 0x2d8c8510, 

-	0x2d83b04f, 0x2cfe6728, 0x2d192ec1, 0x2d692784, 0x2d604bc0, 0x2d22187a, 0x2d3ccb34, 0x2d45adf6

-};

-

-

-const int twidTab512[(8*6 + 32*6 + 128*6)/2] = {

-	0x40000000, 0x40000000, 0x40000000, 0x3b20187d, 

-	0x3ec50c7c, 0x3536238e, 0x2d412d41, 0x3b20187d, 

-	0x187d3b20, 0x187d3b20, 0x3536238e, 0xf3843ec5, 

-	0x00004000, 0x2d412d41, 0xd2bf2d41, 0xe7833b20, 

-	0x238e3536, 0xc13b0c7c, 0xd2bf2d41, 0x187d3b20, 

-	0xc4e0e783, 0xc4e0187d, 0x0c7c3ec5, 0xdc72caca, 

-

-	0x40000000, 0x40000000, 0x40000000, 0x3fb10645, 

-	0x3fec0323, 0x3f4e0964, 0x3ec50c7c, 0x3fb10645, 

-	0x3d3e1294, 0x3d3e1294, 0x3f4e0964, 0x39da1b5d, 

-	0x3b20187d, 0x3ec50c7c, 0x3536238e, 0x38711e2b, 

-	0x3e140f8c, 0x2f6b2afa, 0x3536238e, 0x3d3e1294, 

-	0x28993179, 0x31792899, 0x3c42158f, 0x20e736e5, 

-	0x2d412d41, 0x3b20187d, 0x187d3b20, 0x28993179, 

-	0x39da1b5d, 0x0f8c3e14, 0x238e3536, 0x38711e2b, 

-	0x06453fb1, 0x1e2b3871, 0x36e520e7, 0xfcdd3fec, 

-	0x187d3b20, 0x3536238e, 0xf3843ec5, 0x12943d3e, 

-	0x3367261f, 0xea713c42, 0x0c7c3ec5, 0x31792899, 

-	0xe1d53871, 0x06453fb1, 0x2f6b2afa, 0xd9e13367, 

-	0x00004000, 0x2d412d41, 0xd2bf2d41, 0xf9bb3fb1, 

-	0x2afa2f6b, 0xcc99261f, 0xf3843ec5, 0x28993179, 

-	0xc78f1e2b, 0xed6c3d3e, 0x261f3367, 0xc3be158f, 

-	0xe7833b20, 0x238e3536, 0xc13b0c7c, 0xe1d53871, 

-	0x20e736e5, 0xc0140323, 0xdc723536, 0x1e2b3871, 

-	0xc04ff9bb, 0xd7673179, 0x1b5d39da, 0xc1ecf074, 

-	0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xce872899, 

-	0x158f3c42, 0xc91bdf19, 0xcaca238e, 0x12943d3e, 

-	0xce87d767, 0xc78f1e2b, 0x0f8c3e14, 0xd506d095, 

-	0xc4e0187d, 0x0c7c3ec5, 0xdc72caca, 0xc2c21294, 

-	0x09643f4e, 0xe4a3c626, 0xc13b0c7c, 0x06453fb1, 

-	0xed6cc2c2, 0xc04f0645, 0x03233fec, 0xf69cc0b2, 

-

-	0x40000000, 0x40000000, 0x40000000, 0x3ffb0192, 

-	0x3ffe00c9, 0x3ff4025b, 0x3fec0323, 0x3ffb0192, 

-	0x3fd304b5, 0x3fd304b5, 0x3ff4025b, 0x3f9c070d, 

-	0x3fb10645, 0x3fec0323, 0x3f4e0964, 0x3f8407d5, 

-	0x3fe103ec, 0x3eeb0bb6, 0x3f4e0964, 0x3fd304b5, 

-	0x3e710e05, 0x3f0e0af1, 0x3fc3057d, 0x3de2104f, 

-	0x3ec50c7c, 0x3fb10645, 0x3d3e1294, 0x3e710e05, 

-	0x3f9c070d, 0x3c8414d1, 0x3e140f8c, 0x3f8407d5, 

-	0x3bb61708, 0x3dae1111, 0x3f6a089c, 0x3ad21937, 

-	0x3d3e1294, 0x3f4e0964, 0x39da1b5d, 0x3cc51413, 

-	0x3f2f0a2a, 0x38cf1d79, 0x3c42158f, 0x3f0e0af1, 

-	0x37af1f8b, 0x3bb61708, 0x3eeb0bb6, 0x367c2192, 

-	0x3b20187d, 0x3ec50c7c, 0x3536238e, 0x3a8219ef, 

-	0x3e9c0d41, 0x33de257d, 0x39da1b5d, 0x3e710e05, 

-	0x3274275f, 0x392a1cc6, 0x3e440ec9, 0x30f82934, 

-	0x38711e2b, 0x3e140f8c, 0x2f6b2afa, 0x37af1f8b, 

-	0x3de2104f, 0x2dce2cb2, 0x36e520e7, 0x3dae1111, 

-	0x2c212e5a, 0x3612223d, 0x3d7711d3, 0x2a652ff1, 

-	0x3536238e, 0x3d3e1294, 0x28993179, 0x345324da, 

-	0x3d021354, 0x26c032ee, 0x3367261f, 0x3cc51413, 

-	0x24da3453, 0x3274275f, 0x3c8414d1, 0x22e635a5, 

-	0x31792899, 0x3c42158f, 0x20e736e5, 0x307629cd, 

-	0x3bfd164c, 0x1edc3811, 0x2f6b2afa, 0x3bb61708, 

-	0x1cc6392a, 0x2e5a2c21, 0x3b6c17c3, 0x1aa63a2f, 

-	0x2d412d41, 0x3b20187d, 0x187d3b20, 0x2c212e5a, 

-	0x3ad21937, 0x164c3bfd, 0x2afa2f6b, 0x3a8219ef, 

-	0x14133cc5, 0x29cd3076, 0x3a2f1aa6, 0x11d33d77, 

-	0x28993179, 0x39da1b5d, 0x0f8c3e14, 0x275f3274, 

-	0x39831c12, 0x0d413e9c, 0x261f3367, 0x392a1cc6, 

-	0x0af13f0e, 0x24da3453, 0x38cf1d79, 0x089c3f6a, 

-	0x238e3536, 0x38711e2b, 0x06453fb1, 0x223d3612, 

-	0x38111edc, 0x03ec3fe1, 0x20e736e5, 0x37af1f8b, 

-	0x01923ffb, 0x1f8b37af, 0x374b2039, 0xff373ffe, 

-	0x1e2b3871, 0x36e520e7, 0xfcdd3fec, 0x1cc6392a, 

-	0x367c2192, 0xfa833fc3, 0x1b5d39da, 0x3612223d, 

-	0xf82b3f84, 0x19ef3a82, 0x35a522e6, 0xf5d63f2f, 

-	0x187d3b20, 0x3536238e, 0xf3843ec5, 0x17083bb6, 

-	0x34c62434, 0xf1373e44, 0x158f3c42, 0x345324da, 

-	0xeeef3dae, 0x14133cc5, 0x33de257d, 0xecac3d02, 

-	0x12943d3e, 0x3367261f, 0xea713c42, 0x11113dae, 

-	0x32ee26c0, 0xe83d3b6c, 0x0f8c3e14, 0x3274275f, 

-	0xe6113a82, 0x0e053e71, 0x31f727fd, 0xe3ee3983, 

-	0x0c7c3ec5, 0x31792899, 0xe1d53871, 0x0af13f0e, 

-	0x30f82934, 0xdfc7374b, 0x09643f4e, 0x307629cd, 

-	0xddc33612, 0x07d53f84, 0x2ff12a65, 0xdbcc34c6, 

-	0x06453fb1, 0x2f6b2afa, 0xd9e13367, 0x04b53fd3, 

-	0x2ee32b8e, 0xd80331f7, 0x03233fec, 0x2e5a2c21, 

-	0xd6333076, 0x01923ffb, 0x2dce2cb2, 0xd4722ee3, 

-	0x00004000, 0x2d412d41, 0xd2bf2d41, 0xfe6e3ffb, 

-	0x2cb22dce, 0xd11d2b8e, 0xfcdd3fec, 0x2c212e5a, 

-	0xcf8a29cd, 0xfb4b3fd3, 0x2b8e2ee3, 0xce0927fd, 

-	0xf9bb3fb1, 0x2afa2f6b, 0xcc99261f, 0xf82b3f84, 

-	0x2a652ff1, 0xcb3a2434, 0xf69c3f4e, 0x29cd3076, 

-	0xc9ee223d, 0xf50f3f0e, 0x293430f8, 0xc8b52039, 

-	0xf3843ec5, 0x28993179, 0xc78f1e2b, 0xf1fb3e71, 

-	0x27fd31f7, 0xc67d1c12, 0xf0743e14, 0x275f3274, 

-	0xc57e19ef, 0xeeef3dae, 0x26c032ee, 0xc49417c3, 

-	0xed6c3d3e, 0x261f3367, 0xc3be158f, 0xebed3cc5, 

-	0x257d33de, 0xc2fe1354, 0xea713c42, 0x24da3453, 

-	0xc2521111, 0xe8f83bb6, 0x243434c6, 0xc1bc0ec9, 

-	0xe7833b20, 0x238e3536, 0xc13b0c7c, 0xe6113a82, 

-	0x22e635a5, 0xc0d10a2a, 0xe4a339da, 0x223d3612, 

-	0xc07c07d5, 0xe33a392a, 0x2192367c, 0xc03d057d, 

-	0xe1d53871, 0x20e736e5, 0xc0140323, 0xe07537af, 

-	0x2039374b, 0xc00200c9, 0xdf1936e5, 0x1f8b37af, 

-	0xc005fe6e, 0xddc33612, 0x1edc3811, 0xc01ffc14, 

-	0xdc723536, 0x1e2b3871, 0xc04ff9bb, 0xdb263453, 

-	0x1d7938cf, 0xc096f764, 0xd9e13367, 0x1cc6392a, 

-	0xc0f2f50f, 0xd8a13274, 0x1c123983, 0xc164f2bf, 

-	0xd7673179, 0x1b5d39da, 0xc1ecf074, 0xd6333076, 

-	0x1aa63a2f, 0xc289ee2d, 0xd5062f6b, 0x19ef3a82, 

-	0xc33bebed, 0xd3df2e5a, 0x19373ad2, 0xc403e9b4, 

-	0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xd1a62c21, 

-	0x17c33b6c, 0xc5d1e55a, 0xd0952afa, 0x17083bb6, 

-	0xc6d6e33a, 0xcf8a29cd, 0x164c3bfd, 0xc7efe124, 

-	0xce872899, 0x158f3c42, 0xc91bdf19, 0xcd8c275f, 

-	0x14d13c84, 0xca5bdd1a, 0xcc99261f, 0x14133cc5, 

-	0xcbaddb26, 0xcbad24da, 0x13543d02, 0xcd12d940, 

-	0xcaca238e, 0x12943d3e, 0xce87d767, 0xc9ee223d, 

-	0x11d33d77, 0xd00fd59b, 0xc91b20e7, 0x11113dae, 

-	0xd1a6d3df, 0xc8511f8b, 0x104f3de2, 0xd34ed232, 

-	0xc78f1e2b, 0x0f8c3e14, 0xd506d095, 0xc6d61cc6, 

-	0x0ec93e44, 0xd6cccf08, 0xc6261b5d, 0x0e053e71, 

-	0xd8a1cd8c, 0xc57e19ef, 0x0d413e9c, 0xda83cc22, 

-	0xc4e0187d, 0x0c7c3ec5, 0xdc72caca, 0xc44a1708, 

-	0x0bb63eeb, 0xde6ec984, 0xc3be158f, 0x0af13f0e, 

-	0xe075c851, 0xc33b1413, 0x0a2a3f2f, 0xe287c731, 

-	0xc2c21294, 0x09643f4e, 0xe4a3c626, 0xc2521111, 

-	0x089c3f6a, 0xe6c9c52e, 0xc1ec0f8c, 0x07d53f84, 

-	0xe8f8c44a, 0xc18f0e05, 0x070d3f9c, 0xeb2fc37c, 

-	0xc13b0c7c, 0x06453fb1, 0xed6cc2c2, 0xc0f20af1, 

-	0x057d3fc3, 0xefb1c21e, 0xc0b20964, 0x04b53fd3, 

-	0xf1fbc18f, 0xc07c07d5, 0x03ec3fe1, 0xf44ac115, 

-	0xc04f0645, 0x03233fec, 0xf69cc0b2, 0xc02d04b5, 

-	0x025b3ff4, 0xf8f3c064, 0xc0140323, 0x01923ffb, 

-	0xfb4bc02d, 0xc0050192, 0x00c93ffe, 0xfda5c00c	

-};

-

-const int twidTab64[(4*6 + 16*6)/2] = {

-	0x40000000, 0x40000000, 0x40000000, 0x2d412d41, 

-	0x3b20187d, 0x187d3b20, 0x00004000, 0x2d412d41, 

-	0xd2bf2d41, 0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 

-

-	0x40000000, 0x40000000, 0x40000000, 0x3ec50c7c, 

-	0x3fb10645, 0x3d3e1294, 0x3b20187d, 0x3ec50c7c, 

-	0x3536238e, 0x3536238e, 0x3d3e1294, 0x28993179, 

-	0x2d412d41, 0x3b20187d, 0x187d3b20, 0x238e3536, 

-	0x38711e2b, 0x06453fb1, 0x187d3b20, 0x3536238e, 

-	0xf3843ec5, 0x0c7c3ec5, 0x31792899, 0xe1d53871, 

-	0x00004000, 0x2d412d41, 0xd2bf2d41, 0xf3843ec5, 

-	0x28993179, 0xc78f1e2b, 0xe7833b20, 0x238e3536, 

-	0xc13b0c7c, 0xdc723536, 0x1e2b3871, 0xc04ff9bb, 

-	0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xcaca238e, 

-	0x12943d3e, 0xce87d767, 0xc4e0187d, 0x0c7c3ec5, 

-	0xdc72caca, 0xc13b0c7c, 0x06453fb1, 0xed6cc2c2 

-};

-

-#elif defined ARMV7Neon

-/* 

- *  Q29 for 128 and 1024 

- *

- * for (i = 0; i < num/4; i++) {

- *   angle = (i + 0.125) * M_PI / num;

- *   x = cos(angle) * (1 << 29);

- *   x = sin(angle) * (1 << 29);

- * 

- *   angle = (num/2 - 1 - i + 0.125) * M_PI / num;

- *   x = cos(angle) * (1 << 29);

- *   x = sin(angle) * (1 << 29);

- * }

- */

-const int cossintab[128 + 1024] = {

-	/* 128 */

+#include "aac_rom.h"
+
+#if defined (ARMV5E) && !defined (ARMV7Neon)
+
+/* 
+ *  Q30 for 128 and 1024 
+ *
+ * for (i = 0; i < num/4; i++) {
+ *   angle = (i + 0.125) * M_PI / num;
+ *   x = cos(angle) * (1 << 30);
+ *   x = sin(angle) * (1 << 30);
+ * 
+ *   angle = (num/2 - 1 - i + 0.125) * M_PI / num;
+ *   x = cos(angle) * (1 << 30);
+ *   x = sin(angle) * (1 << 30);
+ * }
+ */
+const int cossintab[128 + 1024] = {
+	/* 128 */
+	0x3fffec43, 0x003243f1, 0x015fd4d2, 0x3ffc38d1, 0x3ff9c13a, 0x01c454f5, 0x02f1b755, 0x3feea776, 
+	0x3fe9b8a9, 0x03562038, 0x0483259d, 0x3fd73a4a, 0x3fcfd50b, 0x04e767c5, 0x0613e1c5, 0x3fb5f4ea, 
+	0x3fac1a5b, 0x0677edbb, 0x07a3adff, 0x3f8adc77, 0x3f7e8e1e, 0x08077457, 0x09324ca7, 0x3f55f796, 
+	0x3f473759, 0x0995bdfd, 0x0abf8043, 0x3f174e70, 0x3f061e95, 0x0b228d42, 0x0c4b0b94, 0x3eceeaad, 
+	0x3ebb4ddb, 0x0cada4f5, 0x0dd4b19a, 0x3e7cd778, 0x3e66d0b4, 0x0e36c82a, 0x0f5c35a3, 0x3e212179, 
+	0x3e08b42a, 0x0fbdba40, 0x10e15b4e, 0x3dbbd6d4, 0x3da106bd, 0x11423ef0, 0x1263e699, 0x3d4d0728, 
+	0x3d2fd86c, 0x12c41a4f, 0x13e39be9, 0x3cd4c38b, 0x3cb53aaa, 0x144310dd, 0x15604013, 0x3c531e88, 
+	0x3c314060, 0x15bee78c, 0x16d99864, 0x3bc82c1f, 0x3ba3fde7, 0x173763c9, 0x184f6aab, 0x3b3401bb, 
+	0x3b0d8909, 0x18ac4b87, 0x19c17d44, 0x3a96b636, 0x3a6df8f8, 0x1a1d6544, 0x1b2f971e, 0x39f061d2, 
+	0x39c5664f, 0x1b8a7815, 0x1c997fc4, 0x39411e33, 0x3913eb0e, 0x1cf34baf, 0x1dfeff67, 0x38890663, 
+	0x3859a292, 0x1e57a86d, 0x1f5fdee6, 0x37c836c2, 0x3796a996, 0x1fb7575c, 0x20bbe7d8, 0x36fecd0e, 
+	0x36cb1e2a, 0x21122240, 0x2212e492, 0x362ce855, 0x35f71fb1, 0x2267d3a0, 0x2364a02e, 0x3552a8f4, 
+	0x351acedd, 0x23b836ca, 0x24b0e699, 0x34703095, 0x34364da6, 0x250317df, 0x25f78497, 0x3385a222, 
+	0x3349bf48, 0x264843d9, 0x273847c8, 0x329321c7, 0x32554840, 0x27878893, 0x2872feb6, 0x3198d4ea, 
+	0x31590e3e, 0x28c0b4d2, 0x29a778db, 0x3096e223, 0x30553828, 0x29f3984c, 0x2ad586a3, 0x2f8d713a, 
+	0x2f49ee0f, 0x2b2003ac, 0x2bfcf97c, 0x2e7cab1c, 0x2e37592c, 0x2c45c8a0, 0x2d1da3d5, 0x2d64b9da, 
+	/* 1024 */
+	0x3fffffb1, 0x0006487f, 0x002bfb74, 0x3ffff0e3, 0x3fffe705, 0x00388c6e, 0x005e3f4c, 0x3fffba9b, 
+	0x3fffa6de, 0x006ad03b, 0x009082ea, 0x3fff5cd8, 0x3fff3f3c, 0x009d13c5, 0x00c2c62f, 0x3ffed79b, 
+	0x3ffeb021, 0x00cf56ef, 0x00f508fc, 0x3ffe2ae5, 0x3ffdf98c, 0x01019998, 0x01274b31, 0x3ffd56b5, 
+	0x3ffd1b7e, 0x0133dba3, 0x01598cb1, 0x3ffc5b0c, 0x3ffc15f7, 0x01661cf0, 0x018bcd5b, 0x3ffb37ec, 
+	0x3ffae8f9, 0x01985d60, 0x01be0d11, 0x3ff9ed53, 0x3ff99483, 0x01ca9cd4, 0x01f04bb4, 0x3ff87b44, 
+	0x3ff81896, 0x01fcdb2e, 0x02228924, 0x3ff6e1bf, 0x3ff67534, 0x022f184d, 0x0254c544, 0x3ff520c5, 
+	0x3ff4aa5d, 0x02615414, 0x0286fff3, 0x3ff33858, 0x3ff2b813, 0x02938e62, 0x02b93914, 0x3ff12878, 
+	0x3ff09e56, 0x02c5c71a, 0x02eb7086, 0x3feef126, 0x3fee5d28, 0x02f7fe1c, 0x031da62b, 0x3fec9265, 
+	0x3febf48b, 0x032a3349, 0x034fd9e5, 0x3fea0c35, 0x3fe96480, 0x035c6682, 0x03820b93, 0x3fe75e98, 
+	0x3fe6ad08, 0x038e97a9, 0x03b43b17, 0x3fe48990, 0x3fe3ce26, 0x03c0c69e, 0x03e66852, 0x3fe18d1f, 
+	0x3fe0c7da, 0x03f2f342, 0x04189326, 0x3fde6945, 0x3fdd9a27, 0x04251d77, 0x044abb73, 0x3fdb1e06, 
+	0x3fda450f, 0x0457451d, 0x047ce11a, 0x3fd7ab64, 0x3fd6c894, 0x04896a16, 0x04af03fc, 0x3fd4115f, 
+	0x3fd324b7, 0x04bb8c42, 0x04e123fa, 0x3fd04ffc, 0x3fcf597c, 0x04edab83, 0x051340f6, 0x3fcc673b, 
+	0x3fcb66e4, 0x051fc7b9, 0x05455ad1, 0x3fc8571f, 0x3fc74cf3, 0x0551e0c7, 0x0577716b, 0x3fc41fac, 
+	0x3fc30baa, 0x0583f68c, 0x05a984a6, 0x3fbfc0e3, 0x3fbea30c, 0x05b608eb, 0x05db9463, 0x3fbb3ac7, 
+	0x3fba131b, 0x05e817c3, 0x060da083, 0x3fb68d5b, 0x3fb55bdc, 0x061a22f7, 0x063fa8e7, 0x3fb1b8a2, 
+	0x3fb07d50, 0x064c2a67, 0x0671ad71, 0x3facbc9f, 0x3fab777b, 0x067e2df5, 0x06a3ae00, 0x3fa79954, 
+	0x3fa64a5f, 0x06b02d81, 0x06d5aa77, 0x3fa24ec6, 0x3fa0f600, 0x06e228ee, 0x0707a2b7, 0x3f9cdcf7, 
+	0x3f9b7a62, 0x0714201b, 0x073996a1, 0x3f9743eb, 0x3f95d787, 0x074612eb, 0x076b8616, 0x3f9183a5, 
+	0x3f900d72, 0x0778013d, 0x079d70f7, 0x3f8b9c28, 0x3f8a1c29, 0x07a9eaf5, 0x07cf5726, 0x3f858d79, 
+	0x3f8403ae, 0x07dbcff2, 0x08013883, 0x3f7f579b, 0x3f7dc405, 0x080db016, 0x083314f1, 0x3f78fa92, 
+	0x3f775d31, 0x083f8b43, 0x0864ec4f, 0x3f727661, 0x3f70cf38, 0x08716159, 0x0896be80, 0x3f6bcb0e, 
+	0x3f6a1a1c, 0x08a3323a, 0x08c88b65, 0x3f64f89b, 0x3f633de2, 0x08d4fdc6, 0x08fa52de, 0x3f5dff0e, 
+	0x3f5c3a8f, 0x0906c3e0, 0x092c14ce, 0x3f56de6a, 0x3f551026, 0x09388469, 0x095dd116, 0x3f4f96b4, 
+	0x3f4dbeac, 0x096a3f42, 0x098f8796, 0x3f4827f0, 0x3f464626, 0x099bf44c, 0x09c13831, 0x3f409223, 
+	0x3f3ea697, 0x09cda368, 0x09f2e2c7, 0x3f38d552, 0x3f36e006, 0x09ff4c78, 0x0a24873a, 0x3f30f181, 
+	0x3f2ef276, 0x0a30ef5e, 0x0a56256c, 0x3f28e6b6, 0x3f26ddec, 0x0a628bfa, 0x0a87bd3d, 0x3f20b4f5, 
+	0x3f1ea26e, 0x0a94222f, 0x0ab94e8f, 0x3f185c43, 0x3f164001, 0x0ac5b1dc, 0x0aead944, 0x3f0fdca5, 
+	0x3f0db6a9, 0x0af73ae5, 0x0b1c5d3d, 0x3f073621, 0x3f05066d, 0x0b28bd2a, 0x0b4dda5c, 0x3efe68bc, 
+	0x3efc2f50, 0x0b5a388d, 0x0b7f5081, 0x3ef5747b, 0x3ef3315a, 0x0b8bacf0, 0x0bb0bf8f, 0x3eec5965, 
+	0x3eea0c8e, 0x0bbd1a33, 0x0be22766, 0x3ee3177e, 0x3ee0c0f4, 0x0bee8038, 0x0c1387e9, 0x3ed9aecc, 
+	0x3ed74e91, 0x0c1fdee1, 0x0c44e0f9, 0x3ed01f55, 0x3ecdb56a, 0x0c513610, 0x0c763278, 0x3ec66920, 
+	0x3ec3f585, 0x0c8285a5, 0x0ca77c47, 0x3ebc8c31, 0x3eba0ee9, 0x0cb3cd84, 0x0cd8be47, 0x3eb2888f, 
+	0x3eb0019c, 0x0ce50d8c, 0x0d09f85b, 0x3ea85e41, 0x3ea5cda3, 0x0d1645a0, 0x0d3b2a64, 0x3e9e0d4c, 
+	0x3e9b7306, 0x0d4775a1, 0x0d6c5443, 0x3e9395b7, 0x3e90f1ca, 0x0d789d71, 0x0d9d75db, 0x3e88f788, 
+	0x3e8649f5, 0x0da9bcf2, 0x0dce8f0d, 0x3e7e32c6, 0x3e7b7b90, 0x0ddad406, 0x0dff9fba, 0x3e734778, 
+	0x3e70869f, 0x0e0be28e, 0x0e30a7c5, 0x3e6835a4, 0x3e656b2b, 0x0e3ce86b, 0x0e61a70f, 0x3e5cfd51, 
+	0x3e5a2939, 0x0e6de580, 0x0e929d7a, 0x3e519e86, 0x3e4ec0d1, 0x0e9ed9af, 0x0ec38ae8, 0x3e46194a, 
+	0x3e4331fa, 0x0ecfc4d9, 0x0ef46f3b, 0x3e3a6da4, 0x3e377cbb, 0x0f00a6df, 0x0f254a53, 0x3e2e9b9c, 
+	0x3e2ba11b, 0x0f317fa5, 0x0f561c15, 0x3e22a338, 0x3e1f9f21, 0x0f624f0c, 0x0f86e460, 0x3e168480, 
+	0x3e1376d5, 0x0f9314f5, 0x0fb7a317, 0x3e0a3f7b, 0x3e07283f, 0x0fc3d143, 0x0fe8581d, 0x3dfdd432, 
+	0x3dfab365, 0x0ff483d7, 0x10190352, 0x3df142ab, 0x3dee1851, 0x10252c94, 0x1049a49a, 0x3de48aef, 
+	0x3de15708, 0x1055cb5b, 0x107a3bd5, 0x3dd7ad05, 0x3dd46f94, 0x1086600e, 0x10aac8e6, 0x3dcaa8f5, 
+	0x3dc761fc, 0x10b6ea90, 0x10db4baf, 0x3dbd7ec7, 0x3dba2e48, 0x10e76ac3, 0x110bc413, 0x3db02e84, 
+	0x3dacd481, 0x1117e088, 0x113c31f3, 0x3da2b834, 0x3d9f54af, 0x11484bc2, 0x116c9531, 0x3d951bde, 
+	0x3d91aed9, 0x1178ac53, 0x119cedaf, 0x3d87598c, 0x3d83e309, 0x11a9021d, 0x11cd3b50, 0x3d797145, 
+	0x3d75f147, 0x11d94d02, 0x11fd7df6, 0x3d6b6313, 0x3d67d99b, 0x12098ce5, 0x122db583, 0x3d5d2efe, 
+	0x3d599c0e, 0x1239c1a7, 0x125de1da, 0x3d4ed50f, 0x3d4b38aa, 0x1269eb2b, 0x128e02dc, 0x3d40554e, 
+	0x3d3caf76, 0x129a0954, 0x12be186c, 0x3d31afc5, 0x3d2e007c, 0x12ca1c03, 0x12ee226c, 0x3d22e47c, 
+	0x3d1f2bc5, 0x12fa231b, 0x131e20c0, 0x3d13f37e, 0x3d10315a, 0x132a1e7e, 0x134e1348, 0x3d04dcd2, 
+	0x3d011145, 0x135a0e0e, 0x137df9e7, 0x3cf5a082, 0x3cf1cb8e, 0x1389f1af, 0x13add481, 0x3ce63e98, 
+	0x3ce2603f, 0x13b9c943, 0x13dda2f7, 0x3cd6b71e, 0x3cd2cf62, 0x13e994ab, 0x140d652c, 0x3cc70a1c, 
+	0x3cc318ff, 0x141953cb, 0x143d1b02, 0x3cb7379c, 0x3cb33d22, 0x14490685, 0x146cc45c, 0x3ca73fa9, 
+	0x3ca33bd3, 0x1478acbc, 0x149c611d, 0x3c97224c, 0x3c93151d, 0x14a84652, 0x14cbf127, 0x3c86df8e, 
+	0x3c82c909, 0x14d7d32a, 0x14fb745e, 0x3c76777b, 0x3c7257a2, 0x15075327, 0x152aeaa3, 0x3c65ea1c, 
+	0x3c61c0f1, 0x1536c62b, 0x155a53d9, 0x3c55377b, 0x3c510501, 0x15662c18, 0x1589afe3, 0x3c445fa2, 
+	0x3c4023dd, 0x159584d3, 0x15b8fea4, 0x3c33629d, 0x3c2f1d8e, 0x15c4d03e, 0x15e83fff, 0x3c224075, 
+	0x3c1df21f, 0x15f40e3a, 0x161773d6, 0x3c10f935, 0x3c0ca19b, 0x16233eac, 0x16469a0d, 0x3bff8ce8, 
+	0x3bfb2c0c, 0x16526176, 0x1675b286, 0x3bedfb99, 0x3be9917e, 0x1681767c, 0x16a4bd25, 0x3bdc4552, 
+	0x3bd7d1fa, 0x16b07d9f, 0x16d3b9cc, 0x3bca6a1d, 0x3bc5ed8d, 0x16df76c3, 0x1702a85e, 0x3bb86a08, 
+	0x3bb3e440, 0x170e61cc, 0x173188be, 0x3ba6451b, 0x3ba1b620, 0x173d3e9b, 0x17605ad0, 0x3b93fb63, 
+	0x3b8f6337, 0x176c0d15, 0x178f1e76, 0x3b818ceb, 0x3b7ceb90, 0x179acd1c, 0x17bdd394, 0x3b6ef9be, 
+	0x3b6a4f38, 0x17c97e93, 0x17ec7a0d, 0x3b5c41e8, 0x3b578e39, 0x17f8215e, 0x181b11c4, 0x3b496574, 
+	0x3b44a8a0, 0x1826b561, 0x18499a9d, 0x3b36646e, 0x3b319e77, 0x18553a7d, 0x1878147a, 0x3b233ee1, 
+	0x3b1e6fca, 0x1883b097, 0x18a67f3f, 0x3b0ff4d9, 0x3b0b1ca6, 0x18b21791, 0x18d4dad0, 0x3afc8663, 
+	0x3af7a516, 0x18e06f50, 0x1903270f, 0x3ae8f38b, 0x3ae40926, 0x190eb7b7, 0x193163e1, 0x3ad53c5b, 
+	0x3ad048e3, 0x193cf0a9, 0x195f9128, 0x3ac160e1, 0x3abc6458, 0x196b1a09, 0x198daec8, 0x3aad6129, 
+	0x3aa85b92, 0x199933bb, 0x19bbbca6, 0x3a993d3e, 0x3a942e9d, 0x19c73da3, 0x19e9baa3, 0x3a84f52f, 
+	0x3a7fdd86, 0x19f537a4, 0x1a17a8a5, 0x3a708906, 0x3a6b6859, 0x1a2321a2, 0x1a45868e, 0x3a5bf8d1, 
+	0x3a56cf23, 0x1a50fb81, 0x1a735442, 0x3a47449c, 0x3a4211f0, 0x1a7ec524, 0x1aa111a6, 0x3a326c74, 
+	0x3a2d30cd, 0x1aac7e6f, 0x1acebe9d, 0x3a1d7066, 0x3a182bc8, 0x1ada2746, 0x1afc5b0a, 0x3a08507f, 
+	0x3a0302ed, 0x1b07bf8c, 0x1b29e6d2, 0x39f30ccc, 0x39edb649, 0x1b354727, 0x1b5761d8, 0x39dda55a, 
+	0x39d845e9, 0x1b62bdf8, 0x1b84cc01, 0x39c81a36, 0x39c2b1da, 0x1b9023e5, 0x1bb22530, 0x39b26b6d, 
+	0x39acfa2b, 0x1bbd78d2, 0x1bdf6d4a, 0x399c990d, 0x39971ee7, 0x1beabca1, 0x1c0ca432, 0x3986a324, 
+	0x3981201e, 0x1c17ef39, 0x1c39c9cd, 0x397089bf, 0x396afddc, 0x1c45107c, 0x1c66ddfe, 0x395a4ceb, 
+	0x3954b82e, 0x1c72204f, 0x1c93e0ab, 0x3943ecb6, 0x393e4f23, 0x1c9f1e96, 0x1cc0d1b6, 0x392d692f, 
+	0x3927c2c9, 0x1ccc0b35, 0x1cedb106, 0x3916c262, 0x3911132d, 0x1cf8e611, 0x1d1a7e7d, 0x38fff85e, 
+	0x38fa405e, 0x1d25af0d, 0x1d473a00, 0x38e90b31, 0x38e34a69, 0x1d52660f, 0x1d73e374, 0x38d1fae9, 
+	0x38cc315d, 0x1d7f0afb, 0x1da07abc, 0x38bac795, 0x38b4f547, 0x1dab9db5, 0x1dccffbf, 0x38a37142, 
+	0x389d9637, 0x1dd81e21, 0x1df9725f, 0x388bf7ff, 0x3886143b, 0x1e048c24, 0x1e25d282, 0x38745bdb, 
+	0x386e6f60, 0x1e30e7a4, 0x1e52200c, 0x385c9ce3, 0x3856a7b6, 0x1e5d3084, 0x1e7e5ae2, 0x3844bb28, 
+	0x383ebd4c, 0x1e8966a8, 0x1eaa82e9, 0x382cb6b7, 0x3826b030, 0x1eb589f7, 0x1ed69805, 0x38148f9f, 
+	0x380e8071, 0x1ee19a54, 0x1f029a1c, 0x37fc45ef, 0x37f62e1d, 0x1f0d97a5, 0x1f2e8911, 0x37e3d9b7, 
+	0x37ddb945, 0x1f3981ce, 0x1f5a64cb, 0x37cb4b04, 0x37c521f6, 0x1f6558b5, 0x1f862d2d, 0x37b299e7, 
+	0x37ac6841, 0x1f911c3d, 0x1fb1e21d, 0x3799c66f, 0x37938c34, 0x1fbccc4d, 0x1fdd8381, 0x3780d0aa, 
+	0x377a8ddf, 0x1fe868c8, 0x2009113c, 0x3767b8a9, 0x37616d51, 0x2013f196, 0x20348b35, 0x374e7e7b, 
+	0x37482a9a, 0x203f6699, 0x205ff14f, 0x3735222f, 0x372ec5c9, 0x206ac7b8, 0x208b4372, 0x371ba3d4, 
+	0x37153eee, 0x209614d9, 0x20b68181, 0x3702037c, 0x36fb9618, 0x20c14ddf, 0x20e1ab63, 0x36e84135, 
+	0x36e1cb58, 0x20ec72b1, 0x210cc0fc, 0x36ce5d10, 0x36c7debd, 0x21178334, 0x2137c232, 0x36b4571b, 
+	0x36add058, 0x21427f4d, 0x2162aeea, 0x369a2f69, 0x3693a038, 0x216d66e2, 0x218d870b, 0x367fe608, 
+	0x36794e6e, 0x219839d8, 0x21b84a79, 0x36657b08, 0x365edb09, 0x21c2f815, 0x21e2f91a, 0x364aee7b, 
+	0x3644461b, 0x21eda17f, 0x220d92d4, 0x36304070, 0x36298fb4, 0x221835fb, 0x2238178d, 0x361570f8, 
+	0x360eb7e3, 0x2242b56f, 0x22628729, 0x35fa8023, 0x35f3beba, 0x226d1fc1, 0x228ce191, 0x35df6e03, 
+	0x35d8a449, 0x229774d7, 0x22b726a8, 0x35c43aa7, 0x35bd68a1, 0x22c1b496, 0x22e15655, 0x35a8e621, 
+	0x35a20bd3, 0x22ebdee5, 0x230b707e, 0x358d7081, 0x35868def, 0x2315f3a8, 0x23357509, 0x3571d9d9, 
+	0x356aef08, 0x233ff2c8, 0x235f63dc, 0x35562239, 0x354f2f2c, 0x2369dc29, 0x23893cdd, 0x353a49b2, 
+	0x35334e6f, 0x2393afb2, 0x23b2fff3, 0x351e5056, 0x35174ce0, 0x23bd6d48, 0x23dcad03, 0x35023636, 
+	0x34fb2a92, 0x23e714d3, 0x240643f4, 0x34e5fb63, 0x34dee795, 0x2410a639, 0x242fc4ad, 0x34c99fef, 
+	0x34c283fb, 0x243a215f, 0x24592f13, 0x34ad23eb, 0x34a5ffd5, 0x2463862c, 0x2482830d, 0x34908768, 
+	0x34895b36, 0x248cd487, 0x24abc082, 0x3473ca79, 0x346c962f, 0x24b60c57, 0x24d4e757, 0x3456ed2f, 
+	0x344fb0d1, 0x24df2d81, 0x24fdf775, 0x3439ef9c, 0x3432ab2e, 0x250837ed, 0x2526f0c1, 0x341cd1d2, 
+	0x34158559, 0x25312b81, 0x254fd323, 0x33ff93e2, 0x33f83f62, 0x255a0823, 0x25789e80, 0x33e235df, 
+	0x33dad95e, 0x2582cdbc, 0x25a152c0, 0x33c4b7db, 0x33bd535c, 0x25ab7c30, 0x25c9efca, 0x33a719e8, 
+	0x339fad70, 0x25d41369, 0x25f27584, 0x33895c18, 0x3381e7ac, 0x25fc934b, 0x261ae3d6, 0x336b7e7e, 
+	0x33640223, 0x2624fbbf, 0x26433aa7, 0x334d812d, 0x3345fce6, 0x264d4cac, 0x266b79dd, 0x332f6435, 
+	0x3327d808, 0x267585f8, 0x2693a161, 0x331127ab, 0x3309939c, 0x269da78b, 0x26bbb119, 0x32f2cba1, 
+	0x32eb2fb5, 0x26c5b14c, 0x26e3a8ec, 0x32d45029, 0x32ccac64, 0x26eda322, 0x270b88c2, 0x32b5b557, 
+	0x32ae09be, 0x27157cf5, 0x27335082, 0x3296fb3d, 0x328f47d5, 0x273d3eac, 0x275b0014, 0x327821ee, 
+	0x327066bc, 0x2764e82f, 0x27829760, 0x3259297d, 0x32516686, 0x278c7965, 0x27aa164c, 0x323a11fe, 
+	0x32324746, 0x27b3f235, 0x27d17cc1, 0x321adb83, 0x3213090f, 0x27db5288, 0x27f8caa5, 0x31fb8620, 
+	0x31f3abf5, 0x28029a45, 0x281fffe2, 0x31dc11e8, 0x31d4300b, 0x2829c954, 0x28471c5e, 0x31bc7eee, 
+	0x31b49564, 0x2850df9d, 0x286e2002, 0x319ccd46, 0x3194dc14, 0x2877dd07, 0x28950ab6, 0x317cfd04, 
+	0x3175042e, 0x289ec17a, 0x28bbdc61, 0x315d0e3b, 0x31550dc6, 0x28c58cdf, 0x28e294eb, 0x313d00ff, 
+	0x3134f8f1, 0x28ec3f1e, 0x2909343e, 0x311cd564, 0x3114c5c0, 0x2912d81f, 0x292fba40, 0x30fc8b7d, 
+	0x30f47449, 0x293957c9, 0x295626da, 0x30dc235e, 0x30d404a0, 0x295fbe06, 0x297c79f5, 0x30bb9d1c, 
+	0x30b376d8, 0x29860abd, 0x29a2b378, 0x309af8ca, 0x3092cb05, 0x29ac3dd7, 0x29c8d34d, 0x307a367c, 
+	0x3072013c, 0x29d2573c, 0x29eed95b, 0x30595648, 0x30511991, 0x29f856d5, 0x2a14c58b, 0x30385840, 
+	0x30301418, 0x2a1e3c8a, 0x2a3a97c7, 0x30173c7a, 0x300ef0e5, 0x2a440844, 0x2a604ff5, 0x2ff6030a, 
+	0x2fedb00d, 0x2a69b9ec, 0x2a85ee00, 0x2fd4ac04, 0x2fcc51a5, 0x2a8f516b, 0x2aab71d0, 0x2fb3377c, 
+	0x2faad5c1, 0x2ab4cea9, 0x2ad0db4e, 0x2f91a589, 0x2f893c75, 0x2ada318e, 0x2af62a63, 0x2f6ff63d, 
+	0x2f6785d7, 0x2aff7a05, 0x2b1b5ef8, 0x2f4e29af, 0x2f45b1fb, 0x2b24a7f6, 0x2b4078f5, 0x2f2c3ff2, 
+	0x2f23c0f6, 0x2b49bb4a, 0x2b657844, 0x2f0a391d, 0x2f01b2de, 0x2b6eb3ea, 0x2b8a5cce, 0x2ee81543, 
+	0x2edf87c6, 0x2b9391c0, 0x2baf267d, 0x2ec5d479, 0x2ebd3fc4, 0x2bb854b4, 0x2bd3d53a, 0x2ea376d6, 
+	0x2e9adaee, 0x2bdcfcb0, 0x2bf868ed, 0x2e80fc6e, 0x2e785958, 0x2c01899e, 0x2c1ce181, 0x2e5e6556, 
+	0x2e55bb17, 0x2c25fb66, 0x2c413edf, 0x2e3bb1a4, 0x2e330042, 0x2c4a51f3, 0x2c6580f1, 0x2e18e16d, 
+	0x2e1028ed, 0x2c6e8d2e, 0x2c89a79f, 0x2df5f4c7, 0x2ded352f, 0x2c92ad01, 0x2cadb2d5, 0x2dd2ebc7, 
+	0x2dca251c, 0x2cb6b155, 0x2cd1a27b, 0x2dafc683, 0x2da6f8ca, 0x2cda9a14, 0x2cf5767c, 0x2d8c8510, 
+	0x2d83b04f, 0x2cfe6728, 0x2d192ec1, 0x2d692784, 0x2d604bc0, 0x2d22187a, 0x2d3ccb34, 0x2d45adf6
+};
+
+
+const int twidTab512[(8*6 + 32*6 + 128*6)/2] = {
+	0x40000000, 0x40000000, 0x40000000, 0x3b20187d, 
+	0x3ec50c7c, 0x3536238e, 0x2d412d41, 0x3b20187d, 
+	0x187d3b20, 0x187d3b20, 0x3536238e, 0xf3843ec5, 
+	0x00004000, 0x2d412d41, 0xd2bf2d41, 0xe7833b20, 
+	0x238e3536, 0xc13b0c7c, 0xd2bf2d41, 0x187d3b20, 
+	0xc4e0e783, 0xc4e0187d, 0x0c7c3ec5, 0xdc72caca, 
+
+	0x40000000, 0x40000000, 0x40000000, 0x3fb10645, 
+	0x3fec0323, 0x3f4e0964, 0x3ec50c7c, 0x3fb10645, 
+	0x3d3e1294, 0x3d3e1294, 0x3f4e0964, 0x39da1b5d, 
+	0x3b20187d, 0x3ec50c7c, 0x3536238e, 0x38711e2b, 
+	0x3e140f8c, 0x2f6b2afa, 0x3536238e, 0x3d3e1294, 
+	0x28993179, 0x31792899, 0x3c42158f, 0x20e736e5, 
+	0x2d412d41, 0x3b20187d, 0x187d3b20, 0x28993179, 
+	0x39da1b5d, 0x0f8c3e14, 0x238e3536, 0x38711e2b, 
+	0x06453fb1, 0x1e2b3871, 0x36e520e7, 0xfcdd3fec, 
+	0x187d3b20, 0x3536238e, 0xf3843ec5, 0x12943d3e, 
+	0x3367261f, 0xea713c42, 0x0c7c3ec5, 0x31792899, 
+	0xe1d53871, 0x06453fb1, 0x2f6b2afa, 0xd9e13367, 
+	0x00004000, 0x2d412d41, 0xd2bf2d41, 0xf9bb3fb1, 
+	0x2afa2f6b, 0xcc99261f, 0xf3843ec5, 0x28993179, 
+	0xc78f1e2b, 0xed6c3d3e, 0x261f3367, 0xc3be158f, 
+	0xe7833b20, 0x238e3536, 0xc13b0c7c, 0xe1d53871, 
+	0x20e736e5, 0xc0140323, 0xdc723536, 0x1e2b3871, 
+	0xc04ff9bb, 0xd7673179, 0x1b5d39da, 0xc1ecf074, 
+	0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xce872899, 
+	0x158f3c42, 0xc91bdf19, 0xcaca238e, 0x12943d3e, 
+	0xce87d767, 0xc78f1e2b, 0x0f8c3e14, 0xd506d095, 
+	0xc4e0187d, 0x0c7c3ec5, 0xdc72caca, 0xc2c21294, 
+	0x09643f4e, 0xe4a3c626, 0xc13b0c7c, 0x06453fb1, 
+	0xed6cc2c2, 0xc04f0645, 0x03233fec, 0xf69cc0b2, 
+
+	0x40000000, 0x40000000, 0x40000000, 0x3ffb0192, 
+	0x3ffe00c9, 0x3ff4025b, 0x3fec0323, 0x3ffb0192, 
+	0x3fd304b5, 0x3fd304b5, 0x3ff4025b, 0x3f9c070d, 
+	0x3fb10645, 0x3fec0323, 0x3f4e0964, 0x3f8407d5, 
+	0x3fe103ec, 0x3eeb0bb6, 0x3f4e0964, 0x3fd304b5, 
+	0x3e710e05, 0x3f0e0af1, 0x3fc3057d, 0x3de2104f, 
+	0x3ec50c7c, 0x3fb10645, 0x3d3e1294, 0x3e710e05, 
+	0x3f9c070d, 0x3c8414d1, 0x3e140f8c, 0x3f8407d5, 
+	0x3bb61708, 0x3dae1111, 0x3f6a089c, 0x3ad21937, 
+	0x3d3e1294, 0x3f4e0964, 0x39da1b5d, 0x3cc51413, 
+	0x3f2f0a2a, 0x38cf1d79, 0x3c42158f, 0x3f0e0af1, 
+	0x37af1f8b, 0x3bb61708, 0x3eeb0bb6, 0x367c2192, 
+	0x3b20187d, 0x3ec50c7c, 0x3536238e, 0x3a8219ef, 
+	0x3e9c0d41, 0x33de257d, 0x39da1b5d, 0x3e710e05, 
+	0x3274275f, 0x392a1cc6, 0x3e440ec9, 0x30f82934, 
+	0x38711e2b, 0x3e140f8c, 0x2f6b2afa, 0x37af1f8b, 
+	0x3de2104f, 0x2dce2cb2, 0x36e520e7, 0x3dae1111, 
+	0x2c212e5a, 0x3612223d, 0x3d7711d3, 0x2a652ff1, 
+	0x3536238e, 0x3d3e1294, 0x28993179, 0x345324da, 
+	0x3d021354, 0x26c032ee, 0x3367261f, 0x3cc51413, 
+	0x24da3453, 0x3274275f, 0x3c8414d1, 0x22e635a5, 
+	0x31792899, 0x3c42158f, 0x20e736e5, 0x307629cd, 
+	0x3bfd164c, 0x1edc3811, 0x2f6b2afa, 0x3bb61708, 
+	0x1cc6392a, 0x2e5a2c21, 0x3b6c17c3, 0x1aa63a2f, 
+	0x2d412d41, 0x3b20187d, 0x187d3b20, 0x2c212e5a, 
+	0x3ad21937, 0x164c3bfd, 0x2afa2f6b, 0x3a8219ef, 
+	0x14133cc5, 0x29cd3076, 0x3a2f1aa6, 0x11d33d77, 
+	0x28993179, 0x39da1b5d, 0x0f8c3e14, 0x275f3274, 
+	0x39831c12, 0x0d413e9c, 0x261f3367, 0x392a1cc6, 
+	0x0af13f0e, 0x24da3453, 0x38cf1d79, 0x089c3f6a, 
+	0x238e3536, 0x38711e2b, 0x06453fb1, 0x223d3612, 
+	0x38111edc, 0x03ec3fe1, 0x20e736e5, 0x37af1f8b, 
+	0x01923ffb, 0x1f8b37af, 0x374b2039, 0xff373ffe, 
+	0x1e2b3871, 0x36e520e7, 0xfcdd3fec, 0x1cc6392a, 
+	0x367c2192, 0xfa833fc3, 0x1b5d39da, 0x3612223d, 
+	0xf82b3f84, 0x19ef3a82, 0x35a522e6, 0xf5d63f2f, 
+	0x187d3b20, 0x3536238e, 0xf3843ec5, 0x17083bb6, 
+	0x34c62434, 0xf1373e44, 0x158f3c42, 0x345324da, 
+	0xeeef3dae, 0x14133cc5, 0x33de257d, 0xecac3d02, 
+	0x12943d3e, 0x3367261f, 0xea713c42, 0x11113dae, 
+	0x32ee26c0, 0xe83d3b6c, 0x0f8c3e14, 0x3274275f, 
+	0xe6113a82, 0x0e053e71, 0x31f727fd, 0xe3ee3983, 
+	0x0c7c3ec5, 0x31792899, 0xe1d53871, 0x0af13f0e, 
+	0x30f82934, 0xdfc7374b, 0x09643f4e, 0x307629cd, 
+	0xddc33612, 0x07d53f84, 0x2ff12a65, 0xdbcc34c6, 
+	0x06453fb1, 0x2f6b2afa, 0xd9e13367, 0x04b53fd3, 
+	0x2ee32b8e, 0xd80331f7, 0x03233fec, 0x2e5a2c21, 
+	0xd6333076, 0x01923ffb, 0x2dce2cb2, 0xd4722ee3, 
+	0x00004000, 0x2d412d41, 0xd2bf2d41, 0xfe6e3ffb, 
+	0x2cb22dce, 0xd11d2b8e, 0xfcdd3fec, 0x2c212e5a, 
+	0xcf8a29cd, 0xfb4b3fd3, 0x2b8e2ee3, 0xce0927fd, 
+	0xf9bb3fb1, 0x2afa2f6b, 0xcc99261f, 0xf82b3f84, 
+	0x2a652ff1, 0xcb3a2434, 0xf69c3f4e, 0x29cd3076, 
+	0xc9ee223d, 0xf50f3f0e, 0x293430f8, 0xc8b52039, 
+	0xf3843ec5, 0x28993179, 0xc78f1e2b, 0xf1fb3e71, 
+	0x27fd31f7, 0xc67d1c12, 0xf0743e14, 0x275f3274, 
+	0xc57e19ef, 0xeeef3dae, 0x26c032ee, 0xc49417c3, 
+	0xed6c3d3e, 0x261f3367, 0xc3be158f, 0xebed3cc5, 
+	0x257d33de, 0xc2fe1354, 0xea713c42, 0x24da3453, 
+	0xc2521111, 0xe8f83bb6, 0x243434c6, 0xc1bc0ec9, 
+	0xe7833b20, 0x238e3536, 0xc13b0c7c, 0xe6113a82, 
+	0x22e635a5, 0xc0d10a2a, 0xe4a339da, 0x223d3612, 
+	0xc07c07d5, 0xe33a392a, 0x2192367c, 0xc03d057d, 
+	0xe1d53871, 0x20e736e5, 0xc0140323, 0xe07537af, 
+	0x2039374b, 0xc00200c9, 0xdf1936e5, 0x1f8b37af, 
+	0xc005fe6e, 0xddc33612, 0x1edc3811, 0xc01ffc14, 
+	0xdc723536, 0x1e2b3871, 0xc04ff9bb, 0xdb263453, 
+	0x1d7938cf, 0xc096f764, 0xd9e13367, 0x1cc6392a, 
+	0xc0f2f50f, 0xd8a13274, 0x1c123983, 0xc164f2bf, 
+	0xd7673179, 0x1b5d39da, 0xc1ecf074, 0xd6333076, 
+	0x1aa63a2f, 0xc289ee2d, 0xd5062f6b, 0x19ef3a82, 
+	0xc33bebed, 0xd3df2e5a, 0x19373ad2, 0xc403e9b4, 
+	0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xd1a62c21, 
+	0x17c33b6c, 0xc5d1e55a, 0xd0952afa, 0x17083bb6, 
+	0xc6d6e33a, 0xcf8a29cd, 0x164c3bfd, 0xc7efe124, 
+	0xce872899, 0x158f3c42, 0xc91bdf19, 0xcd8c275f, 
+	0x14d13c84, 0xca5bdd1a, 0xcc99261f, 0x14133cc5, 
+	0xcbaddb26, 0xcbad24da, 0x13543d02, 0xcd12d940, 
+	0xcaca238e, 0x12943d3e, 0xce87d767, 0xc9ee223d, 
+	0x11d33d77, 0xd00fd59b, 0xc91b20e7, 0x11113dae, 
+	0xd1a6d3df, 0xc8511f8b, 0x104f3de2, 0xd34ed232, 
+	0xc78f1e2b, 0x0f8c3e14, 0xd506d095, 0xc6d61cc6, 
+	0x0ec93e44, 0xd6cccf08, 0xc6261b5d, 0x0e053e71, 
+	0xd8a1cd8c, 0xc57e19ef, 0x0d413e9c, 0xda83cc22, 
+	0xc4e0187d, 0x0c7c3ec5, 0xdc72caca, 0xc44a1708, 
+	0x0bb63eeb, 0xde6ec984, 0xc3be158f, 0x0af13f0e, 
+	0xe075c851, 0xc33b1413, 0x0a2a3f2f, 0xe287c731, 
+	0xc2c21294, 0x09643f4e, 0xe4a3c626, 0xc2521111, 
+	0x089c3f6a, 0xe6c9c52e, 0xc1ec0f8c, 0x07d53f84, 
+	0xe8f8c44a, 0xc18f0e05, 0x070d3f9c, 0xeb2fc37c, 
+	0xc13b0c7c, 0x06453fb1, 0xed6cc2c2, 0xc0f20af1, 
+	0x057d3fc3, 0xefb1c21e, 0xc0b20964, 0x04b53fd3, 
+	0xf1fbc18f, 0xc07c07d5, 0x03ec3fe1, 0xf44ac115, 
+	0xc04f0645, 0x03233fec, 0xf69cc0b2, 0xc02d04b5, 
+	0x025b3ff4, 0xf8f3c064, 0xc0140323, 0x01923ffb, 
+	0xfb4bc02d, 0xc0050192, 0x00c93ffe, 0xfda5c00c	
+};
+
+const int twidTab64[(4*6 + 16*6)/2] = {
+	0x40000000, 0x40000000, 0x40000000, 0x2d412d41, 
+	0x3b20187d, 0x187d3b20, 0x00004000, 0x2d412d41, 
+	0xd2bf2d41, 0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 
+
+	0x40000000, 0x40000000, 0x40000000, 0x3ec50c7c, 
+	0x3fb10645, 0x3d3e1294, 0x3b20187d, 0x3ec50c7c, 
+	0x3536238e, 0x3536238e, 0x3d3e1294, 0x28993179, 
+	0x2d412d41, 0x3b20187d, 0x187d3b20, 0x238e3536, 
+	0x38711e2b, 0x06453fb1, 0x187d3b20, 0x3536238e, 
+	0xf3843ec5, 0x0c7c3ec5, 0x31792899, 0xe1d53871, 
+	0x00004000, 0x2d412d41, 0xd2bf2d41, 0xf3843ec5, 
+	0x28993179, 0xc78f1e2b, 0xe7833b20, 0x238e3536, 
+	0xc13b0c7c, 0xdc723536, 0x1e2b3871, 0xc04ff9bb, 
+	0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xcaca238e, 
+	0x12943d3e, 0xce87d767, 0xc4e0187d, 0x0c7c3ec5, 
+	0xdc72caca, 0xc13b0c7c, 0x06453fb1, 0xed6cc2c2 
+};
+
+#elif defined ARMV7Neon
+/* 
+ *  Q29 for 128 and 1024 
+ *
+ * for (i = 0; i < num/4; i++) {
+ *   angle = (i + 0.125) * M_PI / num;
+ *   x = cos(angle) * (1 << 29);
+ *   x = sin(angle) * (1 << 29);
+ * 
+ *   angle = (num/2 - 1 - i + 0.125) * M_PI / num;
+ *   x = cos(angle) * (1 << 29);
+ *   x = sin(angle) * (1 << 29);
+ * }
+ */
+const int cossintab[128 + 1024] = {
+	/* 128 */
 	0x1ffff621, 0x001921f9, 0x00afea69, 0x1ffe1c68, 0x1ffce09d, 0x00e22a7a, 0x0178dbaa, 0x1ff753bb, 
 	0x1ff4dc55, 0x01ab101c, 0x024192cf, 0x1feb9d25, 0x1fe7ea85, 0x0273b3e2, 0x0309f0e2, 0x1fdafa75, 
 	0x1fd60d2e, 0x033bf6dd, 0x03d1d700, 0x1fc56e3b, 0x1fbf470f, 0x0403ba2b, 0x04992653, 0x1faafbcb, 
@@ -368,139 +368,139 @@
 	0x1a8d676e, 0x11dc1b65, 0x1258734d, 0x1a38184a, 0x1a1b26d3, 0x12818bef, 0x12fbc24b, 0x19c2d111, 
 	0x19a4dfa4, 0x132421ec, 0x139c23e4, 0x194990e4, 0x192aa420, 0x13c3c44a, 0x14397f5b, 0x18cc6a75, 
 	0x18ac871f, 0x14605a69, 0x14d3bc6d, 0x184b7112, 0x182a9c14, 0x14f9cc26, 0x156ac352, 0x17c6b89d, 
-	0x17a4f708, 0x159001d6, 0x15fe7cbe, 0x173e558e, 0x171bac96, 0x1622e450, 0x168ed1eb, 0x16b25ced,

-	/* 1024 */

-	0x1fffffd9, 0x0003243f, 0x0015fdba, 0x1ffff872, 0x1ffff382, 0x001c4637, 0x002f1fa6, 0x1fffdd4d, 

-	0x1fffd36f, 0x0035681d, 0x00484175, 0x1fffae6c, 0x1fff9f9e, 0x004e89e3, 0x00616318, 0x1fff6bce, 

-	0x1fff5811, 0x0067ab77, 0x007a847e, 0x1fff1572, 0x1ffefcc6, 0x0080cccc, 0x0093a599, 0x1ffeab5b, 

-	0x1ffe8dbf, 0x0099edd2, 0x00acc658, 0x1ffe2d86, 0x1ffe0afc, 0x00b30e78, 0x00c5e6ad, 0x1ffd9bf6, 

-	0x1ffd747c, 0x00cc2eb0, 0x00df0688, 0x1ffcf6aa, 0x1ffcca41, 0x00e54e6a, 0x00f825da, 0x1ffc3da2, 

-	0x1ffc0c4b, 0x00fe6d97, 0x01114492, 0x1ffb70e0, 0x1ffb3a9a, 0x01178c27, 0x012a62a2, 0x1ffa9063, 

-	0x1ffa552e, 0x0130aa0a, 0x01437ffa, 0x1ff99c2c, 0x1ff95c09, 0x0149c731, 0x015c9c8a, 0x1ff8943c, 

-	0x1ff84f2b, 0x0162e38d, 0x0175b843, 0x1ff77893, 0x1ff72e94, 0x017bff0e, 0x018ed316, 0x1ff64932, 

-	0x1ff5fa46, 0x019519a5, 0x01a7ecf2, 0x1ff5061b, 0x1ff4b240, 0x01ae3341, 0x01c105c9, 0x1ff3af4c, 

-	0x1ff35684, 0x01c74bd5, 0x01da1d8c, 0x1ff244c8, 0x1ff1e713, 0x01e0634f, 0x01f33429, 0x1ff0c68f, 

-	0x1ff063ed, 0x01f979a1, 0x020c4993, 0x1fef34a3, 0x1feecd14, 0x02128ebb, 0x02255db9, 0x1fed8f03, 

-	0x1fed2287, 0x022ba28f, 0x023e708d, 0x1febd5b2, 0x1feb644a, 0x0244b50b, 0x025781fe, 0x1fea08b0, 

-	0x1fe9925c, 0x025dc621, 0x027091fd, 0x1fe827fe, 0x1fe7acbe, 0x0276d5c1, 0x0289a07b, 0x1fe6339d, 

-	0x1fe5b372, 0x028fe3dd, 0x02a2ad69, 0x1fe42b90, 0x1fe3a679, 0x02a8f063, 0x02bbb8b6, 0x1fe20fd6, 

-	0x1fe185d5, 0x02c1fb46, 0x02d4c253, 0x1fdfe071, 0x1fdf5186, 0x02db0475, 0x02edca32, 0x1fdd9d64, 

-	0x1fdd098e, 0x02f40be2, 0x0306d042, 0x1fdb46ae, 0x1fdaadee, 0x030d117c, 0x031fd474, 0x1fd8dc51, 

-	0x1fd83ea8, 0x03261534, 0x0338d6b8, 0x1fd65e4f, 0x1fd5bbbd, 0x033f16fb, 0x0351d700, 0x1fd3ccaa, 

-	0x1fd32530, 0x035816c1, 0x036ad53c, 0x1fd12763, 0x1fd07b00, 0x03711477, 0x0383d15c, 0x1fce6e7c, 

-	0x1fcdbd31, 0x038a100e, 0x039ccb51, 0x1fcba1f5, 0x1fcaebc3, 0x03a30975, 0x03b5c30b, 0x1fc8c1d2, 

-	0x1fc806b9, 0x03bc009f, 0x03ceb87c, 0x1fc5ce14, 0x1fc50e14, 0x03d4f57a, 0x03e7ab93, 0x1fc2c6bd, 

-	0x1fc201d7, 0x03ede7f9, 0x04009c42, 0x1fbfabcd, 0x1fbee202, 0x0406d80b, 0x04198a78, 0x1fbc7d49, 

-	0x1fbbae99, 0x041fc5a1, 0x04327628, 0x1fb93b31, 0x1fb8679c, 0x0438b0ac, 0x044b5f40, 0x1fb5e587, 

-	0x1fb50d0e, 0x0451991d, 0x046445b2, 0x1fb27c4e, 0x1fb19ef1, 0x046a7ee3, 0x047d296f, 0x1faeff87, 

-	0x1fae1d47, 0x048361f0, 0x04960a67, 0x1fab6f35, 0x1faa8813, 0x049c4235, 0x04aee88b, 0x1fa7cb5a, 

-	0x1fa6df56, 0x04b51fa1, 0x04c7c3cb, 0x1fa413f8, 0x1fa32313, 0x04cdfa26, 0x04e09c18, 0x1fa04912, 

-	0x1f9f534c, 0x04e6d1b4, 0x04f97163, 0x1f9c6aa9, 0x1f9b7003, 0x04ffa63c, 0x0512439d, 0x1f9878c1, 

-	0x1f97793b, 0x051877af, 0x052b12b6, 0x1f94735b, 0x1f936ef6, 0x053145fd, 0x0543de9e, 0x1f905a7a, 

-	0x1f8f5137, 0x054a1117, 0x055ca748, 0x1f8c2e21, 0x1f8b2000, 0x0562d8ee, 0x05756ca2, 0x1f87ee52, 

-	0x1f86db55, 0x057b9d73, 0x058e2e9f, 0x1f839b10, 0x1f828336, 0x05945e95, 0x05a6ed2e, 0x1f7f345e, 

-	0x1f7e17a8, 0x05ad1c47, 0x05bfa840, 0x1f7aba3e, 0x1f7998ad, 0x05c5d678, 0x05d85fc7, 0x1f762cb2, 

-	0x1f750647, 0x05de8d19, 0x05f113b3, 0x1f718bbf, 0x1f70607a, 0x05f7401c, 0x0609c3f5, 0x1f6cd766, 

-	0x1f6ba748, 0x060fef71, 0x0622707d, 0x1f680fab, 0x1f66dab5, 0x06289b08, 0x063b193c, 0x1f633490, 

-	0x1f61fac3, 0x064142d3, 0x0653be23, 0x1f5e4619, 0x1f5d0775, 0x0659e6c2, 0x066c5f24, 0x1f594448, 

-	0x1f5800ce, 0x067286c6, 0x0684fc2e, 0x1f542f21, 0x1f52e6d2, 0x068b22d0, 0x069d9532, 0x1f4f06a6, 

-	0x1f4db983, 0x06a3bad0, 0x06b62a22, 0x1f49cadc, 0x1f4878e5, 0x06bc4eb9, 0x06cebaee, 0x1f447bc4, 

-	0x1f4324fb, 0x06d4de79, 0x06e74786, 0x1f3f1963, 0x1f3dbdc8, 0x06ed6a03, 0x06ffcfdd, 0x1f39a3bc, 

-	0x1f384350, 0x0705f147, 0x071853e3, 0x1f341ad2, 0x1f32b595, 0x071e7436, 0x0730d388, 0x1f2e7ea9, 

-	0x1f2d149d, 0x0736f2c0, 0x07494ebd, 0x1f28cf43, 0x1f276069, 0x074f6cd7, 0x0761c574, 0x1f230ca5, 

-	0x1f2198fd, 0x0767e26c, 0x077a379d, 0x1f1d36d2, 0x1f1bbe5d, 0x07805370, 0x0792a52a, 0x1f174dce, 

-	0x1f15d08d, 0x0798bfd3, 0x07ab0e0a, 0x1f11519c, 0x1f0fcf91, 0x07b12786, 0x07c37230, 0x1f0b4240, 

-	0x1f09bb6b, 0x07c98a7a, 0x07dbd18c, 0x1f051fbe, 0x1f03941f, 0x07e1e8a1, 0x07f42c0e, 0x1efeea19, 

-	0x1efd59b3, 0x07fa41eb, 0x080c81a9, 0x1ef8a155, 0x1ef70c28, 0x0812964a, 0x0824d24d, 0x1ef24577, 

-	0x1ef0ab84, 0x082ae5ad, 0x083d1dea, 0x1eebd682, 0x1eea37ca, 0x08433007, 0x08556473, 0x1ee5547a, 

-	0x1ee3b0fe, 0x085b7548, 0x086da5d8, 0x1edebf64, 0x1edd1724, 0x0873b562, 0x0885e209, 0x1ed81742, 

-	0x1ed66a41, 0x088bf044, 0x089e18f9, 0x1ed15c1a, 0x1ecfaa57, 0x08a425e1, 0x08b64a98, 0x1eca8def, 

-	0x1ec8d76c, 0x08bc562a, 0x08ce76d8, 0x1ec3acc6, 0x1ec1f184, 0x08d4810f, 0x08e69da8, 0x1ebcb8a3, 

-	0x1ebaf8a3, 0x08eca681, 0x08febefb, 0x1eb5b18a, 0x1eb3eccd, 0x0904c673, 0x0916dac2, 0x1eae977f, 

-	0x1eacce07, 0x091ce0d4, 0x092ef0ed, 0x1ea76a87, 0x1ea59c55, 0x0934f596, 0x0947016e, 0x1ea02aa7, 

-	0x1e9e57bb, 0x094d04aa, 0x095f0c36, 0x1e98d7e2, 0x1e97003e, 0x09650e01, 0x09771136, 0x1e91723e, 

-	0x1e8f95e3, 0x097d118d, 0x098f1060, 0x1e89f9bf, 0x1e8818ad, 0x09950f3f, 0x09a709a4, 0x1e826e69, 

-	0x1e8088a2, 0x09ad0707, 0x09befcf4, 0x1e7ad041, 0x1e78e5c7, 0x09c4f8d8, 0x09d6ea40, 0x1e731f4c, 

-	0x1e71301f, 0x09dce4a1, 0x09eed17b, 0x1e6b5b8f, 0x1e6967b1, 0x09f4ca56, 0x0a06b296, 0x1e63850e, 

-	0x1e618c80, 0x0a0ca9e6, 0x0a1e8d81, 0x1e5b9bce, 0x1e599e91, 0x0a248343, 0x0a36622e, 0x1e539fd4, 

-	0x1e519dea, 0x0a3c565e, 0x0a4e308f, 0x1e4b9126, 0x1e498a8e, 0x0a542329, 0x0a65f894, 0x1e436fc7, 

-	0x1e416485, 0x0a6be995, 0x0a7dba2f, 0x1e3b3bbd, 0x1e392bd1, 0x0a83a993, 0x0a957551, 0x1e32f50e, 

-	0x1e30e079, 0x0a9b6315, 0x0aad29ec, 0x1e2a9bbd, 0x1e288281, 0x0ab3160c, 0x0ac4d7f1, 0x1e222fd1, 

-	0x1e2011ee, 0x0acac26a, 0x0adc7f52, 0x1e19b14f, 0x1e178ec7, 0x0ae2681f, 0x0af41fff, 0x1e11203b, 

-	0x1e0ef910, 0x0afa071d, 0x0b0bb9eb, 0x1e087c9b, 0x1e0650ce, 0x0b119f56, 0x0b234d07, 0x1dffc674, 

-	0x1dfd9606, 0x0b2930bb, 0x0b3ad943, 0x1df6fdcc, 0x1df4c8bf, 0x0b40bb3e, 0x0b525e92, 0x1dee22a9, 

-	0x1debe8fd, 0x0b583ecf, 0x0b69dce6, 0x1de5350f, 0x1de2f6c6, 0x0b6fbb62, 0x0b81542f, 0x1ddc3504, 

-	0x1dd9f220, 0x0b8730e6, 0x0b98c45f, 0x1dd3228e, 0x1dd0db10, 0x0b9e9f4d, 0x0bb02d68, 0x1dc9fdb2, 

-	0x1dc7b19b, 0x0bb6068a, 0x0bc78f3b, 0x1dc0c676, 0x1dbe75c8, 0x0bcd668e, 0x0bdee9ca, 0x1db77cdf, 

-	0x1db5279c, 0x0be4bf4a, 0x0bf63d07, 0x1dae20f4, 0x1dabc71d, 0x0bfc10af, 0x0c0d88e2, 0x1da4b2ba, 

-	0x1da25450, 0x0c135ab0, 0x0c24cd4e, 0x1d9b3237, 0x1d98cf3b, 0x0c2a9d3e, 0x0c3c0a3d, 0x1d919f70, 

-	0x1d8f37e5, 0x0c41d84b, 0x0c533fa0, 0x1d87fa6d, 0x1d858e53, 0x0c590bc9, 0x0c6a6d68, 0x1d7e4332, 

-	0x1d7bd28b, 0x0c7037a8, 0x0c819388, 0x1d7479c5, 0x1d720493, 0x0c875bdb, 0x0c98b1f0, 0x1d6a9e2e, 

-	0x1d682472, 0x0c9e7854, 0x0cafc894, 0x1d60b070, 0x1d5e322c, 0x0cb58d04, 0x0cc6d764, 0x1d56b094, 

-	0x1d542dc9, 0x0ccc99de, 0x0cddde53, 0x1d4c9e9f, 0x1d4a174f, 0x0ce39ed2, 0x0cf4dd52, 0x1d427a97, 

-	0x1d3feec3, 0x0cfa9bd2, 0x0d0bd452, 0x1d384483, 0x1d35b42d, 0x0d1190d1, 0x0d22c347, 0x1d2dfc68, 

-	0x1d2b6791, 0x0d287dc1, 0x0d39aa21, 0x1d23a24e, 0x1d2108f8, 0x0d3f6292, 0x0d5088d3, 0x1d19363a, 

-	0x1d169867, 0x0d563f38, 0x0d675f4e, 0x1d0eb833, 0x1d0c15e4, 0x0d6d13a3, 0x0d7e2d85, 0x1d04283f, 

-	0x1d018176, 0x0d83dfc6, 0x0d94f369, 0x1cf98666, 0x1cf6db24, 0x0d9aa393, 0x0dabb0ec, 0x1ceed2ad, 

-	0x1cec22f4, 0x0db15efc, 0x0dc26600, 0x1ce40d1b, 0x1ce158ed, 0x0dc811f3, 0x0dd91298, 0x1cd935b7, 

-	0x1cd67d15, 0x0ddebc69, 0x0defb6a5, 0x1cce4c87, 0x1ccb8f74, 0x0df55e51, 0x0e065219, 0x1cc35192, 

-	0x1cc0900f, 0x0e0bf79c, 0x0e1ce4e6, 0x1cb844df, 0x1cb57eee, 0x0e22883e, 0x0e336eff, 0x1cad2675, 

-	0x1caa5c17, 0x0e391027, 0x0e49f055, 0x1ca1f65b, 0x1c9f2792, 0x0e4f8f4b, 0x0e6068db, 0x1c96b497, 

-	0x1c93e165, 0x0e66059a, 0x0e76d883, 0x1c8b6131, 0x1c888997, 0x0e7c7308, 0x0e8d3f3e, 0x1c7ffc2f, 

-	0x1c7d202f, 0x0e92d787, 0x0ea39d00, 0x1c748599, 0x1c71a535, 0x0ea93308, 0x0eb9f1ba, 0x1c68fd75, 

-	0x1c6618ae, 0x0ebf857d, 0x0ed03d5e, 0x1c5d63ca, 0x1c5a7aa4, 0x0ed5ceda, 0x0ee67fdf, 0x1c51b8a1, 

-	0x1c4ecb1c, 0x0eec0f10, 0x0efcb92f, 0x1c45fc00, 0x1c430a1d, 0x0f024612, 0x0f12e941, 0x1c3a2ded, 

-	0x1c3737b0, 0x0f1873d2, 0x0f291006, 0x1c2e4e72, 0x1c2b53db, 0x0f2e9842, 0x0f3f2d71, 0x1c225d94, 

-	0x1c1f5ea6, 0x0f44b354, 0x0f554175, 0x1c165b5b, 0x1c135818, 0x0f5ac4fc, 0x0f6b4c03, 0x1c0a47cf, 

-	0x1c074038, 0x0f70cd2a, 0x0f814d0e, 0x1bfe22f8, 0x1bfb170f, 0x0f86cbd3, 0x0f974489, 0x1bf1ecdb, 

-	0x1beedca2, 0x0f9cc0e7, 0x0fad3265, 0x1be5a582, 0x1be290fb, 0x0fb2ac5a, 0x0fc31697, 0x1bd94cf4, 

-	0x1bd63421, 0x0fc88e1e, 0x0fd8f10f, 0x1bcce337, 0x1bc9c61a, 0x0fde6626, 0x0feec1c0, 0x1bc06855, 

-	0x1bbd46f0, 0x0ff43464, 0x1004889e, 0x1bb3dc55, 0x1bb0b6a9, 0x1009f8cb, 0x101a459a, 0x1ba73f3d, 

-	0x1ba4154d, 0x101fb34d, 0x102ff8a8, 0x1b9a9117, 0x1b9762e4, 0x103563dc, 0x1045a1b9, 0x1b8dd1ea, 

-	0x1b8a9f77, 0x104b0a6c, 0x105b40c1, 0x1b8101be, 0x1b7dcb0c, 0x1060a6ef, 0x1070d5b1, 0x1b74209b, 

-	0x1b70e5ac, 0x10763958, 0x1086607e, 0x1b672e88, 0x1b63ef5f, 0x108bc19a, 0x109be119, 0x1b5a2b8e, 

-	0x1b56e82c, 0x10a13fa6, 0x10b15775, 0x1b4d17b4, 0x1b49d01c, 0x10b6b371, 0x10c6c385, 0x1b3ff304, 

-	0x1b3ca737, 0x10cc1cec, 0x10dc253c, 0x1b32bd84, 0x1b2f6d85, 0x10e17c0b, 0x10f17c8d, 0x1b25773d, 

-	0x1b22230e, 0x10f6d0c0, 0x1106c96a, 0x1b182038, 0x1b14c7da, 0x110c1afe, 0x111c0bc6, 0x1b0ab87c, 

-	0x1b075bf1, 0x11215ab8, 0x11314395, 0x1afd4012, 0x1af9df5d, 0x11368fe1, 0x114670c8, 0x1aefb702, 

-	0x1aec5225, 0x114bba6b, 0x115b9354, 0x1ae21d54, 0x1adeb451, 0x1160da4b, 0x1170ab2a, 0x1ad47311, 

-	0x1ad105e9, 0x1175ef72, 0x1185b83f, 0x1ac6b841, 0x1ac346f8, 0x118af9d4, 0x119aba84, 0x1ab8ecec, 

-	0x1ab57784, 0x119ff964, 0x11afb1ee, 0x1aab111c, 0x1aa79796, 0x11b4ee14, 0x11c49e6f, 0x1a9d24d9, 

-	0x1a99a737, 0x11c9d7d9, 0x11d97ff9, 0x1a8f282b, 0x1a8ba670, 0x11deb6a4, 0x11ee5682, 0x1a811b1b, 

-	0x1a7d9549, 0x11f38a6a, 0x120321fa, 0x1a72fdb2, 0x1a6f73ca, 0x1208531c, 0x1217e256, 0x1a64cff8, 

-	0x1a6141fd, 0x121d10af, 0x122c9789, 0x1a5691f5, 0x1a52ffeb, 0x1231c316, 0x12414186, 0x1a4843b4, 

-	0x1a44ad9b, 0x12466a44, 0x1255e041, 0x1a39e53d, 0x1a364b17, 0x125b062b, 0x126a73ac, 0x1a2b7698, 

-	0x1a27d868, 0x126f96c1, 0x127efbbb, 0x1a1cf7ce, 0x1a195597, 0x12841bf6, 0x12937861, 0x1a0e68e9, 

-	0x1a0ac2ac, 0x129895c0, 0x12a7e991, 0x19ffc9f1, 0x19fc1fb1, 0x12ad0412, 0x12bc4f40, 0x19f11af0, 

-	0x19ed6caf, 0x12c166de, 0x12d0a960, 0x19e25bee, 0x19dea9ae, 0x12d5be18, 0x12e4f7e5, 0x19d38cf4, 

-	0x19cfd6b8, 0x12ea09b4, 0x12f93ac2, 0x19c4ae0c, 0x19c0f3d6, 0x12fe49a6, 0x130d71eb, 0x19b5bf3f, 

-	0x19b20111, 0x13127de0, 0x13219d53, 0x19a6c096, 0x19a2fe73, 0x1326a656, 0x1335bcef, 0x1997b21b, 

-	0x1993ec04, 0x133ac2fc, 0x1349d0b0, 0x198893d6, 0x1984c9ce, 0x134ed3c5, 0x135dd88c, 0x197965d0, 

-	0x197597da, 0x1362d8a6, 0x1371d476, 0x196a2815, 0x19665632, 0x1376d191, 0x1385c461, 0x195adaab, 

-	0x195704df, 0x138abe7b, 0x1399a841, 0x194b7d9e, 0x1947a3eb, 0x139e9f56, 0x13ad800a, 0x193c10f7, 

-	0x1938335e, 0x13b27417, 0x13c14bb0, 0x192c94bf, 0x1928b343, 0x13c63cb2, 0x13d50b26, 0x191d08ff, 

-	0x191923a3, 0x13d9f91b, 0x13e8be60, 0x190d6dc1, 0x19098488, 0x13eda944, 0x13fc6553, 0x18fdc310, 

-	0x18f9d5fa, 0x14014d23, 0x140ffff1, 0x18ee08f4, 0x18ea1805, 0x1414e4aa, 0x14238e2f, 0x18de3f77, 

-	0x18da4ab2, 0x14286fce, 0x14371001, 0x18ce66a3, 0x18ca6e0a, 0x143bee83, 0x144a855b, 0x18be7e82, 

-	0x18ba8217, 0x144f60bd, 0x145dee30, 0x18ae871e, 0x18aa86e3, 0x1462c670, 0x14714a76, 0x189e8080, 

-	0x189a7c78, 0x14761f8f, 0x14849a1f, 0x188e6ab2, 0x188a62e0, 0x14896c0f, 0x1497dd20, 0x187e45be, 

-	0x187a3a25, 0x149cabe4, 0x14ab136d, 0x186e11af, 0x186a0250, 0x14afdf03, 0x14be3cfa, 0x185dce8e, 

-	0x1859bb6c, 0x14c3055e, 0x14d159bc, 0x184d7c65, 0x18496583, 0x14d61eeb, 0x14e469a6, 0x183d1b3e, 

-	0x1839009e, 0x14e92b9e, 0x14f76cad, 0x182cab24, 0x18288cc8, 0x14fc2b6a, 0x150a62c6, 0x181c2c20, 

-	0x18180a0c, 0x150f1e45, 0x151d4be3, 0x180b9e3d, 0x18077873, 0x15220422, 0x153027fb, 0x17fb0185, 

-	0x17f6d807, 0x1534dcf6, 0x1542f700, 0x17ea5602, 0x17e628d3, 0x1547a8b5, 0x1555b8e8, 0x17d99bbe, 

-	0x17d56ae0, 0x155a6754, 0x15686da7, 0x17c8d2c4, 0x17c49e3b, 0x156d18c7, 0x157b1532, 0x17b7fb1f, 

-	0x17b3c2ec, 0x157fbd03, 0x158daf7c, 0x17a714d7, 0x17a2d8fe, 0x159253fb, 0x15a03c7a, 0x17961ff9, 

-	0x1791e07b, 0x15a4dda5, 0x15b2bc22, 0x17851c8e, 0x1780d96f, 0x15b759f5, 0x15c52e67, 0x17740aa1, 

-	0x176fc3e3, 0x15c9c8e0, 0x15d7933f, 0x1762ea3d, 0x175e9fe2, 0x15dc2a5a, 0x15e9ea9d, 0x1751bb6b, 

-	0x174d6d77, 0x15ee7e58, 0x15fc3477, 0x17407e37, 0x173c2cac, 0x1600c4cf, 0x160e70c1, 0x172f32ab, 

-	0x172add8c, 0x1612fdb3, 0x16209f70, 0x171dd8d2, 0x17198021, 0x162528fa, 0x1632c078, 0x170c70b7, 

-	0x17081477, 0x16374697, 0x1644d3d0, 0x16fafa64, 0x16f69a97, 0x16495680, 0x1656d96a, 0x16e975e4, 

-	0x16e5128e, 0x165b58aa, 0x1668d13e, 0x16d7e341, 0x16d37c65, 0x166d4d0a, 0x167abb3e, 0x16c64288, 

-	0x16c1d827, 0x167f3394, 0x168c9760, 0x16b493c2, 0x16b025e0, 0x16910c3d, 0x169e659a, 0x16a2d6fb

-};

-

-const int twidTab512[8*6 + 32*6 + 128*6] = {

+	0x17a4f708, 0x159001d6, 0x15fe7cbe, 0x173e558e, 0x171bac96, 0x1622e450, 0x168ed1eb, 0x16b25ced,
+	/* 1024 */
+	0x1fffffd9, 0x0003243f, 0x0015fdba, 0x1ffff872, 0x1ffff382, 0x001c4637, 0x002f1fa6, 0x1fffdd4d, 
+	0x1fffd36f, 0x0035681d, 0x00484175, 0x1fffae6c, 0x1fff9f9e, 0x004e89e3, 0x00616318, 0x1fff6bce, 
+	0x1fff5811, 0x0067ab77, 0x007a847e, 0x1fff1572, 0x1ffefcc6, 0x0080cccc, 0x0093a599, 0x1ffeab5b, 
+	0x1ffe8dbf, 0x0099edd2, 0x00acc658, 0x1ffe2d86, 0x1ffe0afc, 0x00b30e78, 0x00c5e6ad, 0x1ffd9bf6, 
+	0x1ffd747c, 0x00cc2eb0, 0x00df0688, 0x1ffcf6aa, 0x1ffcca41, 0x00e54e6a, 0x00f825da, 0x1ffc3da2, 
+	0x1ffc0c4b, 0x00fe6d97, 0x01114492, 0x1ffb70e0, 0x1ffb3a9a, 0x01178c27, 0x012a62a2, 0x1ffa9063, 
+	0x1ffa552e, 0x0130aa0a, 0x01437ffa, 0x1ff99c2c, 0x1ff95c09, 0x0149c731, 0x015c9c8a, 0x1ff8943c, 
+	0x1ff84f2b, 0x0162e38d, 0x0175b843, 0x1ff77893, 0x1ff72e94, 0x017bff0e, 0x018ed316, 0x1ff64932, 
+	0x1ff5fa46, 0x019519a5, 0x01a7ecf2, 0x1ff5061b, 0x1ff4b240, 0x01ae3341, 0x01c105c9, 0x1ff3af4c, 
+	0x1ff35684, 0x01c74bd5, 0x01da1d8c, 0x1ff244c8, 0x1ff1e713, 0x01e0634f, 0x01f33429, 0x1ff0c68f, 
+	0x1ff063ed, 0x01f979a1, 0x020c4993, 0x1fef34a3, 0x1feecd14, 0x02128ebb, 0x02255db9, 0x1fed8f03, 
+	0x1fed2287, 0x022ba28f, 0x023e708d, 0x1febd5b2, 0x1feb644a, 0x0244b50b, 0x025781fe, 0x1fea08b0, 
+	0x1fe9925c, 0x025dc621, 0x027091fd, 0x1fe827fe, 0x1fe7acbe, 0x0276d5c1, 0x0289a07b, 0x1fe6339d, 
+	0x1fe5b372, 0x028fe3dd, 0x02a2ad69, 0x1fe42b90, 0x1fe3a679, 0x02a8f063, 0x02bbb8b6, 0x1fe20fd6, 
+	0x1fe185d5, 0x02c1fb46, 0x02d4c253, 0x1fdfe071, 0x1fdf5186, 0x02db0475, 0x02edca32, 0x1fdd9d64, 
+	0x1fdd098e, 0x02f40be2, 0x0306d042, 0x1fdb46ae, 0x1fdaadee, 0x030d117c, 0x031fd474, 0x1fd8dc51, 
+	0x1fd83ea8, 0x03261534, 0x0338d6b8, 0x1fd65e4f, 0x1fd5bbbd, 0x033f16fb, 0x0351d700, 0x1fd3ccaa, 
+	0x1fd32530, 0x035816c1, 0x036ad53c, 0x1fd12763, 0x1fd07b00, 0x03711477, 0x0383d15c, 0x1fce6e7c, 
+	0x1fcdbd31, 0x038a100e, 0x039ccb51, 0x1fcba1f5, 0x1fcaebc3, 0x03a30975, 0x03b5c30b, 0x1fc8c1d2, 
+	0x1fc806b9, 0x03bc009f, 0x03ceb87c, 0x1fc5ce14, 0x1fc50e14, 0x03d4f57a, 0x03e7ab93, 0x1fc2c6bd, 
+	0x1fc201d7, 0x03ede7f9, 0x04009c42, 0x1fbfabcd, 0x1fbee202, 0x0406d80b, 0x04198a78, 0x1fbc7d49, 
+	0x1fbbae99, 0x041fc5a1, 0x04327628, 0x1fb93b31, 0x1fb8679c, 0x0438b0ac, 0x044b5f40, 0x1fb5e587, 
+	0x1fb50d0e, 0x0451991d, 0x046445b2, 0x1fb27c4e, 0x1fb19ef1, 0x046a7ee3, 0x047d296f, 0x1faeff87, 
+	0x1fae1d47, 0x048361f0, 0x04960a67, 0x1fab6f35, 0x1faa8813, 0x049c4235, 0x04aee88b, 0x1fa7cb5a, 
+	0x1fa6df56, 0x04b51fa1, 0x04c7c3cb, 0x1fa413f8, 0x1fa32313, 0x04cdfa26, 0x04e09c18, 0x1fa04912, 
+	0x1f9f534c, 0x04e6d1b4, 0x04f97163, 0x1f9c6aa9, 0x1f9b7003, 0x04ffa63c, 0x0512439d, 0x1f9878c1, 
+	0x1f97793b, 0x051877af, 0x052b12b6, 0x1f94735b, 0x1f936ef6, 0x053145fd, 0x0543de9e, 0x1f905a7a, 
+	0x1f8f5137, 0x054a1117, 0x055ca748, 0x1f8c2e21, 0x1f8b2000, 0x0562d8ee, 0x05756ca2, 0x1f87ee52, 
+	0x1f86db55, 0x057b9d73, 0x058e2e9f, 0x1f839b10, 0x1f828336, 0x05945e95, 0x05a6ed2e, 0x1f7f345e, 
+	0x1f7e17a8, 0x05ad1c47, 0x05bfa840, 0x1f7aba3e, 0x1f7998ad, 0x05c5d678, 0x05d85fc7, 0x1f762cb2, 
+	0x1f750647, 0x05de8d19, 0x05f113b3, 0x1f718bbf, 0x1f70607a, 0x05f7401c, 0x0609c3f5, 0x1f6cd766, 
+	0x1f6ba748, 0x060fef71, 0x0622707d, 0x1f680fab, 0x1f66dab5, 0x06289b08, 0x063b193c, 0x1f633490, 
+	0x1f61fac3, 0x064142d3, 0x0653be23, 0x1f5e4619, 0x1f5d0775, 0x0659e6c2, 0x066c5f24, 0x1f594448, 
+	0x1f5800ce, 0x067286c6, 0x0684fc2e, 0x1f542f21, 0x1f52e6d2, 0x068b22d0, 0x069d9532, 0x1f4f06a6, 
+	0x1f4db983, 0x06a3bad0, 0x06b62a22, 0x1f49cadc, 0x1f4878e5, 0x06bc4eb9, 0x06cebaee, 0x1f447bc4, 
+	0x1f4324fb, 0x06d4de79, 0x06e74786, 0x1f3f1963, 0x1f3dbdc8, 0x06ed6a03, 0x06ffcfdd, 0x1f39a3bc, 
+	0x1f384350, 0x0705f147, 0x071853e3, 0x1f341ad2, 0x1f32b595, 0x071e7436, 0x0730d388, 0x1f2e7ea9, 
+	0x1f2d149d, 0x0736f2c0, 0x07494ebd, 0x1f28cf43, 0x1f276069, 0x074f6cd7, 0x0761c574, 0x1f230ca5, 
+	0x1f2198fd, 0x0767e26c, 0x077a379d, 0x1f1d36d2, 0x1f1bbe5d, 0x07805370, 0x0792a52a, 0x1f174dce, 
+	0x1f15d08d, 0x0798bfd3, 0x07ab0e0a, 0x1f11519c, 0x1f0fcf91, 0x07b12786, 0x07c37230, 0x1f0b4240, 
+	0x1f09bb6b, 0x07c98a7a, 0x07dbd18c, 0x1f051fbe, 0x1f03941f, 0x07e1e8a1, 0x07f42c0e, 0x1efeea19, 
+	0x1efd59b3, 0x07fa41eb, 0x080c81a9, 0x1ef8a155, 0x1ef70c28, 0x0812964a, 0x0824d24d, 0x1ef24577, 
+	0x1ef0ab84, 0x082ae5ad, 0x083d1dea, 0x1eebd682, 0x1eea37ca, 0x08433007, 0x08556473, 0x1ee5547a, 
+	0x1ee3b0fe, 0x085b7548, 0x086da5d8, 0x1edebf64, 0x1edd1724, 0x0873b562, 0x0885e209, 0x1ed81742, 
+	0x1ed66a41, 0x088bf044, 0x089e18f9, 0x1ed15c1a, 0x1ecfaa57, 0x08a425e1, 0x08b64a98, 0x1eca8def, 
+	0x1ec8d76c, 0x08bc562a, 0x08ce76d8, 0x1ec3acc6, 0x1ec1f184, 0x08d4810f, 0x08e69da8, 0x1ebcb8a3, 
+	0x1ebaf8a3, 0x08eca681, 0x08febefb, 0x1eb5b18a, 0x1eb3eccd, 0x0904c673, 0x0916dac2, 0x1eae977f, 
+	0x1eacce07, 0x091ce0d4, 0x092ef0ed, 0x1ea76a87, 0x1ea59c55, 0x0934f596, 0x0947016e, 0x1ea02aa7, 
+	0x1e9e57bb, 0x094d04aa, 0x095f0c36, 0x1e98d7e2, 0x1e97003e, 0x09650e01, 0x09771136, 0x1e91723e, 
+	0x1e8f95e3, 0x097d118d, 0x098f1060, 0x1e89f9bf, 0x1e8818ad, 0x09950f3f, 0x09a709a4, 0x1e826e69, 
+	0x1e8088a2, 0x09ad0707, 0x09befcf4, 0x1e7ad041, 0x1e78e5c7, 0x09c4f8d8, 0x09d6ea40, 0x1e731f4c, 
+	0x1e71301f, 0x09dce4a1, 0x09eed17b, 0x1e6b5b8f, 0x1e6967b1, 0x09f4ca56, 0x0a06b296, 0x1e63850e, 
+	0x1e618c80, 0x0a0ca9e6, 0x0a1e8d81, 0x1e5b9bce, 0x1e599e91, 0x0a248343, 0x0a36622e, 0x1e539fd4, 
+	0x1e519dea, 0x0a3c565e, 0x0a4e308f, 0x1e4b9126, 0x1e498a8e, 0x0a542329, 0x0a65f894, 0x1e436fc7, 
+	0x1e416485, 0x0a6be995, 0x0a7dba2f, 0x1e3b3bbd, 0x1e392bd1, 0x0a83a993, 0x0a957551, 0x1e32f50e, 
+	0x1e30e079, 0x0a9b6315, 0x0aad29ec, 0x1e2a9bbd, 0x1e288281, 0x0ab3160c, 0x0ac4d7f1, 0x1e222fd1, 
+	0x1e2011ee, 0x0acac26a, 0x0adc7f52, 0x1e19b14f, 0x1e178ec7, 0x0ae2681f, 0x0af41fff, 0x1e11203b, 
+	0x1e0ef910, 0x0afa071d, 0x0b0bb9eb, 0x1e087c9b, 0x1e0650ce, 0x0b119f56, 0x0b234d07, 0x1dffc674, 
+	0x1dfd9606, 0x0b2930bb, 0x0b3ad943, 0x1df6fdcc, 0x1df4c8bf, 0x0b40bb3e, 0x0b525e92, 0x1dee22a9, 
+	0x1debe8fd, 0x0b583ecf, 0x0b69dce6, 0x1de5350f, 0x1de2f6c6, 0x0b6fbb62, 0x0b81542f, 0x1ddc3504, 
+	0x1dd9f220, 0x0b8730e6, 0x0b98c45f, 0x1dd3228e, 0x1dd0db10, 0x0b9e9f4d, 0x0bb02d68, 0x1dc9fdb2, 
+	0x1dc7b19b, 0x0bb6068a, 0x0bc78f3b, 0x1dc0c676, 0x1dbe75c8, 0x0bcd668e, 0x0bdee9ca, 0x1db77cdf, 
+	0x1db5279c, 0x0be4bf4a, 0x0bf63d07, 0x1dae20f4, 0x1dabc71d, 0x0bfc10af, 0x0c0d88e2, 0x1da4b2ba, 
+	0x1da25450, 0x0c135ab0, 0x0c24cd4e, 0x1d9b3237, 0x1d98cf3b, 0x0c2a9d3e, 0x0c3c0a3d, 0x1d919f70, 
+	0x1d8f37e5, 0x0c41d84b, 0x0c533fa0, 0x1d87fa6d, 0x1d858e53, 0x0c590bc9, 0x0c6a6d68, 0x1d7e4332, 
+	0x1d7bd28b, 0x0c7037a8, 0x0c819388, 0x1d7479c5, 0x1d720493, 0x0c875bdb, 0x0c98b1f0, 0x1d6a9e2e, 
+	0x1d682472, 0x0c9e7854, 0x0cafc894, 0x1d60b070, 0x1d5e322c, 0x0cb58d04, 0x0cc6d764, 0x1d56b094, 
+	0x1d542dc9, 0x0ccc99de, 0x0cddde53, 0x1d4c9e9f, 0x1d4a174f, 0x0ce39ed2, 0x0cf4dd52, 0x1d427a97, 
+	0x1d3feec3, 0x0cfa9bd2, 0x0d0bd452, 0x1d384483, 0x1d35b42d, 0x0d1190d1, 0x0d22c347, 0x1d2dfc68, 
+	0x1d2b6791, 0x0d287dc1, 0x0d39aa21, 0x1d23a24e, 0x1d2108f8, 0x0d3f6292, 0x0d5088d3, 0x1d19363a, 
+	0x1d169867, 0x0d563f38, 0x0d675f4e, 0x1d0eb833, 0x1d0c15e4, 0x0d6d13a3, 0x0d7e2d85, 0x1d04283f, 
+	0x1d018176, 0x0d83dfc6, 0x0d94f369, 0x1cf98666, 0x1cf6db24, 0x0d9aa393, 0x0dabb0ec, 0x1ceed2ad, 
+	0x1cec22f4, 0x0db15efc, 0x0dc26600, 0x1ce40d1b, 0x1ce158ed, 0x0dc811f3, 0x0dd91298, 0x1cd935b7, 
+	0x1cd67d15, 0x0ddebc69, 0x0defb6a5, 0x1cce4c87, 0x1ccb8f74, 0x0df55e51, 0x0e065219, 0x1cc35192, 
+	0x1cc0900f, 0x0e0bf79c, 0x0e1ce4e6, 0x1cb844df, 0x1cb57eee, 0x0e22883e, 0x0e336eff, 0x1cad2675, 
+	0x1caa5c17, 0x0e391027, 0x0e49f055, 0x1ca1f65b, 0x1c9f2792, 0x0e4f8f4b, 0x0e6068db, 0x1c96b497, 
+	0x1c93e165, 0x0e66059a, 0x0e76d883, 0x1c8b6131, 0x1c888997, 0x0e7c7308, 0x0e8d3f3e, 0x1c7ffc2f, 
+	0x1c7d202f, 0x0e92d787, 0x0ea39d00, 0x1c748599, 0x1c71a535, 0x0ea93308, 0x0eb9f1ba, 0x1c68fd75, 
+	0x1c6618ae, 0x0ebf857d, 0x0ed03d5e, 0x1c5d63ca, 0x1c5a7aa4, 0x0ed5ceda, 0x0ee67fdf, 0x1c51b8a1, 
+	0x1c4ecb1c, 0x0eec0f10, 0x0efcb92f, 0x1c45fc00, 0x1c430a1d, 0x0f024612, 0x0f12e941, 0x1c3a2ded, 
+	0x1c3737b0, 0x0f1873d2, 0x0f291006, 0x1c2e4e72, 0x1c2b53db, 0x0f2e9842, 0x0f3f2d71, 0x1c225d94, 
+	0x1c1f5ea6, 0x0f44b354, 0x0f554175, 0x1c165b5b, 0x1c135818, 0x0f5ac4fc, 0x0f6b4c03, 0x1c0a47cf, 
+	0x1c074038, 0x0f70cd2a, 0x0f814d0e, 0x1bfe22f8, 0x1bfb170f, 0x0f86cbd3, 0x0f974489, 0x1bf1ecdb, 
+	0x1beedca2, 0x0f9cc0e7, 0x0fad3265, 0x1be5a582, 0x1be290fb, 0x0fb2ac5a, 0x0fc31697, 0x1bd94cf4, 
+	0x1bd63421, 0x0fc88e1e, 0x0fd8f10f, 0x1bcce337, 0x1bc9c61a, 0x0fde6626, 0x0feec1c0, 0x1bc06855, 
+	0x1bbd46f0, 0x0ff43464, 0x1004889e, 0x1bb3dc55, 0x1bb0b6a9, 0x1009f8cb, 0x101a459a, 0x1ba73f3d, 
+	0x1ba4154d, 0x101fb34d, 0x102ff8a8, 0x1b9a9117, 0x1b9762e4, 0x103563dc, 0x1045a1b9, 0x1b8dd1ea, 
+	0x1b8a9f77, 0x104b0a6c, 0x105b40c1, 0x1b8101be, 0x1b7dcb0c, 0x1060a6ef, 0x1070d5b1, 0x1b74209b, 
+	0x1b70e5ac, 0x10763958, 0x1086607e, 0x1b672e88, 0x1b63ef5f, 0x108bc19a, 0x109be119, 0x1b5a2b8e, 
+	0x1b56e82c, 0x10a13fa6, 0x10b15775, 0x1b4d17b4, 0x1b49d01c, 0x10b6b371, 0x10c6c385, 0x1b3ff304, 
+	0x1b3ca737, 0x10cc1cec, 0x10dc253c, 0x1b32bd84, 0x1b2f6d85, 0x10e17c0b, 0x10f17c8d, 0x1b25773d, 
+	0x1b22230e, 0x10f6d0c0, 0x1106c96a, 0x1b182038, 0x1b14c7da, 0x110c1afe, 0x111c0bc6, 0x1b0ab87c, 
+	0x1b075bf1, 0x11215ab8, 0x11314395, 0x1afd4012, 0x1af9df5d, 0x11368fe1, 0x114670c8, 0x1aefb702, 
+	0x1aec5225, 0x114bba6b, 0x115b9354, 0x1ae21d54, 0x1adeb451, 0x1160da4b, 0x1170ab2a, 0x1ad47311, 
+	0x1ad105e9, 0x1175ef72, 0x1185b83f, 0x1ac6b841, 0x1ac346f8, 0x118af9d4, 0x119aba84, 0x1ab8ecec, 
+	0x1ab57784, 0x119ff964, 0x11afb1ee, 0x1aab111c, 0x1aa79796, 0x11b4ee14, 0x11c49e6f, 0x1a9d24d9, 
+	0x1a99a737, 0x11c9d7d9, 0x11d97ff9, 0x1a8f282b, 0x1a8ba670, 0x11deb6a4, 0x11ee5682, 0x1a811b1b, 
+	0x1a7d9549, 0x11f38a6a, 0x120321fa, 0x1a72fdb2, 0x1a6f73ca, 0x1208531c, 0x1217e256, 0x1a64cff8, 
+	0x1a6141fd, 0x121d10af, 0x122c9789, 0x1a5691f5, 0x1a52ffeb, 0x1231c316, 0x12414186, 0x1a4843b4, 
+	0x1a44ad9b, 0x12466a44, 0x1255e041, 0x1a39e53d, 0x1a364b17, 0x125b062b, 0x126a73ac, 0x1a2b7698, 
+	0x1a27d868, 0x126f96c1, 0x127efbbb, 0x1a1cf7ce, 0x1a195597, 0x12841bf6, 0x12937861, 0x1a0e68e9, 
+	0x1a0ac2ac, 0x129895c0, 0x12a7e991, 0x19ffc9f1, 0x19fc1fb1, 0x12ad0412, 0x12bc4f40, 0x19f11af0, 
+	0x19ed6caf, 0x12c166de, 0x12d0a960, 0x19e25bee, 0x19dea9ae, 0x12d5be18, 0x12e4f7e5, 0x19d38cf4, 
+	0x19cfd6b8, 0x12ea09b4, 0x12f93ac2, 0x19c4ae0c, 0x19c0f3d6, 0x12fe49a6, 0x130d71eb, 0x19b5bf3f, 
+	0x19b20111, 0x13127de0, 0x13219d53, 0x19a6c096, 0x19a2fe73, 0x1326a656, 0x1335bcef, 0x1997b21b, 
+	0x1993ec04, 0x133ac2fc, 0x1349d0b0, 0x198893d6, 0x1984c9ce, 0x134ed3c5, 0x135dd88c, 0x197965d0, 
+	0x197597da, 0x1362d8a6, 0x1371d476, 0x196a2815, 0x19665632, 0x1376d191, 0x1385c461, 0x195adaab, 
+	0x195704df, 0x138abe7b, 0x1399a841, 0x194b7d9e, 0x1947a3eb, 0x139e9f56, 0x13ad800a, 0x193c10f7, 
+	0x1938335e, 0x13b27417, 0x13c14bb0, 0x192c94bf, 0x1928b343, 0x13c63cb2, 0x13d50b26, 0x191d08ff, 
+	0x191923a3, 0x13d9f91b, 0x13e8be60, 0x190d6dc1, 0x19098488, 0x13eda944, 0x13fc6553, 0x18fdc310, 
+	0x18f9d5fa, 0x14014d23, 0x140ffff1, 0x18ee08f4, 0x18ea1805, 0x1414e4aa, 0x14238e2f, 0x18de3f77, 
+	0x18da4ab2, 0x14286fce, 0x14371001, 0x18ce66a3, 0x18ca6e0a, 0x143bee83, 0x144a855b, 0x18be7e82, 
+	0x18ba8217, 0x144f60bd, 0x145dee30, 0x18ae871e, 0x18aa86e3, 0x1462c670, 0x14714a76, 0x189e8080, 
+	0x189a7c78, 0x14761f8f, 0x14849a1f, 0x188e6ab2, 0x188a62e0, 0x14896c0f, 0x1497dd20, 0x187e45be, 
+	0x187a3a25, 0x149cabe4, 0x14ab136d, 0x186e11af, 0x186a0250, 0x14afdf03, 0x14be3cfa, 0x185dce8e, 
+	0x1859bb6c, 0x14c3055e, 0x14d159bc, 0x184d7c65, 0x18496583, 0x14d61eeb, 0x14e469a6, 0x183d1b3e, 
+	0x1839009e, 0x14e92b9e, 0x14f76cad, 0x182cab24, 0x18288cc8, 0x14fc2b6a, 0x150a62c6, 0x181c2c20, 
+	0x18180a0c, 0x150f1e45, 0x151d4be3, 0x180b9e3d, 0x18077873, 0x15220422, 0x153027fb, 0x17fb0185, 
+	0x17f6d807, 0x1534dcf6, 0x1542f700, 0x17ea5602, 0x17e628d3, 0x1547a8b5, 0x1555b8e8, 0x17d99bbe, 
+	0x17d56ae0, 0x155a6754, 0x15686da7, 0x17c8d2c4, 0x17c49e3b, 0x156d18c7, 0x157b1532, 0x17b7fb1f, 
+	0x17b3c2ec, 0x157fbd03, 0x158daf7c, 0x17a714d7, 0x17a2d8fe, 0x159253fb, 0x15a03c7a, 0x17961ff9, 
+	0x1791e07b, 0x15a4dda5, 0x15b2bc22, 0x17851c8e, 0x1780d96f, 0x15b759f5, 0x15c52e67, 0x17740aa1, 
+	0x176fc3e3, 0x15c9c8e0, 0x15d7933f, 0x1762ea3d, 0x175e9fe2, 0x15dc2a5a, 0x15e9ea9d, 0x1751bb6b, 
+	0x174d6d77, 0x15ee7e58, 0x15fc3477, 0x17407e37, 0x173c2cac, 0x1600c4cf, 0x160e70c1, 0x172f32ab, 
+	0x172add8c, 0x1612fdb3, 0x16209f70, 0x171dd8d2, 0x17198021, 0x162528fa, 0x1632c078, 0x170c70b7, 
+	0x17081477, 0x16374697, 0x1644d3d0, 0x16fafa64, 0x16f69a97, 0x16495680, 0x1656d96a, 0x16e975e4, 
+	0x16e5128e, 0x165b58aa, 0x1668d13e, 0x16d7e341, 0x16d37c65, 0x166d4d0a, 0x167abb3e, 0x16c64288, 
+	0x16c1d827, 0x167f3394, 0x168c9760, 0x16b493c2, 0x16b025e0, 0x16910c3d, 0x169e659a, 0x16a2d6fb
+};
+
+const int twidTab512[8*6 + 32*6 + 128*6] = {
 	0x20000000, 0x00000000, 0x1d906bcf, 0x0c3ef153, 0x16a09e66, 0x16a09e66, 0x0c3ef153, 0x1d906bcf, 
 	0x20000000, 0x00000000, 0x1f6297d0, 0x063e2e0f, 0x1d906bcf, 0x0c3ef153, 0x1a9b6629, 0x11c73b3a, 
 	0x20000000, 0x00000000, 0x1a9b6629, 0x11c73b3a, 0x0c3ef153, 0x1d906bcf, 0xf9c1d1f1, 0x1f6297d0, 
@@ -628,10 +628,10 @@
 	0xf6b5fce9, 0xe160bea9, 0xf7d823f9, 0xe10e875c, 0xf8fd1f65, 0xe0c70c54, 0xfa248988, 0xe08a665c, 
 	0xe027725c, 0x0322f4d8, 0xe0163253, 0x025aa412, 0xe009de1d, 0x0191f65f, 0xe002779f, 0x00c90ab0, 
 	0x0191f65f, 0x1ff621e3, 0x012d8657, 0x1ffa72f0, 0x00c90ab0, 0x1ffd8861, 0x00648748, 0x1fff6217, 
-	0xfb4dfbe4, 0xe058aa81, 0xfc790f47, 0xe031ea03, 0xfda55bee, 0xe0163253, 0xfed279a9, 0xe0058d10

-};

-

-const int twidTab64[4*6 + 16*6] = {

+	0xfb4dfbe4, 0xe058aa81, 0xfc790f47, 0xe031ea03, 0xfda55bee, 0xe0163253, 0xfed279a9, 0xe0058d10
+};
+
+const int twidTab64[4*6 + 16*6] = {
 	0x20000000, 0x00000000, 0x16a09e66, 0x16a09e66, 0x00000000, 0x20000000, 0xe95f619a, 0x16a09e66, 
 	0x20000000, 0x00000000, 0x1d906bcf, 0x0c3ef153, 0x16a09e66, 0x16a09e66, 0x0c3ef153, 0x1d906bcf, 
 	0x20000000, 0x00000000, 0x0c3ef153, 0x1d906bcf, 0xe95f619a, 0x16a09e66, 0xe26f9431, 0xf3c10ead, 
@@ -647,399 +647,399 @@
 	0xe95f619a, 0x16a09e66, 0xe3c74d0e, 0x0f15ae9c, 0xe09d6830, 0x063e2e0f, 0xe027725c, 0xfcdd0b28, 
 	0xe95f619a, 0x16a09e66, 0xe56499d7, 0x11c73b3a, 0xe26f9431, 0x0c3ef153, 0xe09d6830, 0x063e2e0f, 
 	0x0c3ef153, 0x1d906bcf, 0x094a0317, 0x1e9f4157, 0x063e2e0f, 0x1f6297d0, 0x0322f4d8, 0x1fd88da4, 
-	0xe26f9431, 0xf3c10ead, 0xe7437f95, 0xebb30cdb, 0xee38c4c6, 0xe56499d7, 0xf6b5fce9, 0xe160bea9

-};

-

-#else
-
-/* 

- *  Q30 for 128 and 1024 

- *

- * for (i = 0; i < num/4; i++) {

- *   angle = (i + 0.125) * M_PI / num;

- *   x = cos(angle) * (1 << 30);

- *   x = sin(angle) * (1 << 30);

- * 

- *   angle = (num/2 - 1 - i + 0.125) * M_PI / num;

- *   x = cos(angle) * (1 << 30);

- *   x = sin(angle) * (1 << 30);

- * }

- */

-const int cossintab[128 + 1024] = {

-	/* 128 */

-	0x3fffec43, 0x003243f1, 0x015fd4d2, 0x3ffc38d1, 0x3ff9c13a, 0x01c454f5, 0x02f1b755, 0x3feea776, 

-	0x3fe9b8a9, 0x03562038, 0x0483259d, 0x3fd73a4a, 0x3fcfd50b, 0x04e767c5, 0x0613e1c5, 0x3fb5f4ea, 

-	0x3fac1a5b, 0x0677edbb, 0x07a3adff, 0x3f8adc77, 0x3f7e8e1e, 0x08077457, 0x09324ca7, 0x3f55f796, 

-	0x3f473759, 0x0995bdfd, 0x0abf8043, 0x3f174e70, 0x3f061e95, 0x0b228d42, 0x0c4b0b94, 0x3eceeaad, 

-	0x3ebb4ddb, 0x0cada4f5, 0x0dd4b19a, 0x3e7cd778, 0x3e66d0b4, 0x0e36c82a, 0x0f5c35a3, 0x3e212179, 

-	0x3e08b42a, 0x0fbdba40, 0x10e15b4e, 0x3dbbd6d4, 0x3da106bd, 0x11423ef0, 0x1263e699, 0x3d4d0728, 

-	0x3d2fd86c, 0x12c41a4f, 0x13e39be9, 0x3cd4c38b, 0x3cb53aaa, 0x144310dd, 0x15604013, 0x3c531e88, 

-	0x3c314060, 0x15bee78c, 0x16d99864, 0x3bc82c1f, 0x3ba3fde7, 0x173763c9, 0x184f6aab, 0x3b3401bb, 

-	0x3b0d8909, 0x18ac4b87, 0x19c17d44, 0x3a96b636, 0x3a6df8f8, 0x1a1d6544, 0x1b2f971e, 0x39f061d2, 

-	0x39c5664f, 0x1b8a7815, 0x1c997fc4, 0x39411e33, 0x3913eb0e, 0x1cf34baf, 0x1dfeff67, 0x38890663, 

-	0x3859a292, 0x1e57a86d, 0x1f5fdee6, 0x37c836c2, 0x3796a996, 0x1fb7575c, 0x20bbe7d8, 0x36fecd0e, 

-	0x36cb1e2a, 0x21122240, 0x2212e492, 0x362ce855, 0x35f71fb1, 0x2267d3a0, 0x2364a02e, 0x3552a8f4, 

-	0x351acedd, 0x23b836ca, 0x24b0e699, 0x34703095, 0x34364da6, 0x250317df, 0x25f78497, 0x3385a222, 

-	0x3349bf48, 0x264843d9, 0x273847c8, 0x329321c7, 0x32554840, 0x27878893, 0x2872feb6, 0x3198d4ea, 

-	0x31590e3e, 0x28c0b4d2, 0x29a778db, 0x3096e223, 0x30553828, 0x29f3984c, 0x2ad586a3, 0x2f8d713a, 

-	0x2f49ee0f, 0x2b2003ac, 0x2bfcf97c, 0x2e7cab1c, 0x2e37592c, 0x2c45c8a0, 0x2d1da3d5, 0x2d64b9da, 

-	/* 1024 */

-	0x3fffffb1, 0x0006487f, 0x002bfb74, 0x3ffff0e3, 0x3fffe705, 0x00388c6e, 0x005e3f4c, 0x3fffba9b, 

-	0x3fffa6de, 0x006ad03b, 0x009082ea, 0x3fff5cd8, 0x3fff3f3c, 0x009d13c5, 0x00c2c62f, 0x3ffed79b, 

-	0x3ffeb021, 0x00cf56ef, 0x00f508fc, 0x3ffe2ae5, 0x3ffdf98c, 0x01019998, 0x01274b31, 0x3ffd56b5, 

-	0x3ffd1b7e, 0x0133dba3, 0x01598cb1, 0x3ffc5b0c, 0x3ffc15f7, 0x01661cf0, 0x018bcd5b, 0x3ffb37ec, 

-	0x3ffae8f9, 0x01985d60, 0x01be0d11, 0x3ff9ed53, 0x3ff99483, 0x01ca9cd4, 0x01f04bb4, 0x3ff87b44, 

-	0x3ff81896, 0x01fcdb2e, 0x02228924, 0x3ff6e1bf, 0x3ff67534, 0x022f184d, 0x0254c544, 0x3ff520c5, 

-	0x3ff4aa5d, 0x02615414, 0x0286fff3, 0x3ff33858, 0x3ff2b813, 0x02938e62, 0x02b93914, 0x3ff12878, 

-	0x3ff09e56, 0x02c5c71a, 0x02eb7086, 0x3feef126, 0x3fee5d28, 0x02f7fe1c, 0x031da62b, 0x3fec9265, 

-	0x3febf48b, 0x032a3349, 0x034fd9e5, 0x3fea0c35, 0x3fe96480, 0x035c6682, 0x03820b93, 0x3fe75e98, 

-	0x3fe6ad08, 0x038e97a9, 0x03b43b17, 0x3fe48990, 0x3fe3ce26, 0x03c0c69e, 0x03e66852, 0x3fe18d1f, 

-	0x3fe0c7da, 0x03f2f342, 0x04189326, 0x3fde6945, 0x3fdd9a27, 0x04251d77, 0x044abb73, 0x3fdb1e06, 

-	0x3fda450f, 0x0457451d, 0x047ce11a, 0x3fd7ab64, 0x3fd6c894, 0x04896a16, 0x04af03fc, 0x3fd4115f, 

-	0x3fd324b7, 0x04bb8c42, 0x04e123fa, 0x3fd04ffc, 0x3fcf597c, 0x04edab83, 0x051340f6, 0x3fcc673b, 

-	0x3fcb66e4, 0x051fc7b9, 0x05455ad1, 0x3fc8571f, 0x3fc74cf3, 0x0551e0c7, 0x0577716b, 0x3fc41fac, 

-	0x3fc30baa, 0x0583f68c, 0x05a984a6, 0x3fbfc0e3, 0x3fbea30c, 0x05b608eb, 0x05db9463, 0x3fbb3ac7, 

-	0x3fba131b, 0x05e817c3, 0x060da083, 0x3fb68d5b, 0x3fb55bdc, 0x061a22f7, 0x063fa8e7, 0x3fb1b8a2, 

-	0x3fb07d50, 0x064c2a67, 0x0671ad71, 0x3facbc9f, 0x3fab777b, 0x067e2df5, 0x06a3ae00, 0x3fa79954, 

-	0x3fa64a5f, 0x06b02d81, 0x06d5aa77, 0x3fa24ec6, 0x3fa0f600, 0x06e228ee, 0x0707a2b7, 0x3f9cdcf7, 

-	0x3f9b7a62, 0x0714201b, 0x073996a1, 0x3f9743eb, 0x3f95d787, 0x074612eb, 0x076b8616, 0x3f9183a5, 

-	0x3f900d72, 0x0778013d, 0x079d70f7, 0x3f8b9c28, 0x3f8a1c29, 0x07a9eaf5, 0x07cf5726, 0x3f858d79, 

-	0x3f8403ae, 0x07dbcff2, 0x08013883, 0x3f7f579b, 0x3f7dc405, 0x080db016, 0x083314f1, 0x3f78fa92, 

-	0x3f775d31, 0x083f8b43, 0x0864ec4f, 0x3f727661, 0x3f70cf38, 0x08716159, 0x0896be80, 0x3f6bcb0e, 

-	0x3f6a1a1c, 0x08a3323a, 0x08c88b65, 0x3f64f89b, 0x3f633de2, 0x08d4fdc6, 0x08fa52de, 0x3f5dff0e, 

-	0x3f5c3a8f, 0x0906c3e0, 0x092c14ce, 0x3f56de6a, 0x3f551026, 0x09388469, 0x095dd116, 0x3f4f96b4, 

-	0x3f4dbeac, 0x096a3f42, 0x098f8796, 0x3f4827f0, 0x3f464626, 0x099bf44c, 0x09c13831, 0x3f409223, 

-	0x3f3ea697, 0x09cda368, 0x09f2e2c7, 0x3f38d552, 0x3f36e006, 0x09ff4c78, 0x0a24873a, 0x3f30f181, 

-	0x3f2ef276, 0x0a30ef5e, 0x0a56256c, 0x3f28e6b6, 0x3f26ddec, 0x0a628bfa, 0x0a87bd3d, 0x3f20b4f5, 

-	0x3f1ea26e, 0x0a94222f, 0x0ab94e8f, 0x3f185c43, 0x3f164001, 0x0ac5b1dc, 0x0aead944, 0x3f0fdca5, 

-	0x3f0db6a9, 0x0af73ae5, 0x0b1c5d3d, 0x3f073621, 0x3f05066d, 0x0b28bd2a, 0x0b4dda5c, 0x3efe68bc, 

-	0x3efc2f50, 0x0b5a388d, 0x0b7f5081, 0x3ef5747b, 0x3ef3315a, 0x0b8bacf0, 0x0bb0bf8f, 0x3eec5965, 

-	0x3eea0c8e, 0x0bbd1a33, 0x0be22766, 0x3ee3177e, 0x3ee0c0f4, 0x0bee8038, 0x0c1387e9, 0x3ed9aecc, 

-	0x3ed74e91, 0x0c1fdee1, 0x0c44e0f9, 0x3ed01f55, 0x3ecdb56a, 0x0c513610, 0x0c763278, 0x3ec66920, 

-	0x3ec3f585, 0x0c8285a5, 0x0ca77c47, 0x3ebc8c31, 0x3eba0ee9, 0x0cb3cd84, 0x0cd8be47, 0x3eb2888f, 

-	0x3eb0019c, 0x0ce50d8c, 0x0d09f85b, 0x3ea85e41, 0x3ea5cda3, 0x0d1645a0, 0x0d3b2a64, 0x3e9e0d4c, 

-	0x3e9b7306, 0x0d4775a1, 0x0d6c5443, 0x3e9395b7, 0x3e90f1ca, 0x0d789d71, 0x0d9d75db, 0x3e88f788, 

-	0x3e8649f5, 0x0da9bcf2, 0x0dce8f0d, 0x3e7e32c6, 0x3e7b7b90, 0x0ddad406, 0x0dff9fba, 0x3e734778, 

-	0x3e70869f, 0x0e0be28e, 0x0e30a7c5, 0x3e6835a4, 0x3e656b2b, 0x0e3ce86b, 0x0e61a70f, 0x3e5cfd51, 

-	0x3e5a2939, 0x0e6de580, 0x0e929d7a, 0x3e519e86, 0x3e4ec0d1, 0x0e9ed9af, 0x0ec38ae8, 0x3e46194a, 

-	0x3e4331fa, 0x0ecfc4d9, 0x0ef46f3b, 0x3e3a6da4, 0x3e377cbb, 0x0f00a6df, 0x0f254a53, 0x3e2e9b9c, 

-	0x3e2ba11b, 0x0f317fa5, 0x0f561c15, 0x3e22a338, 0x3e1f9f21, 0x0f624f0c, 0x0f86e460, 0x3e168480, 

-	0x3e1376d5, 0x0f9314f5, 0x0fb7a317, 0x3e0a3f7b, 0x3e07283f, 0x0fc3d143, 0x0fe8581d, 0x3dfdd432, 

-	0x3dfab365, 0x0ff483d7, 0x10190352, 0x3df142ab, 0x3dee1851, 0x10252c94, 0x1049a49a, 0x3de48aef, 

-	0x3de15708, 0x1055cb5b, 0x107a3bd5, 0x3dd7ad05, 0x3dd46f94, 0x1086600e, 0x10aac8e6, 0x3dcaa8f5, 

-	0x3dc761fc, 0x10b6ea90, 0x10db4baf, 0x3dbd7ec7, 0x3dba2e48, 0x10e76ac3, 0x110bc413, 0x3db02e84, 

-	0x3dacd481, 0x1117e088, 0x113c31f3, 0x3da2b834, 0x3d9f54af, 0x11484bc2, 0x116c9531, 0x3d951bde, 

-	0x3d91aed9, 0x1178ac53, 0x119cedaf, 0x3d87598c, 0x3d83e309, 0x11a9021d, 0x11cd3b50, 0x3d797145, 

-	0x3d75f147, 0x11d94d02, 0x11fd7df6, 0x3d6b6313, 0x3d67d99b, 0x12098ce5, 0x122db583, 0x3d5d2efe, 

-	0x3d599c0e, 0x1239c1a7, 0x125de1da, 0x3d4ed50f, 0x3d4b38aa, 0x1269eb2b, 0x128e02dc, 0x3d40554e, 

-	0x3d3caf76, 0x129a0954, 0x12be186c, 0x3d31afc5, 0x3d2e007c, 0x12ca1c03, 0x12ee226c, 0x3d22e47c, 

-	0x3d1f2bc5, 0x12fa231b, 0x131e20c0, 0x3d13f37e, 0x3d10315a, 0x132a1e7e, 0x134e1348, 0x3d04dcd2, 

-	0x3d011145, 0x135a0e0e, 0x137df9e7, 0x3cf5a082, 0x3cf1cb8e, 0x1389f1af, 0x13add481, 0x3ce63e98, 

-	0x3ce2603f, 0x13b9c943, 0x13dda2f7, 0x3cd6b71e, 0x3cd2cf62, 0x13e994ab, 0x140d652c, 0x3cc70a1c, 

-	0x3cc318ff, 0x141953cb, 0x143d1b02, 0x3cb7379c, 0x3cb33d22, 0x14490685, 0x146cc45c, 0x3ca73fa9, 

-	0x3ca33bd3, 0x1478acbc, 0x149c611d, 0x3c97224c, 0x3c93151d, 0x14a84652, 0x14cbf127, 0x3c86df8e, 

-	0x3c82c909, 0x14d7d32a, 0x14fb745e, 0x3c76777b, 0x3c7257a2, 0x15075327, 0x152aeaa3, 0x3c65ea1c, 

-	0x3c61c0f1, 0x1536c62b, 0x155a53d9, 0x3c55377b, 0x3c510501, 0x15662c18, 0x1589afe3, 0x3c445fa2, 

-	0x3c4023dd, 0x159584d3, 0x15b8fea4, 0x3c33629d, 0x3c2f1d8e, 0x15c4d03e, 0x15e83fff, 0x3c224075, 

-	0x3c1df21f, 0x15f40e3a, 0x161773d6, 0x3c10f935, 0x3c0ca19b, 0x16233eac, 0x16469a0d, 0x3bff8ce8, 

-	0x3bfb2c0c, 0x16526176, 0x1675b286, 0x3bedfb99, 0x3be9917e, 0x1681767c, 0x16a4bd25, 0x3bdc4552, 

-	0x3bd7d1fa, 0x16b07d9f, 0x16d3b9cc, 0x3bca6a1d, 0x3bc5ed8d, 0x16df76c3, 0x1702a85e, 0x3bb86a08, 

-	0x3bb3e440, 0x170e61cc, 0x173188be, 0x3ba6451b, 0x3ba1b620, 0x173d3e9b, 0x17605ad0, 0x3b93fb63, 

-	0x3b8f6337, 0x176c0d15, 0x178f1e76, 0x3b818ceb, 0x3b7ceb90, 0x179acd1c, 0x17bdd394, 0x3b6ef9be, 

-	0x3b6a4f38, 0x17c97e93, 0x17ec7a0d, 0x3b5c41e8, 0x3b578e39, 0x17f8215e, 0x181b11c4, 0x3b496574, 

-	0x3b44a8a0, 0x1826b561, 0x18499a9d, 0x3b36646e, 0x3b319e77, 0x18553a7d, 0x1878147a, 0x3b233ee1, 

-	0x3b1e6fca, 0x1883b097, 0x18a67f3f, 0x3b0ff4d9, 0x3b0b1ca6, 0x18b21791, 0x18d4dad0, 0x3afc8663, 

-	0x3af7a516, 0x18e06f50, 0x1903270f, 0x3ae8f38b, 0x3ae40926, 0x190eb7b7, 0x193163e1, 0x3ad53c5b, 

-	0x3ad048e3, 0x193cf0a9, 0x195f9128, 0x3ac160e1, 0x3abc6458, 0x196b1a09, 0x198daec8, 0x3aad6129, 

-	0x3aa85b92, 0x199933bb, 0x19bbbca6, 0x3a993d3e, 0x3a942e9d, 0x19c73da3, 0x19e9baa3, 0x3a84f52f, 

-	0x3a7fdd86, 0x19f537a4, 0x1a17a8a5, 0x3a708906, 0x3a6b6859, 0x1a2321a2, 0x1a45868e, 0x3a5bf8d1, 

-	0x3a56cf23, 0x1a50fb81, 0x1a735442, 0x3a47449c, 0x3a4211f0, 0x1a7ec524, 0x1aa111a6, 0x3a326c74, 

-	0x3a2d30cd, 0x1aac7e6f, 0x1acebe9d, 0x3a1d7066, 0x3a182bc8, 0x1ada2746, 0x1afc5b0a, 0x3a08507f, 

-	0x3a0302ed, 0x1b07bf8c, 0x1b29e6d2, 0x39f30ccc, 0x39edb649, 0x1b354727, 0x1b5761d8, 0x39dda55a, 

-	0x39d845e9, 0x1b62bdf8, 0x1b84cc01, 0x39c81a36, 0x39c2b1da, 0x1b9023e5, 0x1bb22530, 0x39b26b6d, 

-	0x39acfa2b, 0x1bbd78d2, 0x1bdf6d4a, 0x399c990d, 0x39971ee7, 0x1beabca1, 0x1c0ca432, 0x3986a324, 

-	0x3981201e, 0x1c17ef39, 0x1c39c9cd, 0x397089bf, 0x396afddc, 0x1c45107c, 0x1c66ddfe, 0x395a4ceb, 

-	0x3954b82e, 0x1c72204f, 0x1c93e0ab, 0x3943ecb6, 0x393e4f23, 0x1c9f1e96, 0x1cc0d1b6, 0x392d692f, 

-	0x3927c2c9, 0x1ccc0b35, 0x1cedb106, 0x3916c262, 0x3911132d, 0x1cf8e611, 0x1d1a7e7d, 0x38fff85e, 

-	0x38fa405e, 0x1d25af0d, 0x1d473a00, 0x38e90b31, 0x38e34a69, 0x1d52660f, 0x1d73e374, 0x38d1fae9, 

-	0x38cc315d, 0x1d7f0afb, 0x1da07abc, 0x38bac795, 0x38b4f547, 0x1dab9db5, 0x1dccffbf, 0x38a37142, 

-	0x389d9637, 0x1dd81e21, 0x1df9725f, 0x388bf7ff, 0x3886143b, 0x1e048c24, 0x1e25d282, 0x38745bdb, 

-	0x386e6f60, 0x1e30e7a4, 0x1e52200c, 0x385c9ce3, 0x3856a7b6, 0x1e5d3084, 0x1e7e5ae2, 0x3844bb28, 

-	0x383ebd4c, 0x1e8966a8, 0x1eaa82e9, 0x382cb6b7, 0x3826b030, 0x1eb589f7, 0x1ed69805, 0x38148f9f, 

-	0x380e8071, 0x1ee19a54, 0x1f029a1c, 0x37fc45ef, 0x37f62e1d, 0x1f0d97a5, 0x1f2e8911, 0x37e3d9b7, 

-	0x37ddb945, 0x1f3981ce, 0x1f5a64cb, 0x37cb4b04, 0x37c521f6, 0x1f6558b5, 0x1f862d2d, 0x37b299e7, 

-	0x37ac6841, 0x1f911c3d, 0x1fb1e21d, 0x3799c66f, 0x37938c34, 0x1fbccc4d, 0x1fdd8381, 0x3780d0aa, 

-	0x377a8ddf, 0x1fe868c8, 0x2009113c, 0x3767b8a9, 0x37616d51, 0x2013f196, 0x20348b35, 0x374e7e7b, 

-	0x37482a9a, 0x203f6699, 0x205ff14f, 0x3735222f, 0x372ec5c9, 0x206ac7b8, 0x208b4372, 0x371ba3d4, 

-	0x37153eee, 0x209614d9, 0x20b68181, 0x3702037c, 0x36fb9618, 0x20c14ddf, 0x20e1ab63, 0x36e84135, 

-	0x36e1cb58, 0x20ec72b1, 0x210cc0fc, 0x36ce5d10, 0x36c7debd, 0x21178334, 0x2137c232, 0x36b4571b, 

-	0x36add058, 0x21427f4d, 0x2162aeea, 0x369a2f69, 0x3693a038, 0x216d66e2, 0x218d870b, 0x367fe608, 

-	0x36794e6e, 0x219839d8, 0x21b84a79, 0x36657b08, 0x365edb09, 0x21c2f815, 0x21e2f91a, 0x364aee7b, 

-	0x3644461b, 0x21eda17f, 0x220d92d4, 0x36304070, 0x36298fb4, 0x221835fb, 0x2238178d, 0x361570f8, 

-	0x360eb7e3, 0x2242b56f, 0x22628729, 0x35fa8023, 0x35f3beba, 0x226d1fc1, 0x228ce191, 0x35df6e03, 

-	0x35d8a449, 0x229774d7, 0x22b726a8, 0x35c43aa7, 0x35bd68a1, 0x22c1b496, 0x22e15655, 0x35a8e621, 

-	0x35a20bd3, 0x22ebdee5, 0x230b707e, 0x358d7081, 0x35868def, 0x2315f3a8, 0x23357509, 0x3571d9d9, 

-	0x356aef08, 0x233ff2c8, 0x235f63dc, 0x35562239, 0x354f2f2c, 0x2369dc29, 0x23893cdd, 0x353a49b2, 

-	0x35334e6f, 0x2393afb2, 0x23b2fff3, 0x351e5056, 0x35174ce0, 0x23bd6d48, 0x23dcad03, 0x35023636, 

-	0x34fb2a92, 0x23e714d3, 0x240643f4, 0x34e5fb63, 0x34dee795, 0x2410a639, 0x242fc4ad, 0x34c99fef, 

-	0x34c283fb, 0x243a215f, 0x24592f13, 0x34ad23eb, 0x34a5ffd5, 0x2463862c, 0x2482830d, 0x34908768, 

-	0x34895b36, 0x248cd487, 0x24abc082, 0x3473ca79, 0x346c962f, 0x24b60c57, 0x24d4e757, 0x3456ed2f, 

-	0x344fb0d1, 0x24df2d81, 0x24fdf775, 0x3439ef9c, 0x3432ab2e, 0x250837ed, 0x2526f0c1, 0x341cd1d2, 

-	0x34158559, 0x25312b81, 0x254fd323, 0x33ff93e2, 0x33f83f62, 0x255a0823, 0x25789e80, 0x33e235df, 

-	0x33dad95e, 0x2582cdbc, 0x25a152c0, 0x33c4b7db, 0x33bd535c, 0x25ab7c30, 0x25c9efca, 0x33a719e8, 

-	0x339fad70, 0x25d41369, 0x25f27584, 0x33895c18, 0x3381e7ac, 0x25fc934b, 0x261ae3d6, 0x336b7e7e, 

-	0x33640223, 0x2624fbbf, 0x26433aa7, 0x334d812d, 0x3345fce6, 0x264d4cac, 0x266b79dd, 0x332f6435, 

-	0x3327d808, 0x267585f8, 0x2693a161, 0x331127ab, 0x3309939c, 0x269da78b, 0x26bbb119, 0x32f2cba1, 

-	0x32eb2fb5, 0x26c5b14c, 0x26e3a8ec, 0x32d45029, 0x32ccac64, 0x26eda322, 0x270b88c2, 0x32b5b557, 

-	0x32ae09be, 0x27157cf5, 0x27335082, 0x3296fb3d, 0x328f47d5, 0x273d3eac, 0x275b0014, 0x327821ee, 

-	0x327066bc, 0x2764e82f, 0x27829760, 0x3259297d, 0x32516686, 0x278c7965, 0x27aa164c, 0x323a11fe, 

-	0x32324746, 0x27b3f235, 0x27d17cc1, 0x321adb83, 0x3213090f, 0x27db5288, 0x27f8caa5, 0x31fb8620, 

-	0x31f3abf5, 0x28029a45, 0x281fffe2, 0x31dc11e8, 0x31d4300b, 0x2829c954, 0x28471c5e, 0x31bc7eee, 

-	0x31b49564, 0x2850df9d, 0x286e2002, 0x319ccd46, 0x3194dc14, 0x2877dd07, 0x28950ab6, 0x317cfd04, 

-	0x3175042e, 0x289ec17a, 0x28bbdc61, 0x315d0e3b, 0x31550dc6, 0x28c58cdf, 0x28e294eb, 0x313d00ff, 

-	0x3134f8f1, 0x28ec3f1e, 0x2909343e, 0x311cd564, 0x3114c5c0, 0x2912d81f, 0x292fba40, 0x30fc8b7d, 

-	0x30f47449, 0x293957c9, 0x295626da, 0x30dc235e, 0x30d404a0, 0x295fbe06, 0x297c79f5, 0x30bb9d1c, 

-	0x30b376d8, 0x29860abd, 0x29a2b378, 0x309af8ca, 0x3092cb05, 0x29ac3dd7, 0x29c8d34d, 0x307a367c, 

-	0x3072013c, 0x29d2573c, 0x29eed95b, 0x30595648, 0x30511991, 0x29f856d5, 0x2a14c58b, 0x30385840, 

-	0x30301418, 0x2a1e3c8a, 0x2a3a97c7, 0x30173c7a, 0x300ef0e5, 0x2a440844, 0x2a604ff5, 0x2ff6030a, 

-	0x2fedb00d, 0x2a69b9ec, 0x2a85ee00, 0x2fd4ac04, 0x2fcc51a5, 0x2a8f516b, 0x2aab71d0, 0x2fb3377c, 

-	0x2faad5c1, 0x2ab4cea9, 0x2ad0db4e, 0x2f91a589, 0x2f893c75, 0x2ada318e, 0x2af62a63, 0x2f6ff63d, 

-	0x2f6785d7, 0x2aff7a05, 0x2b1b5ef8, 0x2f4e29af, 0x2f45b1fb, 0x2b24a7f6, 0x2b4078f5, 0x2f2c3ff2, 

-	0x2f23c0f6, 0x2b49bb4a, 0x2b657844, 0x2f0a391d, 0x2f01b2de, 0x2b6eb3ea, 0x2b8a5cce, 0x2ee81543, 

-	0x2edf87c6, 0x2b9391c0, 0x2baf267d, 0x2ec5d479, 0x2ebd3fc4, 0x2bb854b4, 0x2bd3d53a, 0x2ea376d6, 

-	0x2e9adaee, 0x2bdcfcb0, 0x2bf868ed, 0x2e80fc6e, 0x2e785958, 0x2c01899e, 0x2c1ce181, 0x2e5e6556, 

-	0x2e55bb17, 0x2c25fb66, 0x2c413edf, 0x2e3bb1a4, 0x2e330042, 0x2c4a51f3, 0x2c6580f1, 0x2e18e16d, 

-	0x2e1028ed, 0x2c6e8d2e, 0x2c89a79f, 0x2df5f4c7, 0x2ded352f, 0x2c92ad01, 0x2cadb2d5, 0x2dd2ebc7, 

-	0x2dca251c, 0x2cb6b155, 0x2cd1a27b, 0x2dafc683, 0x2da6f8ca, 0x2cda9a14, 0x2cf5767c, 0x2d8c8510, 

-	0x2d83b04f, 0x2cfe6728, 0x2d192ec1, 0x2d692784, 0x2d604bc0, 0x2d22187a, 0x2d3ccb34, 0x2d45adf6

+	0xe26f9431, 0xf3c10ead, 0xe7437f95, 0xebb30cdb, 0xee38c4c6, 0xe56499d7, 0xf6b5fce9, 0xe160bea9
 };
 
-const int twidTab512[8*6 + 32*6 + 128*6] = {

-	0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3b20d79e, 0x187de2a6, 

-	0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 

-	0x187de2a6, 0x3b20d79e, 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f, 

-	0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xe7821d5a, 0x3b20d79e, 

-	0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 

-	0xc4df2862, 0xe7821d5a, 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae, 

-

-	0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3fb11b47, 0x0645e9af, 

-	0x3fec43c6, 0x0323ecbe, 0x3f4eaafe, 0x09640837, 0x3ec52f9f, 0x0c7c5c1e, 0x3fb11b47, 0x0645e9af, 

-	0x3d3e82ad, 0x1294062e, 0x3d3e82ad, 0x1294062e, 0x3f4eaafe, 0x09640837, 0x39daf5e8, 0x1b5d1009, 

-	0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x387165e3, 0x1e2b5d38, 

-	0x3e14fdf7, 0x0f8cfcbd, 0x2f6bbe44, 0x2afad269, 0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e, 

-	0x2899e64a, 0x317900d6, 0x317900d6, 0x2899e64a, 0x3c424209, 0x158f9a75, 0x20e70f32, 0x36e5068a, 

-	0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x2899e64a, 0x317900d6, 

-	0x39daf5e8, 0x1b5d1009, 0x0f8cfcbd, 0x3e14fdf7, 0x238e7673, 0x3536cc52, 0x387165e3, 0x1e2b5d38, 

-	0x0645e9af, 0x3fb11b47, 0x1e2b5d38, 0x387165e3, 0x36e5068a, 0x20e70f32, 0xfcdc1342, 0x3fec43c6, 

-	0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f, 0x1294062e, 0x3d3e82ad, 

-	0x3367c08f, 0x261feff9, 0xea70658b, 0x3c424209, 0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a, 

-	0xe1d4a2c8, 0x387165e3, 0x0645e9af, 0x3fb11b47, 0x2f6bbe44, 0x2afad269, 0xd9e01007, 0x3367c08f, 

-	0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xf9ba1651, 0x3fb11b47, 

-	0x2afad269, 0x2f6bbe44, 0xcc983f71, 0x261feff9, 0xf383a3e2, 0x3ec52f9f, 0x2899e64a, 0x317900d6, 

-	0xc78e9a1d, 0x1e2b5d38, 0xed6bf9d2, 0x3d3e82ad, 0x261feff9, 0x3367c08f, 0xc3bdbdf7, 0x158f9a75, 

-	0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xe1d4a2c8, 0x387165e3, 

-	0x20e70f32, 0x36e5068a, 0xc013bc3a, 0x0323ecbe, 0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3, 

-	0xc04ee4b9, 0xf9ba1651, 0xd76619b6, 0x317900d6, 0x1b5d1009, 0x39daf5e8, 0xc1eb0209, 0xf0730343, 

-	0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xce86ff2a, 0x2899e64a, 

-	0x158f9a75, 0x3c424209, 0xc91af976, 0xdf18f0ce, 0xcac933ae, 0x238e7673, 0x1294062e, 0x3d3e82ad, 

-	0xce86ff2a, 0xd76619b6, 0xc78e9a1d, 0x1e2b5d38, 0x0f8cfcbd, 0x3e14fdf7, 0xd5052d97, 0xd09441bc, 

-	0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae, 0xc2c17d53, 0x1294062e, 

-	0x09640837, 0x3f4eaafe, 0xe4a2eff7, 0xc6250a18, 0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47, 

-	0xed6bf9d2, 0xc2c17d53, 0xc04ee4b9, 0x0645e9af, 0x0323ecbe, 0x3fec43c6, 0xf69bf7c9, 0xc0b15502, 

-

-	0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3ffb10c1, 0x0192155f, 

-	0x3ffec42d, 0x00c90e8f, 0x3ff4e5df, 0x025b0cae, 0x3fec43c6, 0x0323ecbe, 0x3ffb10c1, 0x0192155f, 

-	0x3fd39b5a, 0x04b54824, 0x3fd39b5a, 0x04b54824, 0x3ff4e5df, 0x025b0cae, 0x3f9c2bfa, 0x070de171, 

-	0x3fb11b47, 0x0645e9af, 0x3fec43c6, 0x0323ecbe, 0x3f4eaafe, 0x09640837, 0x3f84c8e1, 0x07d59395, 

-	0x3fe12acb, 0x03ecadcf, 0x3eeb3347, 0x0bb6ecef, 0x3f4eaafe, 0x09640837, 0x3fd39b5a, 0x04b54824, 

-	0x3e71e758, 0x0e05c135, 0x3f0ec9f4, 0x0af10a22, 0x3fc395f9, 0x057db402, 0x3de2f147, 0x104fb80e, 

-	0x3ec52f9f, 0x0c7c5c1e, 0x3fb11b47, 0x0645e9af, 0x3d3e82ad, 0x1294062e, 0x3e71e758, 0x0e05c135, 

-	0x3f9c2bfa, 0x070de171, 0x3c84d496, 0x14d1e242, 0x3e14fdf7, 0x0f8cfcbd, 0x3f84c8e1, 0x07d59395, 

-	0x3bb6276d, 0x17088530, 0x3dae81ce, 0x1111d262, 0x3f6af2e3, 0x089cf867, 0x3ad2c2e7, 0x19372a63, 

-	0x3d3e82ad, 0x1294062e, 0x3f4eaafe, 0x09640837, 0x39daf5e8, 0x1b5d1009, 0x3cc511d8, 0x14135c94, 

-	0x3f2ff249, 0x0a2abb58, 0x38cf1669, 0x1d79775b, 0x3c424209, 0x158f9a75, 0x3f0ec9f4, 0x0af10a22, 

-	0x37af8158, 0x1f8ba4db, 0x3bb6276d, 0x17088530, 0x3eeb3347, 0x0bb6ecef, 0x367c9a7d, 0x2192e09a, 

-	0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x3a8269a2, 0x19ef7943, 

-	0x3e9cc076, 0x0d415012, 0x33de87de, 0x257db64b, 0x39daf5e8, 0x1b5d1009, 0x3e71e758, 0x0e05c135, 

-	0x32744493, 0x275ff452, 0x392a9642, 0x1cc66e99, 0x3e44a5ee, 0x0ec9a7f2, 0x30f8801f, 0x29348937, 

-	0x387165e3, 0x1e2b5d38, 0x3e14fdf7, 0x0f8cfcbd, 0x2f6bbe44, 0x2afad269, 0x37af8158, 0x1f8ba4db, 

-	0x3de2f147, 0x104fb80e, 0x2dce88a9, 0x2cb2324b, 0x36e5068a, 0x20e70f32, 0x3dae81ce, 0x1111d262, 

-	0x2c216eaa, 0x2e5a106f, 0x361214b0, 0x223d66a8, 0x3d77b191, 0x11d3443f, 0x2a650525, 0x2ff1d9c6, 

-	0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e, 0x2899e64a, 0x317900d6, 0x34534f40, 0x24da0a99, 

-	0x3d02f756, 0x135410c2, 0x26c0b162, 0x32eefde9, 0x3367c08f, 0x261feff9, 0x3cc511d8, 0x14135c94, 

-	0x24da0a99, 0x34534f40, 0x32744493, 0x275ff452, 0x3c84d496, 0x14d1e242, 0x22e69ac7, 0x35a5793c, 

-	0x317900d6, 0x2899e64a, 0x3c424209, 0x158f9a75, 0x20e70f32, 0x36e5068a, 0x30761c17, 0x29cd9577, 

-	0x3bfd5cc4, 0x164c7ddd, 0x1edc1952, 0x3811884c, 0x2f6bbe44, 0x2afad269, 0x3bb6276d, 0x17088530, 

-	0x1cc66e99, 0x392a9642, 0x2e5a106f, 0x2c216eaa, 0x3b6ca4c4, 0x17c3a931, 0x1aa6c82b, 0x3a2fcee8, 

-	0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x2c216eaa, 0x2e5a106f, 

-	0x3ad2c2e7, 0x19372a63, 0x164c7ddd, 0x3bfd5cc4, 0x2afad269, 0x2f6bbe44, 0x3a8269a2, 0x19ef7943, 

-	0x14135c94, 0x3cc511d8, 0x29cd9577, 0x30761c17, 0x3a2fcee8, 0x1aa6c82b, 0x11d3443f, 0x3d77b191, 

-	0x2899e64a, 0x317900d6, 0x39daf5e8, 0x1b5d1009, 0x0f8cfcbd, 0x3e14fdf7, 0x275ff452, 0x32744493, 

-	0x3983e1e7, 0x1c1249d8, 0x0d415012, 0x3e9cc076, 0x261feff9, 0x3367c08f, 0x392a9642, 0x1cc66e99, 

-	0x0af10a22, 0x3f0ec9f4, 0x24da0a99, 0x34534f40, 0x38cf1669, 0x1d79775b, 0x089cf867, 0x3f6af2e3, 

-	0x238e7673, 0x3536cc52, 0x387165e3, 0x1e2b5d38, 0x0645e9af, 0x3fb11b47, 0x223d66a8, 0x361214b0, 

-	0x3811884c, 0x1edc1952, 0x03ecadcf, 0x3fe12acb, 0x20e70f32, 0x36e5068a, 0x37af8158, 0x1f8ba4db, 

-	0x0192155f, 0x3ffb10c1, 0x1f8ba4db, 0x37af8158, 0x374b54ce, 0x2039f90e, 0xff36f171, 0x3ffec42d, 

-	0x1e2b5d38, 0x387165e3, 0x36e5068a, 0x20e70f32, 0xfcdc1342, 0x3fec43c6, 0x1cc66e99, 0x392a9642, 

-	0x367c9a7d, 0x2192e09a, 0xfa824bfe, 0x3fc395f9, 0x1b5d1009, 0x39daf5e8, 0x361214b0, 0x223d66a8, 

-	0xf82a6c6b, 0x3f84c8e1, 0x19ef7943, 0x3a8269a2, 0x35a5793c, 0x22e69ac7, 0xf5d544a8, 0x3f2ff249, 

-	0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f, 0x17088530, 0x3bb6276d, 

-	0x34c61236, 0x2434f332, 0xf136580e, 0x3e44a5ee, 0x158f9a75, 0x3c424209, 0x34534f40, 0x24da0a99, 

-	0xeeee2d9e, 0x3dae81ce, 0x14135c94, 0x3cc511d8, 0x33de87de, 0x257db64b, 0xecabef3e, 0x3d02f756, 

-	0x1294062e, 0x3d3e82ad, 0x3367c08f, 0x261feff9, 0xea70658b, 0x3c424209, 0x1111d262, 0x3dae81ce, 

-	0x32eefde9, 0x26c0b162, 0xe83c56cf, 0x3b6ca4c4, 0x0f8cfcbd, 0x3e14fdf7, 0x32744493, 0x275ff452, 

-	0xe61086bd, 0x3a8269a2, 0x0e05c135, 0x3e71e758, 0x31f79947, 0x27fdb2a6, 0xe3edb628, 0x3983e1e7, 

-	0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a, 0xe1d4a2c8, 0x387165e3, 0x0af10a22, 0x3f0ec9f4, 

-	0x30f8801f, 0x29348937, 0xdfc606f2, 0x374b54ce, 0x09640837, 0x3f4eaafe, 0x30761c17, 0x29cd9577, 

-	0xddc29958, 0x361214b0, 0x07d59395, 0x3f84c8e1, 0x2ff1d9c6, 0x2a650525, 0xdbcb0cce, 0x34c61236, 

-	0x0645e9af, 0x3fb11b47, 0x2f6bbe44, 0x2afad269, 0xd9e01007, 0x3367c08f, 0x04b54824, 0x3fd39b5a, 

-	0x2ee3cebe, 0x2b8ef77c, 0xd8024d5a, 0x31f79947, 0x0323ecbe, 0x3fec43c6, 0x2e5a106f, 0x2c216eaa, 

-	0xd6326a89, 0x30761c17, 0x0192155f, 0x3ffb10c1, 0x2dce88a9, 0x2cb2324b, 0xd4710884, 0x2ee3cebe, 

-	0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xfe6deaa1, 0x3ffb10c1, 

-	0x2cb2324b, 0x2dce88a9, 0xd11c3142, 0x2b8ef77c, 0xfcdc1342, 0x3fec43c6, 0x2c216eaa, 0x2e5a106f, 

-	0xcf89e3e9, 0x29cd9577, 0xfb4ab7dc, 0x3fd39b5a, 0x2b8ef77c, 0x2ee3cebe, 0xce0866b9, 0x27fdb2a6, 

-	0xf9ba1651, 0x3fb11b47, 0x2afad269, 0x2f6bbe44, 0xcc983f71, 0x261feff9, 0xf82a6c6b, 0x3f84c8e1, 

-	0x2a650525, 0x2ff1d9c6, 0xcb39edca, 0x2434f332, 0xf69bf7c9, 0x3f4eaafe, 0x29cd9577, 0x30761c17, 

-	0xc9edeb50, 0x223d66a8, 0xf50ef5de, 0x3f0ec9f4, 0x29348937, 0x30f8801f, 0xc8b4ab32, 0x2039f90e, 

-	0xf383a3e2, 0x3ec52f9f, 0x2899e64a, 0x317900d6, 0xc78e9a1d, 0x1e2b5d38, 0xf1fa3ecb, 0x3e71e758, 

-	0x27fdb2a6, 0x31f79947, 0xc67c1e19, 0x1c1249d8, 0xf0730343, 0x3e14fdf7, 0x275ff452, 0x32744493, 

-	0xc57d965e, 0x19ef7943, 0xeeee2d9e, 0x3dae81ce, 0x26c0b162, 0x32eefde9, 0xc4935b3c, 0x17c3a931, 

-	0xed6bf9d2, 0x3d3e82ad, 0x261feff9, 0x3367c08f, 0xc3bdbdf7, 0x158f9a75, 0xebeca36c, 0x3cc511d8, 

-	0x257db64b, 0x33de87de, 0xc2fd08aa, 0x135410c2, 0xea70658b, 0x3c424209, 0x24da0a99, 0x34534f40, 

-	0xc2517e32, 0x1111d262, 0xe8f77ad0, 0x3bb6276d, 0x2434f332, 0x34c61236, 0xc1bb5a12, 0x0ec9a7f2, 

-	0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xe61086bd, 0x3a8269a2, 

-	0x22e69ac7, 0x35a5793c, 0xc0d00db7, 0x0a2abb58, 0xe4a2eff7, 0x39daf5e8, 0x223d66a8, 0x361214b0, 

-	0xc07b371f, 0x07d59395, 0xe3399167, 0x392a9642, 0x2192e09a, 0x367c9a7d, 0xc03c6a07, 0x057db402, 

-	0xe1d4a2c8, 0x387165e3, 0x20e70f32, 0x36e5068a, 0xc013bc3a, 0x0323ecbe, 0xe0745b25, 0x37af8158, 

-	0x2039f90e, 0x374b54ce, 0xc0013bd3, 0x00c90e8f, 0xdf18f0ce, 0x36e5068a, 0x1f8ba4db, 0x37af8158, 

-	0xc004ef3f, 0xfe6deaa1, 0xddc29958, 0x361214b0, 0x1edc1952, 0x3811884c, 0xc01ed535, 0xfc135231, 

-	0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3, 0xc04ee4b9, 0xf9ba1651, 0xdb25f567, 0x34534f40, 

-	0x1d79775b, 0x38cf1669, 0xc0950d1d, 0xf7630799, 0xd9e01007, 0x3367c08f, 0x1cc66e99, 0x392a9642, 

-	0xc0f1360c, 0xf50ef5de, 0xd8a00bae, 0x32744493, 0x1c1249d8, 0x3983e1e7, 0xc1633f8a, 0xf2beafee, 

-	0xd76619b6, 0x317900d6, 0x1b5d1009, 0x39daf5e8, 0xc1eb0209, 0xf0730343, 0xd6326a89, 0x30761c17, 

-	0x1aa6c82b, 0x3a2fcee8, 0xc2884e6f, 0xee2cbbc1, 0xd5052d97, 0x2f6bbe44, 0x19ef7943, 0x3a8269a2, 

-	0xc33aee28, 0xebeca36c, 0xd3de9156, 0x2e5a106f, 0x19372a63, 0x3ad2c2e7, 0xc402a33c, 0xe9b38223, 

-	0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xd1a5ef91, 0x2c216eaa, 

-	0x17c3a931, 0x3b6ca4c4, 0xc5d03118, 0xe55937d5, 0xd09441bc, 0x2afad269, 0x17088530, 0x3bb6276d, 

-	0xc6d569be, 0xe3399167, 0xcf89e3e9, 0x29cd9577, 0x164c7ddd, 0x3bfd5cc4, 0xc7ee77b4, 0xe123e6ae, 

-	0xce86ff2a, 0x2899e64a, 0x158f9a75, 0x3c424209, 0xc91af976, 0xdf18f0ce, 0xcd8bbb6d, 0x275ff452, 

-	0x14d1e242, 0x3c84d496, 0xca5a86c4, 0xdd196539, 0xcc983f71, 0x261feff9, 0x14135c94, 0x3cc511d8, 

-	0xcbacb0c0, 0xdb25f567, 0xcbacb0c0, 0x24da0a99, 0x135410c2, 0x3d02f756, 0xcd110217, 0xd93f4e9e, 

-	0xcac933ae, 0x238e7673, 0x1294062e, 0x3d3e82ad, 0xce86ff2a, 0xd76619b6, 0xc9edeb50, 0x223d66a8, 

-	0x11d3443f, 0x3d77b191, 0xd00e263a, 0xd59afadb, 0xc91af976, 0x20e70f32, 0x1111d262, 0x3dae81ce, 

-	0xd1a5ef91, 0xd3de9156, 0xc8507ea8, 0x1f8ba4db, 0x104fb80e, 0x3de2f147, 0xd34dcdb5, 0xd2317757, 

-	0xc78e9a1d, 0x1e2b5d38, 0x0f8cfcbd, 0x3e14fdf7, 0xd5052d97, 0xd09441bc, 0xc6d569be, 0x1cc66e99, 

-	0x0ec9a7f2, 0x3e44a5ee, 0xd6cb76c9, 0xcf077fe1, 0xc6250a18, 0x1b5d1009, 0x0e05c135, 0x3e71e758, 

-	0xd8a00bae, 0xcd8bbb6d, 0xc57d965e, 0x19ef7943, 0x0d415012, 0x3e9cc076, 0xda8249b5, 0xcc217822, 

-	0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae, 0xc449d893, 0x17088530, 

-	0x0bb6ecef, 0x3eeb3347, 0xde6d1f66, 0xc9836583, 0xc3bdbdf7, 0x158f9a75, 0x0af10a22, 0x3f0ec9f4, 

-	0xe0745b25, 0xc8507ea8, 0xc33aee28, 0x14135c94, 0x0a2abb58, 0x3f2ff249, 0xe28688a5, 0xc730e997, 

-	0xc2c17d53, 0x1294062e, 0x09640837, 0x3f4eaafe, 0xe4a2eff7, 0xc6250a18, 0xc2517e32, 0x1111d262, 

-	0x089cf867, 0x3f6af2e3, 0xe6c8d59d, 0xc52d3d19, 0xc1eb0209, 0x0f8cfcbd, 0x07d59395, 0x3f84c8e1, 

-	0xe8f77ad0, 0xc449d893, 0xc18e18a8, 0x0e05c135, 0x070de171, 0x3f9c2bfa, 0xeb2e1dbe, 0xc37b2b6a, 

-	0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47, 0xed6bf9d2, 0xc2c17d53, 0xc0f1360c, 0x0af10a22, 

-	0x057db402, 0x3fc395f9, 0xefb047f2, 0xc21d0eb9, 0xc0b15502, 0x09640837, 0x04b54824, 0x3fd39b5a, 

-	0xf1fa3ecb, 0xc18e18a8, 0xc07b371f, 0x07d59395, 0x03ecadcf, 0x3fe12acb, 0xf4491311, 0xc114ccb9, 

-	0xc04ee4b9, 0x0645e9af, 0x0323ecbe, 0x3fec43c6, 0xf69bf7c9, 0xc0b15502, 0xc02c64a6, 0x04b54824, 

-	0x025b0cae, 0x3ff4e5df, 0xf8f21e8f, 0xc063d406, 0xc013bc3a, 0x0323ecbe, 0x0192155f, 0x3ffb10c1, 

-	0xfb4ab7dc, 0xc02c64a6, 0xc004ef3f, 0x0192155f, 0x00c90e8f, 0x3ffec42d, 0xfda4f352, 0xc00b1a21

-};

-

-const int twidTab64[4*6 + 16*6] = {

-	0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x2d413ccc, 0x2d413ccc, 

-	0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 

-	0xd2bec334, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 

-

-	0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3ec52f9f, 0x0c7c5c1e, 

-	0x3fb11b47, 0x0645e9af, 0x3d3e82ad, 0x1294062e, 0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e, 

-	0x3536cc52, 0x238e7673, 0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e, 0x2899e64a, 0x317900d6, 

-	0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x238e7673, 0x3536cc52, 

-	0x387165e3, 0x1e2b5d38, 0x0645e9af, 0x3fb11b47, 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 

-	0xf383a3e2, 0x3ec52f9f, 0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a, 0xe1d4a2c8, 0x387165e3, 

-	0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xf383a3e2, 0x3ec52f9f, 

-	0x2899e64a, 0x317900d6, 0xc78e9a1d, 0x1e2b5d38, 0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52, 

-	0xc13ad061, 0x0c7c5c1e, 0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3, 0xc04ee4b9, 0xf9ba1651, 

-	0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xcac933ae, 0x238e7673, 

-	0x1294062e, 0x3d3e82ad, 0xce86ff2a, 0xd76619b6, 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 

-	0xdc71898d, 0xcac933ae, 0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47, 0xed6bf9d2, 0xc2c17d53 

-};

-#endif  //ARMV5E

-

-const int ShortWindowSine[FRAME_LEN_SHORT/2] ={  

-	0x00c97fff, 0x025b7ffa, 0x03ed7ff1, 0x057f7fe2, 0x07117fce, 0x08a27fb5, 0x0a337f98, 0x0bc47f75, 

-	0x0d547f4e, 0x0ee47f22, 0x10737ef0, 0x12017eba, 0x138f7e7f, 0x151c7e3f, 0x16a87dfb, 0x18337db1, 

-	0x19be7d63, 0x1b477d0f, 0x1cd07cb7, 0x1e577c5a, 0x1fdd7bf9, 0x21627b92, 0x22e57b27, 0x24677ab7, 

-	0x25e87a42, 0x276879c9, 0x28e5794a, 0x2a6278c8, 0x2bdc7840, 0x2d5577b4, 0x2ecc7723, 0x3042768e, 

-	0x31b575f4, 0x33277556, 0x349774b3, 0x3604740b, 0x3770735f, 0x38d972af, 0x3a4071fa, 0x3ba57141, 

-	0x3d087083, 0x3e686fc2, 0x3fc66efb, 0x41216e31, 0x427a6d62, 0x43d16c8f, 0x45246bb8, 0x46756add, 

-	0x47c469fd, 0x490f691a, 0x4a586832, 0x4b9e6747, 0x4ce16657, 0x4e216564, 0x4f5e646c, 0x50986371, 

-	0x51cf6272, 0x5303616f, 0x54336068, 0x55605f5e, 0x568a5e50, 0x57b15d3e, 0x58d45c29, 0x59f45b10

+#else
+
+/* 
+ *  Q30 for 128 and 1024 
+ *
+ * for (i = 0; i < num/4; i++) {
+ *   angle = (i + 0.125) * M_PI / num;
+ *   x = cos(angle) * (1 << 30);
+ *   x = sin(angle) * (1 << 30);
+ * 
+ *   angle = (num/2 - 1 - i + 0.125) * M_PI / num;
+ *   x = cos(angle) * (1 << 30);
+ *   x = sin(angle) * (1 << 30);
+ * }
+ */
+const int cossintab[128 + 1024] = {
+	/* 128 */
+	0x3fffec43, 0x003243f1, 0x015fd4d2, 0x3ffc38d1, 0x3ff9c13a, 0x01c454f5, 0x02f1b755, 0x3feea776, 
+	0x3fe9b8a9, 0x03562038, 0x0483259d, 0x3fd73a4a, 0x3fcfd50b, 0x04e767c5, 0x0613e1c5, 0x3fb5f4ea, 
+	0x3fac1a5b, 0x0677edbb, 0x07a3adff, 0x3f8adc77, 0x3f7e8e1e, 0x08077457, 0x09324ca7, 0x3f55f796, 
+	0x3f473759, 0x0995bdfd, 0x0abf8043, 0x3f174e70, 0x3f061e95, 0x0b228d42, 0x0c4b0b94, 0x3eceeaad, 
+	0x3ebb4ddb, 0x0cada4f5, 0x0dd4b19a, 0x3e7cd778, 0x3e66d0b4, 0x0e36c82a, 0x0f5c35a3, 0x3e212179, 
+	0x3e08b42a, 0x0fbdba40, 0x10e15b4e, 0x3dbbd6d4, 0x3da106bd, 0x11423ef0, 0x1263e699, 0x3d4d0728, 
+	0x3d2fd86c, 0x12c41a4f, 0x13e39be9, 0x3cd4c38b, 0x3cb53aaa, 0x144310dd, 0x15604013, 0x3c531e88, 
+	0x3c314060, 0x15bee78c, 0x16d99864, 0x3bc82c1f, 0x3ba3fde7, 0x173763c9, 0x184f6aab, 0x3b3401bb, 
+	0x3b0d8909, 0x18ac4b87, 0x19c17d44, 0x3a96b636, 0x3a6df8f8, 0x1a1d6544, 0x1b2f971e, 0x39f061d2, 
+	0x39c5664f, 0x1b8a7815, 0x1c997fc4, 0x39411e33, 0x3913eb0e, 0x1cf34baf, 0x1dfeff67, 0x38890663, 
+	0x3859a292, 0x1e57a86d, 0x1f5fdee6, 0x37c836c2, 0x3796a996, 0x1fb7575c, 0x20bbe7d8, 0x36fecd0e, 
+	0x36cb1e2a, 0x21122240, 0x2212e492, 0x362ce855, 0x35f71fb1, 0x2267d3a0, 0x2364a02e, 0x3552a8f4, 
+	0x351acedd, 0x23b836ca, 0x24b0e699, 0x34703095, 0x34364da6, 0x250317df, 0x25f78497, 0x3385a222, 
+	0x3349bf48, 0x264843d9, 0x273847c8, 0x329321c7, 0x32554840, 0x27878893, 0x2872feb6, 0x3198d4ea, 
+	0x31590e3e, 0x28c0b4d2, 0x29a778db, 0x3096e223, 0x30553828, 0x29f3984c, 0x2ad586a3, 0x2f8d713a, 
+	0x2f49ee0f, 0x2b2003ac, 0x2bfcf97c, 0x2e7cab1c, 0x2e37592c, 0x2c45c8a0, 0x2d1da3d5, 0x2d64b9da, 
+	/* 1024 */
+	0x3fffffb1, 0x0006487f, 0x002bfb74, 0x3ffff0e3, 0x3fffe705, 0x00388c6e, 0x005e3f4c, 0x3fffba9b, 
+	0x3fffa6de, 0x006ad03b, 0x009082ea, 0x3fff5cd8, 0x3fff3f3c, 0x009d13c5, 0x00c2c62f, 0x3ffed79b, 
+	0x3ffeb021, 0x00cf56ef, 0x00f508fc, 0x3ffe2ae5, 0x3ffdf98c, 0x01019998, 0x01274b31, 0x3ffd56b5, 
+	0x3ffd1b7e, 0x0133dba3, 0x01598cb1, 0x3ffc5b0c, 0x3ffc15f7, 0x01661cf0, 0x018bcd5b, 0x3ffb37ec, 
+	0x3ffae8f9, 0x01985d60, 0x01be0d11, 0x3ff9ed53, 0x3ff99483, 0x01ca9cd4, 0x01f04bb4, 0x3ff87b44, 
+	0x3ff81896, 0x01fcdb2e, 0x02228924, 0x3ff6e1bf, 0x3ff67534, 0x022f184d, 0x0254c544, 0x3ff520c5, 
+	0x3ff4aa5d, 0x02615414, 0x0286fff3, 0x3ff33858, 0x3ff2b813, 0x02938e62, 0x02b93914, 0x3ff12878, 
+	0x3ff09e56, 0x02c5c71a, 0x02eb7086, 0x3feef126, 0x3fee5d28, 0x02f7fe1c, 0x031da62b, 0x3fec9265, 
+	0x3febf48b, 0x032a3349, 0x034fd9e5, 0x3fea0c35, 0x3fe96480, 0x035c6682, 0x03820b93, 0x3fe75e98, 
+	0x3fe6ad08, 0x038e97a9, 0x03b43b17, 0x3fe48990, 0x3fe3ce26, 0x03c0c69e, 0x03e66852, 0x3fe18d1f, 
+	0x3fe0c7da, 0x03f2f342, 0x04189326, 0x3fde6945, 0x3fdd9a27, 0x04251d77, 0x044abb73, 0x3fdb1e06, 
+	0x3fda450f, 0x0457451d, 0x047ce11a, 0x3fd7ab64, 0x3fd6c894, 0x04896a16, 0x04af03fc, 0x3fd4115f, 
+	0x3fd324b7, 0x04bb8c42, 0x04e123fa, 0x3fd04ffc, 0x3fcf597c, 0x04edab83, 0x051340f6, 0x3fcc673b, 
+	0x3fcb66e4, 0x051fc7b9, 0x05455ad1, 0x3fc8571f, 0x3fc74cf3, 0x0551e0c7, 0x0577716b, 0x3fc41fac, 
+	0x3fc30baa, 0x0583f68c, 0x05a984a6, 0x3fbfc0e3, 0x3fbea30c, 0x05b608eb, 0x05db9463, 0x3fbb3ac7, 
+	0x3fba131b, 0x05e817c3, 0x060da083, 0x3fb68d5b, 0x3fb55bdc, 0x061a22f7, 0x063fa8e7, 0x3fb1b8a2, 
+	0x3fb07d50, 0x064c2a67, 0x0671ad71, 0x3facbc9f, 0x3fab777b, 0x067e2df5, 0x06a3ae00, 0x3fa79954, 
+	0x3fa64a5f, 0x06b02d81, 0x06d5aa77, 0x3fa24ec6, 0x3fa0f600, 0x06e228ee, 0x0707a2b7, 0x3f9cdcf7, 
+	0x3f9b7a62, 0x0714201b, 0x073996a1, 0x3f9743eb, 0x3f95d787, 0x074612eb, 0x076b8616, 0x3f9183a5, 
+	0x3f900d72, 0x0778013d, 0x079d70f7, 0x3f8b9c28, 0x3f8a1c29, 0x07a9eaf5, 0x07cf5726, 0x3f858d79, 
+	0x3f8403ae, 0x07dbcff2, 0x08013883, 0x3f7f579b, 0x3f7dc405, 0x080db016, 0x083314f1, 0x3f78fa92, 
+	0x3f775d31, 0x083f8b43, 0x0864ec4f, 0x3f727661, 0x3f70cf38, 0x08716159, 0x0896be80, 0x3f6bcb0e, 
+	0x3f6a1a1c, 0x08a3323a, 0x08c88b65, 0x3f64f89b, 0x3f633de2, 0x08d4fdc6, 0x08fa52de, 0x3f5dff0e, 
+	0x3f5c3a8f, 0x0906c3e0, 0x092c14ce, 0x3f56de6a, 0x3f551026, 0x09388469, 0x095dd116, 0x3f4f96b4, 
+	0x3f4dbeac, 0x096a3f42, 0x098f8796, 0x3f4827f0, 0x3f464626, 0x099bf44c, 0x09c13831, 0x3f409223, 
+	0x3f3ea697, 0x09cda368, 0x09f2e2c7, 0x3f38d552, 0x3f36e006, 0x09ff4c78, 0x0a24873a, 0x3f30f181, 
+	0x3f2ef276, 0x0a30ef5e, 0x0a56256c, 0x3f28e6b6, 0x3f26ddec, 0x0a628bfa, 0x0a87bd3d, 0x3f20b4f5, 
+	0x3f1ea26e, 0x0a94222f, 0x0ab94e8f, 0x3f185c43, 0x3f164001, 0x0ac5b1dc, 0x0aead944, 0x3f0fdca5, 
+	0x3f0db6a9, 0x0af73ae5, 0x0b1c5d3d, 0x3f073621, 0x3f05066d, 0x0b28bd2a, 0x0b4dda5c, 0x3efe68bc, 
+	0x3efc2f50, 0x0b5a388d, 0x0b7f5081, 0x3ef5747b, 0x3ef3315a, 0x0b8bacf0, 0x0bb0bf8f, 0x3eec5965, 
+	0x3eea0c8e, 0x0bbd1a33, 0x0be22766, 0x3ee3177e, 0x3ee0c0f4, 0x0bee8038, 0x0c1387e9, 0x3ed9aecc, 
+	0x3ed74e91, 0x0c1fdee1, 0x0c44e0f9, 0x3ed01f55, 0x3ecdb56a, 0x0c513610, 0x0c763278, 0x3ec66920, 
+	0x3ec3f585, 0x0c8285a5, 0x0ca77c47, 0x3ebc8c31, 0x3eba0ee9, 0x0cb3cd84, 0x0cd8be47, 0x3eb2888f, 
+	0x3eb0019c, 0x0ce50d8c, 0x0d09f85b, 0x3ea85e41, 0x3ea5cda3, 0x0d1645a0, 0x0d3b2a64, 0x3e9e0d4c, 
+	0x3e9b7306, 0x0d4775a1, 0x0d6c5443, 0x3e9395b7, 0x3e90f1ca, 0x0d789d71, 0x0d9d75db, 0x3e88f788, 
+	0x3e8649f5, 0x0da9bcf2, 0x0dce8f0d, 0x3e7e32c6, 0x3e7b7b90, 0x0ddad406, 0x0dff9fba, 0x3e734778, 
+	0x3e70869f, 0x0e0be28e, 0x0e30a7c5, 0x3e6835a4, 0x3e656b2b, 0x0e3ce86b, 0x0e61a70f, 0x3e5cfd51, 
+	0x3e5a2939, 0x0e6de580, 0x0e929d7a, 0x3e519e86, 0x3e4ec0d1, 0x0e9ed9af, 0x0ec38ae8, 0x3e46194a, 
+	0x3e4331fa, 0x0ecfc4d9, 0x0ef46f3b, 0x3e3a6da4, 0x3e377cbb, 0x0f00a6df, 0x0f254a53, 0x3e2e9b9c, 
+	0x3e2ba11b, 0x0f317fa5, 0x0f561c15, 0x3e22a338, 0x3e1f9f21, 0x0f624f0c, 0x0f86e460, 0x3e168480, 
+	0x3e1376d5, 0x0f9314f5, 0x0fb7a317, 0x3e0a3f7b, 0x3e07283f, 0x0fc3d143, 0x0fe8581d, 0x3dfdd432, 
+	0x3dfab365, 0x0ff483d7, 0x10190352, 0x3df142ab, 0x3dee1851, 0x10252c94, 0x1049a49a, 0x3de48aef, 
+	0x3de15708, 0x1055cb5b, 0x107a3bd5, 0x3dd7ad05, 0x3dd46f94, 0x1086600e, 0x10aac8e6, 0x3dcaa8f5, 
+	0x3dc761fc, 0x10b6ea90, 0x10db4baf, 0x3dbd7ec7, 0x3dba2e48, 0x10e76ac3, 0x110bc413, 0x3db02e84, 
+	0x3dacd481, 0x1117e088, 0x113c31f3, 0x3da2b834, 0x3d9f54af, 0x11484bc2, 0x116c9531, 0x3d951bde, 
+	0x3d91aed9, 0x1178ac53, 0x119cedaf, 0x3d87598c, 0x3d83e309, 0x11a9021d, 0x11cd3b50, 0x3d797145, 
+	0x3d75f147, 0x11d94d02, 0x11fd7df6, 0x3d6b6313, 0x3d67d99b, 0x12098ce5, 0x122db583, 0x3d5d2efe, 
+	0x3d599c0e, 0x1239c1a7, 0x125de1da, 0x3d4ed50f, 0x3d4b38aa, 0x1269eb2b, 0x128e02dc, 0x3d40554e, 
+	0x3d3caf76, 0x129a0954, 0x12be186c, 0x3d31afc5, 0x3d2e007c, 0x12ca1c03, 0x12ee226c, 0x3d22e47c, 
+	0x3d1f2bc5, 0x12fa231b, 0x131e20c0, 0x3d13f37e, 0x3d10315a, 0x132a1e7e, 0x134e1348, 0x3d04dcd2, 
+	0x3d011145, 0x135a0e0e, 0x137df9e7, 0x3cf5a082, 0x3cf1cb8e, 0x1389f1af, 0x13add481, 0x3ce63e98, 
+	0x3ce2603f, 0x13b9c943, 0x13dda2f7, 0x3cd6b71e, 0x3cd2cf62, 0x13e994ab, 0x140d652c, 0x3cc70a1c, 
+	0x3cc318ff, 0x141953cb, 0x143d1b02, 0x3cb7379c, 0x3cb33d22, 0x14490685, 0x146cc45c, 0x3ca73fa9, 
+	0x3ca33bd3, 0x1478acbc, 0x149c611d, 0x3c97224c, 0x3c93151d, 0x14a84652, 0x14cbf127, 0x3c86df8e, 
+	0x3c82c909, 0x14d7d32a, 0x14fb745e, 0x3c76777b, 0x3c7257a2, 0x15075327, 0x152aeaa3, 0x3c65ea1c, 
+	0x3c61c0f1, 0x1536c62b, 0x155a53d9, 0x3c55377b, 0x3c510501, 0x15662c18, 0x1589afe3, 0x3c445fa2, 
+	0x3c4023dd, 0x159584d3, 0x15b8fea4, 0x3c33629d, 0x3c2f1d8e, 0x15c4d03e, 0x15e83fff, 0x3c224075, 
+	0x3c1df21f, 0x15f40e3a, 0x161773d6, 0x3c10f935, 0x3c0ca19b, 0x16233eac, 0x16469a0d, 0x3bff8ce8, 
+	0x3bfb2c0c, 0x16526176, 0x1675b286, 0x3bedfb99, 0x3be9917e, 0x1681767c, 0x16a4bd25, 0x3bdc4552, 
+	0x3bd7d1fa, 0x16b07d9f, 0x16d3b9cc, 0x3bca6a1d, 0x3bc5ed8d, 0x16df76c3, 0x1702a85e, 0x3bb86a08, 
+	0x3bb3e440, 0x170e61cc, 0x173188be, 0x3ba6451b, 0x3ba1b620, 0x173d3e9b, 0x17605ad0, 0x3b93fb63, 
+	0x3b8f6337, 0x176c0d15, 0x178f1e76, 0x3b818ceb, 0x3b7ceb90, 0x179acd1c, 0x17bdd394, 0x3b6ef9be, 
+	0x3b6a4f38, 0x17c97e93, 0x17ec7a0d, 0x3b5c41e8, 0x3b578e39, 0x17f8215e, 0x181b11c4, 0x3b496574, 
+	0x3b44a8a0, 0x1826b561, 0x18499a9d, 0x3b36646e, 0x3b319e77, 0x18553a7d, 0x1878147a, 0x3b233ee1, 
+	0x3b1e6fca, 0x1883b097, 0x18a67f3f, 0x3b0ff4d9, 0x3b0b1ca6, 0x18b21791, 0x18d4dad0, 0x3afc8663, 
+	0x3af7a516, 0x18e06f50, 0x1903270f, 0x3ae8f38b, 0x3ae40926, 0x190eb7b7, 0x193163e1, 0x3ad53c5b, 
+	0x3ad048e3, 0x193cf0a9, 0x195f9128, 0x3ac160e1, 0x3abc6458, 0x196b1a09, 0x198daec8, 0x3aad6129, 
+	0x3aa85b92, 0x199933bb, 0x19bbbca6, 0x3a993d3e, 0x3a942e9d, 0x19c73da3, 0x19e9baa3, 0x3a84f52f, 
+	0x3a7fdd86, 0x19f537a4, 0x1a17a8a5, 0x3a708906, 0x3a6b6859, 0x1a2321a2, 0x1a45868e, 0x3a5bf8d1, 
+	0x3a56cf23, 0x1a50fb81, 0x1a735442, 0x3a47449c, 0x3a4211f0, 0x1a7ec524, 0x1aa111a6, 0x3a326c74, 
+	0x3a2d30cd, 0x1aac7e6f, 0x1acebe9d, 0x3a1d7066, 0x3a182bc8, 0x1ada2746, 0x1afc5b0a, 0x3a08507f, 
+	0x3a0302ed, 0x1b07bf8c, 0x1b29e6d2, 0x39f30ccc, 0x39edb649, 0x1b354727, 0x1b5761d8, 0x39dda55a, 
+	0x39d845e9, 0x1b62bdf8, 0x1b84cc01, 0x39c81a36, 0x39c2b1da, 0x1b9023e5, 0x1bb22530, 0x39b26b6d, 
+	0x39acfa2b, 0x1bbd78d2, 0x1bdf6d4a, 0x399c990d, 0x39971ee7, 0x1beabca1, 0x1c0ca432, 0x3986a324, 
+	0x3981201e, 0x1c17ef39, 0x1c39c9cd, 0x397089bf, 0x396afddc, 0x1c45107c, 0x1c66ddfe, 0x395a4ceb, 
+	0x3954b82e, 0x1c72204f, 0x1c93e0ab, 0x3943ecb6, 0x393e4f23, 0x1c9f1e96, 0x1cc0d1b6, 0x392d692f, 
+	0x3927c2c9, 0x1ccc0b35, 0x1cedb106, 0x3916c262, 0x3911132d, 0x1cf8e611, 0x1d1a7e7d, 0x38fff85e, 
+	0x38fa405e, 0x1d25af0d, 0x1d473a00, 0x38e90b31, 0x38e34a69, 0x1d52660f, 0x1d73e374, 0x38d1fae9, 
+	0x38cc315d, 0x1d7f0afb, 0x1da07abc, 0x38bac795, 0x38b4f547, 0x1dab9db5, 0x1dccffbf, 0x38a37142, 
+	0x389d9637, 0x1dd81e21, 0x1df9725f, 0x388bf7ff, 0x3886143b, 0x1e048c24, 0x1e25d282, 0x38745bdb, 
+	0x386e6f60, 0x1e30e7a4, 0x1e52200c, 0x385c9ce3, 0x3856a7b6, 0x1e5d3084, 0x1e7e5ae2, 0x3844bb28, 
+	0x383ebd4c, 0x1e8966a8, 0x1eaa82e9, 0x382cb6b7, 0x3826b030, 0x1eb589f7, 0x1ed69805, 0x38148f9f, 
+	0x380e8071, 0x1ee19a54, 0x1f029a1c, 0x37fc45ef, 0x37f62e1d, 0x1f0d97a5, 0x1f2e8911, 0x37e3d9b7, 
+	0x37ddb945, 0x1f3981ce, 0x1f5a64cb, 0x37cb4b04, 0x37c521f6, 0x1f6558b5, 0x1f862d2d, 0x37b299e7, 
+	0x37ac6841, 0x1f911c3d, 0x1fb1e21d, 0x3799c66f, 0x37938c34, 0x1fbccc4d, 0x1fdd8381, 0x3780d0aa, 
+	0x377a8ddf, 0x1fe868c8, 0x2009113c, 0x3767b8a9, 0x37616d51, 0x2013f196, 0x20348b35, 0x374e7e7b, 
+	0x37482a9a, 0x203f6699, 0x205ff14f, 0x3735222f, 0x372ec5c9, 0x206ac7b8, 0x208b4372, 0x371ba3d4, 
+	0x37153eee, 0x209614d9, 0x20b68181, 0x3702037c, 0x36fb9618, 0x20c14ddf, 0x20e1ab63, 0x36e84135, 
+	0x36e1cb58, 0x20ec72b1, 0x210cc0fc, 0x36ce5d10, 0x36c7debd, 0x21178334, 0x2137c232, 0x36b4571b, 
+	0x36add058, 0x21427f4d, 0x2162aeea, 0x369a2f69, 0x3693a038, 0x216d66e2, 0x218d870b, 0x367fe608, 
+	0x36794e6e, 0x219839d8, 0x21b84a79, 0x36657b08, 0x365edb09, 0x21c2f815, 0x21e2f91a, 0x364aee7b, 
+	0x3644461b, 0x21eda17f, 0x220d92d4, 0x36304070, 0x36298fb4, 0x221835fb, 0x2238178d, 0x361570f8, 
+	0x360eb7e3, 0x2242b56f, 0x22628729, 0x35fa8023, 0x35f3beba, 0x226d1fc1, 0x228ce191, 0x35df6e03, 
+	0x35d8a449, 0x229774d7, 0x22b726a8, 0x35c43aa7, 0x35bd68a1, 0x22c1b496, 0x22e15655, 0x35a8e621, 
+	0x35a20bd3, 0x22ebdee5, 0x230b707e, 0x358d7081, 0x35868def, 0x2315f3a8, 0x23357509, 0x3571d9d9, 
+	0x356aef08, 0x233ff2c8, 0x235f63dc, 0x35562239, 0x354f2f2c, 0x2369dc29, 0x23893cdd, 0x353a49b2, 
+	0x35334e6f, 0x2393afb2, 0x23b2fff3, 0x351e5056, 0x35174ce0, 0x23bd6d48, 0x23dcad03, 0x35023636, 
+	0x34fb2a92, 0x23e714d3, 0x240643f4, 0x34e5fb63, 0x34dee795, 0x2410a639, 0x242fc4ad, 0x34c99fef, 
+	0x34c283fb, 0x243a215f, 0x24592f13, 0x34ad23eb, 0x34a5ffd5, 0x2463862c, 0x2482830d, 0x34908768, 
+	0x34895b36, 0x248cd487, 0x24abc082, 0x3473ca79, 0x346c962f, 0x24b60c57, 0x24d4e757, 0x3456ed2f, 
+	0x344fb0d1, 0x24df2d81, 0x24fdf775, 0x3439ef9c, 0x3432ab2e, 0x250837ed, 0x2526f0c1, 0x341cd1d2, 
+	0x34158559, 0x25312b81, 0x254fd323, 0x33ff93e2, 0x33f83f62, 0x255a0823, 0x25789e80, 0x33e235df, 
+	0x33dad95e, 0x2582cdbc, 0x25a152c0, 0x33c4b7db, 0x33bd535c, 0x25ab7c30, 0x25c9efca, 0x33a719e8, 
+	0x339fad70, 0x25d41369, 0x25f27584, 0x33895c18, 0x3381e7ac, 0x25fc934b, 0x261ae3d6, 0x336b7e7e, 
+	0x33640223, 0x2624fbbf, 0x26433aa7, 0x334d812d, 0x3345fce6, 0x264d4cac, 0x266b79dd, 0x332f6435, 
+	0x3327d808, 0x267585f8, 0x2693a161, 0x331127ab, 0x3309939c, 0x269da78b, 0x26bbb119, 0x32f2cba1, 
+	0x32eb2fb5, 0x26c5b14c, 0x26e3a8ec, 0x32d45029, 0x32ccac64, 0x26eda322, 0x270b88c2, 0x32b5b557, 
+	0x32ae09be, 0x27157cf5, 0x27335082, 0x3296fb3d, 0x328f47d5, 0x273d3eac, 0x275b0014, 0x327821ee, 
+	0x327066bc, 0x2764e82f, 0x27829760, 0x3259297d, 0x32516686, 0x278c7965, 0x27aa164c, 0x323a11fe, 
+	0x32324746, 0x27b3f235, 0x27d17cc1, 0x321adb83, 0x3213090f, 0x27db5288, 0x27f8caa5, 0x31fb8620, 
+	0x31f3abf5, 0x28029a45, 0x281fffe2, 0x31dc11e8, 0x31d4300b, 0x2829c954, 0x28471c5e, 0x31bc7eee, 
+	0x31b49564, 0x2850df9d, 0x286e2002, 0x319ccd46, 0x3194dc14, 0x2877dd07, 0x28950ab6, 0x317cfd04, 
+	0x3175042e, 0x289ec17a, 0x28bbdc61, 0x315d0e3b, 0x31550dc6, 0x28c58cdf, 0x28e294eb, 0x313d00ff, 
+	0x3134f8f1, 0x28ec3f1e, 0x2909343e, 0x311cd564, 0x3114c5c0, 0x2912d81f, 0x292fba40, 0x30fc8b7d, 
+	0x30f47449, 0x293957c9, 0x295626da, 0x30dc235e, 0x30d404a0, 0x295fbe06, 0x297c79f5, 0x30bb9d1c, 
+	0x30b376d8, 0x29860abd, 0x29a2b378, 0x309af8ca, 0x3092cb05, 0x29ac3dd7, 0x29c8d34d, 0x307a367c, 
+	0x3072013c, 0x29d2573c, 0x29eed95b, 0x30595648, 0x30511991, 0x29f856d5, 0x2a14c58b, 0x30385840, 
+	0x30301418, 0x2a1e3c8a, 0x2a3a97c7, 0x30173c7a, 0x300ef0e5, 0x2a440844, 0x2a604ff5, 0x2ff6030a, 
+	0x2fedb00d, 0x2a69b9ec, 0x2a85ee00, 0x2fd4ac04, 0x2fcc51a5, 0x2a8f516b, 0x2aab71d0, 0x2fb3377c, 
+	0x2faad5c1, 0x2ab4cea9, 0x2ad0db4e, 0x2f91a589, 0x2f893c75, 0x2ada318e, 0x2af62a63, 0x2f6ff63d, 
+	0x2f6785d7, 0x2aff7a05, 0x2b1b5ef8, 0x2f4e29af, 0x2f45b1fb, 0x2b24a7f6, 0x2b4078f5, 0x2f2c3ff2, 
+	0x2f23c0f6, 0x2b49bb4a, 0x2b657844, 0x2f0a391d, 0x2f01b2de, 0x2b6eb3ea, 0x2b8a5cce, 0x2ee81543, 
+	0x2edf87c6, 0x2b9391c0, 0x2baf267d, 0x2ec5d479, 0x2ebd3fc4, 0x2bb854b4, 0x2bd3d53a, 0x2ea376d6, 
+	0x2e9adaee, 0x2bdcfcb0, 0x2bf868ed, 0x2e80fc6e, 0x2e785958, 0x2c01899e, 0x2c1ce181, 0x2e5e6556, 
+	0x2e55bb17, 0x2c25fb66, 0x2c413edf, 0x2e3bb1a4, 0x2e330042, 0x2c4a51f3, 0x2c6580f1, 0x2e18e16d, 
+	0x2e1028ed, 0x2c6e8d2e, 0x2c89a79f, 0x2df5f4c7, 0x2ded352f, 0x2c92ad01, 0x2cadb2d5, 0x2dd2ebc7, 
+	0x2dca251c, 0x2cb6b155, 0x2cd1a27b, 0x2dafc683, 0x2da6f8ca, 0x2cda9a14, 0x2cf5767c, 0x2d8c8510, 
+	0x2d83b04f, 0x2cfe6728, 0x2d192ec1, 0x2d692784, 0x2d604bc0, 0x2d22187a, 0x2d3ccb34, 0x2d45adf6
+};
+
+const int twidTab512[8*6 + 32*6 + 128*6] = {
+	0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3b20d79e, 0x187de2a6, 
+	0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 
+	0x187de2a6, 0x3b20d79e, 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f, 
+	0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xe7821d5a, 0x3b20d79e, 
+	0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 
+	0xc4df2862, 0xe7821d5a, 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae, 
+
+	0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3fb11b47, 0x0645e9af, 
+	0x3fec43c6, 0x0323ecbe, 0x3f4eaafe, 0x09640837, 0x3ec52f9f, 0x0c7c5c1e, 0x3fb11b47, 0x0645e9af, 
+	0x3d3e82ad, 0x1294062e, 0x3d3e82ad, 0x1294062e, 0x3f4eaafe, 0x09640837, 0x39daf5e8, 0x1b5d1009, 
+	0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x387165e3, 0x1e2b5d38, 
+	0x3e14fdf7, 0x0f8cfcbd, 0x2f6bbe44, 0x2afad269, 0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e, 
+	0x2899e64a, 0x317900d6, 0x317900d6, 0x2899e64a, 0x3c424209, 0x158f9a75, 0x20e70f32, 0x36e5068a, 
+	0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x2899e64a, 0x317900d6, 
+	0x39daf5e8, 0x1b5d1009, 0x0f8cfcbd, 0x3e14fdf7, 0x238e7673, 0x3536cc52, 0x387165e3, 0x1e2b5d38, 
+	0x0645e9af, 0x3fb11b47, 0x1e2b5d38, 0x387165e3, 0x36e5068a, 0x20e70f32, 0xfcdc1342, 0x3fec43c6, 
+	0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f, 0x1294062e, 0x3d3e82ad, 
+	0x3367c08f, 0x261feff9, 0xea70658b, 0x3c424209, 0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a, 
+	0xe1d4a2c8, 0x387165e3, 0x0645e9af, 0x3fb11b47, 0x2f6bbe44, 0x2afad269, 0xd9e01007, 0x3367c08f, 
+	0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xf9ba1651, 0x3fb11b47, 
+	0x2afad269, 0x2f6bbe44, 0xcc983f71, 0x261feff9, 0xf383a3e2, 0x3ec52f9f, 0x2899e64a, 0x317900d6, 
+	0xc78e9a1d, 0x1e2b5d38, 0xed6bf9d2, 0x3d3e82ad, 0x261feff9, 0x3367c08f, 0xc3bdbdf7, 0x158f9a75, 
+	0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xe1d4a2c8, 0x387165e3, 
+	0x20e70f32, 0x36e5068a, 0xc013bc3a, 0x0323ecbe, 0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3, 
+	0xc04ee4b9, 0xf9ba1651, 0xd76619b6, 0x317900d6, 0x1b5d1009, 0x39daf5e8, 0xc1eb0209, 0xf0730343, 
+	0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xce86ff2a, 0x2899e64a, 
+	0x158f9a75, 0x3c424209, 0xc91af976, 0xdf18f0ce, 0xcac933ae, 0x238e7673, 0x1294062e, 0x3d3e82ad, 
+	0xce86ff2a, 0xd76619b6, 0xc78e9a1d, 0x1e2b5d38, 0x0f8cfcbd, 0x3e14fdf7, 0xd5052d97, 0xd09441bc, 
+	0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae, 0xc2c17d53, 0x1294062e, 
+	0x09640837, 0x3f4eaafe, 0xe4a2eff7, 0xc6250a18, 0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47, 
+	0xed6bf9d2, 0xc2c17d53, 0xc04ee4b9, 0x0645e9af, 0x0323ecbe, 0x3fec43c6, 0xf69bf7c9, 0xc0b15502, 
+
+	0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3ffb10c1, 0x0192155f, 
+	0x3ffec42d, 0x00c90e8f, 0x3ff4e5df, 0x025b0cae, 0x3fec43c6, 0x0323ecbe, 0x3ffb10c1, 0x0192155f, 
+	0x3fd39b5a, 0x04b54824, 0x3fd39b5a, 0x04b54824, 0x3ff4e5df, 0x025b0cae, 0x3f9c2bfa, 0x070de171, 
+	0x3fb11b47, 0x0645e9af, 0x3fec43c6, 0x0323ecbe, 0x3f4eaafe, 0x09640837, 0x3f84c8e1, 0x07d59395, 
+	0x3fe12acb, 0x03ecadcf, 0x3eeb3347, 0x0bb6ecef, 0x3f4eaafe, 0x09640837, 0x3fd39b5a, 0x04b54824, 
+	0x3e71e758, 0x0e05c135, 0x3f0ec9f4, 0x0af10a22, 0x3fc395f9, 0x057db402, 0x3de2f147, 0x104fb80e, 
+	0x3ec52f9f, 0x0c7c5c1e, 0x3fb11b47, 0x0645e9af, 0x3d3e82ad, 0x1294062e, 0x3e71e758, 0x0e05c135, 
+	0x3f9c2bfa, 0x070de171, 0x3c84d496, 0x14d1e242, 0x3e14fdf7, 0x0f8cfcbd, 0x3f84c8e1, 0x07d59395, 
+	0x3bb6276d, 0x17088530, 0x3dae81ce, 0x1111d262, 0x3f6af2e3, 0x089cf867, 0x3ad2c2e7, 0x19372a63, 
+	0x3d3e82ad, 0x1294062e, 0x3f4eaafe, 0x09640837, 0x39daf5e8, 0x1b5d1009, 0x3cc511d8, 0x14135c94, 
+	0x3f2ff249, 0x0a2abb58, 0x38cf1669, 0x1d79775b, 0x3c424209, 0x158f9a75, 0x3f0ec9f4, 0x0af10a22, 
+	0x37af8158, 0x1f8ba4db, 0x3bb6276d, 0x17088530, 0x3eeb3347, 0x0bb6ecef, 0x367c9a7d, 0x2192e09a, 
+	0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x3a8269a2, 0x19ef7943, 
+	0x3e9cc076, 0x0d415012, 0x33de87de, 0x257db64b, 0x39daf5e8, 0x1b5d1009, 0x3e71e758, 0x0e05c135, 
+	0x32744493, 0x275ff452, 0x392a9642, 0x1cc66e99, 0x3e44a5ee, 0x0ec9a7f2, 0x30f8801f, 0x29348937, 
+	0x387165e3, 0x1e2b5d38, 0x3e14fdf7, 0x0f8cfcbd, 0x2f6bbe44, 0x2afad269, 0x37af8158, 0x1f8ba4db, 
+	0x3de2f147, 0x104fb80e, 0x2dce88a9, 0x2cb2324b, 0x36e5068a, 0x20e70f32, 0x3dae81ce, 0x1111d262, 
+	0x2c216eaa, 0x2e5a106f, 0x361214b0, 0x223d66a8, 0x3d77b191, 0x11d3443f, 0x2a650525, 0x2ff1d9c6, 
+	0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e, 0x2899e64a, 0x317900d6, 0x34534f40, 0x24da0a99, 
+	0x3d02f756, 0x135410c2, 0x26c0b162, 0x32eefde9, 0x3367c08f, 0x261feff9, 0x3cc511d8, 0x14135c94, 
+	0x24da0a99, 0x34534f40, 0x32744493, 0x275ff452, 0x3c84d496, 0x14d1e242, 0x22e69ac7, 0x35a5793c, 
+	0x317900d6, 0x2899e64a, 0x3c424209, 0x158f9a75, 0x20e70f32, 0x36e5068a, 0x30761c17, 0x29cd9577, 
+	0x3bfd5cc4, 0x164c7ddd, 0x1edc1952, 0x3811884c, 0x2f6bbe44, 0x2afad269, 0x3bb6276d, 0x17088530, 
+	0x1cc66e99, 0x392a9642, 0x2e5a106f, 0x2c216eaa, 0x3b6ca4c4, 0x17c3a931, 0x1aa6c82b, 0x3a2fcee8, 
+	0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x2c216eaa, 0x2e5a106f, 
+	0x3ad2c2e7, 0x19372a63, 0x164c7ddd, 0x3bfd5cc4, 0x2afad269, 0x2f6bbe44, 0x3a8269a2, 0x19ef7943, 
+	0x14135c94, 0x3cc511d8, 0x29cd9577, 0x30761c17, 0x3a2fcee8, 0x1aa6c82b, 0x11d3443f, 0x3d77b191, 
+	0x2899e64a, 0x317900d6, 0x39daf5e8, 0x1b5d1009, 0x0f8cfcbd, 0x3e14fdf7, 0x275ff452, 0x32744493, 
+	0x3983e1e7, 0x1c1249d8, 0x0d415012, 0x3e9cc076, 0x261feff9, 0x3367c08f, 0x392a9642, 0x1cc66e99, 
+	0x0af10a22, 0x3f0ec9f4, 0x24da0a99, 0x34534f40, 0x38cf1669, 0x1d79775b, 0x089cf867, 0x3f6af2e3, 
+	0x238e7673, 0x3536cc52, 0x387165e3, 0x1e2b5d38, 0x0645e9af, 0x3fb11b47, 0x223d66a8, 0x361214b0, 
+	0x3811884c, 0x1edc1952, 0x03ecadcf, 0x3fe12acb, 0x20e70f32, 0x36e5068a, 0x37af8158, 0x1f8ba4db, 
+	0x0192155f, 0x3ffb10c1, 0x1f8ba4db, 0x37af8158, 0x374b54ce, 0x2039f90e, 0xff36f171, 0x3ffec42d, 
+	0x1e2b5d38, 0x387165e3, 0x36e5068a, 0x20e70f32, 0xfcdc1342, 0x3fec43c6, 0x1cc66e99, 0x392a9642, 
+	0x367c9a7d, 0x2192e09a, 0xfa824bfe, 0x3fc395f9, 0x1b5d1009, 0x39daf5e8, 0x361214b0, 0x223d66a8, 
+	0xf82a6c6b, 0x3f84c8e1, 0x19ef7943, 0x3a8269a2, 0x35a5793c, 0x22e69ac7, 0xf5d544a8, 0x3f2ff249, 
+	0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f, 0x17088530, 0x3bb6276d, 
+	0x34c61236, 0x2434f332, 0xf136580e, 0x3e44a5ee, 0x158f9a75, 0x3c424209, 0x34534f40, 0x24da0a99, 
+	0xeeee2d9e, 0x3dae81ce, 0x14135c94, 0x3cc511d8, 0x33de87de, 0x257db64b, 0xecabef3e, 0x3d02f756, 
+	0x1294062e, 0x3d3e82ad, 0x3367c08f, 0x261feff9, 0xea70658b, 0x3c424209, 0x1111d262, 0x3dae81ce, 
+	0x32eefde9, 0x26c0b162, 0xe83c56cf, 0x3b6ca4c4, 0x0f8cfcbd, 0x3e14fdf7, 0x32744493, 0x275ff452, 
+	0xe61086bd, 0x3a8269a2, 0x0e05c135, 0x3e71e758, 0x31f79947, 0x27fdb2a6, 0xe3edb628, 0x3983e1e7, 
+	0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a, 0xe1d4a2c8, 0x387165e3, 0x0af10a22, 0x3f0ec9f4, 
+	0x30f8801f, 0x29348937, 0xdfc606f2, 0x374b54ce, 0x09640837, 0x3f4eaafe, 0x30761c17, 0x29cd9577, 
+	0xddc29958, 0x361214b0, 0x07d59395, 0x3f84c8e1, 0x2ff1d9c6, 0x2a650525, 0xdbcb0cce, 0x34c61236, 
+	0x0645e9af, 0x3fb11b47, 0x2f6bbe44, 0x2afad269, 0xd9e01007, 0x3367c08f, 0x04b54824, 0x3fd39b5a, 
+	0x2ee3cebe, 0x2b8ef77c, 0xd8024d5a, 0x31f79947, 0x0323ecbe, 0x3fec43c6, 0x2e5a106f, 0x2c216eaa, 
+	0xd6326a89, 0x30761c17, 0x0192155f, 0x3ffb10c1, 0x2dce88a9, 0x2cb2324b, 0xd4710884, 0x2ee3cebe, 
+	0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xfe6deaa1, 0x3ffb10c1, 
+	0x2cb2324b, 0x2dce88a9, 0xd11c3142, 0x2b8ef77c, 0xfcdc1342, 0x3fec43c6, 0x2c216eaa, 0x2e5a106f, 
+	0xcf89e3e9, 0x29cd9577, 0xfb4ab7dc, 0x3fd39b5a, 0x2b8ef77c, 0x2ee3cebe, 0xce0866b9, 0x27fdb2a6, 
+	0xf9ba1651, 0x3fb11b47, 0x2afad269, 0x2f6bbe44, 0xcc983f71, 0x261feff9, 0xf82a6c6b, 0x3f84c8e1, 
+	0x2a650525, 0x2ff1d9c6, 0xcb39edca, 0x2434f332, 0xf69bf7c9, 0x3f4eaafe, 0x29cd9577, 0x30761c17, 
+	0xc9edeb50, 0x223d66a8, 0xf50ef5de, 0x3f0ec9f4, 0x29348937, 0x30f8801f, 0xc8b4ab32, 0x2039f90e, 
+	0xf383a3e2, 0x3ec52f9f, 0x2899e64a, 0x317900d6, 0xc78e9a1d, 0x1e2b5d38, 0xf1fa3ecb, 0x3e71e758, 
+	0x27fdb2a6, 0x31f79947, 0xc67c1e19, 0x1c1249d8, 0xf0730343, 0x3e14fdf7, 0x275ff452, 0x32744493, 
+	0xc57d965e, 0x19ef7943, 0xeeee2d9e, 0x3dae81ce, 0x26c0b162, 0x32eefde9, 0xc4935b3c, 0x17c3a931, 
+	0xed6bf9d2, 0x3d3e82ad, 0x261feff9, 0x3367c08f, 0xc3bdbdf7, 0x158f9a75, 0xebeca36c, 0x3cc511d8, 
+	0x257db64b, 0x33de87de, 0xc2fd08aa, 0x135410c2, 0xea70658b, 0x3c424209, 0x24da0a99, 0x34534f40, 
+	0xc2517e32, 0x1111d262, 0xe8f77ad0, 0x3bb6276d, 0x2434f332, 0x34c61236, 0xc1bb5a12, 0x0ec9a7f2, 
+	0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xe61086bd, 0x3a8269a2, 
+	0x22e69ac7, 0x35a5793c, 0xc0d00db7, 0x0a2abb58, 0xe4a2eff7, 0x39daf5e8, 0x223d66a8, 0x361214b0, 
+	0xc07b371f, 0x07d59395, 0xe3399167, 0x392a9642, 0x2192e09a, 0x367c9a7d, 0xc03c6a07, 0x057db402, 
+	0xe1d4a2c8, 0x387165e3, 0x20e70f32, 0x36e5068a, 0xc013bc3a, 0x0323ecbe, 0xe0745b25, 0x37af8158, 
+	0x2039f90e, 0x374b54ce, 0xc0013bd3, 0x00c90e8f, 0xdf18f0ce, 0x36e5068a, 0x1f8ba4db, 0x37af8158, 
+	0xc004ef3f, 0xfe6deaa1, 0xddc29958, 0x361214b0, 0x1edc1952, 0x3811884c, 0xc01ed535, 0xfc135231, 
+	0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3, 0xc04ee4b9, 0xf9ba1651, 0xdb25f567, 0x34534f40, 
+	0x1d79775b, 0x38cf1669, 0xc0950d1d, 0xf7630799, 0xd9e01007, 0x3367c08f, 0x1cc66e99, 0x392a9642, 
+	0xc0f1360c, 0xf50ef5de, 0xd8a00bae, 0x32744493, 0x1c1249d8, 0x3983e1e7, 0xc1633f8a, 0xf2beafee, 
+	0xd76619b6, 0x317900d6, 0x1b5d1009, 0x39daf5e8, 0xc1eb0209, 0xf0730343, 0xd6326a89, 0x30761c17, 
+	0x1aa6c82b, 0x3a2fcee8, 0xc2884e6f, 0xee2cbbc1, 0xd5052d97, 0x2f6bbe44, 0x19ef7943, 0x3a8269a2, 
+	0xc33aee28, 0xebeca36c, 0xd3de9156, 0x2e5a106f, 0x19372a63, 0x3ad2c2e7, 0xc402a33c, 0xe9b38223, 
+	0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xd1a5ef91, 0x2c216eaa, 
+	0x17c3a931, 0x3b6ca4c4, 0xc5d03118, 0xe55937d5, 0xd09441bc, 0x2afad269, 0x17088530, 0x3bb6276d, 
+	0xc6d569be, 0xe3399167, 0xcf89e3e9, 0x29cd9577, 0x164c7ddd, 0x3bfd5cc4, 0xc7ee77b4, 0xe123e6ae, 
+	0xce86ff2a, 0x2899e64a, 0x158f9a75, 0x3c424209, 0xc91af976, 0xdf18f0ce, 0xcd8bbb6d, 0x275ff452, 
+	0x14d1e242, 0x3c84d496, 0xca5a86c4, 0xdd196539, 0xcc983f71, 0x261feff9, 0x14135c94, 0x3cc511d8, 
+	0xcbacb0c0, 0xdb25f567, 0xcbacb0c0, 0x24da0a99, 0x135410c2, 0x3d02f756, 0xcd110217, 0xd93f4e9e, 
+	0xcac933ae, 0x238e7673, 0x1294062e, 0x3d3e82ad, 0xce86ff2a, 0xd76619b6, 0xc9edeb50, 0x223d66a8, 
+	0x11d3443f, 0x3d77b191, 0xd00e263a, 0xd59afadb, 0xc91af976, 0x20e70f32, 0x1111d262, 0x3dae81ce, 
+	0xd1a5ef91, 0xd3de9156, 0xc8507ea8, 0x1f8ba4db, 0x104fb80e, 0x3de2f147, 0xd34dcdb5, 0xd2317757, 
+	0xc78e9a1d, 0x1e2b5d38, 0x0f8cfcbd, 0x3e14fdf7, 0xd5052d97, 0xd09441bc, 0xc6d569be, 0x1cc66e99, 
+	0x0ec9a7f2, 0x3e44a5ee, 0xd6cb76c9, 0xcf077fe1, 0xc6250a18, 0x1b5d1009, 0x0e05c135, 0x3e71e758, 
+	0xd8a00bae, 0xcd8bbb6d, 0xc57d965e, 0x19ef7943, 0x0d415012, 0x3e9cc076, 0xda8249b5, 0xcc217822, 
+	0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae, 0xc449d893, 0x17088530, 
+	0x0bb6ecef, 0x3eeb3347, 0xde6d1f66, 0xc9836583, 0xc3bdbdf7, 0x158f9a75, 0x0af10a22, 0x3f0ec9f4, 
+	0xe0745b25, 0xc8507ea8, 0xc33aee28, 0x14135c94, 0x0a2abb58, 0x3f2ff249, 0xe28688a5, 0xc730e997, 
+	0xc2c17d53, 0x1294062e, 0x09640837, 0x3f4eaafe, 0xe4a2eff7, 0xc6250a18, 0xc2517e32, 0x1111d262, 
+	0x089cf867, 0x3f6af2e3, 0xe6c8d59d, 0xc52d3d19, 0xc1eb0209, 0x0f8cfcbd, 0x07d59395, 0x3f84c8e1, 
+	0xe8f77ad0, 0xc449d893, 0xc18e18a8, 0x0e05c135, 0x070de171, 0x3f9c2bfa, 0xeb2e1dbe, 0xc37b2b6a, 
+	0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47, 0xed6bf9d2, 0xc2c17d53, 0xc0f1360c, 0x0af10a22, 
+	0x057db402, 0x3fc395f9, 0xefb047f2, 0xc21d0eb9, 0xc0b15502, 0x09640837, 0x04b54824, 0x3fd39b5a, 
+	0xf1fa3ecb, 0xc18e18a8, 0xc07b371f, 0x07d59395, 0x03ecadcf, 0x3fe12acb, 0xf4491311, 0xc114ccb9, 
+	0xc04ee4b9, 0x0645e9af, 0x0323ecbe, 0x3fec43c6, 0xf69bf7c9, 0xc0b15502, 0xc02c64a6, 0x04b54824, 
+	0x025b0cae, 0x3ff4e5df, 0xf8f21e8f, 0xc063d406, 0xc013bc3a, 0x0323ecbe, 0x0192155f, 0x3ffb10c1, 
+	0xfb4ab7dc, 0xc02c64a6, 0xc004ef3f, 0x0192155f, 0x00c90e8f, 0x3ffec42d, 0xfda4f352, 0xc00b1a21
+};
+
+const int twidTab64[4*6 + 16*6] = {
+	0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x2d413ccc, 0x2d413ccc, 
+	0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 
+	0xd2bec334, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 
+
+	0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3ec52f9f, 0x0c7c5c1e, 
+	0x3fb11b47, 0x0645e9af, 0x3d3e82ad, 0x1294062e, 0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e, 
+	0x3536cc52, 0x238e7673, 0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e, 0x2899e64a, 0x317900d6, 
+	0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x238e7673, 0x3536cc52, 
+	0x387165e3, 0x1e2b5d38, 0x0645e9af, 0x3fb11b47, 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 
+	0xf383a3e2, 0x3ec52f9f, 0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a, 0xe1d4a2c8, 0x387165e3, 
+	0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xf383a3e2, 0x3ec52f9f, 
+	0x2899e64a, 0x317900d6, 0xc78e9a1d, 0x1e2b5d38, 0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52, 
+	0xc13ad061, 0x0c7c5c1e, 0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3, 0xc04ee4b9, 0xf9ba1651, 
+	0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xcac933ae, 0x238e7673, 
+	0x1294062e, 0x3d3e82ad, 0xce86ff2a, 0xd76619b6, 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 
+	0xdc71898d, 0xcac933ae, 0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47, 0xed6bf9d2, 0xc2c17d53 
+};
+#endif  //ARMV5E
+
+const int ShortWindowSine[FRAME_LEN_SHORT/2] ={  
+	0x00c97fff, 0x025b7ffa, 0x03ed7ff1, 0x057f7fe2, 0x07117fce, 0x08a27fb5, 0x0a337f98, 0x0bc47f75, 
+	0x0d547f4e, 0x0ee47f22, 0x10737ef0, 0x12017eba, 0x138f7e7f, 0x151c7e3f, 0x16a87dfb, 0x18337db1, 
+	0x19be7d63, 0x1b477d0f, 0x1cd07cb7, 0x1e577c5a, 0x1fdd7bf9, 0x21627b92, 0x22e57b27, 0x24677ab7, 
+	0x25e87a42, 0x276879c9, 0x28e5794a, 0x2a6278c8, 0x2bdc7840, 0x2d5577b4, 0x2ecc7723, 0x3042768e, 
+	0x31b575f4, 0x33277556, 0x349774b3, 0x3604740b, 0x3770735f, 0x38d972af, 0x3a4071fa, 0x3ba57141, 
+	0x3d087083, 0x3e686fc2, 0x3fc66efb, 0x41216e31, 0x427a6d62, 0x43d16c8f, 0x45246bb8, 0x46756add, 
+	0x47c469fd, 0x490f691a, 0x4a586832, 0x4b9e6747, 0x4ce16657, 0x4e216564, 0x4f5e646c, 0x50986371, 
+	0x51cf6272, 0x5303616f, 0x54336068, 0x55605f5e, 0x568a5e50, 0x57b15d3e, 0x58d45c29, 0x59f45b10
 };
 
 const int LongWindowKBD[FRAME_LEN_LONG/2]={  
-	0x000a7fff, 0x000e7fff, 0x00127fff, 0x00157fff, 0x00197fff, 0x001c7fff, 0x00207fff, 0x00237fff, 

-	0x00267fff, 0x002a7fff, 0x002d7fff, 0x00307fff, 0x00347fff, 0x00387fff, 0x003b7fff, 0x003f7fff, 

-	0x00437fff, 0x00477fff, 0x004b7fff, 0x004f7fff, 0x00537fff, 0x00577fff, 0x005b7fff, 0x00607fff, 

-	0x00647fff, 0x00697fff, 0x006d7fff, 0x00727fff, 0x00777fff, 0x007c7fff, 0x00817fff, 0x00867fff, 

-	0x008b7fff, 0x00917fff, 0x00967fff, 0x009c7fff, 0x00a17fff, 0x00a77fff, 0x00ad7fff, 0x00b37fff, 

-	0x00b97fff, 0x00bf7fff, 0x00c67fff, 0x00cc7fff, 0x00d37fff, 0x00da7fff, 0x00e07fff, 0x00e77fff, 

-	0x00ee7fff, 0x00f57fff, 0x00fd7fff, 0x01047fff, 0x010c7fff, 0x01137fff, 0x011b7fff, 0x01237fff, 

-	0x012b7fff, 0x01337fff, 0x013c7ffe, 0x01447ffe, 0x014d7ffe, 0x01567ffe, 0x015f7ffe, 0x01687ffe, 

-	0x01717ffe, 0x017a7ffe, 0x01837ffe, 0x018d7ffe, 0x01977ffd, 0x01a17ffd, 0x01ab7ffd, 0x01b57ffd, 

-	0x01bf7ffd, 0x01ca7ffd, 0x01d47ffd, 0x01df7ffc, 0x01ea7ffc, 0x01f57ffc, 0x02007ffc, 0x020c7ffc, 

-	0x02177ffc, 0x02237ffb, 0x022f7ffb, 0x023b7ffb, 0x02477ffb, 0x02537ffb, 0x02607ffa, 0x026d7ffa, 

-	0x027a7ffa, 0x02877ffa, 0x02947ff9, 0x02a17ff9, 0x02af7ff9, 0x02bc7ff9, 0x02ca7ff8, 0x02d87ff8, 

-	0x02e77ff8, 0x02f57ff7, 0x03047ff7, 0x03127ff7, 0x03217ff6, 0x03317ff6, 0x03407ff5, 0x034f7ff5, 

-	0x035f7ff5, 0x036f7ff4, 0x037f7ff4, 0x038f7ff3, 0x03a07ff3, 0x03b07ff2, 0x03c17ff2, 0x03d27ff1, 

-	0x03e37ff1, 0x03f57ff0, 0x04067ff0, 0x04187fef, 0x042a7fef, 0x043c7fee, 0x044f7fed, 0x04617fed, 

-	0x04747fec, 0x04877feb, 0x049a7feb, 0x04ae7fea, 0x04c17fe9, 0x04d57fe9, 0x04e97fe8, 0x04fd7fe7, 

-	0x05127fe6, 0x05277fe5, 0x053b7fe5, 0x05507fe4, 0x05667fe3, 0x057b7fe2, 0x05917fe1, 0x05a77fe0, 

-	0x05bd7fdf, 0x05d37fde, 0x05ea7fdd, 0x06017fdc, 0x06187fdb, 0x062f7fda, 0x06467fd9, 0x065e7fd7, 

-	0x06767fd6, 0x068e7fd5, 0x06a67fd4, 0x06bf7fd2, 0x06d87fd1, 0x06f17fd0, 0x070a7fce, 0x07237fcd, 

-	0x073d7fcc, 0x07577fca, 0x07717fc9, 0x078c7fc7, 0x07a67fc5, 0x07c17fc4, 0x07dc7fc2, 0x07f77fc0, 

-	0x08137fbf, 0x082f7fbd, 0x084b7fbb, 0x08677fb9, 0x08847fb7, 0x08a07fb6, 0x08bd7fb4, 0x08da7fb2, 

-	0x08f87faf, 0x09167fad, 0x09347fab, 0x09527fa9, 0x09707fa7, 0x098f7fa5, 0x09ae7fa2, 0x09cd7fa0, 

-	0x09ec7f9d, 0x0a0c7f9b, 0x0a2c7f98, 0x0a4c7f96, 0x0a6c7f93, 0x0a8d7f91, 0x0aae7f8e, 0x0acf7f8b, 

-	0x0af07f88, 0x0b127f85, 0x0b337f82, 0x0b557f7f, 0x0b787f7c, 0x0b9a7f79, 0x0bbd7f76, 0x0be07f73, 

-	0x0c047f6f, 0x0c277f6c, 0x0c4b7f69, 0x0c6f7f65, 0x0c937f61, 0x0cb87f5e, 0x0cdd7f5a, 0x0d027f56, 

-	0x0d277f53, 0x0d4d7f4f, 0x0d737f4b, 0x0d997f47, 0x0dbf7f43, 0x0de67f3e, 0x0e0c7f3a, 0x0e347f36, 

-	0x0e5b7f31, 0x0e837f2d, 0x0eaa7f28, 0x0ed37f24, 0x0efb7f1f, 0x0f237f1a, 0x0f4c7f15, 0x0f757f10, 

-	0x0f9f7f0b, 0x0fc87f06, 0x0ff27f01, 0x101c7efb, 0x10477ef6, 0x10717ef0, 0x109c7eeb, 0x10c87ee5, 

-	0x10f37edf, 0x111f7eda, 0x114a7ed4, 0x11777ece, 0x11a37ec7, 0x11d07ec1, 0x11fd7ebb, 0x122a7eb4, 

-	0x12577eae, 0x12857ea7, 0x12b37ea0, 0x12e17e9a, 0x130f7e93, 0x133e7e8c, 0x136d7e84, 0x139c7e7d, 

-	0x13cc7e76, 0x13fb7e6e, 0x142b7e67, 0x145b7e5f, 0x148c7e57, 0x14bc7e4f, 0x14ed7e47, 0x151e7e3f, 

-	0x15507e37, 0x15817e2e, 0x15b37e26, 0x15e57e1d, 0x16187e14, 0x164a7e0b, 0x167d7e02, 0x16b07df9, 

-	0x16e47df0, 0x17177de6, 0x174b7ddd, 0x177f7dd3, 0x17b37dc9, 0x17e87dbf, 0x181d7db5, 0x18527dab, 

-	0x18877da1, 0x18bc7d96, 0x18f27d8c, 0x19287d81, 0x195e7d76, 0x19957d6b, 0x19cb7d60, 0x1a027d54, 

-	0x1a397d49, 0x1a717d3d, 0x1aa87d31, 0x1ae07d26, 0x1b187d19, 0x1b507d0d, 0x1b897d01, 0x1bc27cf4, 

-	0x1bfb7ce8, 0x1c347cdb, 0x1c6d7cce, 0x1ca77cc1, 0x1ce17cb3, 0x1d1b7ca6, 0x1d557c98, 0x1d8f7c8a, 

-	0x1dca7c7c, 0x1e057c6e, 0x1e407c60, 0x1e7b7c51, 0x1eb77c43, 0x1ef37c34, 0x1f2f7c25, 0x1f6b7c16, 

-	0x1fa77c06, 0x1fe47bf7, 0x20217be7, 0x205e7bd7, 0x209b7bc7, 0x20d87bb7, 0x21167ba6, 0x21547b96, 

-	0x21927b85, 0x21d07b74, 0x220e7b63, 0x224d7b52, 0x228c7b40, 0x22cb7b2e, 0x230a7b1c, 0x23497b0a, 

-	0x23897af8, 0x23c87ae6, 0x24087ad3, 0x24487ac0, 0x24897aad, 0x24c97a9a, 0x250a7a86, 0x254b7a73, 

-	0x258c7a5f, 0x25cd7a4b, 0x260e7a36, 0x26507a22, 0x26917a0d, 0x26d379f8, 0x271579e3, 0x275779ce, 

-	0x279a79b8, 0x27dc79a3, 0x281f798d, 0x28627977, 0x28a57960, 0x28e8794a, 0x292b7933, 0x296f791c, 

-	0x29b27905, 0x29f678ed, 0x2a3a78d6, 0x2a7e78be, 0x2ac278a6, 0x2b07788d, 0x2b4b7875, 0x2b90785c, 

-	0x2bd47843, 0x2c19782a, 0x2c5e7810, 0x2ca477f7, 0x2ce977dd, 0x2d2e77c3, 0x2d7477a8, 0x2dba778e, 

-	0x2dff7773, 0x2e457758, 0x2e8b773d, 0x2ed27721, 0x2f187706, 0x2f5e76ea, 0x2fa576cd, 0x2fec76b1, 

-	0x30327694, 0x30797677, 0x30c0765a, 0x3107763d, 0x314e761f, 0x31967601, 0x31dd75e3, 0x322575c5, 

-	0x326c75a6, 0x32b47588, 0x32fc7569, 0x33447549, 0x338c752a, 0x33d4750a, 0x341c74ea, 0x346474ca, 

-	0x34ac74a9, 0x34f57488, 0x353d7467, 0x35857446, 0x35ce7424, 0x36177403, 0x365f73e1, 0x36a873be, 

-	0x36f1739c, 0x373a7379, 0x37837356, 0x37cc7333, 0x3815730f, 0x385e72ec, 0x38a772c8, 0x38f172a3, 

-	0x393a727f, 0x3983725a, 0x39cd7235, 0x3a167210, 0x3a6071ea, 0x3aa971c4, 0x3af3719e, 0x3b3c7178, 

-	0x3b867151, 0x3bd0712b, 0x3c197104, 0x3c6370dc, 0x3cad70b5, 0x3cf7708d, 0x3d407065, 0x3d8a703c, 

-	0x3dd47014, 0x3e1e6feb, 0x3e686fc2, 0x3eb16f98, 0x3efb6f6f, 0x3f456f45, 0x3f8f6f1b, 0x3fd96ef0, 

-	0x40236ec6, 0x406d6e9b, 0x40b66e70, 0x41006e44, 0x414a6e19, 0x41946ded, 0x41de6dc1, 0x42286d94, 

-	0x42716d68, 0x42bb6d3b, 0x43056d0d, 0x434f6ce0, 0x43986cb2, 0x43e26c84, 0x442c6c56, 0x44756c28, 

-	0x44bf6bf9, 0x45086bca, 0x45526b9b, 0x459b6b6b, 0x45e56b3c, 0x462e6b0c, 0x46786adb, 0x46c16aab, 

-	0x470a6a7a, 0x47536a49, 0x479c6a18, 0x47e569e7, 0x482e69b5, 0x48776983, 0x48c06951, 0x4909691e, 

-	0x495268ec, 0x499b68b9, 0x49e36885, 0x4a2c6852, 0x4a74681e, 0x4abd67ea, 0x4b0567b6, 0x4b4d6782, 

-	0x4b95674d, 0x4bde6718, 0x4c2666e3, 0x4c6d66ae, 0x4cb56678, 0x4cfd6642, 0x4d45660c, 0x4d8c65d6, 

-	0x4dd4659f, 0x4e1b6568, 0x4e626531, 0x4ea964fa, 0x4ef064c3, 0x4f37648b, 0x4f7e6453, 0x4fc5641b, 

-	0x500b63e2, 0x505263aa, 0x50986371, 0x50df6338, 0x512562fe, 0x516b62c5, 0x51b1628b, 0x51f66251, 

-	0x523c6217, 0x528161dc, 0x52c761a2, 0x530c6167, 0x5351612c, 0x539660f1, 0x53db60b5, 0x54206079, 

-	0x5464603d, 0x54a96001, 0x54ed5fc5, 0x55315f88, 0x55755f4b, 0x55b95f0e, 0x55fc5ed1, 0x56405e94, 

-	0x56835e56, 0x56c75e18, 0x570a5dda, 0x574d5d9c, 0x578f5d5e, 0x57d25d1f, 0x58145ce0, 0x58565ca1, 

+	0x000a7fff, 0x000e7fff, 0x00127fff, 0x00157fff, 0x00197fff, 0x001c7fff, 0x00207fff, 0x00237fff, 
+	0x00267fff, 0x002a7fff, 0x002d7fff, 0x00307fff, 0x00347fff, 0x00387fff, 0x003b7fff, 0x003f7fff, 
+	0x00437fff, 0x00477fff, 0x004b7fff, 0x004f7fff, 0x00537fff, 0x00577fff, 0x005b7fff, 0x00607fff, 
+	0x00647fff, 0x00697fff, 0x006d7fff, 0x00727fff, 0x00777fff, 0x007c7fff, 0x00817fff, 0x00867fff, 
+	0x008b7fff, 0x00917fff, 0x00967fff, 0x009c7fff, 0x00a17fff, 0x00a77fff, 0x00ad7fff, 0x00b37fff, 
+	0x00b97fff, 0x00bf7fff, 0x00c67fff, 0x00cc7fff, 0x00d37fff, 0x00da7fff, 0x00e07fff, 0x00e77fff, 
+	0x00ee7fff, 0x00f57fff, 0x00fd7fff, 0x01047fff, 0x010c7fff, 0x01137fff, 0x011b7fff, 0x01237fff, 
+	0x012b7fff, 0x01337fff, 0x013c7ffe, 0x01447ffe, 0x014d7ffe, 0x01567ffe, 0x015f7ffe, 0x01687ffe, 
+	0x01717ffe, 0x017a7ffe, 0x01837ffe, 0x018d7ffe, 0x01977ffd, 0x01a17ffd, 0x01ab7ffd, 0x01b57ffd, 
+	0x01bf7ffd, 0x01ca7ffd, 0x01d47ffd, 0x01df7ffc, 0x01ea7ffc, 0x01f57ffc, 0x02007ffc, 0x020c7ffc, 
+	0x02177ffc, 0x02237ffb, 0x022f7ffb, 0x023b7ffb, 0x02477ffb, 0x02537ffb, 0x02607ffa, 0x026d7ffa, 
+	0x027a7ffa, 0x02877ffa, 0x02947ff9, 0x02a17ff9, 0x02af7ff9, 0x02bc7ff9, 0x02ca7ff8, 0x02d87ff8, 
+	0x02e77ff8, 0x02f57ff7, 0x03047ff7, 0x03127ff7, 0x03217ff6, 0x03317ff6, 0x03407ff5, 0x034f7ff5, 
+	0x035f7ff5, 0x036f7ff4, 0x037f7ff4, 0x038f7ff3, 0x03a07ff3, 0x03b07ff2, 0x03c17ff2, 0x03d27ff1, 
+	0x03e37ff1, 0x03f57ff0, 0x04067ff0, 0x04187fef, 0x042a7fef, 0x043c7fee, 0x044f7fed, 0x04617fed, 
+	0x04747fec, 0x04877feb, 0x049a7feb, 0x04ae7fea, 0x04c17fe9, 0x04d57fe9, 0x04e97fe8, 0x04fd7fe7, 
+	0x05127fe6, 0x05277fe5, 0x053b7fe5, 0x05507fe4, 0x05667fe3, 0x057b7fe2, 0x05917fe1, 0x05a77fe0, 
+	0x05bd7fdf, 0x05d37fde, 0x05ea7fdd, 0x06017fdc, 0x06187fdb, 0x062f7fda, 0x06467fd9, 0x065e7fd7, 
+	0x06767fd6, 0x068e7fd5, 0x06a67fd4, 0x06bf7fd2, 0x06d87fd1, 0x06f17fd0, 0x070a7fce, 0x07237fcd, 
+	0x073d7fcc, 0x07577fca, 0x07717fc9, 0x078c7fc7, 0x07a67fc5, 0x07c17fc4, 0x07dc7fc2, 0x07f77fc0, 
+	0x08137fbf, 0x082f7fbd, 0x084b7fbb, 0x08677fb9, 0x08847fb7, 0x08a07fb6, 0x08bd7fb4, 0x08da7fb2, 
+	0x08f87faf, 0x09167fad, 0x09347fab, 0x09527fa9, 0x09707fa7, 0x098f7fa5, 0x09ae7fa2, 0x09cd7fa0, 
+	0x09ec7f9d, 0x0a0c7f9b, 0x0a2c7f98, 0x0a4c7f96, 0x0a6c7f93, 0x0a8d7f91, 0x0aae7f8e, 0x0acf7f8b, 
+	0x0af07f88, 0x0b127f85, 0x0b337f82, 0x0b557f7f, 0x0b787f7c, 0x0b9a7f79, 0x0bbd7f76, 0x0be07f73, 
+	0x0c047f6f, 0x0c277f6c, 0x0c4b7f69, 0x0c6f7f65, 0x0c937f61, 0x0cb87f5e, 0x0cdd7f5a, 0x0d027f56, 
+	0x0d277f53, 0x0d4d7f4f, 0x0d737f4b, 0x0d997f47, 0x0dbf7f43, 0x0de67f3e, 0x0e0c7f3a, 0x0e347f36, 
+	0x0e5b7f31, 0x0e837f2d, 0x0eaa7f28, 0x0ed37f24, 0x0efb7f1f, 0x0f237f1a, 0x0f4c7f15, 0x0f757f10, 
+	0x0f9f7f0b, 0x0fc87f06, 0x0ff27f01, 0x101c7efb, 0x10477ef6, 0x10717ef0, 0x109c7eeb, 0x10c87ee5, 
+	0x10f37edf, 0x111f7eda, 0x114a7ed4, 0x11777ece, 0x11a37ec7, 0x11d07ec1, 0x11fd7ebb, 0x122a7eb4, 
+	0x12577eae, 0x12857ea7, 0x12b37ea0, 0x12e17e9a, 0x130f7e93, 0x133e7e8c, 0x136d7e84, 0x139c7e7d, 
+	0x13cc7e76, 0x13fb7e6e, 0x142b7e67, 0x145b7e5f, 0x148c7e57, 0x14bc7e4f, 0x14ed7e47, 0x151e7e3f, 
+	0x15507e37, 0x15817e2e, 0x15b37e26, 0x15e57e1d, 0x16187e14, 0x164a7e0b, 0x167d7e02, 0x16b07df9, 
+	0x16e47df0, 0x17177de6, 0x174b7ddd, 0x177f7dd3, 0x17b37dc9, 0x17e87dbf, 0x181d7db5, 0x18527dab, 
+	0x18877da1, 0x18bc7d96, 0x18f27d8c, 0x19287d81, 0x195e7d76, 0x19957d6b, 0x19cb7d60, 0x1a027d54, 
+	0x1a397d49, 0x1a717d3d, 0x1aa87d31, 0x1ae07d26, 0x1b187d19, 0x1b507d0d, 0x1b897d01, 0x1bc27cf4, 
+	0x1bfb7ce8, 0x1c347cdb, 0x1c6d7cce, 0x1ca77cc1, 0x1ce17cb3, 0x1d1b7ca6, 0x1d557c98, 0x1d8f7c8a, 
+	0x1dca7c7c, 0x1e057c6e, 0x1e407c60, 0x1e7b7c51, 0x1eb77c43, 0x1ef37c34, 0x1f2f7c25, 0x1f6b7c16, 
+	0x1fa77c06, 0x1fe47bf7, 0x20217be7, 0x205e7bd7, 0x209b7bc7, 0x20d87bb7, 0x21167ba6, 0x21547b96, 
+	0x21927b85, 0x21d07b74, 0x220e7b63, 0x224d7b52, 0x228c7b40, 0x22cb7b2e, 0x230a7b1c, 0x23497b0a, 
+	0x23897af8, 0x23c87ae6, 0x24087ad3, 0x24487ac0, 0x24897aad, 0x24c97a9a, 0x250a7a86, 0x254b7a73, 
+	0x258c7a5f, 0x25cd7a4b, 0x260e7a36, 0x26507a22, 0x26917a0d, 0x26d379f8, 0x271579e3, 0x275779ce, 
+	0x279a79b8, 0x27dc79a3, 0x281f798d, 0x28627977, 0x28a57960, 0x28e8794a, 0x292b7933, 0x296f791c, 
+	0x29b27905, 0x29f678ed, 0x2a3a78d6, 0x2a7e78be, 0x2ac278a6, 0x2b07788d, 0x2b4b7875, 0x2b90785c, 
+	0x2bd47843, 0x2c19782a, 0x2c5e7810, 0x2ca477f7, 0x2ce977dd, 0x2d2e77c3, 0x2d7477a8, 0x2dba778e, 
+	0x2dff7773, 0x2e457758, 0x2e8b773d, 0x2ed27721, 0x2f187706, 0x2f5e76ea, 0x2fa576cd, 0x2fec76b1, 
+	0x30327694, 0x30797677, 0x30c0765a, 0x3107763d, 0x314e761f, 0x31967601, 0x31dd75e3, 0x322575c5, 
+	0x326c75a6, 0x32b47588, 0x32fc7569, 0x33447549, 0x338c752a, 0x33d4750a, 0x341c74ea, 0x346474ca, 
+	0x34ac74a9, 0x34f57488, 0x353d7467, 0x35857446, 0x35ce7424, 0x36177403, 0x365f73e1, 0x36a873be, 
+	0x36f1739c, 0x373a7379, 0x37837356, 0x37cc7333, 0x3815730f, 0x385e72ec, 0x38a772c8, 0x38f172a3, 
+	0x393a727f, 0x3983725a, 0x39cd7235, 0x3a167210, 0x3a6071ea, 0x3aa971c4, 0x3af3719e, 0x3b3c7178, 
+	0x3b867151, 0x3bd0712b, 0x3c197104, 0x3c6370dc, 0x3cad70b5, 0x3cf7708d, 0x3d407065, 0x3d8a703c, 
+	0x3dd47014, 0x3e1e6feb, 0x3e686fc2, 0x3eb16f98, 0x3efb6f6f, 0x3f456f45, 0x3f8f6f1b, 0x3fd96ef0, 
+	0x40236ec6, 0x406d6e9b, 0x40b66e70, 0x41006e44, 0x414a6e19, 0x41946ded, 0x41de6dc1, 0x42286d94, 
+	0x42716d68, 0x42bb6d3b, 0x43056d0d, 0x434f6ce0, 0x43986cb2, 0x43e26c84, 0x442c6c56, 0x44756c28, 
+	0x44bf6bf9, 0x45086bca, 0x45526b9b, 0x459b6b6b, 0x45e56b3c, 0x462e6b0c, 0x46786adb, 0x46c16aab, 
+	0x470a6a7a, 0x47536a49, 0x479c6a18, 0x47e569e7, 0x482e69b5, 0x48776983, 0x48c06951, 0x4909691e, 
+	0x495268ec, 0x499b68b9, 0x49e36885, 0x4a2c6852, 0x4a74681e, 0x4abd67ea, 0x4b0567b6, 0x4b4d6782, 
+	0x4b95674d, 0x4bde6718, 0x4c2666e3, 0x4c6d66ae, 0x4cb56678, 0x4cfd6642, 0x4d45660c, 0x4d8c65d6, 
+	0x4dd4659f, 0x4e1b6568, 0x4e626531, 0x4ea964fa, 0x4ef064c3, 0x4f37648b, 0x4f7e6453, 0x4fc5641b, 
+	0x500b63e2, 0x505263aa, 0x50986371, 0x50df6338, 0x512562fe, 0x516b62c5, 0x51b1628b, 0x51f66251, 
+	0x523c6217, 0x528161dc, 0x52c761a2, 0x530c6167, 0x5351612c, 0x539660f1, 0x53db60b5, 0x54206079, 
+	0x5464603d, 0x54a96001, 0x54ed5fc5, 0x55315f88, 0x55755f4b, 0x55b95f0e, 0x55fc5ed1, 0x56405e94, 
+	0x56835e56, 0x56c75e18, 0x570a5dda, 0x574d5d9c, 0x578f5d5e, 0x57d25d1f, 0x58145ce0, 0x58565ca1, 
 	0x58995c62, 0x58da5c23, 0x591c5be3, 0x595e5ba4, 0x599f5b64, 0x59e05b24, 0x5a215ae3, 0x5a625aa3
 };
 
@@ -1334,15 +1334,15 @@
 	0x7f5571cd, 0x7f801003, 0x7faab1c8, 0x7fd5571d
 };
 
-

-const Word32 invSBF[24] = {

-  0x3FFD34FC, 0x2D3F8000, 0x24F18C7E, 0x1FFE9A7E, 

-  0x1C9DF10C, 0x1A1F851A, 0x182FE994, 0x169FC000, 

-  0x15542AAA, 0x143C31C2, 0x134B1B6C, 0x127920BE, 

-  0x11BF2FCC, 0x111A749E, 0x1085FC42, 0x0FFFA7BE, 

-  0x0F855818, 0x0F14EE56, 0x0EAE6A78, 0x0E4EF886, 

-  0x0DF69880, 0x0DA49568, 0x0D578542, 0x0D101D0C

-};

+
+const Word32 invSBF[24] = {
+  0x3FFD34FC, 0x2D3F8000, 0x24F18C7E, 0x1FFE9A7E, 
+  0x1C9DF10C, 0x1A1F851A, 0x182FE994, 0x169FC000, 
+  0x15542AAA, 0x143C31C2, 0x134B1B6C, 0x127920BE, 
+  0x11BF2FCC, 0x111A749E, 0x1085FC42, 0x0FFFA7BE, 
+  0x0F855818, 0x0F14EE56, 0x0EAE6A78, 0x0E4EF886, 
+  0x0DF69880, 0x0DA49568, 0x0D578542, 0x0D101D0C
+};
 
 const Word16 pow2tominusNover16[17] = {
   0x7fff, 0x7a93, 0x7560, 0x7066,
@@ -1350,21 +1350,21 @@
   0x5a82, 0x56ac, 0x52ff, 0x4f7b,
   0x4c1c, 0x48e2, 0x45cb, 0x42d5,
   0x4000
-};

-

-const Word16 sideInfoTabLong[MAX_SFB_LONG + 1] = {

-  9, 9, 9, 9, 9, 9, 9, 9, 9, 

-  9, 9, 9, 9, 9, 9, 9, 9, 9, 

-  9, 9, 9, 9, 9, 9, 9, 9, 9, 

-  9, 9, 9, 9, 14, 14, 14, 14, 

-  14, 14, 14, 14, 14, 14, 14, 

-  14, 14, 14, 14, 14, 14, 14, 

-  14, 14, 14

-};

-

-const Word16 sideInfoTabShort[MAX_SFB_SHORT + 1] = {

-  7, 7, 7, 7, 7, 7, 7, 10, 10, 

-  10, 10, 10, 10, 10, 13, 13

+};
+
+const Word16 sideInfoTabLong[MAX_SFB_LONG + 1] = {
+  9, 9, 9, 9, 9, 9, 9, 9, 9, 
+  9, 9, 9, 9, 9, 9, 9, 9, 9, 
+  9, 9, 9, 9, 9, 9, 9, 9, 9, 
+  9, 9, 9, 9, 14, 14, 14, 14, 
+  14, 14, 14, 14, 14, 14, 14, 
+  14, 14, 14, 14, 14, 14, 14, 
+  14, 14, 14
+};
+
+const Word16 sideInfoTabShort[MAX_SFB_SHORT + 1] = {
+  7, 7, 7, 7, 7, 7, 7, 10, 10, 
+  10, 10, 10, 10, 10, 13, 13
 };
 
 Word32 specExpMantTableComb_enc[4][14] =
@@ -1398,33 +1398,33 @@
   {1, 3, 4, 5, 7, 8, 9, 11, 12, 13, 15, 16, 17, 19}
 };
 
-const Word16 quantBorders[4][4] = {

-  /* pow(1.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */

-  {0x0400, 0x0ee7, 0x1c86, 0x2c0d},

-  /* pow(2.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */

-  {0x04c2, 0x11b9, 0x21eb, 0x3463},

-  /* pow(3.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */

-  {0x05a8, 0x1514, 0x2856, 0x3e4c},

-  /* pow(4.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */

-  {0x06ba, 0x1911, 0x2ff8, 0x4a16},

-};

-
-const Word16 quantRecon[4][3] = {

-  {0x0800, 0x1429, 0x229d},

-  {0x0983, 0x17f9, 0x292a},

-  {0x0b50, 0x1c82, 0x30f4},

-  {0x0d74, 0x21e7, 0x3a37},

+const Word16 quantBorders[4][4] = {
+  /* pow(1.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */
+  {0x0400, 0x0ee7, 0x1c86, 0x2c0d},
+  /* pow(2.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */
+  {0x04c2, 0x11b9, 0x21eb, 0x3463},
+  /* pow(3.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */
+  {0x05a8, 0x1514, 0x2856, 0x3e4c},
+  /* pow(4.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */
+  {0x06ba, 0x1911, 0x2ff8, 0x4a16},
 };
 
-const int sampRateTab[NUM_SAMPLE_RATES] = {

-    96000, 88200, 64000, 48000, 44100, 32000, 

-	24000, 22050, 16000, 12000, 11025,  8000

+const Word16 quantRecon[4][3] = {
+  {0x0800, 0x1429, 0x229d},
+  {0x0983, 0x17f9, 0x292a},
+  {0x0b50, 0x1c82, 0x30f4},
+  {0x0d74, 0x21e7, 0x3a37},
+};
+
+const int sampRateTab[NUM_SAMPLE_RATES] = {
+    96000, 88200, 64000, 48000, 44100, 32000, 
+	24000, 22050, 16000, 12000, 11025,  8000
 };
 
 
-const int	rates[8] = {		

-	160, 240, 320, 400, 480, 560, 640, 0

-};

+const int	rates[8] = {		
+	160, 240, 320, 400, 480, 560, 640, 0
+};
 
 const int BandwithCoefTab[8][NUM_SAMPLE_RATES] = {
 	{ 7000,  7000,  4666,  3500,  3500,  2800,  2800,  2800,  2800,  2000,  2000,  2000},
@@ -1438,73 +1438,73 @@
 };
 
 
-/* total number of scale factor bands in one window */

-const UWord8 sfBandTotalShort[NUM_SAMPLE_RATES] = {

-    12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15

-};

-

-const UWord8 sfBandTotalLong[NUM_SAMPLE_RATES] = {

-    41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40

-};

-

-/* scale factor band tables */

-const int sfBandTabShortOffset[NUM_SAMPLE_RATES] = {0, 0, 0, 13, 13, 13, 28, 28, 44, 44, 44, 60};

-

-const short sfBandTabShort[76] = {

-	/* short block 64, 88, 96 kHz [13]  */

-	0,   4,   8,  12,  16,  20,  24,  32,  40,  48,  64,  92, 128,

-

-	/* short block 32, 44, 48 kHz [15]  */

-	0,   4,   8,  12,  16,  20,  28,  36,  44,  56,  68,  80,  96, 112, 128,

-

-	/* short block 22, 24 kHz [16]  */

-	0,   4,   8,  12,  16,  20,  24,  28,  36,  44,  52,  64,  76,  92, 108, 128,

-

-	/* short block 11, 12, 16 kHz [16] */

-	0,   4,   8,  12,  16,  20,  24,  28,  32,  40,  48,  60,  72,  88, 108, 128,

-

-	/* short block 8 kHz [16] */

-	0,   4,   8,  12,  16,  20,  24,  28,  36,  44,  52,  60,  72,  88, 108, 128

-};

-

-const int sfBandTabLongOffset[NUM_SAMPLE_RATES] = {0, 0, 42, 90, 90, 140, 192, 192, 240, 240, 240, 284};

-

-const short sfBandTabLong[325] = {

-	/* long block 88, 96 kHz [42]  */

-	  0,   4,   8,  12,  16,  20,  24,  28,  32,  36,  40,  44,  48,   52,

-	 56,  64,  72,  80,  88,  96, 108, 120, 132, 144, 156, 172, 188,  212,

-	240, 276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024,

-

-	/* long block 64 kHz [48]  */

-	  0,   4,   8,  12,  16,  20,  24,  28,  32,  36,  40,  44,  48,  52,  56,   64,

-	 72,  80,  88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268, 304, 344,  384,

-	424, 464, 504, 544, 584, 624, 664, 704, 744, 784, 824, 864, 904, 944, 984, 1024,

-

-	/* long block 44, 48 kHz [50] */

-	  0,   4,   8,  12,  16,  20,  24,  28,  32,  36,  40,  48,  56,  64,  72,   80,  88,

-	 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384,  416, 448,

-	480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 1024,

-

-	/* long block 32 kHz [52] */

-	  0,   4,   8,  12,  16,  20,  24,  28,  32,  36,  40,  48,  56,  64,  72,   80,  88,  96,

-	108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416,  448, 480, 512,

-	544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 992, 1024,

-

-	/* long block 22, 24 kHz [48] */

-	  0,   4,   8,  12,  16,  20,  24,  28,  32,  36,  40,  44,  52,  60,  68,   76,

-	 84,  92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220, 240, 260,  284,

-	308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704, 768, 832, 896, 960, 1024,

-

-	/* long block 11, 12, 16 kHz [44] */

-	  0,   8,  16,  24,  32,  40,  48,  56,  64,  72,  80,  88, 100,  112, 124,

-	136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320,  344, 368,

-	396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024,

-

-	/* long block 8 kHz [41]  */

-	  0,  12,  24,  36,  48,  60,  72,  84,  96, 108, 120, 132,  144, 156,

-	172, 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372,  396, 420,

-	448, 476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024

-};

+/* total number of scale factor bands in one window */
+const UWord8 sfBandTotalShort[NUM_SAMPLE_RATES] = {
+    12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15
+};
+
+const UWord8 sfBandTotalLong[NUM_SAMPLE_RATES] = {
+    41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40
+};
+
+/* scale factor band tables */
+const int sfBandTabShortOffset[NUM_SAMPLE_RATES] = {0, 0, 0, 13, 13, 13, 28, 28, 44, 44, 44, 60};
+
+const short sfBandTabShort[76] = {
+	/* short block 64, 88, 96 kHz [13]  */
+	0,   4,   8,  12,  16,  20,  24,  32,  40,  48,  64,  92, 128,
+
+	/* short block 32, 44, 48 kHz [15]  */
+	0,   4,   8,  12,  16,  20,  28,  36,  44,  56,  68,  80,  96, 112, 128,
+
+	/* short block 22, 24 kHz [16]  */
+	0,   4,   8,  12,  16,  20,  24,  28,  36,  44,  52,  64,  76,  92, 108, 128,
+
+	/* short block 11, 12, 16 kHz [16] */
+	0,   4,   8,  12,  16,  20,  24,  28,  32,  40,  48,  60,  72,  88, 108, 128,
+
+	/* short block 8 kHz [16] */
+	0,   4,   8,  12,  16,  20,  24,  28,  36,  44,  52,  60,  72,  88, 108, 128
+};
+
+const int sfBandTabLongOffset[NUM_SAMPLE_RATES] = {0, 0, 42, 90, 90, 140, 192, 192, 240, 240, 240, 284};
+
+const short sfBandTabLong[325] = {
+	/* long block 88, 96 kHz [42]  */
+	  0,   4,   8,  12,  16,  20,  24,  28,  32,  36,  40,  44,  48,   52,
+	 56,  64,  72,  80,  88,  96, 108, 120, 132, 144, 156, 172, 188,  212,
+	240, 276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024,
+
+	/* long block 64 kHz [48]  */
+	  0,   4,   8,  12,  16,  20,  24,  28,  32,  36,  40,  44,  48,  52,  56,   64,
+	 72,  80,  88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268, 304, 344,  384,
+	424, 464, 504, 544, 584, 624, 664, 704, 744, 784, 824, 864, 904, 944, 984, 1024,
+
+	/* long block 44, 48 kHz [50] */
+	  0,   4,   8,  12,  16,  20,  24,  28,  32,  36,  40,  48,  56,  64,  72,   80,  88,
+	 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384,  416, 448,
+	480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 1024,
+
+	/* long block 32 kHz [52] */
+	  0,   4,   8,  12,  16,  20,  24,  28,  32,  36,  40,  48,  56,  64,  72,   80,  88,  96,
+	108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416,  448, 480, 512,
+	544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 992, 1024,
+
+	/* long block 22, 24 kHz [48] */
+	  0,   4,   8,  12,  16,  20,  24,  28,  32,  36,  40,  44,  52,  60,  68,   76,
+	 84,  92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220, 240, 260,  284,
+	308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704, 768, 832, 896, 960, 1024,
+
+	/* long block 11, 12, 16 kHz [44] */
+	  0,   8,  16,  24,  32,  40,  48,  56,  64,  72,  80,  88, 100,  112, 124,
+	136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320,  344, 368,
+	396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024,
+
+	/* long block 8 kHz [41]  */
+	  0,  12,  24,  36,  48,  60,  72,  84,  96, 108, 120, 132,  144, 156,
+	172, 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372,  396, 420,
+	448, 476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024
+};
 
 /*
   these tables are used only for counting and 
@@ -2344,20 +2344,20 @@
 };
 
 
-const unsigned char bitrevTab[17 + 129] = 

-{

-/* 64 */

-0x01, 0x08, 0x02, 0x04, 0x03, 0x0c, 0x05, 0x0a, 0x07, 0x0e, 0x0b, 0x0d, 0x00, 0x06, 0x09, 0x0f,

-0x00,

-

-/* 512 */

-0x01, 0x40, 0x02, 0x20, 0x03, 0x60, 0x04, 0x10, 0x05, 0x50, 0x06, 0x30, 0x07, 0x70, 0x09, 0x48,

-0x0a, 0x28, 0x0b, 0x68, 0x0c, 0x18, 0x0d, 0x58, 0x0e, 0x38, 0x0f, 0x78, 0x11, 0x44, 0x12, 0x24,

-0x13, 0x64, 0x15, 0x54, 0x16, 0x34, 0x17, 0x74, 0x19, 0x4c, 0x1a, 0x2c, 0x1b, 0x6c, 0x1d, 0x5c,

-0x1e, 0x3c, 0x1f, 0x7c, 0x21, 0x42, 0x23, 0x62, 0x25, 0x52, 0x26, 0x32, 0x27, 0x72, 0x29, 0x4a,

-0x2b, 0x6a, 0x2d, 0x5a, 0x2e, 0x3a, 0x2f, 0x7a, 0x31, 0x46, 0x33, 0x66, 0x35, 0x56, 0x37, 0x76,

-0x39, 0x4e, 0x3b, 0x6e, 0x3d, 0x5e, 0x3f, 0x7e, 0x43, 0x61, 0x45, 0x51, 0x47, 0x71, 0x4b, 0x69,

-0x4d, 0x59, 0x4f, 0x79, 0x53, 0x65, 0x57, 0x75, 0x5b, 0x6d, 0x5f, 0x7d, 0x67, 0x73, 0x6f, 0x7b,

-0x00, 0x08, 0x14, 0x1c, 0x22, 0x2a, 0x36, 0x3e, 0x41, 0x49, 0x55, 0x5d, 0x63, 0x6b, 0x77, 0x7f,

-0x00,

+const unsigned char bitrevTab[17 + 129] = 
+{
+/* 64 */
+0x01, 0x08, 0x02, 0x04, 0x03, 0x0c, 0x05, 0x0a, 0x07, 0x0e, 0x0b, 0x0d, 0x00, 0x06, 0x09, 0x0f,
+0x00,
+
+/* 512 */
+0x01, 0x40, 0x02, 0x20, 0x03, 0x60, 0x04, 0x10, 0x05, 0x50, 0x06, 0x30, 0x07, 0x70, 0x09, 0x48,
+0x0a, 0x28, 0x0b, 0x68, 0x0c, 0x18, 0x0d, 0x58, 0x0e, 0x38, 0x0f, 0x78, 0x11, 0x44, 0x12, 0x24,
+0x13, 0x64, 0x15, 0x54, 0x16, 0x34, 0x17, 0x74, 0x19, 0x4c, 0x1a, 0x2c, 0x1b, 0x6c, 0x1d, 0x5c,
+0x1e, 0x3c, 0x1f, 0x7c, 0x21, 0x42, 0x23, 0x62, 0x25, 0x52, 0x26, 0x32, 0x27, 0x72, 0x29, 0x4a,
+0x2b, 0x6a, 0x2d, 0x5a, 0x2e, 0x3a, 0x2f, 0x7a, 0x31, 0x46, 0x33, 0x66, 0x35, 0x56, 0x37, 0x76,
+0x39, 0x4e, 0x3b, 0x6e, 0x3d, 0x5e, 0x3f, 0x7e, 0x43, 0x61, 0x45, 0x51, 0x47, 0x71, 0x4b, 0x69,
+0x4d, 0x59, 0x4f, 0x79, 0x53, 0x65, 0x57, 0x75, 0x5b, 0x6d, 0x5f, 0x7d, 0x67, 0x73, 0x6f, 0x7b,
+0x00, 0x08, 0x14, 0x1c, 0x22, 0x2a, 0x36, 0x3e, 0x41, 0x49, 0x55, 0x5d, 0x63, 0x6b, 0x77, 0x7f,
+0x00,
 };
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/src/aacenc.c b/media/libstagefright/codecs/aacenc/src/aacenc.c
index 552ae41..975f598 100644
--- a/media/libstagefright/codecs/aacenc/src/aacenc.c
+++ b/media/libstagefright/codecs/aacenc/src/aacenc.c
@@ -1,105 +1,105 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		aacenc.c

-

-	Content:	aac encoder interface functions

-

-*******************************************************************************/

-

-#include "voAAC.h"

-#include "typedef.h"

-#include "aacenc_core.h"

-#include "aac_rom.h"

-#include "cmnMemory.h"

-#include "memalign.h"

-

-/**

-* Init the audio codec module and return codec handle

-* \param phCodec [OUT] Return the video codec handle

-* \param vType	[IN] The codec type if the module support multi codec.

-* \param pUserData	[IN] The init param. It is memory operator or alloced memory

-* \retval VO_ERR_NONE Succeeded.

-*/

-VO_U32 VO_API voAACEncInit(VO_HANDLE * phCodec,VO_AUDIO_CODINGTYPE vType, VO_CODEC_INIT_USERDATA *pUserData)

-{

-	AAC_ENCODER*hAacEnc;

-	AACENC_CONFIG config;

-	int error;

-

-#ifdef USE_DEAULT_MEM

-	VO_MEM_OPERATOR voMemoprator;

-#endif

-	VO_MEM_OPERATOR *pMemOP;

-	int interMem;

-

-	interMem = 0;

-	error = 0;

-	

-	/* init the memory operator */

-	if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL )

-	{

-#ifdef USE_DEAULT_MEM

-		voMemoprator.Alloc = cmnMemAlloc;

-		voMemoprator.Copy = cmnMemCopy;

-		voMemoprator.Free = cmnMemFree;

-		voMemoprator.Set = cmnMemSet;

-		voMemoprator.Check = cmnMemCheck;

-

-		interMem = 1;

-

-		pMemOP = &voMemoprator;

-#else

-		*phCodec = NULL;

-		return VO_ERR_INVALID_ARG;

-#endif

-	}

-	else

-	{

-		pMemOP = (VO_MEM_OPERATOR *)pUserData->memData;

-	}

-

-	/* init the aac encoder handle */

-	hAacEnc = (AAC_ENCODER*)mem_malloc(pMemOP, sizeof(AAC_ENCODER), 32, VO_INDEX_ENC_AAC);

-	if(NULL == hAacEnc)

-	{

-		error = 1;

-	}

-

-	if(!error)

-	{

-		/* init the aac encoder intra memory */

-		hAacEnc->intbuf = (short *)mem_malloc(pMemOP, AACENC_BLOCKSIZE*MAX_CHANNELS*sizeof(short), 32, VO_INDEX_ENC_AAC);

-		if(NULL == hAacEnc->intbuf)

-		{

-			error = 1;

-		}

-	}

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		aacenc.c
+
+	Content:	aac encoder interface functions
+
+*******************************************************************************/
+
+#include "voAAC.h"
+#include "typedef.h"
+#include "aacenc_core.h"
+#include "aac_rom.h"
+#include "cmnMemory.h"
+#include "memalign.h"
+
+/**
+* Init the audio codec module and return codec handle
+* \param phCodec [OUT] Return the video codec handle
+* \param vType	[IN] The codec type if the module support multi codec.
+* \param pUserData	[IN] The init param. It is memory operator or alloced memory
+* \retval VO_ERR_NONE Succeeded.
+*/
+VO_U32 VO_API voAACEncInit(VO_HANDLE * phCodec,VO_AUDIO_CODINGTYPE vType, VO_CODEC_INIT_USERDATA *pUserData)
+{
+	AAC_ENCODER*hAacEnc;
+	AACENC_CONFIG config;
+	int error;
+
+#ifdef USE_DEAULT_MEM
+	VO_MEM_OPERATOR voMemoprator;
+#endif
+	VO_MEM_OPERATOR *pMemOP;
+	int interMem;
+
+	interMem = 0;
+	error = 0;
+	
+	/* init the memory operator */
+	if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL )
+	{
+#ifdef USE_DEAULT_MEM
+		voMemoprator.Alloc = cmnMemAlloc;
+		voMemoprator.Copy = cmnMemCopy;
+		voMemoprator.Free = cmnMemFree;
+		voMemoprator.Set = cmnMemSet;
+		voMemoprator.Check = cmnMemCheck;
+
+		interMem = 1;
+
+		pMemOP = &voMemoprator;
+#else
+		*phCodec = NULL;
+		return VO_ERR_INVALID_ARG;
+#endif
+	}
+	else
+	{
+		pMemOP = (VO_MEM_OPERATOR *)pUserData->memData;
+	}
+
+	/* init the aac encoder handle */
+	hAacEnc = (AAC_ENCODER*)mem_malloc(pMemOP, sizeof(AAC_ENCODER), 32, VO_INDEX_ENC_AAC);
+	if(NULL == hAacEnc)
+	{
+		error = 1;
+	}
+
+	if(!error)
+	{
+		/* init the aac encoder intra memory */
+		hAacEnc->intbuf = (short *)mem_malloc(pMemOP, AACENC_BLOCKSIZE*MAX_CHANNELS*sizeof(short), 32, VO_INDEX_ENC_AAC);
+		if(NULL == hAacEnc->intbuf)
+		{
+			error = 1;
+		}
+	}
+
 	if (!error) {
 		/* init the aac encoder psychoacoustic */
 		error = (PsyNew(&hAacEnc->psyKernel, MAX_CHANNELS, pMemOP) ||
 			PsyOutNew(&hAacEnc->psyOut, pMemOP));
-	}

-

+	}
+
 	if (!error) {
 		/* init the aac encoder quantization elements */
 		error = QCOutNew(&hAacEnc->qcOut,MAX_CHANNELS, pMemOP);
-	}

-

+	}
+
 	if (!error) {
 		/* init the aac encoder quantization state */
 		error = QCNew(&hAacEnc->qcKernel, pMemOP);
@@ -116,380 +116,380 @@
 		}		
 		*phCodec = NULL;
 		return VO_ERR_OUTOF_MEMORY;
-	}

-

-	/* init the aac encoder memory operator  */

-#ifdef USE_DEAULT_MEM

-	if(interMem)

-	{

-		hAacEnc->voMemoprator.Alloc = cmnMemAlloc;

-		hAacEnc->voMemoprator.Copy = cmnMemCopy;

-		hAacEnc->voMemoprator.Free = cmnMemFree;

-		hAacEnc->voMemoprator.Set = cmnMemSet;

-		hAacEnc->voMemoprator.Check = cmnMemCheck;

-

-		pMemOP = &hAacEnc->voMemoprator;

-	}

-#endif

-	/* init the aac encoder default parameter  */

-	if(hAacEnc->initOK == 0)

-	{

-		 AACENC_CONFIG config;

-		 config.adtsUsed = 1;

-		 config.bitRate = 128000;

-		 config.nChannelsIn = 2;

-		 config.nChannelsOut = 2;

-		 config.sampleRate = 44100;

-		 config.bandWidth = 20000;

-

-		 AacEncOpen(hAacEnc, config);

-	}

-

-	hAacEnc->voMemop = pMemOP;

-

-	*phCodec = hAacEnc;

-

-	return VO_ERR_NONE;

-}

-

-/**

-* Set input audio data.

-* \param hCodec [IN]] The Codec Handle which was created by Init function.

-* \param pInput [IN] The input buffer param.

-* \param pOutBuffer [OUT] The output buffer info.

-* \retval VO_ERR_NONE Succeeded.

-*/

-VO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput)

-{

-	AAC_ENCODER *hAacEnc;

-	int  length;

-

-	if(NULL == hCodec || NULL == pInput || NULL == pInput->Buffer)

-	{

-		return VO_ERR_INVALID_ARG;

-	}

-	

-	hAacEnc = (AAC_ENCODER *)hCodec;

-	

-	/* init input pcm buffer and length*/

-	hAacEnc->inbuf = (short *)pInput->Buffer;

-	hAacEnc->inlen = pInput->Length / sizeof(short);

-	hAacEnc->uselength = 0;

-

-	hAacEnc->encbuf = hAacEnc->inbuf;

-	hAacEnc->enclen = hAacEnc->inlen;

-	

-	/* rebuild intra pcm buffer and length*/

-	if(hAacEnc->intlen)

-	{

-		length = min(hAacEnc->config.nChannelsIn*AACENC_BLOCKSIZE - hAacEnc->intlen, hAacEnc->inlen);

-		hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf + hAacEnc->intlen, 

-			hAacEnc->inbuf, length*sizeof(short));

-

-		hAacEnc->encbuf = hAacEnc->intbuf;

-		hAacEnc->enclen = hAacEnc->intlen + length;

-

-		hAacEnc->inbuf += length;

-		hAacEnc->inlen -= length;

-	}

-	

-	return VO_ERR_NONE;

-}

-

-/**

-* Get the outut audio data

-* \param hCodec [IN]] The Codec Handle which was created by Init function.

-* \param pOutBuffer [OUT] The output audio data

-* \param pOutInfo [OUT] The dec module filled audio format and used the input size.

-*						 pOutInfo->InputUsed is total used the input size.

-* \retval  VO_ERR_NONE Succeeded.

-*			VO_ERR_INPUT_BUFFER_SMALL. The input was finished or the input data was not enought.

-*/

-VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput, VO_AUDIO_OUTPUTINFO * pOutInfo)

-{

-	AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;

-	Word16 numAncDataBytes=0;

-	Word32  inbuflen;

-	int ret, length;

-	if(NULL == hAacEnc)

-		return VO_ERR_INVALID_ARG;

-

-	 inbuflen = AACENC_BLOCKSIZE*hAacEnc->config.nChannelsIn;

-

-	 /* check the input pcm buffer and length*/

-	 if(NULL == hAacEnc->encbuf || hAacEnc->enclen < inbuflen)

-	 {

-		length = hAacEnc->enclen;		

-		if(hAacEnc->intlen == 0)

-		{	

-			hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf, 

-				hAacEnc->encbuf, length*sizeof(short));		

-			hAacEnc->uselength += length*sizeof(short);

-		}

-		else

-		{

-			hAacEnc->uselength += (length - hAacEnc->intlen)*sizeof(short);

-		}

-

-		hAacEnc->intlen = length;

-

-		pOutput->Length = 0;

-		if(pOutInfo)

-			pOutInfo->InputUsed = hAacEnc->uselength;

-		return VO_ERR_INPUT_BUFFER_SMALL;	

-	 }

-

-	 /* check the output aac buffer and length*/

-	 if(NULL == pOutput || NULL == pOutput->Buffer || pOutput->Length < (6144/8)*hAacEnc->config.nChannelsOut/(sizeof(Word32)))

-		 return VO_ERR_OUTPUT_BUFFER_SMALL;

-

-	 /* aac encoder core function */

-	 AacEncEncode( hAacEnc,

-			(Word16*)hAacEnc->encbuf,

-			NULL,

-			&numAncDataBytes,

-			pOutput->Buffer,

-			&pOutput->Length);

-

-	 /* update the input pcm buffer and length*/

-	 if(hAacEnc->intlen)

-	 {

-		length = inbuflen - hAacEnc->intlen;		

-		hAacEnc->encbuf = hAacEnc->inbuf;

-		hAacEnc->enclen = hAacEnc->inlen;

-		hAacEnc->uselength += length*sizeof(short);

-		hAacEnc->intlen = 0;

-	 }

-	 else

-	 {

-		 hAacEnc->encbuf = hAacEnc->encbuf + inbuflen;

-		 hAacEnc->enclen = hAacEnc->enclen - inbuflen;

-		 hAacEnc->uselength += inbuflen*sizeof(short);

-	 }	 

-

-	 /* update the output aac information */

-	if(pOutInfo)

-	{

-		pOutInfo->Format.Channels = hAacEnc->config.nChannelsOut;

-		pOutInfo->Format.SampleRate = hAacEnc->config.sampleRate;

-		pOutInfo->Format.SampleBits = 16;

-		pOutInfo->InputUsed = hAacEnc->uselength;

-	}

-

-	 return VO_ERR_NONE;

-}

-

-/**

-* Uninit the Codec.

-* \param hCodec [IN]] The Codec Handle which was created by Init function.

-* \retval VO_ERR_NONE Succeeded.

-*/

-VO_U32 VO_API voAACEncUninit(VO_HANDLE hCodec)

-{

-	AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;

-	

-	if(NULL != hAacEnc)

-	{

-		/* close the aac encoder */

-		AacEncClose(hAacEnc, hAacEnc->voMemop);

-

-		/* free the aac encoder handle*/

-		mem_free(hAacEnc->voMemop, hAacEnc, VO_INDEX_ENC_AAC);

-		hAacEnc = NULL;

-	}	

-

-	return VO_ERR_NONE;

-}

-

-/**

-* Set the param for special target.

-* \param hCodec [IN]] The Codec Handle which was created by Init function.

-* \param uParamID [IN] The param ID.

-* \param pData [IN] The param value depend on the ID>

-* \retval VO_ERR_NONE Succeeded.

-*/

-VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)

-{

-	AACENC_CONFIG config;

-	AACENC_PARAM* pAAC_param;

-	VO_AUDIO_FORMAT *pWAV_Format;

-	AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;

-	int ret, i, bitrate, tmp;

-	int SampleRateIdx;

-

-	if(NULL == hAacEnc)

-		return VO_ERR_INVALID_ARG;

-	

-	switch(uParamID)

-	{

-	case VO_PID_AAC_ENCPARAM:  /* init aac encoder parameter*/

-		AacInitDefaultConfig(&config);

-		if(pData == NULL)

-			return VO_ERR_INVALID_ARG;

-		pAAC_param = (AACENC_PARAM*)pData;

-		config.adtsUsed = pAAC_param->adtsUsed;

-		config.bitRate = pAAC_param->bitRate;

-		config.nChannelsIn = pAAC_param->nChannels;

-		config.nChannelsOut = pAAC_param->nChannels;

-		config.sampleRate = pAAC_param->sampleRate;

-

-		/* check the channel */

-		if(config.nChannelsIn< 1  || config.nChannelsIn > MAX_CHANNELS  ||

-             config.nChannelsOut < 1 || config.nChannelsOut > MAX_CHANNELS || config.nChannelsIn < config.nChannelsOut)

-			 return VO_ERR_AUDIO_UNSCHANNEL;

-

-		/* check the samplerate */

-		ret = -1;

-		for(i = 0; i < NUM_SAMPLE_RATES; i++)

-		{

-			if(config.sampleRate == sampRateTab[i])

-			{

-				ret = 0;

-				break;

-			}

-		}

-		if(ret < 0)

-			return VO_ERR_AUDIO_UNSSAMPLERATE;

-

-		SampleRateIdx = i;

-

-		tmp = 441;

-		if(config.sampleRate%8000 == 0) 

-			tmp =480;

-		/* check the bitrate */

-		if(config.bitRate!=0 && (config.bitRate/config.nChannelsOut < 4000) ||

-           (config.bitRate/config.nChannelsOut > 160000) || 

-		   (config.bitRate > config.sampleRate*6*config.nChannelsOut))

-		{

-			config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut;

-

-			if(config.bitRate/config.nChannelsOut < 4000)

-				config.bitRate = 4000 * config.nChannelsOut;

-			else if(config.bitRate > config.sampleRate*6*config.nChannelsOut)

-				config.bitRate = config.sampleRate*6*config.nChannelsOut;

-			else if(config.bitRate/config.nChannelsOut > 160000)

-				config.bitRate = config.nChannelsOut*160000;

-		}

-

-		/* check the bandwidth */

-		bitrate = config.bitRate / config.nChannelsOut;

-		bitrate = bitrate * tmp / config.sampleRate;

-

-		for (i = 0; rates[i]; i++)

-		{

-			if (rates[i] >= bitrate)

-				break;

-		}

-

-		config.bandWidth = BandwithCoefTab[i][SampleRateIdx];

-

-		/* init aac encoder core */

-		ret = AacEncOpen(hAacEnc, config);

-		if(ret) 

-			return VO_ERR_AUDIO_UNSFEATURE;

-		break;

-	case VO_PID_AUDIO_FORMAT:	/* init pcm channel and samplerate*/

-		AacInitDefaultConfig(&config);

-		if(pData == NULL)

-			return VO_ERR_INVALID_ARG;

-		pWAV_Format = (VO_AUDIO_FORMAT*)pData;

-		config.adtsUsed = 1;

-		config.nChannelsIn = pWAV_Format->Channels;

-		config.nChannelsOut = pWAV_Format->Channels;

-		config.sampleRate = pWAV_Format->SampleRate;

-

-		/* check the channel */

-		if(config.nChannelsIn< 1  || config.nChannelsIn > MAX_CHANNELS  ||

-             config.nChannelsOut < 1 || config.nChannelsOut > MAX_CHANNELS || config.nChannelsIn < config.nChannelsOut)

-			 return VO_ERR_AUDIO_UNSCHANNEL;

-

-		/* check the samplebits */

-		if(pWAV_Format->SampleBits != 16)

-		{

-			return VO_ERR_AUDIO_UNSFEATURE;

-		}

-

-		/* check the samplerate */

-		ret = -1;

-		for(i = 0; i < NUM_SAMPLE_RATES; i++)

-		{

-			if(config.sampleRate == sampRateTab[i])

-			{

-				ret = 0;

-				break;

-			}

-		}

-		if(ret < 0)

-			return VO_ERR_AUDIO_UNSSAMPLERATE;

-

-		SampleRateIdx = i;

-

-		/* update the bitrates */

-		tmp = 441;

-		if(config.sampleRate%8000 == 0) 

-			tmp =480;

-

-		config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut;

-

-		if(config.bitRate/config.nChannelsOut < 4000)

-			config.bitRate = 4000 * config.nChannelsOut;

-		else if(config.bitRate > config.sampleRate*6*config.nChannelsOut)

-			config.bitRate = config.sampleRate*6*config.nChannelsOut;

-		else if(config.bitRate/config.nChannelsOut > 160000)

-			config.bitRate = config.nChannelsOut*160000;

-

-		/* check the bandwidth */

-		bitrate = config.bitRate / config.nChannelsOut;

-		bitrate = bitrate * tmp / config.sampleRate;

-

-		for (i = 0; rates[i]; i++)

-		{

-			if (rates[i] >= bitrate)

-				break;

-		}

-

-		config.bandWidth = BandwithCoefTab[i][SampleRateIdx];

-		

-		/* init aac encoder core */

-		ret = AacEncOpen(hAacEnc, config);

-		if(ret) 

-			return VO_ERR_AUDIO_UNSFEATURE;

-		break;

-	default:

-		return VO_ERR_WRONG_PARAM_ID;

-	}

-

-	return VO_ERR_NONE;

-}

-

-/**

-* Get the param for special target.

-* \param hCodec [IN]] The Codec Handle which was created by Init function.

-* \param uParamID [IN] The param ID.

-* \param pData [IN] The param value depend on the ID>

-* \retval VO_ERR_NONE Succeeded.

-*/

-VO_U32 VO_API voAACEncGetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)

-{

-	return VO_ERR_NONE;

-}

-

-/**

- * Get audio codec API interface

- * \param pEncHandle [out] Return the AAC Encoder handle.

- * \retval VO_ERR_OK Succeeded.

- */

-VO_S32 VO_API voGetAACEncAPI(VO_AUDIO_CODECAPI * pDecHandle)

-{

-	if(pDecHandle == NULL)

-		return VO_ERR_INVALID_ARG;

-		

-	pDecHandle->Init = voAACEncInit;

-	pDecHandle->SetInputData = voAACEncSetInputData;

-	pDecHandle->GetOutputData = voAACEncGetOutputData;

-	pDecHandle->SetParam = voAACEncSetParam;

-	pDecHandle->GetParam = voAACEncGetParam;

-	pDecHandle->Uninit = voAACEncUninit;

-

-	return VO_ERR_NONE;

+	}
+
+	/* init the aac encoder memory operator  */
+#ifdef USE_DEAULT_MEM
+	if(interMem)
+	{
+		hAacEnc->voMemoprator.Alloc = cmnMemAlloc;
+		hAacEnc->voMemoprator.Copy = cmnMemCopy;
+		hAacEnc->voMemoprator.Free = cmnMemFree;
+		hAacEnc->voMemoprator.Set = cmnMemSet;
+		hAacEnc->voMemoprator.Check = cmnMemCheck;
+
+		pMemOP = &hAacEnc->voMemoprator;
+	}
+#endif
+	/* init the aac encoder default parameter  */
+	if(hAacEnc->initOK == 0)
+	{
+		 AACENC_CONFIG config;
+		 config.adtsUsed = 1;
+		 config.bitRate = 128000;
+		 config.nChannelsIn = 2;
+		 config.nChannelsOut = 2;
+		 config.sampleRate = 44100;
+		 config.bandWidth = 20000;
+
+		 AacEncOpen(hAacEnc, config);
+	}
+
+	hAacEnc->voMemop = pMemOP;
+
+	*phCodec = hAacEnc;
+
+	return VO_ERR_NONE;
+}
+
+/**
+* Set input audio data.
+* \param hCodec [IN]] The Codec Handle which was created by Init function.
+* \param pInput [IN] The input buffer param.
+* \param pOutBuffer [OUT] The output buffer info.
+* \retval VO_ERR_NONE Succeeded.
+*/
+VO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput)
+{
+	AAC_ENCODER *hAacEnc;
+	int  length;
+
+	if(NULL == hCodec || NULL == pInput || NULL == pInput->Buffer)
+	{
+		return VO_ERR_INVALID_ARG;
+	}
+	
+	hAacEnc = (AAC_ENCODER *)hCodec;
+	
+	/* init input pcm buffer and length*/
+	hAacEnc->inbuf = (short *)pInput->Buffer;
+	hAacEnc->inlen = pInput->Length / sizeof(short);
+	hAacEnc->uselength = 0;
+
+	hAacEnc->encbuf = hAacEnc->inbuf;
+	hAacEnc->enclen = hAacEnc->inlen;
+	
+	/* rebuild intra pcm buffer and length*/
+	if(hAacEnc->intlen)
+	{
+		length = min(hAacEnc->config.nChannelsIn*AACENC_BLOCKSIZE - hAacEnc->intlen, hAacEnc->inlen);
+		hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf + hAacEnc->intlen, 
+			hAacEnc->inbuf, length*sizeof(short));
+
+		hAacEnc->encbuf = hAacEnc->intbuf;
+		hAacEnc->enclen = hAacEnc->intlen + length;
+
+		hAacEnc->inbuf += length;
+		hAacEnc->inlen -= length;
+	}
+	
+	return VO_ERR_NONE;
+}
+
+/**
+* Get the outut audio data
+* \param hCodec [IN]] The Codec Handle which was created by Init function.
+* \param pOutBuffer [OUT] The output audio data
+* \param pOutInfo [OUT] The dec module filled audio format and used the input size.
+*						 pOutInfo->InputUsed is total used the input size.
+* \retval  VO_ERR_NONE Succeeded.
+*			VO_ERR_INPUT_BUFFER_SMALL. The input was finished or the input data was not enought.
+*/
+VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput, VO_AUDIO_OUTPUTINFO * pOutInfo)
+{
+	AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;
+	Word16 numAncDataBytes=0;
+	Word32  inbuflen;
+	int ret, length;
+	if(NULL == hAacEnc)
+		return VO_ERR_INVALID_ARG;
+
+	 inbuflen = AACENC_BLOCKSIZE*hAacEnc->config.nChannelsIn;
+
+	 /* check the input pcm buffer and length*/
+	 if(NULL == hAacEnc->encbuf || hAacEnc->enclen < inbuflen)
+	 {
+		length = hAacEnc->enclen;		
+		if(hAacEnc->intlen == 0)
+		{	
+			hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf, 
+				hAacEnc->encbuf, length*sizeof(short));		
+			hAacEnc->uselength += length*sizeof(short);
+		}
+		else
+		{
+			hAacEnc->uselength += (length - hAacEnc->intlen)*sizeof(short);
+		}
+
+		hAacEnc->intlen = length;
+
+		pOutput->Length = 0;
+		if(pOutInfo)
+			pOutInfo->InputUsed = hAacEnc->uselength;
+		return VO_ERR_INPUT_BUFFER_SMALL;	
+	 }
+
+	 /* check the output aac buffer and length*/
+	 if(NULL == pOutput || NULL == pOutput->Buffer || pOutput->Length < (6144/8)*hAacEnc->config.nChannelsOut/(sizeof(Word32)))
+		 return VO_ERR_OUTPUT_BUFFER_SMALL;
+
+	 /* aac encoder core function */
+	 AacEncEncode( hAacEnc,
+			(Word16*)hAacEnc->encbuf,
+			NULL,
+			&numAncDataBytes,
+			pOutput->Buffer,
+			&pOutput->Length);
+
+	 /* update the input pcm buffer and length*/
+	 if(hAacEnc->intlen)
+	 {
+		length = inbuflen - hAacEnc->intlen;		
+		hAacEnc->encbuf = hAacEnc->inbuf;
+		hAacEnc->enclen = hAacEnc->inlen;
+		hAacEnc->uselength += length*sizeof(short);
+		hAacEnc->intlen = 0;
+	 }
+	 else
+	 {
+		 hAacEnc->encbuf = hAacEnc->encbuf + inbuflen;
+		 hAacEnc->enclen = hAacEnc->enclen - inbuflen;
+		 hAacEnc->uselength += inbuflen*sizeof(short);
+	 }	 
+
+	 /* update the output aac information */
+	if(pOutInfo)
+	{
+		pOutInfo->Format.Channels = hAacEnc->config.nChannelsOut;
+		pOutInfo->Format.SampleRate = hAacEnc->config.sampleRate;
+		pOutInfo->Format.SampleBits = 16;
+		pOutInfo->InputUsed = hAacEnc->uselength;
+	}
+
+	 return VO_ERR_NONE;
+}
+
+/**
+* Uninit the Codec.
+* \param hCodec [IN]] The Codec Handle which was created by Init function.
+* \retval VO_ERR_NONE Succeeded.
+*/
+VO_U32 VO_API voAACEncUninit(VO_HANDLE hCodec)
+{
+	AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;
+	
+	if(NULL != hAacEnc)
+	{
+		/* close the aac encoder */
+		AacEncClose(hAacEnc, hAacEnc->voMemop);
+
+		/* free the aac encoder handle*/
+		mem_free(hAacEnc->voMemop, hAacEnc, VO_INDEX_ENC_AAC);
+		hAacEnc = NULL;
+	}	
+
+	return VO_ERR_NONE;
+}
+
+/**
+* Set the param for special target.
+* \param hCodec [IN]] The Codec Handle which was created by Init function.
+* \param uParamID [IN] The param ID.
+* \param pData [IN] The param value depend on the ID>
+* \retval VO_ERR_NONE Succeeded.
+*/
+VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
+{
+	AACENC_CONFIG config;
+	AACENC_PARAM* pAAC_param;
+	VO_AUDIO_FORMAT *pWAV_Format;
+	AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;
+	int ret, i, bitrate, tmp;
+	int SampleRateIdx;
+
+	if(NULL == hAacEnc)
+		return VO_ERR_INVALID_ARG;
+	
+	switch(uParamID)
+	{
+	case VO_PID_AAC_ENCPARAM:  /* init aac encoder parameter*/
+		AacInitDefaultConfig(&config);
+		if(pData == NULL)
+			return VO_ERR_INVALID_ARG;
+		pAAC_param = (AACENC_PARAM*)pData;
+		config.adtsUsed = pAAC_param->adtsUsed;
+		config.bitRate = pAAC_param->bitRate;
+		config.nChannelsIn = pAAC_param->nChannels;
+		config.nChannelsOut = pAAC_param->nChannels;
+		config.sampleRate = pAAC_param->sampleRate;
+
+		/* check the channel */
+		if(config.nChannelsIn< 1  || config.nChannelsIn > MAX_CHANNELS  ||
+             config.nChannelsOut < 1 || config.nChannelsOut > MAX_CHANNELS || config.nChannelsIn < config.nChannelsOut)
+			 return VO_ERR_AUDIO_UNSCHANNEL;
+
+		/* check the samplerate */
+		ret = -1;
+		for(i = 0; i < NUM_SAMPLE_RATES; i++)
+		{
+			if(config.sampleRate == sampRateTab[i])
+			{
+				ret = 0;
+				break;
+			}
+		}
+		if(ret < 0)
+			return VO_ERR_AUDIO_UNSSAMPLERATE;
+
+		SampleRateIdx = i;
+
+		tmp = 441;
+		if(config.sampleRate%8000 == 0) 
+			tmp =480;
+		/* check the bitrate */
+		if(config.bitRate!=0 && (config.bitRate/config.nChannelsOut < 4000) ||
+           (config.bitRate/config.nChannelsOut > 160000) || 
+		   (config.bitRate > config.sampleRate*6*config.nChannelsOut))
+		{
+			config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut;
+
+			if(config.bitRate/config.nChannelsOut < 4000)
+				config.bitRate = 4000 * config.nChannelsOut;
+			else if(config.bitRate > config.sampleRate*6*config.nChannelsOut)
+				config.bitRate = config.sampleRate*6*config.nChannelsOut;
+			else if(config.bitRate/config.nChannelsOut > 160000)
+				config.bitRate = config.nChannelsOut*160000;
+		}
+
+		/* check the bandwidth */
+		bitrate = config.bitRate / config.nChannelsOut;
+		bitrate = bitrate * tmp / config.sampleRate;
+
+		for (i = 0; rates[i]; i++)
+		{
+			if (rates[i] >= bitrate)
+				break;
+		}
+
+		config.bandWidth = BandwithCoefTab[i][SampleRateIdx];
+
+		/* init aac encoder core */
+		ret = AacEncOpen(hAacEnc, config);
+		if(ret) 
+			return VO_ERR_AUDIO_UNSFEATURE;
+		break;
+	case VO_PID_AUDIO_FORMAT:	/* init pcm channel and samplerate*/
+		AacInitDefaultConfig(&config);
+		if(pData == NULL)
+			return VO_ERR_INVALID_ARG;
+		pWAV_Format = (VO_AUDIO_FORMAT*)pData;
+		config.adtsUsed = 1;
+		config.nChannelsIn = pWAV_Format->Channels;
+		config.nChannelsOut = pWAV_Format->Channels;
+		config.sampleRate = pWAV_Format->SampleRate;
+
+		/* check the channel */
+		if(config.nChannelsIn< 1  || config.nChannelsIn > MAX_CHANNELS  ||
+             config.nChannelsOut < 1 || config.nChannelsOut > MAX_CHANNELS || config.nChannelsIn < config.nChannelsOut)
+			 return VO_ERR_AUDIO_UNSCHANNEL;
+
+		/* check the samplebits */
+		if(pWAV_Format->SampleBits != 16)
+		{
+			return VO_ERR_AUDIO_UNSFEATURE;
+		}
+
+		/* check the samplerate */
+		ret = -1;
+		for(i = 0; i < NUM_SAMPLE_RATES; i++)
+		{
+			if(config.sampleRate == sampRateTab[i])
+			{
+				ret = 0;
+				break;
+			}
+		}
+		if(ret < 0)
+			return VO_ERR_AUDIO_UNSSAMPLERATE;
+
+		SampleRateIdx = i;
+
+		/* update the bitrates */
+		tmp = 441;
+		if(config.sampleRate%8000 == 0) 
+			tmp =480;
+
+		config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut;
+
+		if(config.bitRate/config.nChannelsOut < 4000)
+			config.bitRate = 4000 * config.nChannelsOut;
+		else if(config.bitRate > config.sampleRate*6*config.nChannelsOut)
+			config.bitRate = config.sampleRate*6*config.nChannelsOut;
+		else if(config.bitRate/config.nChannelsOut > 160000)
+			config.bitRate = config.nChannelsOut*160000;
+
+		/* check the bandwidth */
+		bitrate = config.bitRate / config.nChannelsOut;
+		bitrate = bitrate * tmp / config.sampleRate;
+
+		for (i = 0; rates[i]; i++)
+		{
+			if (rates[i] >= bitrate)
+				break;
+		}
+
+		config.bandWidth = BandwithCoefTab[i][SampleRateIdx];
+		
+		/* init aac encoder core */
+		ret = AacEncOpen(hAacEnc, config);
+		if(ret) 
+			return VO_ERR_AUDIO_UNSFEATURE;
+		break;
+	default:
+		return VO_ERR_WRONG_PARAM_ID;
+	}
+
+	return VO_ERR_NONE;
+}
+
+/**
+* Get the param for special target.
+* \param hCodec [IN]] The Codec Handle which was created by Init function.
+* \param uParamID [IN] The param ID.
+* \param pData [IN] The param value depend on the ID>
+* \retval VO_ERR_NONE Succeeded.
+*/
+VO_U32 VO_API voAACEncGetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
+{
+	return VO_ERR_NONE;
+}
+
+/**
+ * Get audio codec API interface
+ * \param pEncHandle [out] Return the AAC Encoder handle.
+ * \retval VO_ERR_OK Succeeded.
+ */
+VO_S32 VO_API voGetAACEncAPI(VO_AUDIO_CODECAPI * pDecHandle)
+{
+	if(pDecHandle == NULL)
+		return VO_ERR_INVALID_ARG;
+		
+	pDecHandle->Init = voAACEncInit;
+	pDecHandle->SetInputData = voAACEncSetInputData;
+	pDecHandle->GetOutputData = voAACEncGetOutputData;
+	pDecHandle->SetParam = voAACEncSetParam;
+	pDecHandle->GetParam = voAACEncGetParam;
+	pDecHandle->Uninit = voAACEncUninit;
+
+	return VO_ERR_NONE;
 }
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/src/aacenc_core.c b/media/libstagefright/codecs/aacenc/src/aacenc_core.c
index 616475c..b69a017 100644
--- a/media/libstagefright/codecs/aacenc/src/aacenc_core.c
+++ b/media/libstagefright/codecs/aacenc/src/aacenc_core.c
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		aacenc_core.c

-

-	Content:	aac encoder core functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		aacenc_core.c
+
+	Content:	aac encoder core functions
+
 *******************************************************************************/
 
 #include "typedef.h"
@@ -58,9 +58,9 @@
                      const  AACENC_CONFIG     config   /* pre-initialized config struct */
                      )
 {
-  Word32 i;

+  Word32 i;
   Word32 error = 0;
-  Word16 profile = 1;

+  Word16 profile = 1;
 
   ELEMENT_INFO *elInfo = NULL;
    
@@ -76,7 +76,7 @@
     error = InitElementInfo (config.nChannelsOut,
                              &hAacEnc->elInfo);
   }
-

+
   if (!error) {
     elInfo = &hAacEnc->elInfo;
   }
@@ -95,8 +95,8 @@
   }
 
  /* use or not adts header */
-  if(!error) {

-	  hAacEnc->qcOut.qcElement.adtsUsed = config.adtsUsed;

+  if(!error) {
+	  hAacEnc->qcOut.qcElement.adtsUsed = config.adtsUsed;
   }
 
   /* init encoder quantization */
@@ -198,14 +198,14 @@
                  &aacEnc->qcOut,
                  &aacEnc->psyOut,
                  &globUsedBits,				 
-                 ancBytes,

+                 ancBytes,
 				 aacEnc->psyKernel.sampleRateIdx);
 
   updateBitres(&aacEnc->qcKernel,
                &aacEnc->qcOut);
 
   /* write out the bitstream */
-  *numOutBytes = GetBitsAvail(aacEnc->hBitStream) >> 3;

+  *numOutBytes = GetBitsAvail(aacEnc->hBitStream) >> 3;
 
   return 0;
 }
diff --git a/media/libstagefright/codecs/aacenc/src/adj_thr.c b/media/libstagefright/codecs/aacenc/src/adj_thr.c
index 0dbd216..83b43a1 100644
--- a/media/libstagefright/codecs/aacenc/src/adj_thr.c
+++ b/media/libstagefright/codecs/aacenc/src/adj_thr.c
@@ -1,26 +1,26 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		adj_thr.c

-

-	Content:	Threshold compensation functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		adj_thr.c
+
+	Content:	Threshold compensation functions
+
 *******************************************************************************/
 
-#include "basic_op.h"

+#include "basic_op.h"
 #include "oper_32b.h"
 #include "adj_thr_data.h"
 #include "adj_thr.h"
@@ -29,14 +29,14 @@
 
 
 #define  minSnrLimit    0x6666 /* 1 dB */
-#define  PEBITS_COEF	0x170a /* 0.18*(1 << 15)*/

-

-#define  HOLE_THR_LONG	0x2873	/* 0.316*(1 << 15) */

-#define  HOLE_THR_SHORT 0x4000  /* 0.5  *(1 << 15) */

-

-#define  MS_THRSPREAD_COEF 0x7333  /* 0.9 * (1 << 15) */

-

-#define	 MIN_SNR_COEF	   0x651f  /* 3.16* (1 << (15 - 2)) */

+#define  PEBITS_COEF	0x170a /* 0.18*(1 << 15)*/
+
+#define  HOLE_THR_LONG	0x2873	/* 0.316*(1 << 15) */
+#define  HOLE_THR_SHORT 0x4000  /* 0.5  *(1 << 15) */
+
+#define  MS_THRSPREAD_COEF 0x7333  /* 0.9 * (1 << 15) */
+
+#define	 MIN_SNR_COEF	   0x651f  /* 3.16* (1 << (15 - 2)) */
 
 /* values for avoid hole flag */
 enum _avoid_hole_state {
@@ -67,15 +67,15 @@
                           PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
                           const Word16 nChannels)
 {
-  Word16 ch, sfb, sfbGrp;

+  Word16 ch, sfb, sfbGrp;
   Word32 *pthrExp, *psfbThre;
   for (ch=0; ch<nChannels; ch++) {
-    PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];

-	 for(sfbGrp = 0; sfbGrp < psyOutChan->sfbCnt; sfbGrp+= psyOutChan->sfbPerGroup)	 

-	  pthrExp = &(thrExp[ch][sfbGrp]);

-	  psfbThre = psyOutChan->sfbThreshold + sfbGrp;

+    PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
+	 for(sfbGrp = 0; sfbGrp < psyOutChan->sfbCnt; sfbGrp+= psyOutChan->sfbPerGroup)	 
+	  pthrExp = &(thrExp[ch][sfbGrp]);
+	  psfbThre = psyOutChan->sfbThreshold + sfbGrp;
 	  for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
-		*pthrExp = rsqrt(rsqrt(*psfbThre,INT_BITS),INT_BITS);

+		*pthrExp = rsqrt(rsqrt(*psfbThre,INT_BITS),INT_BITS);
 		pthrExp++; psfbThre++;
       }
   }
@@ -112,7 +112,7 @@
     }
      
     if (nSfb > 0) {
-	  avgEn = avgEn / nSfb;

+	  avgEn = avgEn / nSfb;
 
       log_avgEn = iLog4(avgEn);
       startRatio_x_avgEn = fixmul(msaParam->startRatio, avgEn);
@@ -172,18 +172,18 @@
      
     if (psyOutChan->windowSequence != SHORT_WINDOW) {
       for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
-         psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp;

+         psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp;
 		 for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
-			*psfbSpreadEn = *psfbSpreadEn >> 1;  /* 0.5 */

+			*psfbSpreadEn = *psfbSpreadEn >> 1;  /* 0.5 */
 			++psfbSpreadEn;
         }
       }
     }
     else {
-      for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){

+      for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
 		psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp;
         for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
-          *psfbSpreadEn = (*psfbSpreadEn >> 1) + (*psfbSpreadEn >> 3);  /* 0.63 */

+          *psfbSpreadEn = (*psfbSpreadEn >> 1) + (*psfbSpreadEn >> 3);  /* 0.63 */
 		  ++psfbSpreadEn;
         }
       }
@@ -201,7 +201,7 @@
         threshold = HOLE_THR_SHORT;
 
       for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
-        Word16 *psfbMinSnr = psyOutChan->sfbMinSnr + sfbGrp;

+        Word16 *psfbMinSnr = psyOutChan->sfbMinSnr + sfbGrp;
 		for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
           Word32 sfbEn, sfbEnm1, sfbEnp1, avgEn;
              
@@ -219,7 +219,7 @@
              
           if (sfbEn > avgEn && avgEn > 0) {
             Word32 tmpMinSnr;
-            shift = norm_l(sfbEn);

+            shift = norm_l(sfbEn);
 			tmpMinSnr = Div_32(L_mpy_ls(avgEn, minSnrLimit) << shift, sfbEn << shift );
             tmpMinSnr = max(tmpMinSnr, HOLE_THR_LONG);                  
             tmpMinSnr = max(tmpMinSnr, threshold);
@@ -231,7 +231,7 @@
             Word32 tmpMinSnr;
             Word32 minSnrEn = L_mpy_wx(avgEn, *psfbMinSnr);                 
              
-            if(minSnrEn < sfbEn) {

+            if(minSnrEn < sfbEn) {
 			  shift = norm_l(sfbEn);
               tmpMinSnr = Div_32( minSnrEn << shift, sfbEn<<shift);
             }
@@ -242,7 +242,7 @@
 
             *psfbMinSnr =
               (min((tmpMinSnr >>  2), mult(*psfbMinSnr, MIN_SNR_COEF)) << 2);
-          }

+          }
 		  psfbMinSnr++;
         }
       }
@@ -266,17 +266,17 @@
           psyOutChanM->sfbMinSnr[sfb] = MAX_16;                                          
         }
         else {
-          shift = norm_l(sfbEnM); 

-		  psyOutChanM->sfbMinSnr[sfb] = min(max(psyOutChanM->sfbMinSnr[sfb], 

+          shift = norm_l(sfbEnM); 
+		  psyOutChanM->sfbMinSnr[sfb] = min(max(psyOutChanM->sfbMinSnr[sfb], 
 			  round16(Div_32(maxThr<<shift, sfbEnM << shift))), minSnrLimit);
         }
          
         if(maxThr >= sfbEnS) {
           psyOutChanS->sfbMinSnr[sfb] = MAX_16;
         }
-        else {

+        else {
 		  shift = norm_l(sfbEnS);
-          psyOutChanS->sfbMinSnr[sfb] = min(max(psyOutChanS->sfbMinSnr[sfb], 

+          psyOutChanS->sfbMinSnr[sfb] = min(max(psyOutChanS->sfbMinSnr[sfb], 
 			  round16(Div_32(maxThr << shift, sfbEnS << shift))), minSnrLimit);
         }
 
@@ -295,7 +295,7 @@
   for(ch=0; ch<nChannels; ch++) {
     PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
     for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
-      Word16 *pahFlag = ahFlag[ch] + sfbGrp;

+      Word16 *pahFlag = ahFlag[ch] + sfbGrp;
 	  for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
                
         if ((psyOutChan->sfbSpreadedEnergy[sfbGrp+sfb] > psyOutChan->sfbEnergy[sfbGrp+sfb]) ||
@@ -328,7 +328,7 @@
                        PSY_OUT_CHANNEL  psyOutChannel[MAX_CHANNELS],
                        const Word16     nChannels)
 {
-  Word16 ch, sfb, sfbGrp;

+  Word16 ch, sfb, sfbGrp;
   int ipe, iconstPart, inActiveLines;
 
   ipe = 0;                                                       
@@ -347,7 +347,7 @@
         }
       }
     }
-  }

+  }
 
   *pe = saturate(ipe);                                                       
   *constPart = saturate(iconstPart);                                                
@@ -367,14 +367,14 @@
                              const Word32     redVal)
 {
   Word32 sfbThrReduced;
-  Word32 *psfbEn, *psfbThr;     

-  Word16 ch, sfb, sfbGrp;

+  Word32 *psfbEn, *psfbThr;     
+  Word16 ch, sfb, sfbGrp;
 
   for(ch=0; ch<nChannels; ch++) {
     PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
     for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) {
- 	  psfbEn  = psyOutChan->sfbEnergy + sfbGrp;                                      

-      psfbThr = psyOutChan->sfbThreshold + sfbGrp;

+ 	  psfbEn  = psyOutChan->sfbEnergy + sfbGrp;                                      
+      psfbThr = psyOutChan->sfbThreshold + sfbGrp;
 	  for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
          
         if (*psfbEn > *psfbThr) {
@@ -391,8 +391,8 @@
             ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE;                                          
           }
 		  *psfbThr = sfbThrReduced;
-        }

-

+        }
+
 		psfbEn++;  psfbThr++;
       }
     }
@@ -419,8 +419,8 @@
   PSY_OUT_CHANNEL *psyOutChan;
   PE_CHANNEL_DATA *peChanData;
   Word32 deltaSfbPe;
-  Word32 normFactor;

-  Word32 *psfbPeFactors;

+  Word32 normFactor;
+  Word32 *psfbPeFactors;
   Word16 *psfbNActiveLines, *pahFlag;
   Word32 sfbEn, sfbThr;
   Word32 sfbThrReduced;
@@ -431,9 +431,9 @@
     psyOutChan = &psyOutChannel[ch];
     peChanData = &peData->peChannelData[ch];
     for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
-      psfbPeFactors = peData->sfbPeFactors[ch] + sfbGrp;

-	  psfbNActiveLines = peChanData->sfbNActiveLines + sfbGrp;

-	  pahFlag = ahFlag[ch] + sfbGrp;

+      psfbPeFactors = peData->sfbPeFactors[ch] + sfbGrp;
+	  psfbNActiveLines = peChanData->sfbNActiveLines + sfbGrp;
+	  pahFlag = ahFlag[ch] + sfbGrp;
 	  for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
         Word32 redThrExp = thrExp[ch][sfbGrp+sfb] + redVal;
              
@@ -444,8 +444,8 @@
         }
         else {
           *psfbPeFactors = 0;                                              
-        }

-		psfbPeFactors++; 

+        }
+		psfbPeFactors++; 
 		pahFlag++; psfbNActiveLines++;
       }
     }
@@ -457,9 +457,9 @@
     psyOutChan = &psyOutChannel[ch];
     peChanData = &peData->peChannelData[ch];
     for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
-      psfbPeFactors = peData->sfbPeFactors[ch] + sfbGrp;

-	  psfbNActiveLines = peChanData->sfbNActiveLines + sfbGrp;

-	  pahFlag = ahFlag[ch] + sfbGrp;

+      psfbPeFactors = peData->sfbPeFactors[ch] + sfbGrp;
+	  psfbNActiveLines = peChanData->sfbNActiveLines + sfbGrp;
+	  pahFlag = ahFlag[ch] + sfbGrp;
 	  for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
         /* pe difference for this sfb */
         deltaSfbPe = *psfbPeFactors * deltaPe;
@@ -487,7 +487,7 @@
               
              
             if(thrFactor > sfbThr) {
-              shift = norm_l(thrFactor);

+              shift = norm_l(thrFactor);
 			  sfbThrReduced = Div_32( sfbThr << shift, thrFactor<<shift );
             }
             else {
@@ -506,8 +506,8 @@
           }
 
           psyOutChan->sfbThreshold[sfbGrp+sfb] = sfbThrReduced;  
-        }

-

+        }
+
 		pahFlag++; psfbNActiveLines++; psfbPeFactors++;
       }
     }
@@ -539,8 +539,8 @@
     for (sfb=sfbSubWin; sfb<psyOutChannel[0].sfbCnt;
         sfb+=psyOutChannel[0].sfbPerGroup) {
       /* loop over all channels */
-		PE_CHANNEL_DATA* peChan = peData->peChannelData;

-		PSY_OUT_CHANNEL* psyOutCh = psyOutChannel;

+		PE_CHANNEL_DATA* peChan = peData->peChannelData;
+		PSY_OUT_CHANNEL* psyOutCh = psyOutChannel;
 		for (ch=0; ch<nChannels; ch++) {           
         if (ahFlag[ch][sfb] != NO_AH &&
             psyOutCh->sfbMinSnr[sfb] < minSnrLimit) {
@@ -553,7 +553,7 @@
               peChan->sfbPe[sfb];
           peData->pe = peData->pe + deltaPe;
           peChan->pe = peChan->pe + deltaPe;		  
-        }

+        }
 		peChan += 1; psyOutCh += 1;
       }
       /* stop if enough has been saved */
@@ -659,7 +659,7 @@
      
     if(ahCnt) {
       Word32 iahCnt;
-      shift = norm_l(ahCnt);

+      shift = norm_l(ahCnt);
 	  iahCnt = Div_32( 1 << shift, ahCnt << shift );
       avgEn = fixmul(avgEn, iahCnt);
     }
@@ -831,7 +831,7 @@
   fillLevel = max(fillLevel, clipLow);
   fillLevel = min(fillLevel, clipHigh);
 
-  if(clipHigh-clipLow)

+  if(clipHigh-clipLow)
   bitsave = (maxBitSave - (((maxBitSave-minBitSave)*(fillLevel-clipLow))/
                               (clipHigh-clipLow)));
 
@@ -860,7 +860,7 @@
   fillLevel = max(fillLevel, clipLow);
   fillLevel = min(fillLevel, clipHigh);
 
-  if(clipHigh-clipLow)

+  if(clipHigh-clipLow)
   bitspend = (minBitSpend + ((maxBitSpend - minBitSpend)*(fillLevel - clipLow) /
                                 (clipHigh-clipLow)));
                             
@@ -964,7 +964,7 @@
                           bresParam->clipSpendLow, bresParam->clipSpendHigh,
                           bresParam->minBitSpend, bresParam->maxBitSpend);
 
-  if(adjThrChan->peMax != adjThrChan->peMin)

+  if(adjThrChan->peMax != adjThrChan->peMin)
 	bitresFac = (100 - bitSave) + extract_l(((bitSpend + bitSave) * (pex - adjThrChan->peMin)) /
                     (adjThrChan->peMax - adjThrChan->peMin));
   else
@@ -1196,7 +1196,7 @@
      
     if (peOffsDiff > 0) {
       Word32 temp = 1000 - (nChannels * 200);
-      chBitDistribution[ch] = chBitDistribution[ch] +

+      chBitDistribution[ch] = chBitDistribution[ch] +
 		  (temp * peData.peChannelData[ch].pe) / peOffsDiff;
     }
   }
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/AutoCorrelation_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/AutoCorrelation_v5.s
index 48edd4f..e0885f1 100644
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/AutoCorrelation_v5.s
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/AutoCorrelation_v5.s
@@ -1,167 +1,167 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-@	File:		AutoCorrelation_v5.s

-@

-@	Content:	AutoCorrelation function armv5 assemble

-@

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-

-

-	.section .text	

-	.global	AutoCorrelation

-

-AutoCorrelation:

-	stmdb     sp!, {r4 - r11, lr}

-

-  sub     r13, r13, #20                     

-

-  mov     r5, r0                            

-  mov     r7, r1                            

-  mov     r9, r3                            

-  mov     r2, r2, lsl #16                      

-  mov     r0, #0          

-  mov     r4, r2, asr #16                   

-  mov     r8, #0                            

-  cmp     r4, #0                            

-  ble     L136        

-	

-	cmp     r4, #8 

-	mov		  r2, #0 

-  blt     L133   

-

-	sub     r12, r4, #8                

-L132:  

-  ldr     r6, [r5, r2]  

-	add		  r2, r2, #4

-	smulbb  r3, r6, r6

-	ldr     r1, [r5, r2] 

-	smultt	r10, r6, r6

-	mov		  r3, r3, asr #9

-	smulbb	r6, r1, r1

-	mov		  r10, r10, asr #9

-	qadd	  r0, r0, r3

-	smultt	r11, r1, r1

-	add     r2, r2, #4

-	qadd	  r0, r0, r10

-	mov		  r6, r6, asr #9

-	mov		  r11, r11, asr #9

-	ldr		  r1, [r5, r2]

-	qadd	  r0, r0, r6

-	smulbb	r10, r1, r1

-	smultt	r6, r1, r1

-	qadd	  r0, r0, r11

-	mov		  r10, r10, asr #9

-	mov		  r6, r6, asr #9

-	qadd	  r0, r0, r10

-	add     r2, r2, #4

-	add     r8, r8, #6

-

-	qadd	  r0, r0, r6

-	cmp     r8, r12                            

-  blt     L132	                  

-L133:                         

-  ldrsh   r6, [r5, r2]                      

-  mul     r10, r6, r6   

-	add     r2, r2, #2                     

-  mov     r1, r10, asr #9                    

-  qadd    r0, r0, r1

-L134:                         

-  add     r8, r8, #1                        

-  cmp     r8, r4                            

-  blt     L133                            

-L135:                        

-L136:                         

-  str     r0, [r7, #0]                      

-  cmp     r0, #0                            

-  beq     L1320                           

-L137:                         

-  mov     r2, r9, lsl #16                   

-	mov     r8, #1                                

-  mov     r2, r2, asr #16                   

-  cmp     r2, #1                            

-  ble     L1319                           

-L138:                        

-L139:                         

-  sub     r4, r4, #1                        

-  mov     r14, #0                           

-  mov     r3, #0                            

-  cmp     r4, #0                            

-  ble     L1317                           

-L1310:                       

-  cmp     r4, #6                            

-  addlt   r6, r5, r8, lsl #1                

-  blt     L1314                           

-L1311:                        

-  add     r6, r5, r8, lsl #1                

-  sub     r12, r4, #6                       

-  str     r8, [r13, #8]                     

-  str     r7, [r13, #4]                     

-L1312:                        

-  mov     r1, r3, lsl #1                    

-  ldrsh   r7, [r6, r1]                      

-  ldrsh   r10, [r5, r1]  

-  add     r8, r1, r6 

-	add     r9, r5, r1                       

-	mul     r7, r10, r7

-  ldrsh   r1, [r8, #2] 

-	ldrsh   r10, [r8, #4]   

-  add     r7, r14, r7, asr #9  	                                             

-  ldrsh   r0, [r9, #2]                          

-  ldrsh   r11, [r9, #4]                   

-  mul     r1, r0, r1                        

-  ldrsh   r14, [r8, #6]                     

-  mul     r10, r11, r10          

-	add     r7, r7, r1, asr #9            

-  ldrsh   r8, [r8, #8] 

-	add     r3, r3, #5

-	ldrsh   r11, [r9, #6]                  

-  ldrsh   r1, [r9, #8]                      

-  mul     r14, r11, r14                     

-  add     r7, r7, r10, asr #9       

-  mul     r1, r1, r8                             

-  add     r14, r7, r14, asr #9              

-	cmp     r3, r12 

-  add     r14, r14, r1, asr #9              

-  ble     L1312                           

-L1313:                        

-  ldr     r8, [r13, #8]                     

-  ldr     r7, [r13, #4]                     

-L1314:                        

-L1315:                        

-  mov     r12, r3, lsl #1                   

-  ldrsh   r9, [r6, r12]                     

-  ldrsh   r12, [r5, r12]                    

-  add     r3, r3, #1                        

-  cmp     r3, r4                            

-  mul     r12, r12, r9                      

-  add     r14, r14, r12, asr #9             

-  blt     L1315                           

-L1316:                        

-L1317:                        

-  str     r14, [r7, +r8, lsl #2]            

-  add     r8, r8, #1                        

-  cmp     r8, r2                            

-  blt     L139   

-	                         

-L1319:

-L1320:

-	add     r13, r13, #20                    

-	ldmia   sp!, {r4 - r11, pc}

-

-	@ENDP  @ |AutoCorrelation|

-	.end

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@	File:		AutoCorrelation_v5.s
+@
+@	Content:	AutoCorrelation function armv5 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+
+	.section .text	
+	.global	AutoCorrelation
+
+AutoCorrelation:
+	stmdb     sp!, {r4 - r11, lr}
+
+  sub     r13, r13, #20                     
+
+  mov     r5, r0                            
+  mov     r7, r1                            
+  mov     r9, r3                            
+  mov     r2, r2, lsl #16                      
+  mov     r0, #0          
+  mov     r4, r2, asr #16                   
+  mov     r8, #0                            
+  cmp     r4, #0                            
+  ble     L136        
+	
+	cmp     r4, #8 
+	mov		  r2, #0 
+  blt     L133   
+
+	sub     r12, r4, #8                
+L132:  
+  ldr     r6, [r5, r2]  
+	add		  r2, r2, #4
+	smulbb  r3, r6, r6
+	ldr     r1, [r5, r2] 
+	smultt	r10, r6, r6
+	mov		  r3, r3, asr #9
+	smulbb	r6, r1, r1
+	mov		  r10, r10, asr #9
+	qadd	  r0, r0, r3
+	smultt	r11, r1, r1
+	add     r2, r2, #4
+	qadd	  r0, r0, r10
+	mov		  r6, r6, asr #9
+	mov		  r11, r11, asr #9
+	ldr		  r1, [r5, r2]
+	qadd	  r0, r0, r6
+	smulbb	r10, r1, r1
+	smultt	r6, r1, r1
+	qadd	  r0, r0, r11
+	mov		  r10, r10, asr #9
+	mov		  r6, r6, asr #9
+	qadd	  r0, r0, r10
+	add     r2, r2, #4
+	add     r8, r8, #6
+
+	qadd	  r0, r0, r6
+	cmp     r8, r12                            
+  blt     L132	                  
+L133:                         
+  ldrsh   r6, [r5, r2]                      
+  mul     r10, r6, r6   
+	add     r2, r2, #2                     
+  mov     r1, r10, asr #9                    
+  qadd    r0, r0, r1
+L134:                         
+  add     r8, r8, #1                        
+  cmp     r8, r4                            
+  blt     L133                            
+L135:                        
+L136:                         
+  str     r0, [r7, #0]                      
+  cmp     r0, #0                            
+  beq     L1320                           
+L137:                         
+  mov     r2, r9, lsl #16                   
+	mov     r8, #1                                
+  mov     r2, r2, asr #16                   
+  cmp     r2, #1                            
+  ble     L1319                           
+L138:                        
+L139:                         
+  sub     r4, r4, #1                        
+  mov     r14, #0                           
+  mov     r3, #0                            
+  cmp     r4, #0                            
+  ble     L1317                           
+L1310:                       
+  cmp     r4, #6                            
+  addlt   r6, r5, r8, lsl #1                
+  blt     L1314                           
+L1311:                        
+  add     r6, r5, r8, lsl #1                
+  sub     r12, r4, #6                       
+  str     r8, [r13, #8]                     
+  str     r7, [r13, #4]                     
+L1312:                        
+  mov     r1, r3, lsl #1                    
+  ldrsh   r7, [r6, r1]                      
+  ldrsh   r10, [r5, r1]  
+  add     r8, r1, r6 
+	add     r9, r5, r1                       
+	mul     r7, r10, r7
+  ldrsh   r1, [r8, #2] 
+	ldrsh   r10, [r8, #4]   
+  add     r7, r14, r7, asr #9  	                                             
+  ldrsh   r0, [r9, #2]                          
+  ldrsh   r11, [r9, #4]                   
+  mul     r1, r0, r1                        
+  ldrsh   r14, [r8, #6]                     
+  mul     r10, r11, r10          
+	add     r7, r7, r1, asr #9            
+  ldrsh   r8, [r8, #8] 
+	add     r3, r3, #5
+	ldrsh   r11, [r9, #6]                  
+  ldrsh   r1, [r9, #8]                      
+  mul     r14, r11, r14                     
+  add     r7, r7, r10, asr #9       
+  mul     r1, r1, r8                             
+  add     r14, r7, r14, asr #9              
+	cmp     r3, r12 
+  add     r14, r14, r1, asr #9              
+  ble     L1312                           
+L1313:                        
+  ldr     r8, [r13, #8]                     
+  ldr     r7, [r13, #4]                     
+L1314:                        
+L1315:                        
+  mov     r12, r3, lsl #1                   
+  ldrsh   r9, [r6, r12]                     
+  ldrsh   r12, [r5, r12]                    
+  add     r3, r3, #1                        
+  cmp     r3, r4                            
+  mul     r12, r12, r9                      
+  add     r14, r14, r12, asr #9             
+  blt     L1315                           
+L1316:                        
+L1317:                        
+  str     r14, [r7, +r8, lsl #2]            
+  add     r8, r8, #1                        
+  cmp     r8, r2                            
+  blt     L139   
+	                         
+L1319:
+L1320:
+	add     r13, r13, #20                    
+	ldmia   sp!, {r4 - r11, pc}
+
+	@ENDP  @ |AutoCorrelation|
+	.end
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/CalcWindowEnergy_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/CalcWindowEnergy_v5.s
index 7997e98..75b916c 100644
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/CalcWindowEnergy_v5.s
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/CalcWindowEnergy_v5.s
@@ -1,112 +1,112 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-@	File:		CalcWindowEnergy_v5.s

-@

-@	Content:	CalcWindowEnergy function armv5 assemble

-@

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-

-	.section .text

-	

-	.global	CalcWindowEnergy

-

-CalcWindowEnergy:

-	stmdb   sp!, {r4 - r11, lr}

-	sub     r13, r13, #20 

-

-  mov     r3, r3, lsl #16                         

-	ldr     r10, [r0, #168]                    @ states0 = blockSwitchingControl->iirStates[0];

-  mov     r3, r3, asr #16 

-	ldr     r11, [r0, #172]                    @ states1 = blockSwitchingControl->iirStates[1];

-

-	mov     r2, r2, lsl #16

-	ldr     r12, hiPassCoeff                   @ Coeff0 = hiPassCoeff[0];      

-  mov     r2, r2, asr #16

-	ldr     r14, hiPassCoeff + 4			         @ Coeff1 = hiPassCoeff[1];

-	

-	mov			r8, #0							               @ w=0

-	mov			r5, #0							               @ wOffset = 0;

-	

-BLOCK_BEGIN:

-	mov			r6, #0                             @ accuUE = 0; 

-	mov			r7, #0								             @ accuFE = 0; 

-	mov			r4, #0							               @ i=0

-		                   

-	str			r8, [r13, #4]	

-	str			r0, [r13, #8]	

-	str			r3, [r13, #12]

-	

-ENERGY_BEG:	

-	mov     r9, r5, lsl #1  

-	ldrsh   r9, [r1, r9]											@ tempUnfiltered = timeSignal[tidx];

-

-	add			r5, r5, r2												@ tidx = tidx + chIncrement;

-	

-	smulwb	r3, r14, r9												@ accu1 = L_mpy_ls(Coeff1, tempUnfiltered);	

-	smull		r0, r8, r12, r11									@ accu2 = fixmul( Coeff0, states1 );

-	

-	mov			r3, r3, lsl #1

-	mov			r8, r8, lsl #1

-

-	sub			r0, r3, r10												@ accu3 = accu1 - states0;	

-	sub			r8,	r0, r8												@ out = accu3 - accu2;

-

-	mov		  r10, r3														@ states0 = accu1;

-	mov		  r11, r8														@ states1 = out;  

-	

-	mul		  r3, r9, r9	

-	mov     r8, r8, asr #16

-	

-	add		  r4, r4, #1

-	add     r6, r6, r3, asr #7

-

-	mul		  r9, r8, r8	

-	ldr		  r3, [r13, #12]

-

-	add		  r7, r7, r9, asr #7

-		

-	cmp     r4, r3                            

-  blt     ENERGY_BEG       

-	

-	ldr		  r0, [r13, #8]

-	ldr		  r8, [r13, #4]

-	

-ENERGY_END:

-	add		  r4, r0, r8, lsl #2

-

-	str     r6, [r4, #72]         

-	add		  r8, r8, #1	           

-  str     r7, [r4, #136]                   

-

-	cmp		  r8, #8

-	blt		  BLOCK_BEGIN                  	                        

-

-BLOCK_END:

-	str     r10, [r0, #168]                    

-  str     r11, [r0, #172]                    

-  mov     r0, #1            

-	                

-  add     r13, r13, #20   

-	ldmia   sp!, {r4 - r11, pc}                  

-

-hiPassCoeff:

-	.word 0xbec8b439

-	.word	0x609d4952

-		

-	@ENDP

-	.end

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@	File:		CalcWindowEnergy_v5.s
+@
+@	Content:	CalcWindowEnergy function armv5 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+	.section .text
+	
+	.global	CalcWindowEnergy
+
+CalcWindowEnergy:
+	stmdb   sp!, {r4 - r11, lr}
+	sub     r13, r13, #20 
+
+  mov     r3, r3, lsl #16                         
+	ldr     r10, [r0, #168]                    @ states0 = blockSwitchingControl->iirStates[0];
+  mov     r3, r3, asr #16 
+	ldr     r11, [r0, #172]                    @ states1 = blockSwitchingControl->iirStates[1];
+
+	mov     r2, r2, lsl #16
+	ldr     r12, hiPassCoeff                   @ Coeff0 = hiPassCoeff[0];      
+  mov     r2, r2, asr #16
+	ldr     r14, hiPassCoeff + 4			         @ Coeff1 = hiPassCoeff[1];
+	
+	mov			r8, #0							               @ w=0
+	mov			r5, #0							               @ wOffset = 0;
+	
+BLOCK_BEGIN:
+	mov			r6, #0                             @ accuUE = 0; 
+	mov			r7, #0								             @ accuFE = 0; 
+	mov			r4, #0							               @ i=0
+		                   
+	str			r8, [r13, #4]	
+	str			r0, [r13, #8]	
+	str			r3, [r13, #12]
+	
+ENERGY_BEG:	
+	mov     r9, r5, lsl #1  
+	ldrsh   r9, [r1, r9]											@ tempUnfiltered = timeSignal[tidx];
+
+	add			r5, r5, r2												@ tidx = tidx + chIncrement;
+	
+	smulwb	r3, r14, r9												@ accu1 = L_mpy_ls(Coeff1, tempUnfiltered);	
+	smull		r0, r8, r12, r11									@ accu2 = fixmul( Coeff0, states1 );
+	
+	mov			r3, r3, lsl #1
+	mov			r8, r8, lsl #1
+
+	sub			r0, r3, r10												@ accu3 = accu1 - states0;	
+	sub			r8,	r0, r8												@ out = accu3 - accu2;
+
+	mov		  r10, r3														@ states0 = accu1;
+	mov		  r11, r8														@ states1 = out;  
+	
+	mul		  r3, r9, r9	
+	mov     r8, r8, asr #16
+	
+	add		  r4, r4, #1
+	add     r6, r6, r3, asr #7
+
+	mul		  r9, r8, r8	
+	ldr		  r3, [r13, #12]
+
+	add		  r7, r7, r9, asr #7
+		
+	cmp     r4, r3                            
+  blt     ENERGY_BEG       
+	
+	ldr		  r0, [r13, #8]
+	ldr		  r8, [r13, #4]
+	
+ENERGY_END:
+	add		  r4, r0, r8, lsl #2
+
+	str     r6, [r4, #72]         
+	add		  r8, r8, #1	           
+  str     r7, [r4, #136]                   
+
+	cmp		  r8, #8
+	blt		  BLOCK_BEGIN                  	                        
+
+BLOCK_END:
+	str     r10, [r0, #168]                    
+  str     r11, [r0, #172]                    
+  mov     r0, #1            
+	                
+  add     r13, r13, #20   
+	ldmia   sp!, {r4 - r11, pc}                  
+
+hiPassCoeff:
+	.word 0xbec8b439
+	.word	0x609d4952
+		
+	@ENDP
+	.end
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/PrePostMDCT_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/PrePostMDCT_v5.s
index d4d3edb..38fe092 100644
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/PrePostMDCT_v5.s
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/PrePostMDCT_v5.s
@@ -1,131 +1,131 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-@	File:		PrePostMDCT_v5.s

-@

-@	Content:	premdct and postmdct function armv5 assemble

-@

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-

-	.section .text

-	.global	PreMDCT

-

-PreMDCT:

-	stmdb       sp!, {r4 - r11, lr}

-	

-	add         r9, r0, r1, lsl #2

-	sub         r3, r9, #8

-

-	movs        r1, r1, asr #2

-	beq         PreMDCT_END

-	

-PreMDCT_LOOP:

-	ldr					r8, [r2], #4

-	ldr					r9, [r2], #4

-	

-	ldrd				r4, [r0]

-	ldrd				r6, [r3]

-	

-	smull				r14, r11, r4, r8					@ MULHIGH(tr1, cosa)

-	smull    			r10, r12, r7, r8					@ MULHIGH(ti1, cosa)

-		

-	smull				r14, r8, r7, r9						@ MULHIGH(ti1, sina)

-	smull				r7, r10, r4, r9						@ MULHIGH(tr1, sina)	

-		

-	add					r11, r11, r8						@ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@	

-	sub					r7, r12, r10						@ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina)

-	

-	ldr					r8, [r2], #4

-	ldr					r9, [r2], #4

-	

-	smull				r14, r4, r6, r8						@ MULHIGH(tr2, cosa)

-	smull    			r10, r12, r5, r8					@ MULHIGH(ti2, cosa)

-		

-	smull				r14, r8, r5, r9						@ MULHIGH(ti2, sina)

-	smull				r5, r10, r6, r9						@ MULHIGH(tr2, sina)

-	

-	add					r8, r8, r4

-	sub					r9, r12, r10

-	

-	mov					r6, r11		

-

-	strd				r6, [r0]	

-	strd				r8, [r3]

-	

-	subs				r1, r1, #1

-	sub					r3, r3, #8

-	add 				r0, r0, #8

-	bne					PreMDCT_LOOP

-

-PreMDCT_END:

-	ldmia       sp!, {r4 - r11, pc}

-	@ENDP  @ |PreMDCT|

-	

-	.section .text

-	.global	PostMDCT

-

-PostMDCT:

-	stmdb       sp!, {r4 - r11, lr}

-	

-	add         r9, r0, r1, lsl #2

-	sub         r3, r9, #8

-

-	movs        r1, r1, asr #2

-	beq         PostMDCT_END

-	

-PostMDCT_LOOP:

-	ldr					r8, [r2], #4					

-	ldr					r9, [r2], #4

-	

-	ldrd				r4, [r0]

-	ldrd				r6, [r3]

-	

-	smull				r14, r11, r4, r8					@ MULHIGH(tr1, cosa)

-	smull    			r10, r12, r5, r8					@ MULHIGH(ti1, cosa)

-		

-	smull				r14, r8, r5, r9						@ MULHIGH(ti1, sina)

-	smull				r5, r10, r4, r9						@ MULHIGH(tr1, sina)	

-		

-	add					r4, r11, r8							@ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@	

-	sub					r11, r10, r12						@ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina)@

-	

-	ldr					r8, [r2], #4						@

-	ldr					r9, [r2], #4

-	

-	smull				r14, r5, r6, r8						@ MULHIGH(tr2, cosa)

-	smull    			r10, r12, r7, r8					@ MULHIGH(ti2, cosa)

-		

-	smull				r14, r8, r7, r9						@ MULHIGH(ti2, sina)

-	smull				r7, r10, r6, r9						@ MULHIGH(tr2, sina)

-	

-	add					r6, r8, r5							@ MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2)@

-	sub					r5, r10, r12						@ MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2)@

-	

-	mov					r7, r11				

-

-	strd				r4, [r0]

-	strd				r6, [r3]

-	

-	subs				r1, r1, #1

-	sub					r3, r3, #8

-	add 				r0, r0, #8

-	bne					PostMDCT_LOOP

-

-PostMDCT_END:

-	ldmia       sp!, {r4 - r11, pc}

-	@ENDP  @ |PostMDCT|

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@	File:		PrePostMDCT_v5.s
+@
+@	Content:	premdct and postmdct function armv5 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+	.section .text
+	.global	PreMDCT
+
+PreMDCT:
+	stmdb       sp!, {r4 - r11, lr}
+	
+	add         r9, r0, r1, lsl #2
+	sub         r3, r9, #8
+
+	movs        r1, r1, asr #2
+	beq         PreMDCT_END
+	
+PreMDCT_LOOP:
+	ldr					r8, [r2], #4
+	ldr					r9, [r2], #4
+	
+	ldrd				r4, [r0]
+	ldrd				r6, [r3]
+	
+	smull				r14, r11, r4, r8					@ MULHIGH(tr1, cosa)
+	smull    			r10, r12, r7, r8					@ MULHIGH(ti1, cosa)
+		
+	smull				r14, r8, r7, r9						@ MULHIGH(ti1, sina)
+	smull				r7, r10, r4, r9						@ MULHIGH(tr1, sina)	
+		
+	add					r11, r11, r8						@ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@	
+	sub					r7, r12, r10						@ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina)
+	
+	ldr					r8, [r2], #4
+	ldr					r9, [r2], #4
+	
+	smull				r14, r4, r6, r8						@ MULHIGH(tr2, cosa)
+	smull    			r10, r12, r5, r8					@ MULHIGH(ti2, cosa)
+		
+	smull				r14, r8, r5, r9						@ MULHIGH(ti2, sina)
+	smull				r5, r10, r6, r9						@ MULHIGH(tr2, sina)
+	
+	add					r8, r8, r4
+	sub					r9, r12, r10
+	
+	mov					r6, r11		
+
+	strd				r6, [r0]	
+	strd				r8, [r3]
+	
+	subs				r1, r1, #1
+	sub					r3, r3, #8
+	add 				r0, r0, #8
+	bne					PreMDCT_LOOP
+
+PreMDCT_END:
+	ldmia       sp!, {r4 - r11, pc}
+	@ENDP  @ |PreMDCT|
+	
+	.section .text
+	.global	PostMDCT
+
+PostMDCT:
+	stmdb       sp!, {r4 - r11, lr}
+	
+	add         r9, r0, r1, lsl #2
+	sub         r3, r9, #8
+
+	movs        r1, r1, asr #2
+	beq         PostMDCT_END
+	
+PostMDCT_LOOP:
+	ldr					r8, [r2], #4					
+	ldr					r9, [r2], #4
+	
+	ldrd				r4, [r0]
+	ldrd				r6, [r3]
+	
+	smull				r14, r11, r4, r8					@ MULHIGH(tr1, cosa)
+	smull    			r10, r12, r5, r8					@ MULHIGH(ti1, cosa)
+		
+	smull				r14, r8, r5, r9						@ MULHIGH(ti1, sina)
+	smull				r5, r10, r4, r9						@ MULHIGH(tr1, sina)	
+		
+	add					r4, r11, r8							@ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@	
+	sub					r11, r10, r12						@ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina)@
+	
+	ldr					r8, [r2], #4						@
+	ldr					r9, [r2], #4
+	
+	smull				r14, r5, r6, r8						@ MULHIGH(tr2, cosa)
+	smull    			r10, r12, r7, r8					@ MULHIGH(ti2, cosa)
+		
+	smull				r14, r8, r7, r9						@ MULHIGH(ti2, sina)
+	smull				r7, r10, r6, r9						@ MULHIGH(tr2, sina)
+	
+	add					r6, r8, r5							@ MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2)@
+	sub					r5, r10, r12						@ MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2)@
+	
+	mov					r7, r11				
+
+	strd				r4, [r0]
+	strd				r6, [r3]
+	
+	subs				r1, r1, #1
+	sub					r3, r3, #8
+	add 				r0, r0, #8
+	bne					PostMDCT_LOOP
+
+PostMDCT_END:
+	ldmia       sp!, {r4 - r11, pc}
+	@ENDP  @ |PostMDCT|
 	.end
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/R4R8First_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/R4R8First_v5.s
index 370daf4..b30881a 100644
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/R4R8First_v5.s
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/R4R8First_v5.s
@@ -1,252 +1,252 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-@	File:		R4R8First_v5.s

-@

-@	Content:	Radix8First and Radix4First function armv5 assemble

-@

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-

-	.section .text

-	.global	Radix4First

-

-Radix4First:

-	stmdb       sp!, {r4 - r11, lr}

-	

-	movs				r10, r1

-	mov					r11, r0

-	beq					Radix4First_END

-		

-Radix4First_LOOP:

-	ldrd				r0, [r11]

-	ldrd				r2, [r11, #8]

-	ldrd				r4, [r11, #16]

-	ldrd				r6, [r11, #24]

-	

-	add					r8, r0, r2

-	add					r9, r1, r3

-	

-	sub					r0, r0, r2

-	sub					r1, r1, r3

-	

-	add					r2, r4, r6

-	add					r3, r5, r7

-	

-	sub					r4, r4, r6

-	sub					r5, r5, r7

-	

-	add					r6, r8, r2

-	add					r7, r9, r3

-	

-	sub					r8, r8, r2

-	sub					r9, r9, r3

-	

-	add					r2, r0, r5

-	sub					r3, r1, r4

-	

-	sub					r0, r0, r5

-	add					r1, r1, r4

-	

-	strd				r6, [r11]

-	strd				r2, [r11, #8]

-	strd				r8, [r11, #16]

-	strd				r0, [r11, #24]

-	

-	subs				r10, r10, #1

-	add					r11, r11, #32

-	bne					Radix4First_LOOP

-

-Radix4First_END:

-	ldmia       sp!, {r4 - r11, pc}

-	@ENDP  @ |Radix4First|

-	

-	.section .text

-	.global	Radix8First

-

-Radix8First:

-	stmdb       sp!, {r4 - r11, lr}

-	sub         sp, sp, #0x24

-	

-	mov				  r12, r1

-	mov					r14, r0

-	cmp					r12, #0

-	beq					Radix8First_END

-	

-Radix8First_LOOP:

-	ldrd				r0, [r14]		

-	ldrd				r2, [r14, #8]

-	ldrd				r4, [r14, #16]

-	ldrd				r6, [r14, #24]

-	

-	add					r8, r0, r2					@ r0 = buf[0] + buf[2]@

-	add					r9, r1, r3					@ i0 = buf[1] + buf[3]@

-	

-	sub					r0, r0, r2					@ r1 = buf[0] - buf[2]@

-	sub					r1, r1, r3					@ i1 = buf[1] - buf[3]@

-	

-	add					r2, r4, r6					@	r2 = buf[4] + buf[6]@

-	add					r3, r5, r7					@ i2 = buf[5] + buf[7]@

-	

-	sub					r4, r4, r6					@	r3 = buf[4] - buf[6]@

-	sub					r5, r5, r7					@ i3 = buf[5] - buf[7]@

-	

-	add					r6, r8, r2					@ r4 = (r0 + r2) >> 1@

-	add					r7, r9, r3					@ i4 = (i0 + i2) >> 1@

-	

-	sub					r8, r8, r2					@	r5 = (r0 - r2) >> 1@

-	sub					r9, r9, r3					@ i5 = (i0 - i2) >> 1@

-	

-	sub					r2, r0, r5					@ r6 = (r1 - i3) >> 1@

-	add					r3, r1, r4					@ i6 = (i1 + r3) >> 1@

-	

-	add					r0, r0, r5					@ r7 = (r1 + i3) >> 1@

-	sub					r1, r1, r4					@ i7 = (i1 - r3) >> 1@

-	

-	mov					r6, r6, asr #1			@

-	mov					r7, r7, asr #1			@

-	

-	mov					r8, r8, asr #1

-	mov					r9, r9, asr #1

-	

-	mov					r2, r2, asr #1

-	mov					r3, r3, asr #1

-	

-	mov					r0, r0, asr #1

-	mov					r1, r1, asr #1	

-	

-	str					r6, [sp]

-	str					r7, [sp, #4]

-	

-	str					r8, [sp, #8]

-	str					r9, [sp, #12]

-	

-	str					r2, [sp, #16]

-	str					r3, [sp, #20]	

-	

-	str					r0, [sp, #24]

-	str					r1, [sp, #28]	

-	

-	ldrd				r2, [r14, #32]		

-	ldrd				r4, [r14, #40]

-	ldrd				r6, [r14, #48]

-	ldrd				r8, [r14, #56]

-	

-	add					r0, r2, r4					@ r0 = buf[ 8] + buf[10]@

-	add					r1, r3, r5					@ i0 = buf[ 9] + buf[11]@

-	

-	sub					r2, r2, r4					@ r1 = buf[ 8] - buf[10]@

-	sub					r3, r3, r5					@ i1 = buf[ 9] - buf[11]@

-	

-	add					r4, r6, r8					@ r2 = buf[12] + buf[14]@

-	add					r5, r7, r9					@ i2 = buf[13] + buf[15]@

-	

-	sub					r6, r6, r8					@ r3 = buf[12] - buf[14]@

-	sub					r7, r7, r9					@	i3 = buf[13] - buf[15]@

-	

-	add					r8, r0, r4					@ t0 = (r0 + r2)

-	add					r9, r1, r5					@ t1 = (i0 + i2)

-	

-	sub					r0, r0, r4					@ t2 = (r0 - r2)

-	sub					r1, r1, r5					@ t3 = (i0 - i2)

-	

-	mov					r8, r8, asr #1

-	ldr					r4, [sp]

-	

-	mov					r9, r9, asr #1

-	ldr					r5, [sp, #4]

-	

-	mov					r0, r0, asr #1		

-	mov					r1, r1, asr #1

-	

-	add					r10, r4, r8					@ buf[ 0] = r4 + t0@

-	add					r11, r5, r9					@ buf[ 1] = i4 + t1@

-	

-	sub					r4,  r4, r8					@ buf[ 8] = r4 - t0@

-	sub					r5,  r5, r9					@	buf[ 9] = i4 - t1@

-	

- 	strd				r10, [r14]

- 	strd				r4,  [r14, #32]

- 	

- 	ldr					r10, [sp, #8]

- 	ldr					r11, [sp, #12]

- 	

- 	add					r4, r10, r1					@ buf[ 4] = r5 + t3@

- 	sub					r5, r11, r0					@	buf[ 5] = i5 - t2@

- 	

- 	sub					r10, r10, r1				@ buf[12] = r5 - t3@

- 	add					r11, r11, r0				@ buf[13] = i5 + t2@

- 	

- 	strd				r4,  [r14, #16]

- 	strd				r10, [r14, #48]

- 	

- 	sub					r0, r2, r7					@ r0 = r1 - i3@

- 	add					r1, r3, r6					@ i0 = i1 + r3@

- 

-  ldr					r11, DATATab

- 	

- 	add					r2, r2, r7					@ r2 = r1 + i3@

- 	sub					r3, r3, r6					@ i2 = i1 - r3@

- 	

-	sub					r4, r0, r1					@ r0 - i0

-	add					r5, r0, r1					@ r0 + i0

-	

-	sub					r0, r2, r3					@ r2 - i2

-	add					r1, r2, r3					@ r2 + i2

-	

-	smull				r8, r6, r4, r11								

-	smull				r9, r7, r5, r11								

-	

-	ldr					r2, [sp, #16]

-	ldr					r3, [sp, #20]

-	

-	smull				r8, r4, r0, r11								

-	smull				r9, r5, r1, r11								

-	

-	ldr					r10, [sp, #24]

-	ldr					r11, [sp, #28]

-	

-	sub					r8, r2, r6

-	sub					r9, r3, r7

-	

-	add					r2, r2, r6

-	add					r3, r3, r7

-	

-	add					r6, r10, r5

-	sub					r7, r11, r4

-	

-	sub					r0, r10, r5

-	add					r1, r11, r4

-	

-	strd				r6, [r14, #8]

-	strd				r8, [r14, #24]

-	strd				r0, [r14, #40]

-	strd				r2, [r14, #56]

-	

-	subs				r12, r12, #1

-	add					r14, r14, #64

-	

-	bne					Radix8First_LOOP

-	

-Radix8First_END:

-	add         sp, sp, #0x24

-	ldmia       sp!, {r4 - r11, pc}

-	

-DATATab:

-	.word       0x5a82799a

-	

-	@ENDP  @ |Radix8First|

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@	File:		R4R8First_v5.s
+@
+@	Content:	Radix8First and Radix4First function armv5 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+	.section .text
+	.global	Radix4First
+
+Radix4First:
+	stmdb       sp!, {r4 - r11, lr}
+	
+	movs				r10, r1
+	mov					r11, r0
+	beq					Radix4First_END
+		
+Radix4First_LOOP:
+	ldrd				r0, [r11]
+	ldrd				r2, [r11, #8]
+	ldrd				r4, [r11, #16]
+	ldrd				r6, [r11, #24]
+	
+	add					r8, r0, r2
+	add					r9, r1, r3
+	
+	sub					r0, r0, r2
+	sub					r1, r1, r3
+	
+	add					r2, r4, r6
+	add					r3, r5, r7
+	
+	sub					r4, r4, r6
+	sub					r5, r5, r7
+	
+	add					r6, r8, r2
+	add					r7, r9, r3
+	
+	sub					r8, r8, r2
+	sub					r9, r9, r3
+	
+	add					r2, r0, r5
+	sub					r3, r1, r4
+	
+	sub					r0, r0, r5
+	add					r1, r1, r4
+	
+	strd				r6, [r11]
+	strd				r2, [r11, #8]
+	strd				r8, [r11, #16]
+	strd				r0, [r11, #24]
+	
+	subs				r10, r10, #1
+	add					r11, r11, #32
+	bne					Radix4First_LOOP
+
+Radix4First_END:
+	ldmia       sp!, {r4 - r11, pc}
+	@ENDP  @ |Radix4First|
+	
+	.section .text
+	.global	Radix8First
+
+Radix8First:
+	stmdb       sp!, {r4 - r11, lr}
+	sub         sp, sp, #0x24
+	
+	mov				  r12, r1
+	mov					r14, r0
+	cmp					r12, #0
+	beq					Radix8First_END
+	
+Radix8First_LOOP:
+	ldrd				r0, [r14]		
+	ldrd				r2, [r14, #8]
+	ldrd				r4, [r14, #16]
+	ldrd				r6, [r14, #24]
+	
+	add					r8, r0, r2					@ r0 = buf[0] + buf[2]@
+	add					r9, r1, r3					@ i0 = buf[1] + buf[3]@
+	
+	sub					r0, r0, r2					@ r1 = buf[0] - buf[2]@
+	sub					r1, r1, r3					@ i1 = buf[1] - buf[3]@
+	
+	add					r2, r4, r6					@	r2 = buf[4] + buf[6]@
+	add					r3, r5, r7					@ i2 = buf[5] + buf[7]@
+	
+	sub					r4, r4, r6					@	r3 = buf[4] - buf[6]@
+	sub					r5, r5, r7					@ i3 = buf[5] - buf[7]@
+	
+	add					r6, r8, r2					@ r4 = (r0 + r2) >> 1@
+	add					r7, r9, r3					@ i4 = (i0 + i2) >> 1@
+	
+	sub					r8, r8, r2					@	r5 = (r0 - r2) >> 1@
+	sub					r9, r9, r3					@ i5 = (i0 - i2) >> 1@
+	
+	sub					r2, r0, r5					@ r6 = (r1 - i3) >> 1@
+	add					r3, r1, r4					@ i6 = (i1 + r3) >> 1@
+	
+	add					r0, r0, r5					@ r7 = (r1 + i3) >> 1@
+	sub					r1, r1, r4					@ i7 = (i1 - r3) >> 1@
+	
+	mov					r6, r6, asr #1			@
+	mov					r7, r7, asr #1			@
+	
+	mov					r8, r8, asr #1
+	mov					r9, r9, asr #1
+	
+	mov					r2, r2, asr #1
+	mov					r3, r3, asr #1
+	
+	mov					r0, r0, asr #1
+	mov					r1, r1, asr #1	
+	
+	str					r6, [sp]
+	str					r7, [sp, #4]
+	
+	str					r8, [sp, #8]
+	str					r9, [sp, #12]
+	
+	str					r2, [sp, #16]
+	str					r3, [sp, #20]	
+	
+	str					r0, [sp, #24]
+	str					r1, [sp, #28]	
+	
+	ldrd				r2, [r14, #32]		
+	ldrd				r4, [r14, #40]
+	ldrd				r6, [r14, #48]
+	ldrd				r8, [r14, #56]
+	
+	add					r0, r2, r4					@ r0 = buf[ 8] + buf[10]@
+	add					r1, r3, r5					@ i0 = buf[ 9] + buf[11]@
+	
+	sub					r2, r2, r4					@ r1 = buf[ 8] - buf[10]@
+	sub					r3, r3, r5					@ i1 = buf[ 9] - buf[11]@
+	
+	add					r4, r6, r8					@ r2 = buf[12] + buf[14]@
+	add					r5, r7, r9					@ i2 = buf[13] + buf[15]@
+	
+	sub					r6, r6, r8					@ r3 = buf[12] - buf[14]@
+	sub					r7, r7, r9					@	i3 = buf[13] - buf[15]@
+	
+	add					r8, r0, r4					@ t0 = (r0 + r2)
+	add					r9, r1, r5					@ t1 = (i0 + i2)
+	
+	sub					r0, r0, r4					@ t2 = (r0 - r2)
+	sub					r1, r1, r5					@ t3 = (i0 - i2)
+	
+	mov					r8, r8, asr #1
+	ldr					r4, [sp]
+	
+	mov					r9, r9, asr #1
+	ldr					r5, [sp, #4]
+	
+	mov					r0, r0, asr #1		
+	mov					r1, r1, asr #1
+	
+	add					r10, r4, r8					@ buf[ 0] = r4 + t0@
+	add					r11, r5, r9					@ buf[ 1] = i4 + t1@
+	
+	sub					r4,  r4, r8					@ buf[ 8] = r4 - t0@
+	sub					r5,  r5, r9					@	buf[ 9] = i4 - t1@
+	
+ 	strd				r10, [r14]
+ 	strd				r4,  [r14, #32]
+ 	
+ 	ldr					r10, [sp, #8]
+ 	ldr					r11, [sp, #12]
+ 	
+ 	add					r4, r10, r1					@ buf[ 4] = r5 + t3@
+ 	sub					r5, r11, r0					@	buf[ 5] = i5 - t2@
+ 	
+ 	sub					r10, r10, r1				@ buf[12] = r5 - t3@
+ 	add					r11, r11, r0				@ buf[13] = i5 + t2@
+ 	
+ 	strd				r4,  [r14, #16]
+ 	strd				r10, [r14, #48]
+ 	
+ 	sub					r0, r2, r7					@ r0 = r1 - i3@
+ 	add					r1, r3, r6					@ i0 = i1 + r3@
+ 
+  ldr					r11, DATATab
+ 	
+ 	add					r2, r2, r7					@ r2 = r1 + i3@
+ 	sub					r3, r3, r6					@ i2 = i1 - r3@
+ 	
+	sub					r4, r0, r1					@ r0 - i0
+	add					r5, r0, r1					@ r0 + i0
+	
+	sub					r0, r2, r3					@ r2 - i2
+	add					r1, r2, r3					@ r2 + i2
+	
+	smull				r8, r6, r4, r11								
+	smull				r9, r7, r5, r11								
+	
+	ldr					r2, [sp, #16]
+	ldr					r3, [sp, #20]
+	
+	smull				r8, r4, r0, r11								
+	smull				r9, r5, r1, r11								
+	
+	ldr					r10, [sp, #24]
+	ldr					r11, [sp, #28]
+	
+	sub					r8, r2, r6
+	sub					r9, r3, r7
+	
+	add					r2, r2, r6
+	add					r3, r3, r7
+	
+	add					r6, r10, r5
+	sub					r7, r11, r4
+	
+	sub					r0, r10, r5
+	add					r1, r11, r4
+	
+	strd				r6, [r14, #8]
+	strd				r8, [r14, #24]
+	strd				r0, [r14, #40]
+	strd				r2, [r14, #56]
+	
+	subs				r12, r12, #1
+	add					r14, r14, #64
+	
+	bne					Radix8First_LOOP
+	
+Radix8First_END:
+	add         sp, sp, #0x24
+	ldmia       sp!, {r4 - r11, pc}
+	
+DATATab:
+	.word       0x5a82799a
+	
+	@ENDP  @ |Radix8First|
 	.end
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/Radix4FFT_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/Radix4FFT_v5.s
index db8e5d8..bc069b4 100644
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/Radix4FFT_v5.s
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/Radix4FFT_v5.s
@@ -1,169 +1,169 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-@	File:		Radix4FFT_v5.s

-@

-@	Content:	Radix4FFT armv5 assemble

-@

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-	.section .text

-	.global	Radix4FFT

-

-Radix4FFT:

-	stmdb     sp!, {r4 - r11, lr}

-	sub       sp, sp, #32                     

-

-	mov			r1, r1, asr #2

-	cmp     r1, #0       

-	beq     Radix4FFT_END                            

-                       

-Radix4FFT_LOOP1:          

-	mov     r14, r0          							@ xptr = buf@          

-	mov		r10, r1 												@ i = num@

-	mov     r9, r2, lsl #3  							@ step = 2*bgn@

-	cmp     r10, #0  

-	str		r0, [sp] 

-	str		r1, [sp, #4]      

-	str		r2, [sp, #8]

-	str		r3, [sp, #12]  

-	beq     Radix4FFT_LOOP1_END                            	    

-     

-Radix4FFT_LOOP2:                       

-	mov     r12, r3				        				@ csptr = twidTab@

-	mov		r11, r2												@ j = bgn

-	cmp     r11, #0        

-	str		r10, [sp, #16]

-	beq     Radix4FFT_LOOP2_END                         

-	 

-Radix4FFT_LOOP3:                          

-	str			r11, [sp, #20]	 

-	

-	ldrd		r0, [r14, #0]									@ r0 = xptr[0]@ r1 = xptr[1]@

-	add			r14, r14, r9 	 								@ xptr += step@

-	

-	ldrd		r10,	[r14, #0]  					 			@ r2 = xptr[0]@ r3 = xptr[1]@	

-	ldr			r8, [r12], #4									@ cosxsinx = csptr[0]@

-	

-	smulwt	r4, r10, r8										@ L_mpy_wx(cosx, t0)

-	smulwt	r3, r11, r8										@ L_mpy_wx(cosx, t1)

-	

-	smlawb	r2, r11, r8, r4								@ r2 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@

-	smulwb	r5, r10, r8										@ L_mpy_wx(sinx, t0)

-	

-	mov			r10, r0, asr #2								@ t0 = r0 >> 2@

-	mov			r11, r1, asr #2								@	t1 = r1 >> 2@

-		

-	sub			r3, r3, r5										@ r3 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@

-	add     r14, r14, r9 	 								@ xptr += step@

-	

-	sub			r0, r10, r2										@ r0 = t0 - r2@

-	sub			r1, r11, r3									  @ r1 = t1 - r3@

-	

-	add			r2, r10, r2										@ r2 = t0 + r2@

-	add			r3, r11, r3										@ r3 = t1 + r3@

-	

-	str			r2, [sp, #24]

-	str			r3, [sp, #28]

-	

-	ldrd		r10, [r14, #0]								@ r4 = xptr[0]@ r5 = xptr[1]@

-	ldr			r8, [r12], #4									@ cosxsinx = csptr[1]@

-	

-	smulwt	r6, r10, r8										@ L_mpy_wx(cosx, t0)

-	smulwt	r5, r11, r8										@ L_mpy_wx(cosx, t1)

-	

-	smlawb	r4, r11, r8, r6								@ r4 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@

-	smulwb	r7, r10, r8										@ L_mpy_wx(sinx, t0)

-	

-	add			r14, r14, r9									@ xptr += step@

-	sub			r5, r5, r7										@ r5 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@

-		

-	ldrd		r10, [r14]										@ r6 = xptr[0]@ r7 = xptr[1]@

-	ldr			r8, [r12], #4									@ cosxsinx = csptr[1]@

-	

-	smulwt	r2, r10, r8										@ L_mpy_wx(cosx, t0)

-	smulwt	r7, r11, r8										@ L_mpy_wx(cosx, t1)

-	

-	smlawb	r6, r11, r8, r2								@ r4 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@

-	smulwb	r3, r10, r8										@ L_mpy_wx(sinx, t0)

-	

-	mov			r10, r4												@ t0 = r4@

-	mov			r11, r5												@ t1 = r5@	

-	

-	sub			r7, r7, r3										@ r5 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@

-	

-

-	add			r4,  r10, r6									@	r4 = t0 + r6@	

-	sub			r5, r7, r11										@ r5 = r7 - t1@

-	

-	sub			r6, r10, r6										@ r6 = t0 - r6@

-	add			r7, r7, r11										@ r7 = r7 + t1@

-	

-	ldr			r2, [sp, #24]

-	ldr			r3, [sp, #28]

-	

-	add			r10, r0, r5										@ xptr[0] = r0 + r5@

-	add			r11, r1, r6										@ xptr[0] = r1 + r6

-	

-	strd		r10, [r14]										

-	sub			r14, r14, r9									@ xptr -= step@

-	

-	sub			r10, r2, r4										@	xptr[0] = r2 - r4@

-	sub			r11, r3, r7										@ xptr[1] = r3 - r7@

-	

-	strd		r10, [r14]				

-	sub			r14, r14, r9									@ xptr -= step@

-	

-	sub			r10, r0, r5										@ xptr[0] = r0 - r5@

-	sub			r11, r1, r6										@ xptr[0] = r1 - r6

-	

-	strd		r10, [r14]										

-	sub			r14, r14, r9									@ xptr -= step@

-	

-	add			r10, r2, r4										@	xptr[0] = r2 - r4@

-	add			r11, r3, r7										@ xptr[1] = r3 - r7@

-	

-	strd		r10, [r14]				

-	add			r14, r14, #8									@ xptr += 2@

-	

-	ldr			r11, [sp, #20]

-	subs		r11, r11, #1

-	bne			Radix4FFT_LOOP3	

-	 

-Radix4FFT_LOOP2_END:           

-	ldr			r10, [sp, #16]

-	ldr			r3, [sp, #12]

-	ldr			r2, [sp, #8]

-	rsb			r8, r9, r9, lsl #2   

-	sub			r10, r10, #1

-	add			r14, r14, r8		      

-	cmp			r10, #0  

-	bhi     Radix4FFT_LOOP2           

-                        

-Radix4FFT_LOOP1_END:               

-	ldr     r0, [sp]    

-	ldr		r1, [sp, #4]

-	add     r3, r3, r8, asr #1

-	mov     r2, r2, lsl #2 

-	movs    r1, r1, asr #2 

-	bne     Radix4FFT_LOOP1          

-                        

-Radix4FFT_END:                        

-	add     sp, sp, #32                  

-	ldmia   sp!, {r4 - r11, pc}

-		

-	@ENDP  @ |Radix4FFT|

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@	File:		Radix4FFT_v5.s
+@
+@	Content:	Radix4FFT armv5 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+	.section .text
+	.global	Radix4FFT
+
+Radix4FFT:
+	stmdb     sp!, {r4 - r11, lr}
+	sub       sp, sp, #32                     
+
+	mov			r1, r1, asr #2
+	cmp     r1, #0       
+	beq     Radix4FFT_END                            
+                       
+Radix4FFT_LOOP1:          
+	mov     r14, r0          							@ xptr = buf@          
+	mov		r10, r1 												@ i = num@
+	mov     r9, r2, lsl #3  							@ step = 2*bgn@
+	cmp     r10, #0  
+	str		r0, [sp] 
+	str		r1, [sp, #4]      
+	str		r2, [sp, #8]
+	str		r3, [sp, #12]  
+	beq     Radix4FFT_LOOP1_END                            	    
+     
+Radix4FFT_LOOP2:                       
+	mov     r12, r3				        				@ csptr = twidTab@
+	mov		r11, r2												@ j = bgn
+	cmp     r11, #0        
+	str		r10, [sp, #16]
+	beq     Radix4FFT_LOOP2_END                         
+	 
+Radix4FFT_LOOP3:                          
+	str			r11, [sp, #20]	 
+	
+	ldrd		r0, [r14, #0]									@ r0 = xptr[0]@ r1 = xptr[1]@
+	add			r14, r14, r9 	 								@ xptr += step@
+	
+	ldrd		r10,	[r14, #0]  					 			@ r2 = xptr[0]@ r3 = xptr[1]@	
+	ldr			r8, [r12], #4									@ cosxsinx = csptr[0]@
+	
+	smulwt	r4, r10, r8										@ L_mpy_wx(cosx, t0)
+	smulwt	r3, r11, r8										@ L_mpy_wx(cosx, t1)
+	
+	smlawb	r2, r11, r8, r4								@ r2 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
+	smulwb	r5, r10, r8										@ L_mpy_wx(sinx, t0)
+	
+	mov			r10, r0, asr #2								@ t0 = r0 >> 2@
+	mov			r11, r1, asr #2								@	t1 = r1 >> 2@
+		
+	sub			r3, r3, r5										@ r3 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
+	add     r14, r14, r9 	 								@ xptr += step@
+	
+	sub			r0, r10, r2										@ r0 = t0 - r2@
+	sub			r1, r11, r3									  @ r1 = t1 - r3@
+	
+	add			r2, r10, r2										@ r2 = t0 + r2@
+	add			r3, r11, r3										@ r3 = t1 + r3@
+	
+	str			r2, [sp, #24]
+	str			r3, [sp, #28]
+	
+	ldrd		r10, [r14, #0]								@ r4 = xptr[0]@ r5 = xptr[1]@
+	ldr			r8, [r12], #4									@ cosxsinx = csptr[1]@
+	
+	smulwt	r6, r10, r8										@ L_mpy_wx(cosx, t0)
+	smulwt	r5, r11, r8										@ L_mpy_wx(cosx, t1)
+	
+	smlawb	r4, r11, r8, r6								@ r4 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
+	smulwb	r7, r10, r8										@ L_mpy_wx(sinx, t0)
+	
+	add			r14, r14, r9									@ xptr += step@
+	sub			r5, r5, r7										@ r5 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
+		
+	ldrd		r10, [r14]										@ r6 = xptr[0]@ r7 = xptr[1]@
+	ldr			r8, [r12], #4									@ cosxsinx = csptr[1]@
+	
+	smulwt	r2, r10, r8										@ L_mpy_wx(cosx, t0)
+	smulwt	r7, r11, r8										@ L_mpy_wx(cosx, t1)
+	
+	smlawb	r6, r11, r8, r2								@ r4 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
+	smulwb	r3, r10, r8										@ L_mpy_wx(sinx, t0)
+	
+	mov			r10, r4												@ t0 = r4@
+	mov			r11, r5												@ t1 = r5@	
+	
+	sub			r7, r7, r3										@ r5 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
+	
+
+	add			r4,  r10, r6									@	r4 = t0 + r6@	
+	sub			r5, r7, r11										@ r5 = r7 - t1@
+	
+	sub			r6, r10, r6										@ r6 = t0 - r6@
+	add			r7, r7, r11										@ r7 = r7 + t1@
+	
+	ldr			r2, [sp, #24]
+	ldr			r3, [sp, #28]
+	
+	add			r10, r0, r5										@ xptr[0] = r0 + r5@
+	add			r11, r1, r6										@ xptr[0] = r1 + r6
+	
+	strd		r10, [r14]										
+	sub			r14, r14, r9									@ xptr -= step@
+	
+	sub			r10, r2, r4										@	xptr[0] = r2 - r4@
+	sub			r11, r3, r7										@ xptr[1] = r3 - r7@
+	
+	strd		r10, [r14]				
+	sub			r14, r14, r9									@ xptr -= step@
+	
+	sub			r10, r0, r5										@ xptr[0] = r0 - r5@
+	sub			r11, r1, r6										@ xptr[0] = r1 - r6
+	
+	strd		r10, [r14]										
+	sub			r14, r14, r9									@ xptr -= step@
+	
+	add			r10, r2, r4										@	xptr[0] = r2 - r4@
+	add			r11, r3, r7										@ xptr[1] = r3 - r7@
+	
+	strd		r10, [r14]				
+	add			r14, r14, #8									@ xptr += 2@
+	
+	ldr			r11, [sp, #20]
+	subs		r11, r11, #1
+	bne			Radix4FFT_LOOP3	
+	 
+Radix4FFT_LOOP2_END:           
+	ldr			r10, [sp, #16]
+	ldr			r3, [sp, #12]
+	ldr			r2, [sp, #8]
+	rsb			r8, r9, r9, lsl #2   
+	sub			r10, r10, #1
+	add			r14, r14, r8		      
+	cmp			r10, #0  
+	bhi     Radix4FFT_LOOP2           
+                        
+Radix4FFT_LOOP1_END:               
+	ldr     r0, [sp]    
+	ldr		r1, [sp, #4]
+	add     r3, r3, r8, asr #1
+	mov     r2, r2, lsl #2 
+	movs    r1, r1, asr #2 
+	bne     Radix4FFT_LOOP1          
+                        
+Radix4FFT_END:                        
+	add     sp, sp, #32                  
+	ldmia   sp!, {r4 - r11, pc}
+		
+	@ENDP  @ |Radix4FFT|
 	.end
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/band_nrg_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/band_nrg_v5.s
index a463dfd..3b88810 100644
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/band_nrg_v5.s
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/band_nrg_v5.s
@@ -1,204 +1,204 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-@	File:		band_nrg_v5.s

-@

-@	Content:	CalcBandEnergy and CalcBandEnergyMS function armv5 assemble

-@

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-

-	.section .text

-

-	.global	CalcBandEnergy

-

-CalcBandEnergy:

-	stmdb   sp!, {r4 - r11, lr}	

-                   

-  mov     r2, r2, lsl #16                   

-	ldr     r12, [r13, #36]

-	mov			r9, #0

-  mov     r5, r2, asr #16    

-	mov			r4, #0               

-  cmp     r5, #0	

-	ble     L212 

-

-L22:

-  mov     r2, r4, lsl #1                    

-  ldrsh   r10, [r1, r2]                     

-  add     r11, r1, r2                       

-  ldrsh   r2, [r11, #2]    

-	mov     r14, #0                 

-  cmp     r10, r2                           

-  bge     L28 

-	

-L23:

-	ldr     r11, [r0, +r10, lsl #2]	

-  add     r10, r10, #1    

-	ldr     r6, [r0, +r10, lsl #2]	

-	smull   r11, r7, r11, r11

-	add     r10, r10, #1 

-	smull	  r6, r8, r6, r6

-	ldr     r11, [r0, +r10, lsl #2]

-	qadd	  r14, r14, r7

-	add     r10, r10, #1

-	smull	  r11, r7, r11, r11

-	ldr     r6, [r0, +r10, lsl #2]

-	qadd	  r14, r14, r8

-	smull	  r6, r8, r6, r6

-  add     r10, r10, #1 

-	qadd	  r14, r14, r7

-	cmp     r10, r2

-	qadd	  r14, r14, r8

-	blt     L23   

-

-L28:	

-	qadd	  r14, r14, r14

-	str     r14, [r3, +r4, lsl #2]

-	add     r4, r4, #1 

-	qadd	  r9, r9, r14

-	cmp     r4, r5                          

-

-  blt     L22       	

-

-L212:	

-	str     r9, [r12, #0]                     

-	ldmia   sp!, {r4 - r11, pc}

-	

-	@ENDP  ; |CalcBandEnergy|

-	

-	.global	CalcBandEnergyMS

-

-CalcBandEnergyMS:

-	stmdb   sp!, {r4 - r11, lr}

-	sub     r13, r13, #24

-	

-	mov     r12, #0 

-  mov     r3, r3, lsl #16  

-  mov     r14, #0 

-	mov     r3, r3, asr #16      

-	cmp     r3, #0          

-	mov		  r4, #0                  

-  ble     L315    

-	

-L32:	

-	mov		  r5, r4, lsl #1

-	mov		  r6, #0

-	ldrsh   r10, [r2, r5]

-	add     r5, r2, r5

-	mov		  r7, #0

-	ldrsh	  r11, [r5, #2]                        

-	cmp     r10, r11                          

-  bge     L39    

-

-	str		  r3, [r13, #4]

-	str		  r4, [r13, #8]

-	str		  r12, [r13, #12]

-	str		  r14, [r13, #16]

-

-L33:	

-	ldr     r8, [r0, +r10, lsl #2]                    

-	ldr     r9, [r1, +r10, lsl #2]

-	mov		  r8, r8, asr #1

-	add		  r10, r10, #1

-	mov		  r9, r9, asr #1

-

-	ldr     r12, [r0, +r10, lsl #2]          

-	add		  r5, r8, r9	          

-	ldr     r14, [r1, +r10, lsl #2]

-	sub		  r8, r8, r9

-

-	smull   r5, r3, r5, r5 

-	mov		  r12, r12, asr #1

-	smull   r8, r4, r8, r8 

-	mov		  r14, r14, asr #1

-

-	qadd	  r6, r6, r3

-	add		  r5, r12, r14

-	qadd	  r7, r7, r4

-	sub		  r8, r12, r14

-

-	smull   r5, r3, r5, r5 

-	add		  r10, r10, #1

-	smull   r8, r4, r8, r8 

-		

-	qadd	  r6, r6, r3

-	qadd	  r7, r7, r4

-

-	ldr     r8, [r0, +r10, lsl #2]                    

-	ldr     r9, [r1, +r10, lsl #2]

-	mov		  r8, r8, asr #1

-	add		  r10, r10, #1

-	mov		  r9, r9, asr #1

-

-	ldr     r12, [r0, +r10, lsl #2]          

-	add		  r5, r8, r9	          

-	ldr     r14, [r1, +r10, lsl #2]

-	sub		  r8, r8, r9

-

-	smull   r5, r3, r5, r5 

-	mov		  r12, r12, asr #1

-	smull   r8, r4, r8, r8 

-	mov		  r14, r14, asr #1

-

-	qadd	  r6, r6, r3

-	add		  r5, r12, r14

-	qadd	  r7, r7, r4

-	sub		  r8, r12, r14

-

-	smull   r5, r3, r5, r5 

-	add		  r10, r10, #1

-	smull   r8, r4, r8, r8 

-		

-	qadd	  r6, r6, r3

-	qadd	  r7, r7, r4

-

-	cmp     r10, r11

-	

-	blt		  L33

-

-	ldr		  r3, [r13, #4]

-	ldr		  r4, [r13, #8]	

-	ldr		  r12, [r13, #12]

-	ldr		  r14, [r13, #16]

-L39:	

-	qadd	  r6, r6, r6

-	qadd	  r7, r7, r7	

-	

-	ldr		  r8, [r13, #60]

-	ldr		  r9, [r13, #68]

-

-	qadd	  r12, r12, r6

-	qadd	  r14, r14, r7

-	

-	str		  r6, [r8, +r4, lsl #2]       

-	str     r7, [r9, +r4, lsl #2]    

-	

-	add		  r4, r4, #1

-	cmp		  r4, r3

-	blt     L32            

-

-L315:

-	ldr		  r8, [r13, #64]

-	ldr		  r9, [r13, #72]

-	str		  r12, [r8, #0]

-	str		  r14, [r9, #0]

-

-	add     r13, r13, #24

-	ldmia   sp!, {r4 - r11, pc}

-	@ENDP  ; |CalcBandEnergyMS|

-

-	.end

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@	File:		band_nrg_v5.s
+@
+@	Content:	CalcBandEnergy and CalcBandEnergyMS function armv5 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+	.section .text
+
+	.global	CalcBandEnergy
+
+CalcBandEnergy:
+	stmdb   sp!, {r4 - r11, lr}	
+                   
+  mov     r2, r2, lsl #16                   
+	ldr     r12, [r13, #36]
+	mov			r9, #0
+  mov     r5, r2, asr #16    
+	mov			r4, #0               
+  cmp     r5, #0	
+	ble     L212 
+
+L22:
+  mov     r2, r4, lsl #1                    
+  ldrsh   r10, [r1, r2]                     
+  add     r11, r1, r2                       
+  ldrsh   r2, [r11, #2]    
+	mov     r14, #0                 
+  cmp     r10, r2                           
+  bge     L28 
+	
+L23:
+	ldr     r11, [r0, +r10, lsl #2]	
+  add     r10, r10, #1    
+	ldr     r6, [r0, +r10, lsl #2]	
+	smull   r11, r7, r11, r11
+	add     r10, r10, #1 
+	smull	  r6, r8, r6, r6
+	ldr     r11, [r0, +r10, lsl #2]
+	qadd	  r14, r14, r7
+	add     r10, r10, #1
+	smull	  r11, r7, r11, r11
+	ldr     r6, [r0, +r10, lsl #2]
+	qadd	  r14, r14, r8
+	smull	  r6, r8, r6, r6
+  add     r10, r10, #1 
+	qadd	  r14, r14, r7
+	cmp     r10, r2
+	qadd	  r14, r14, r8
+	blt     L23   
+
+L28:	
+	qadd	  r14, r14, r14
+	str     r14, [r3, +r4, lsl #2]
+	add     r4, r4, #1 
+	qadd	  r9, r9, r14
+	cmp     r4, r5                          
+
+  blt     L22       	
+
+L212:	
+	str     r9, [r12, #0]                     
+	ldmia   sp!, {r4 - r11, pc}
+	
+	@ENDP  ; |CalcBandEnergy|
+	
+	.global	CalcBandEnergyMS
+
+CalcBandEnergyMS:
+	stmdb   sp!, {r4 - r11, lr}
+	sub     r13, r13, #24
+	
+	mov     r12, #0 
+  mov     r3, r3, lsl #16  
+  mov     r14, #0 
+	mov     r3, r3, asr #16      
+	cmp     r3, #0          
+	mov		  r4, #0                  
+  ble     L315    
+	
+L32:	
+	mov		  r5, r4, lsl #1
+	mov		  r6, #0
+	ldrsh   r10, [r2, r5]
+	add     r5, r2, r5
+	mov		  r7, #0
+	ldrsh	  r11, [r5, #2]                        
+	cmp     r10, r11                          
+  bge     L39    
+
+	str		  r3, [r13, #4]
+	str		  r4, [r13, #8]
+	str		  r12, [r13, #12]
+	str		  r14, [r13, #16]
+
+L33:	
+	ldr     r8, [r0, +r10, lsl #2]                    
+	ldr     r9, [r1, +r10, lsl #2]
+	mov		  r8, r8, asr #1
+	add		  r10, r10, #1
+	mov		  r9, r9, asr #1
+
+	ldr     r12, [r0, +r10, lsl #2]          
+	add		  r5, r8, r9	          
+	ldr     r14, [r1, +r10, lsl #2]
+	sub		  r8, r8, r9
+
+	smull   r5, r3, r5, r5 
+	mov		  r12, r12, asr #1
+	smull   r8, r4, r8, r8 
+	mov		  r14, r14, asr #1
+
+	qadd	  r6, r6, r3
+	add		  r5, r12, r14
+	qadd	  r7, r7, r4
+	sub		  r8, r12, r14
+
+	smull   r5, r3, r5, r5 
+	add		  r10, r10, #1
+	smull   r8, r4, r8, r8 
+		
+	qadd	  r6, r6, r3
+	qadd	  r7, r7, r4
+
+	ldr     r8, [r0, +r10, lsl #2]                    
+	ldr     r9, [r1, +r10, lsl #2]
+	mov		  r8, r8, asr #1
+	add		  r10, r10, #1
+	mov		  r9, r9, asr #1
+
+	ldr     r12, [r0, +r10, lsl #2]          
+	add		  r5, r8, r9	          
+	ldr     r14, [r1, +r10, lsl #2]
+	sub		  r8, r8, r9
+
+	smull   r5, r3, r5, r5 
+	mov		  r12, r12, asr #1
+	smull   r8, r4, r8, r8 
+	mov		  r14, r14, asr #1
+
+	qadd	  r6, r6, r3
+	add		  r5, r12, r14
+	qadd	  r7, r7, r4
+	sub		  r8, r12, r14
+
+	smull   r5, r3, r5, r5 
+	add		  r10, r10, #1
+	smull   r8, r4, r8, r8 
+		
+	qadd	  r6, r6, r3
+	qadd	  r7, r7, r4
+
+	cmp     r10, r11
+	
+	blt		  L33
+
+	ldr		  r3, [r13, #4]
+	ldr		  r4, [r13, #8]	
+	ldr		  r12, [r13, #12]
+	ldr		  r14, [r13, #16]
+L39:	
+	qadd	  r6, r6, r6
+	qadd	  r7, r7, r7	
+	
+	ldr		  r8, [r13, #60]
+	ldr		  r9, [r13, #68]
+
+	qadd	  r12, r12, r6
+	qadd	  r14, r14, r7
+	
+	str		  r6, [r8, +r4, lsl #2]       
+	str     r7, [r9, +r4, lsl #2]    
+	
+	add		  r4, r4, #1
+	cmp		  r4, r3
+	blt     L32            
+
+L315:
+	ldr		  r8, [r13, #64]
+	ldr		  r9, [r13, #72]
+	str		  r12, [r8, #0]
+	str		  r14, [r9, #0]
+
+	add     r13, r13, #24
+	ldmia   sp!, {r4 - r11, pc}
+	@ENDP  ; |CalcBandEnergyMS|
+
+	.end
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/PrePostMDCT_v7.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/PrePostMDCT_v7.s
index bf7dcbad..a04c105 100644
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/PrePostMDCT_v7.s
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/PrePostMDCT_v7.s
@@ -1,135 +1,135 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-@	File:		PrePostMDCT_v7.s

-@

-@	Content:	premdct and postmdct function armv7 assemble

-@

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-

-	.section .text

-	.global	PreMDCT

-

-PreMDCT:

-	stmdb     sp!, {r4 - r11, lr}

-	

-	add         r9, r0, r1, lsl #2

-	sub         r3, r9, #32

-

-	movs        r1, r1, asr #2

-	beq         PreMDCT_END	

-	

-PreMDCT_LOOP:

-	VLD4.I32			{d0, d2, d4, d6}, [r2]!				@ cosa = *csptr++@ sina = *csptr++@

-	VLD4.I32			{d1, d3, d5, d7}, [r2]!				@ cosb = *csptr++@ sinb = *csptr++@

-	VLD2.I32			{d8, d9, d10, d11}, [r0]			@ tr1 = *(buf0 + 0)@ ti2 = *(buf0 + 1)@

-	VLD2.I32			{d13, d15}, [r3]!					@ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@

-	VLD2.I32			{d12, d14}, [r3]!					@ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@

-		

-	VREV64.32			Q8, Q7	

-	VREV64.32			Q9, Q6

-

-	

-	VQDMULH.S32		Q10, Q0, Q4								@ MULHIGH(cosa, tr1)

-	VQDMULH.S32		Q11, Q1, Q8								@ MULHIGH(sina, ti1)

-	VQDMULH.S32		Q12, Q0, Q8								@ MULHIGH(cosa, ti1)

-	VQDMULH.S32		Q13, Q1, Q4								@ MULHIGH(sina, tr1)

-		

-	VADD.S32			Q0, Q10, Q11						@ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@

-	VSUB.S32			Q1, Q12, Q13						@ *buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1)@

-	

-	VST2.I32			{d0, d1, d2, d3}, [r0]!

-	sub						r3, r3, #32

-	

-	VQDMULH.S32		Q10, Q2, Q9										@ MULHIGH(cosb, tr2)

-	VQDMULH.S32		Q11, Q3, Q5										@ MULHIGH(sinb, ti2)

-	VQDMULH.S32		Q12, Q2, Q5										@ MULHIGH(cosb, ti2)

-	VQDMULH.S32		Q13, Q3, Q9										@ MULHIGH(sinb, tr2)

-		

-	VADD.S32			Q0, Q10, Q11									@ MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@

-	VSUB.S32			Q1, Q12, Q13									@ MULHIGH(cosa, ti2) - MULHIGH(sina, tr2)@

-	

-	VREV64.32			Q3, Q1

-	VREV64.32			Q2, Q0

-		

-	VST2.I32		{d5, d7}, [r3]!	

-	VST2.I32		{d4, d6}, [r3]! 

-	

-	subs     		r1, r1, #4

-	sub		  		r3, r3, #64	

-	bne       	PreMDCT_LOOP

-	

-PreMDCT_END:

-	ldmia     sp!, {r4 - r11, pc}

-	@ENDP  @ |PreMDCT|

-

-	.section .text

-	.global	PostMDCT

-

-PostMDCT:

-	stmdb     sp!, {r4 - r11, lr}

-	

-	add         r9, r0, r1, lsl #2

-	sub         r3, r9, #32

-

-	movs        r1, r1, asr #2

-	beq         PostMDCT_END

-	

-PostMDCT_LOOP:

-	VLD4.I32			{d0, d2, d4, d6}, [r2]!				@ cosa = *csptr++@ sina = *csptr++@

-	VLD4.I32			{d1, d3, d5, d7}, [r2]!				@ cosb = *csptr++@ sinb = *csptr++@

-	VLD2.I32			{d8, d9, d10, d11}, [r0]			@ tr1 = *(zbuf1 + 0)@ ti1 = *(zbuf1 + 1)@

-	VLD2.I32			{d13, d15}, [r3]!							@ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@

-	VLD2.I32			{d12, d14}, [r3]!							@ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@	

-

-	VREV64.32			Q8, Q6	

-	VREV64.32			Q9, Q7			

-	

-	VQDMULH.S32		Q10, Q0, Q4										@ MULHIGH(cosa, tr1)

-	VQDMULH.S32		Q11, Q1, Q5										@ MULHIGH(sina, ti1)

-	VQDMULH.S32		Q12, Q0, Q5										@ MULHIGH(cosa, ti1)

-	VQDMULH.S32		Q13, Q1, Q4										@ MULHIGH(sina, tr1)

-		

-	VADD.S32			Q0, Q10, Q11									@ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@

-	VSUB.S32			Q5, Q13, Q12									@ *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1)@

-	

-	VQDMULH.S32		Q10, Q2, Q8										@ MULHIGH(cosb, tr2)

-	VQDMULH.S32		Q11, Q3, Q9										@ MULHIGH(sinb, ti2)

-	VQDMULH.S32		Q12, Q2, Q9										@ MULHIGH(cosb, ti2)

-	VQDMULH.S32		Q13, Q3, Q8										@ MULHIGH(sinb, tr2)

-		

-	VADD.S32			Q4, Q10, Q11									@ *buf1-- = MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@

-	VSUB.S32			Q1, Q13, Q12									@ *buf0++ = MULHIGH(sina, tr2) - MULHIGH(cosa, ti2)@	

-	

-	VREV64.32			Q2, Q4

-	VREV64.32			Q3, Q5	

-	

-	sub						r3, r3, #32	

-	VST2.I32			{d0, d1, d2, d3}, [r0]!

-		

-	VST2.I32			{d5, d7}, [r3]!	

-	VST2.I32			{d4, d6}, [r3]! 

-	

-	subs     			r1, r1, #4

-	sub		  			r3, r3, #64		

-	bne       	PostMDCT_LOOP

-

-PostMDCT_END:

-	ldmia     sp!, {r4 - r11, pc}

-

-	@ENDP  		@ |PostMDCT|

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@	File:		PrePostMDCT_v7.s
+@
+@	Content:	premdct and postmdct function armv7 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+	.section .text
+	.global	PreMDCT
+
+PreMDCT:
+	stmdb     sp!, {r4 - r11, lr}
+	
+	add         r9, r0, r1, lsl #2
+	sub         r3, r9, #32
+
+	movs        r1, r1, asr #2
+	beq         PreMDCT_END	
+	
+PreMDCT_LOOP:
+	VLD4.I32			{d0, d2, d4, d6}, [r2]!				@ cosa = *csptr++@ sina = *csptr++@
+	VLD4.I32			{d1, d3, d5, d7}, [r2]!				@ cosb = *csptr++@ sinb = *csptr++@
+	VLD2.I32			{d8, d9, d10, d11}, [r0]			@ tr1 = *(buf0 + 0)@ ti2 = *(buf0 + 1)@
+	VLD2.I32			{d13, d15}, [r3]!					@ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@
+	VLD2.I32			{d12, d14}, [r3]!					@ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@
+		
+	VREV64.32			Q8, Q7	
+	VREV64.32			Q9, Q6
+
+	
+	VQDMULH.S32		Q10, Q0, Q4								@ MULHIGH(cosa, tr1)
+	VQDMULH.S32		Q11, Q1, Q8								@ MULHIGH(sina, ti1)
+	VQDMULH.S32		Q12, Q0, Q8								@ MULHIGH(cosa, ti1)
+	VQDMULH.S32		Q13, Q1, Q4								@ MULHIGH(sina, tr1)
+		
+	VADD.S32			Q0, Q10, Q11						@ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
+	VSUB.S32			Q1, Q12, Q13						@ *buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1)@
+	
+	VST2.I32			{d0, d1, d2, d3}, [r0]!
+	sub						r3, r3, #32
+	
+	VQDMULH.S32		Q10, Q2, Q9										@ MULHIGH(cosb, tr2)
+	VQDMULH.S32		Q11, Q3, Q5										@ MULHIGH(sinb, ti2)
+	VQDMULH.S32		Q12, Q2, Q5										@ MULHIGH(cosb, ti2)
+	VQDMULH.S32		Q13, Q3, Q9										@ MULHIGH(sinb, tr2)
+		
+	VADD.S32			Q0, Q10, Q11									@ MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@
+	VSUB.S32			Q1, Q12, Q13									@ MULHIGH(cosa, ti2) - MULHIGH(sina, tr2)@
+	
+	VREV64.32			Q3, Q1
+	VREV64.32			Q2, Q0
+		
+	VST2.I32		{d5, d7}, [r3]!	
+	VST2.I32		{d4, d6}, [r3]! 
+	
+	subs     		r1, r1, #4
+	sub		  		r3, r3, #64	
+	bne       	PreMDCT_LOOP
+	
+PreMDCT_END:
+	ldmia     sp!, {r4 - r11, pc}
+	@ENDP  @ |PreMDCT|
+
+	.section .text
+	.global	PostMDCT
+
+PostMDCT:
+	stmdb     sp!, {r4 - r11, lr}
+	
+	add         r9, r0, r1, lsl #2
+	sub         r3, r9, #32
+
+	movs        r1, r1, asr #2
+	beq         PostMDCT_END
+	
+PostMDCT_LOOP:
+	VLD4.I32			{d0, d2, d4, d6}, [r2]!				@ cosa = *csptr++@ sina = *csptr++@
+	VLD4.I32			{d1, d3, d5, d7}, [r2]!				@ cosb = *csptr++@ sinb = *csptr++@
+	VLD2.I32			{d8, d9, d10, d11}, [r0]			@ tr1 = *(zbuf1 + 0)@ ti1 = *(zbuf1 + 1)@
+	VLD2.I32			{d13, d15}, [r3]!							@ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@
+	VLD2.I32			{d12, d14}, [r3]!							@ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@	
+
+	VREV64.32			Q8, Q6	
+	VREV64.32			Q9, Q7			
+	
+	VQDMULH.S32		Q10, Q0, Q4										@ MULHIGH(cosa, tr1)
+	VQDMULH.S32		Q11, Q1, Q5										@ MULHIGH(sina, ti1)
+	VQDMULH.S32		Q12, Q0, Q5										@ MULHIGH(cosa, ti1)
+	VQDMULH.S32		Q13, Q1, Q4										@ MULHIGH(sina, tr1)
+		
+	VADD.S32			Q0, Q10, Q11									@ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
+	VSUB.S32			Q5, Q13, Q12									@ *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1)@
+	
+	VQDMULH.S32		Q10, Q2, Q8										@ MULHIGH(cosb, tr2)
+	VQDMULH.S32		Q11, Q3, Q9										@ MULHIGH(sinb, ti2)
+	VQDMULH.S32		Q12, Q2, Q9										@ MULHIGH(cosb, ti2)
+	VQDMULH.S32		Q13, Q3, Q8										@ MULHIGH(sinb, tr2)
+		
+	VADD.S32			Q4, Q10, Q11									@ *buf1-- = MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@
+	VSUB.S32			Q1, Q13, Q12									@ *buf0++ = MULHIGH(sina, tr2) - MULHIGH(cosa, ti2)@	
+	
+	VREV64.32			Q2, Q4
+	VREV64.32			Q3, Q5	
+	
+	sub						r3, r3, #32	
+	VST2.I32			{d0, d1, d2, d3}, [r0]!
+		
+	VST2.I32			{d5, d7}, [r3]!	
+	VST2.I32			{d4, d6}, [r3]! 
+	
+	subs     			r1, r1, #4
+	sub		  			r3, r3, #64		
+	bne       	PostMDCT_LOOP
+
+PostMDCT_END:
+	ldmia     sp!, {r4 - r11, pc}
+
+	@ENDP  		@ |PostMDCT|
 	.end
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/R4R8First_v7.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/R4R8First_v7.s
index 99ee68b..defd45d 100644
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/R4R8First_v7.s
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/R4R8First_v7.s
@@ -1,146 +1,146 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-@	File:		R4R8First_v7.s

-@

-@	Content:	Radix8First and Radix4First function armv7 assemble

-@

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-

-	.section .text

-	.global	Radix8First

-

-Radix8First:

-	stmdb     		sp!, {r4 - r11, lr}

-

-	ldr       		r3, SQRT1_2

-	cmp       		r1, #0

-	

-	VDUP.I32  		Q15, r3	

-	beq       		Radix8First_END

-	

-Radix8First_LOOP:

-	VLD1.I32			{d0, d1, d2, d3},	[r0]!

-	VLD1.I32			{d8, d9, d10, d11},	[r0]!

-		

-	VADD.S32			d4, d0, d1		@ r0 = buf[0] + buf[2]@i0 = buf[1] + buf[3]@

-	VSUB.S32			d5, d0, d1		@ r1 = buf[0] - buf[2]@i1 = buf[1] - buf[3]@	

-	VSUB.S32			d7, d2, d3		@ r2 = buf[4] - buf[6]@i2 = buf[5] - buf[7]@	

-	VADD.S32			d6, d2, d3		@ r3 = buf[4] + buf[6]@i3 = buf[5] + buf[7]@

-	VREV64.I32			d7, d7	

-	

-	VADD.S32			Q0, Q2, Q3		@ r4 = (r0 + r2)@i4 = (i0 + i2)@i6 = (i1 + r3)@r7 = (r1 + i3)

-	VSUB.S32			Q1, Q2, Q3		@ r5 = (r0 - r2)@i5 = (i0 - i2)@r6 = (r1 - i3)@i7 = (i1 - r3)@

-

-	VREV64.I32			d3, d3	

-

-	VADD.S32			d4, d8, d9		@ r0 = buf[ 8] + buf[10]@i0 = buf[ 9] + buf[11]@

-	VSUB.S32			d7, d10, d11	@ r1 = buf[12] - buf[14]@i1 = buf[13] - buf[15]@	

-	VADD.S32			d6, d10, d11	@ r2 = buf[12] + buf[14]@i2 = buf[13] + buf[15]@

-	VREV64.I32			d7, d7	

-	VSUB.S32			d5, d8, d9		@ r3 = buf[ 8] - buf[10]@i3 = buf[ 9] - buf[11]@

-	

-	VTRN.32				d1, d3	

-	

-	VADD.S32			Q4, Q2, Q3		@ t0 = (r0 + r2) >> 1@t1 = (i0 + i2) >> 1@i0 = i1 + r3@r2 = r1 + i3@

-	VSUB.S32			Q5, Q2, Q3		@ t2 = (r0 - r2) >> 1@t3 = (i0 - i2) >> 1@r0 = r1 - i3@i2 = i1 - r3@

-	

-	VREV64.I32			d3, d3

-	

-	VSHR.S32			d8, d8, #1		 

-	VSHR.S32			Q0, Q0, #1

-	VREV64.I32			d10, d10

-	VTRN.32				d11, d9

-	VSHR.S32			Q1, Q1, #1

-	VSHR.S32			d10, d10, #1

-	VREV64.I32			d9, d9

-	

-	sub       			r0, r0, #0x40

-	

-	VADD.S32			d12, d0, d8

-	VSUB.S32			d16, d0, d8	

-	VADD.S32			d14, d2, d10

-	VSUB.S32			d18, d2, d10

-	

-	VSUB.S32			d4, d11, d9

-	VADD.S32			d5, d11, d9

-	

-	VREV64.I32			d18, d18

-	

-	VQDMULH.S32			Q3, Q2, Q15

-	VTRN.32				d14, d18

-	VTRN.32				d6, d7

-	VREV64.I32			d18, d18	

-	

-	VSUB.S32			d15, d3, d6

-	VREV64.I32			d7, d7

-	VADD.S32			d19, d3, d6

-	VADD.S32			d13, d1, d7

-	VSUB.S32			d17, d1, d7

-	

-	VREV64.I32			d17, d17

-	VTRN.32				d13, d17

-	VREV64.I32			d17, d17

-	

-	subs       			r1, r1, #1	

-	

-	VST1.I32			{d12, d13, d14, d15}, [r0]!

-	VST1.I32			{d16, d17, d18, d19}, [r0]!	

-	bne       			Radix8First_LOOP

-	

-Radix8First_END:

-	ldmia     sp!, {r4 - r11, pc}	

-SQRT1_2:

-	.word      0x2d413ccd

-	

-	@ENDP  @ |Radix8First|

-	

-	.section .text

-	.global	Radix4First

-

-Radix4First:

-	stmdb     	sp!, {r4 - r11, lr}

-

-	cmp       	r1, #0

-	beq       	Radix4First_END

-	

-Radix4First_LOOP:

-	VLD1.I32			{d0, d1, d2, d3}, [r0]					

-	

-	VADD.S32			d4, d0, d1							@ r0 = buf[0] + buf[2]@ r1 = buf[1] + buf[3]@		

-	VSUB.S32			d5, d0, d1							@ r2 = buf[0] - buf[2]@ r3 = buf[1] - buf[3]@

-	VSUB.S32			d7, d2, d3							@ r4 = buf[4] + buf[6]@ r5 = buf[5] + buf[7]@

-	VADD.S32			d6, d2, d3							@ r6 = buf[4] - buf[6]@ r7 = buf[5] - buf[7]@

-	

-	VREV64.I32		d7, d7									@ 

-	

-	VADD.S32			Q4, Q2, Q3

-	VSUB.S32			Q5, Q2, Q3

-	

-	VREV64.I32		d11, d11

-	VTRN.32				d9, d11

-	subs       		r1, r1, #1	

-	VREV64.I32		d11, d11

-	VST1.I32			{d8, d9, d10, d11}, [r0]!

-

-	bne       		Radix4First_LOOP

-	

-Radix4First_END:

-	ldmia    		sp!, {r4 - r11, pc}

-

-	@ENDP  @ |Radix4First|

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@	File:		R4R8First_v7.s
+@
+@	Content:	Radix8First and Radix4First function armv7 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+	.section .text
+	.global	Radix8First
+
+Radix8First:
+	stmdb     		sp!, {r4 - r11, lr}
+
+	ldr       		r3, SQRT1_2
+	cmp       		r1, #0
+	
+	VDUP.I32  		Q15, r3	
+	beq       		Radix8First_END
+	
+Radix8First_LOOP:
+	VLD1.I32			{d0, d1, d2, d3},	[r0]!
+	VLD1.I32			{d8, d9, d10, d11},	[r0]!
+		
+	VADD.S32			d4, d0, d1		@ r0 = buf[0] + buf[2]@i0 = buf[1] + buf[3]@
+	VSUB.S32			d5, d0, d1		@ r1 = buf[0] - buf[2]@i1 = buf[1] - buf[3]@	
+	VSUB.S32			d7, d2, d3		@ r2 = buf[4] - buf[6]@i2 = buf[5] - buf[7]@	
+	VADD.S32			d6, d2, d3		@ r3 = buf[4] + buf[6]@i3 = buf[5] + buf[7]@
+	VREV64.I32			d7, d7	
+	
+	VADD.S32			Q0, Q2, Q3		@ r4 = (r0 + r2)@i4 = (i0 + i2)@i6 = (i1 + r3)@r7 = (r1 + i3)
+	VSUB.S32			Q1, Q2, Q3		@ r5 = (r0 - r2)@i5 = (i0 - i2)@r6 = (r1 - i3)@i7 = (i1 - r3)@
+
+	VREV64.I32			d3, d3	
+
+	VADD.S32			d4, d8, d9		@ r0 = buf[ 8] + buf[10]@i0 = buf[ 9] + buf[11]@
+	VSUB.S32			d7, d10, d11	@ r1 = buf[12] - buf[14]@i1 = buf[13] - buf[15]@	
+	VADD.S32			d6, d10, d11	@ r2 = buf[12] + buf[14]@i2 = buf[13] + buf[15]@
+	VREV64.I32			d7, d7	
+	VSUB.S32			d5, d8, d9		@ r3 = buf[ 8] - buf[10]@i3 = buf[ 9] - buf[11]@
+	
+	VTRN.32				d1, d3	
+	
+	VADD.S32			Q4, Q2, Q3		@ t0 = (r0 + r2) >> 1@t1 = (i0 + i2) >> 1@i0 = i1 + r3@r2 = r1 + i3@
+	VSUB.S32			Q5, Q2, Q3		@ t2 = (r0 - r2) >> 1@t3 = (i0 - i2) >> 1@r0 = r1 - i3@i2 = i1 - r3@
+	
+	VREV64.I32			d3, d3
+	
+	VSHR.S32			d8, d8, #1		 
+	VSHR.S32			Q0, Q0, #1
+	VREV64.I32			d10, d10
+	VTRN.32				d11, d9
+	VSHR.S32			Q1, Q1, #1
+	VSHR.S32			d10, d10, #1
+	VREV64.I32			d9, d9
+	
+	sub       			r0, r0, #0x40
+	
+	VADD.S32			d12, d0, d8
+	VSUB.S32			d16, d0, d8	
+	VADD.S32			d14, d2, d10
+	VSUB.S32			d18, d2, d10
+	
+	VSUB.S32			d4, d11, d9
+	VADD.S32			d5, d11, d9
+	
+	VREV64.I32			d18, d18
+	
+	VQDMULH.S32			Q3, Q2, Q15
+	VTRN.32				d14, d18
+	VTRN.32				d6, d7
+	VREV64.I32			d18, d18	
+	
+	VSUB.S32			d15, d3, d6
+	VREV64.I32			d7, d7
+	VADD.S32			d19, d3, d6
+	VADD.S32			d13, d1, d7
+	VSUB.S32			d17, d1, d7
+	
+	VREV64.I32			d17, d17
+	VTRN.32				d13, d17
+	VREV64.I32			d17, d17
+	
+	subs       			r1, r1, #1	
+	
+	VST1.I32			{d12, d13, d14, d15}, [r0]!
+	VST1.I32			{d16, d17, d18, d19}, [r0]!	
+	bne       			Radix8First_LOOP
+	
+Radix8First_END:
+	ldmia     sp!, {r4 - r11, pc}	
+SQRT1_2:
+	.word      0x2d413ccd
+	
+	@ENDP  @ |Radix8First|
+	
+	.section .text
+	.global	Radix4First
+
+Radix4First:
+	stmdb     	sp!, {r4 - r11, lr}
+
+	cmp       	r1, #0
+	beq       	Radix4First_END
+	
+Radix4First_LOOP:
+	VLD1.I32			{d0, d1, d2, d3}, [r0]					
+	
+	VADD.S32			d4, d0, d1							@ r0 = buf[0] + buf[2]@ r1 = buf[1] + buf[3]@		
+	VSUB.S32			d5, d0, d1							@ r2 = buf[0] - buf[2]@ r3 = buf[1] - buf[3]@
+	VSUB.S32			d7, d2, d3							@ r4 = buf[4] + buf[6]@ r5 = buf[5] + buf[7]@
+	VADD.S32			d6, d2, d3							@ r6 = buf[4] - buf[6]@ r7 = buf[5] - buf[7]@
+	
+	VREV64.I32		d7, d7									@ 
+	
+	VADD.S32			Q4, Q2, Q3
+	VSUB.S32			Q5, Q2, Q3
+	
+	VREV64.I32		d11, d11
+	VTRN.32				d9, d11
+	subs       		r1, r1, #1	
+	VREV64.I32		d11, d11
+	VST1.I32			{d8, d9, d10, d11}, [r0]!
+
+	bne       		Radix4First_LOOP
+	
+Radix4First_END:
+	ldmia    		sp!, {r4 - r11, pc}
+
+	@ENDP  @ |Radix4First|
 	.end
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/Radix4FFT_v7.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/Radix4FFT_v7.s
index e1a8438..84a4a80 100644
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/Radix4FFT_v7.s
+++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/Radix4FFT_v7.s
@@ -1,143 +1,143 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-@	File:		Radix4FFT_v7.s

-@

-@	Content:	Radix4FFT armv7 assemble

-@

-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-

-	.section .text

-	.global	Radix4FFT

-

-Radix4FFT:

-	stmdb    sp!, {r4 - r11, lr}

-

-	mov			r1, r1, asr #2

-	cmp     	r1, #0                            

-	beq     	Radix4FFT_END                            

-                        

-Radix4FFT_LOOP1:                         

-	mov     	r5, r2, lsl #1  

-	mov     	r8, r0          

-	mov     	r7, r1  

-	mov     	r5, r5, lsl #2   

-	cmp     	r1, #0          

-	rsbeq   	r12, r5, r5, lsl #2 

-	beq     	Radix4FFT_LOOP1_END              

-                         

-	rsb     	r12, r5, r5, lsl #2   

-	 

-Radix4FFT_LOOP2:                        

-	mov     	r6, r3 

-	mov     	r4, r2  

-	cmp     	r2, #0        

-	beq     	Radix4FFT_LOOP2_END         

-  

-Radix4FFT_LOOP3:                          

-	@r0 = xptr[0]@

-	@r1 = xptr[1]@

-	VLD2.I32			{D0, D1, D2, D3}, [r8]				

-	VLD2.I32			{D28, D29, D30, D31}, [r6]!		@ cosx = csptr[0]@ sinx = csptr[1]@

-	

-	add					r8, r8, r5										@ xptr += step@	

-	VLD2.I32			{D4, D5, D6,D7}, [r8]					@ r2 = xptr[0]@ r3 = xptr[1]@

-	

-	VQDMULH.S32		Q10, Q2, Q14									@ MULHIGH(cosx, t0)

-	VQDMULH.S32		Q11, Q3, Q15									@ MULHIGH(sinx, t1)

-	VQDMULH.S32		Q12, Q3, Q14									@ MULHIGH(cosx, t1)

-	VQDMULH.S32		Q13, Q2, Q15									@ MULHIGH(sinx, t0)

-		

-	VADD.S32			Q2, Q10, Q11									@ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)

-	VSUB.S32			Q3, Q12, Q13									@ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)

-	

-	add					r8, r8, r5										@ xptr += step@

-	VSHR.S32			Q10, Q0, #2										@ t0 = r0 >> 2@

-	VSHR.S32			Q11, Q1, #2										@ t1 = r1 >> 2@

-	

-	VSUB.S32			Q0,	Q10, Q2										@ r0 = t0 - r2@

-	VSUB.S32			Q1,	Q11, Q3										@ r1 = t1 - r3@

-	VADD.S32			Q2, Q10, Q2										@ r2 = t0 + r2@

-	VADD.S32			Q3, Q11, Q3										@ r3 = t1 + r3@

-		

-	VLD2.I32			{D8, D9, D10, D11}, [r8]	

-	VLD2.I32			{D28, D29, D30, D31}, [r6]!	

-	add						r8, r8, r5

-

-	VQDMULH.S32		Q10, Q4, Q14									@ MULHIGH(cosx, t0)

-	VQDMULH.S32		Q11, Q5, Q15									@ MULHIGH(sinx, t1)

-	VQDMULH.S32		Q12, Q5, Q14									@ MULHIGH(cosx, t1)

-	VQDMULH.S32		Q13, Q4, Q15									@ MULHIGH(sinx, t0)

-		

-	VADD.S32			Q8, Q10, Q11									@ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)

-	VSUB.S32			Q9, Q12, Q13									@ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)	

-	

-	VLD2.I32		{D12, D13, D14, D15}, [r8]	

-	VLD2.I32		{D28, D29, D30, D31}, [r6]!

-	

-	VQDMULH.S32		Q10, Q6, Q14									@ MULHIGH(cosx, t0)

-	VQDMULH.S32		Q11, Q7, Q15									@ MULHIGH(sinx, t1)

-	VQDMULH.S32		Q12, Q7, Q14									@ MULHIGH(cosx, t1)

-	VQDMULH.S32		Q13, Q6, Q15									@ MULHIGH(sinx, t0)

-		

-	VADD.S32			Q6, Q10, Q11									@ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)

-	VSUB.S32			Q7, Q12, Q13									@ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)		

-	

-	VADD.S32			Q4, Q8, Q6										@ r4 = t0 + r6@

-	VSUB.S32			Q5, Q7, Q9										@ r5 = r7 - t1@

-	VSUB.S32			Q6, Q8, Q6										@ r6 = t0 - r6@

-	VADD.S32			Q7, Q7, Q9										@ r7 = r7 + t1@

-	

-	VADD.S32			Q8, Q0, Q5										@ xptr[0] = r0 + r5@

-	VADD.S32			Q9, Q1, Q6										@ xptr[1] = r1 + r6@

-	VST2.I32			{D16, D17, D18, D19}, [r8]

-	

-	VSUB.S32			Q10, Q2, Q4										@ xptr[0] = r2 - r4@

-	sub					r8, r8, r5										@ xptr -= step@

-	VSUB.S32			Q11, Q3, Q7										@ xptr[1] = r3 - r7@

-	VST2.I32			{D20, D21, D22, D23}, [r8]

-		

-	VSUB.S32			Q8, Q0, Q5										@ xptr[0] = r0 - r5@

-	sub					r8, r8, r5										@ xptr -= step@

-	VSUB.S32			Q9, Q1, Q6										@ xptr[1] = r1 - r6@

-	VST2.I32			{D16, D17, D18, D19}, [r8]

-		

-	VADD.S32			Q10, Q2, Q4										@ xptr[0] = r2 + r4@

-	sub					r8, r8, r5										@ xptr -= step@

-	VADD.S32			Q11, Q3, Q7										@ xptr[1] = r3 + r7@

-	VST2.I32			{D20, D21, D22, D23}, [r8]!

-		

-	subs    			r4, r4, #4 

-	bne     			Radix4FFT_LOOP3 

-	                         

-Radix4FFT_LOOP2_END:                         

-	add     			r8, r8, r12    

-	sub    				r7, r7, #1     

-	cmp					r7, #0

-	bhi     			Radix4FFT_LOOP2           

-                        

-Radix4FFT_LOOP1_END:                        

-	add     			r3, r12, r3    

-	mov     			r2, r2, lsl #2 

-	movs    			r1, r1, asr #2 

-	bne     			Radix4FFT_LOOP1          

-                        

-Radix4FFT_END:        

-	ldmia   			sp!, {r4 - r11, pc}

-		

-	@ENDP  @ |Radix4FFT|

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@	File:		Radix4FFT_v7.s
+@
+@	Content:	Radix4FFT armv7 assemble
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+	.section .text
+	.global	Radix4FFT
+
+Radix4FFT:
+	stmdb    sp!, {r4 - r11, lr}
+
+	mov			r1, r1, asr #2
+	cmp     	r1, #0                            
+	beq     	Radix4FFT_END                            
+                        
+Radix4FFT_LOOP1:                         
+	mov     	r5, r2, lsl #1  
+	mov     	r8, r0          
+	mov     	r7, r1  
+	mov     	r5, r5, lsl #2   
+	cmp     	r1, #0          
+	rsbeq   	r12, r5, r5, lsl #2 
+	beq     	Radix4FFT_LOOP1_END              
+                         
+	rsb     	r12, r5, r5, lsl #2   
+	 
+Radix4FFT_LOOP2:                        
+	mov     	r6, r3 
+	mov     	r4, r2  
+	cmp     	r2, #0        
+	beq     	Radix4FFT_LOOP2_END         
+  
+Radix4FFT_LOOP3:                          
+	@r0 = xptr[0]@
+	@r1 = xptr[1]@
+	VLD2.I32			{D0, D1, D2, D3}, [r8]				
+	VLD2.I32			{D28, D29, D30, D31}, [r6]!		@ cosx = csptr[0]@ sinx = csptr[1]@
+	
+	add					r8, r8, r5										@ xptr += step@	
+	VLD2.I32			{D4, D5, D6,D7}, [r8]					@ r2 = xptr[0]@ r3 = xptr[1]@
+	
+	VQDMULH.S32		Q10, Q2, Q14									@ MULHIGH(cosx, t0)
+	VQDMULH.S32		Q11, Q3, Q15									@ MULHIGH(sinx, t1)
+	VQDMULH.S32		Q12, Q3, Q14									@ MULHIGH(cosx, t1)
+	VQDMULH.S32		Q13, Q2, Q15									@ MULHIGH(sinx, t0)
+		
+	VADD.S32			Q2, Q10, Q11									@ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
+	VSUB.S32			Q3, Q12, Q13									@ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
+	
+	add					r8, r8, r5										@ xptr += step@
+	VSHR.S32			Q10, Q0, #2										@ t0 = r0 >> 2@
+	VSHR.S32			Q11, Q1, #2										@ t1 = r1 >> 2@
+	
+	VSUB.S32			Q0,	Q10, Q2										@ r0 = t0 - r2@
+	VSUB.S32			Q1,	Q11, Q3										@ r1 = t1 - r3@
+	VADD.S32			Q2, Q10, Q2										@ r2 = t0 + r2@
+	VADD.S32			Q3, Q11, Q3										@ r3 = t1 + r3@
+		
+	VLD2.I32			{D8, D9, D10, D11}, [r8]	
+	VLD2.I32			{D28, D29, D30, D31}, [r6]!	
+	add						r8, r8, r5
+
+	VQDMULH.S32		Q10, Q4, Q14									@ MULHIGH(cosx, t0)
+	VQDMULH.S32		Q11, Q5, Q15									@ MULHIGH(sinx, t1)
+	VQDMULH.S32		Q12, Q5, Q14									@ MULHIGH(cosx, t1)
+	VQDMULH.S32		Q13, Q4, Q15									@ MULHIGH(sinx, t0)
+		
+	VADD.S32			Q8, Q10, Q11									@ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
+	VSUB.S32			Q9, Q12, Q13									@ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)	
+	
+	VLD2.I32		{D12, D13, D14, D15}, [r8]	
+	VLD2.I32		{D28, D29, D30, D31}, [r6]!
+	
+	VQDMULH.S32		Q10, Q6, Q14									@ MULHIGH(cosx, t0)
+	VQDMULH.S32		Q11, Q7, Q15									@ MULHIGH(sinx, t1)
+	VQDMULH.S32		Q12, Q7, Q14									@ MULHIGH(cosx, t1)
+	VQDMULH.S32		Q13, Q6, Q15									@ MULHIGH(sinx, t0)
+		
+	VADD.S32			Q6, Q10, Q11									@ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
+	VSUB.S32			Q7, Q12, Q13									@ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)		
+	
+	VADD.S32			Q4, Q8, Q6										@ r4 = t0 + r6@
+	VSUB.S32			Q5, Q7, Q9										@ r5 = r7 - t1@
+	VSUB.S32			Q6, Q8, Q6										@ r6 = t0 - r6@
+	VADD.S32			Q7, Q7, Q9										@ r7 = r7 + t1@
+	
+	VADD.S32			Q8, Q0, Q5										@ xptr[0] = r0 + r5@
+	VADD.S32			Q9, Q1, Q6										@ xptr[1] = r1 + r6@
+	VST2.I32			{D16, D17, D18, D19}, [r8]
+	
+	VSUB.S32			Q10, Q2, Q4										@ xptr[0] = r2 - r4@
+	sub					r8, r8, r5										@ xptr -= step@
+	VSUB.S32			Q11, Q3, Q7										@ xptr[1] = r3 - r7@
+	VST2.I32			{D20, D21, D22, D23}, [r8]
+		
+	VSUB.S32			Q8, Q0, Q5										@ xptr[0] = r0 - r5@
+	sub					r8, r8, r5										@ xptr -= step@
+	VSUB.S32			Q9, Q1, Q6										@ xptr[1] = r1 - r6@
+	VST2.I32			{D16, D17, D18, D19}, [r8]
+		
+	VADD.S32			Q10, Q2, Q4										@ xptr[0] = r2 + r4@
+	sub					r8, r8, r5										@ xptr -= step@
+	VADD.S32			Q11, Q3, Q7										@ xptr[1] = r3 + r7@
+	VST2.I32			{D20, D21, D22, D23}, [r8]!
+		
+	subs    			r4, r4, #4 
+	bne     			Radix4FFT_LOOP3 
+	                         
+Radix4FFT_LOOP2_END:                         
+	add     			r8, r8, r12    
+	sub    				r7, r7, #1     
+	cmp					r7, #0
+	bhi     			Radix4FFT_LOOP2           
+                        
+Radix4FFT_LOOP1_END:                        
+	add     			r3, r12, r3    
+	mov     			r2, r2, lsl #2 
+	movs    			r1, r1, asr #2 
+	bne     			Radix4FFT_LOOP1          
+                        
+Radix4FFT_END:        
+	ldmia   			sp!, {r4 - r11, pc}
+		
+	@ENDP  @ |Radix4FFT|
 	.end
\ No newline at end of file
diff --git a/media/libstagefright/codecs/aacenc/src/band_nrg.c b/media/libstagefright/codecs/aacenc/src/band_nrg.c
index 666c4ca..89c39b6 100644
--- a/media/libstagefright/codecs/aacenc/src/band_nrg.c
+++ b/media/libstagefright/codecs/aacenc/src/band_nrg.c
@@ -1,35 +1,35 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		band_nrg.c

-

-	Content:	Band/Line energy calculations functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		band_nrg.c
+
+	Content:	Band/Line energy calculations functions
+
 *******************************************************************************/
 
-#include "basic_op.h"

+#include "basic_op.h"
 #include "band_nrg.h"
 
-#ifndef ARMV5E

+#ifndef ARMV5E
 /********************************************************************************
 *
 * function name: CalcBandEnergy
 * description:   Calc sfb-bandwise mdct-energies for left and right channel
 *
-**********************************************************************************/

+**********************************************************************************/
 void CalcBandEnergy(const Word32 *mdctSpectrum,
                     const Word16 *bandOffset,
                     const Word16  numBands,
@@ -42,8 +42,8 @@
   for (i=0; i<numBands; i++) {
     Word32 accu = 0;                                             
     for (j=bandOffset[i]; j<bandOffset[i+1]; j++)
-      accu = L_add(accu, MULHIGH(mdctSpectrum[j], mdctSpectrum[j]));

-

+      accu = L_add(accu, MULHIGH(mdctSpectrum[j], mdctSpectrum[j]));
+
 	accu = L_add(accu, accu);
     accuSum = L_add(accuSum, accu);
     bandEnergy[i] = accu;                                        
@@ -86,9 +86,9 @@
       accuMid = L_add(accuMid, MULHIGH(specm, specm));
       accuSide = L_add(accuSide, MULHIGH(specs, specs));
     }
-    

-	accuMid = L_add(accuMid, accuMid);

-	accuSide = L_add(accuSide, accuSide);

+    
+	accuMid = L_add(accuMid, accuMid);
+	accuSide = L_add(accuSide, accuSide);
 	bandEnergyMid[i] = accuMid;                                  
     accuMidSum = L_add(accuMidSum, accuMid);
     bandEnergySide[i] = accuSide;                                
diff --git a/media/libstagefright/codecs/aacenc/src/bit_cnt.c b/media/libstagefright/codecs/aacenc/src/bit_cnt.c
index 24837e8..dd0b9b4 100644
--- a/media/libstagefright/codecs/aacenc/src/bit_cnt.c
+++ b/media/libstagefright/codecs/aacenc/src/bit_cnt.c
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		bit_cnt.c

-

-	Content:	Huffman Bitcounter & coder functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		bit_cnt.c
+
+	Content:	Huffman Bitcounter & coder functions
+
 *******************************************************************************/
 
 #include "bit_cnt.h"
@@ -45,7 +45,7 @@
 {
   Word32 t0,t1,t2,t3,i;
   Word32 bc1_2,bc3_4,bc5_6,bc7_8,bc9_10;
-  Word16 bc11,sc;

+  Word16 bc11,sc;
   
   bc1_2=0;                               
   bc3_4=0;                               
@@ -162,7 +162,7 @@
 
            
     sc = sc + (t0>0) + (t1>0) + (t2>0) + (t3>0);   
-  }

+  }
   
   bitCount[1]=INVALID_BITCOUNT;                          
   bitCount[2]=INVALID_BITCOUNT;                          
@@ -196,7 +196,7 @@
 
   Word32 t0,t1,i;
   Word32 bc5_6,bc7_8,bc9_10;
-  Word16 bc11,sc;

+  Word16 bc11,sc;
 
   bc5_6=0;                               
   bc7_8=0;                               
@@ -294,43 +294,43 @@
 * output:       bitCount for tables 9-11
 *
 *****************************************************************************/
-static void count9_10_11(const Word16 *values,

-                         const Word16  width,

-                         Word16       *bitCount)

-{

-

-  Word32 t0,t1,i;  

-  Word32 bc9_10;

-  Word16 bc11,sc;

-

-  bc9_10=0;                              

-  bc11=0;                                

-  sc=0;                                  

-

-  for(i=0;i<width;i+=2){

-

-    t0=ABS(values[i+0]);

-    t1=ABS(values[i+1]);

-    

-

-    bc9_10 += EXPAND(huff_ltab9_10[t0][t1]);           

-    bc11 = bc11 + huff_ltab11[t0][t1];

-

-       

-    sc = sc + (t0>0) + (t1>0);

-  }

-  bitCount[1]=INVALID_BITCOUNT;          

-  bitCount[2]=INVALID_BITCOUNT;          

-  bitCount[3]=INVALID_BITCOUNT;          

-  bitCount[4]=INVALID_BITCOUNT;          

-  bitCount[5]=INVALID_BITCOUNT;          

-  bitCount[6]=INVALID_BITCOUNT;          

-  bitCount[7]=INVALID_BITCOUNT;          

-  bitCount[8]=INVALID_BITCOUNT;          

-  bitCount[9]=extract_h(bc9_10) + sc;

-  bitCount[10]=extract_l(bc9_10) + sc;

-  bitCount[11]=bc11 + sc;

-  

+static void count9_10_11(const Word16 *values,
+                         const Word16  width,
+                         Word16       *bitCount)
+{
+
+  Word32 t0,t1,i;  
+  Word32 bc9_10;
+  Word16 bc11,sc;
+
+  bc9_10=0;                              
+  bc11=0;                                
+  sc=0;                                  
+
+  for(i=0;i<width;i+=2){
+
+    t0=ABS(values[i+0]);
+    t1=ABS(values[i+1]);
+    
+
+    bc9_10 += EXPAND(huff_ltab9_10[t0][t1]);           
+    bc11 = bc11 + huff_ltab11[t0][t1];
+
+       
+    sc = sc + (t0>0) + (t1>0);
+  }
+  bitCount[1]=INVALID_BITCOUNT;          
+  bitCount[2]=INVALID_BITCOUNT;          
+  bitCount[3]=INVALID_BITCOUNT;          
+  bitCount[4]=INVALID_BITCOUNT;          
+  bitCount[5]=INVALID_BITCOUNT;          
+  bitCount[6]=INVALID_BITCOUNT;          
+  bitCount[7]=INVALID_BITCOUNT;          
+  bitCount[8]=INVALID_BITCOUNT;          
+  bitCount[9]=extract_h(bc9_10) + sc;
+  bitCount[10]=extract_l(bc9_10) + sc;
+  bitCount[11]=bc11 + sc;
+  
 }
  
 /*****************************************************************************
@@ -342,35 +342,35 @@
 * output:       bitCount for table 11
 *
 *****************************************************************************/
- static void count11(const Word16 *values,

-                    const Word16  width,

-                    Word16        *bitCount)

-{

-  Word32 t0,t1,i;

-  Word16 bc11,sc;  

-

-  bc11=0;                        

-  sc=0;                          

-  for(i=0;i<width;i+=2){

-    t0=ABS(values[i+0]);

-    t1=ABS(values[i+1]);

-    bc11 = bc11 + huff_ltab11[t0][t1];

-

-       

-    sc = sc + (t0>0) + (t1>0);

-  }

-

-  bitCount[1]=INVALID_BITCOUNT;                  

-  bitCount[2]=INVALID_BITCOUNT;                  

-  bitCount[3]=INVALID_BITCOUNT;                  

-  bitCount[4]=INVALID_BITCOUNT;                  

-  bitCount[5]=INVALID_BITCOUNT;                  

-  bitCount[6]=INVALID_BITCOUNT;                  

-  bitCount[7]=INVALID_BITCOUNT;                  

-  bitCount[8]=INVALID_BITCOUNT;                  

-  bitCount[9]=INVALID_BITCOUNT;                  

-  bitCount[10]=INVALID_BITCOUNT;                 

-  bitCount[11]=bc11 + sc;

+ static void count11(const Word16 *values,
+                    const Word16  width,
+                    Word16        *bitCount)
+{
+  Word32 t0,t1,i;
+  Word16 bc11,sc;  
+
+  bc11=0;                        
+  sc=0;                          
+  for(i=0;i<width;i+=2){
+    t0=ABS(values[i+0]);
+    t1=ABS(values[i+1]);
+    bc11 = bc11 + huff_ltab11[t0][t1];
+
+       
+    sc = sc + (t0>0) + (t1>0);
+  }
+
+  bitCount[1]=INVALID_BITCOUNT;                  
+  bitCount[2]=INVALID_BITCOUNT;                  
+  bitCount[3]=INVALID_BITCOUNT;                  
+  bitCount[4]=INVALID_BITCOUNT;                  
+  bitCount[5]=INVALID_BITCOUNT;                  
+  bitCount[6]=INVALID_BITCOUNT;                  
+  bitCount[7]=INVALID_BITCOUNT;                  
+  bitCount[8]=INVALID_BITCOUNT;                  
+  bitCount[9]=INVALID_BITCOUNT;                  
+  bitCount[10]=INVALID_BITCOUNT;                 
+  bitCount[11]=bc11 + sc;
 }
 
 /*****************************************************************************
@@ -383,54 +383,54 @@
 *
 *****************************************************************************/
 
-static void countEsc(const Word16 *values,

-                     const Word16  width,

-                     Word16       *bitCount)

-{

-  Word32 t0,t1,t00,t01,i;

-  Word16 bc11,ec,sc;  

-

-  bc11=0;                                

-  sc=0;                                  

-  ec=0;                                  

-  for(i=0;i<width;i+=2){

-    t0=ABS(values[i+0]);

-    t1=ABS(values[i+1]);

-    

-       

-    sc = sc + (t0>0) + (t1>0);

-

-    t00 = min(t0,16);

-    t01 = min(t1,16);

-    bc11 = bc11 + huff_ltab11[t00][t01];

-    

-     

-    if(t0 >= 16){

-      ec = ec + 5;

-      while(sub(t0=(t0 >> 1), 16) >= 0) {

-        ec = ec + 2;

-      }

-    }

-    

-     

-    if(t1 >= 16){

-      ec = ec + 5;

-      while(sub(t1=(t1 >> 1), 16) >= 0) {

-        ec = ec + 2;

-      }

-    }

-  }

-  bitCount[1]=INVALID_BITCOUNT;          

-  bitCount[2]=INVALID_BITCOUNT;          

-  bitCount[3]=INVALID_BITCOUNT;          

-  bitCount[4]=INVALID_BITCOUNT;          

-  bitCount[5]=INVALID_BITCOUNT;          

-  bitCount[6]=INVALID_BITCOUNT;          

-  bitCount[7]=INVALID_BITCOUNT;          

-  bitCount[8]=INVALID_BITCOUNT;          

-  bitCount[9]=INVALID_BITCOUNT;          

-  bitCount[10]=INVALID_BITCOUNT;         

-  bitCount[11]=bc11 + sc + ec;

+static void countEsc(const Word16 *values,
+                     const Word16  width,
+                     Word16       *bitCount)
+{
+  Word32 t0,t1,t00,t01,i;
+  Word16 bc11,ec,sc;  
+
+  bc11=0;                                
+  sc=0;                                  
+  ec=0;                                  
+  for(i=0;i<width;i+=2){
+    t0=ABS(values[i+0]);
+    t1=ABS(values[i+1]);
+    
+       
+    sc = sc + (t0>0) + (t1>0);
+
+    t00 = min(t0,16);
+    t01 = min(t1,16);
+    bc11 = bc11 + huff_ltab11[t00][t01];
+    
+     
+    if(t0 >= 16){
+      ec = ec + 5;
+      while(sub(t0=(t0 >> 1), 16) >= 0) {
+        ec = ec + 2;
+      }
+    }
+    
+     
+    if(t1 >= 16){
+      ec = ec + 5;
+      while(sub(t1=(t1 >> 1), 16) >= 0) {
+        ec = ec + 2;
+      }
+    }
+  }
+  bitCount[1]=INVALID_BITCOUNT;          
+  bitCount[2]=INVALID_BITCOUNT;          
+  bitCount[3]=INVALID_BITCOUNT;          
+  bitCount[4]=INVALID_BITCOUNT;          
+  bitCount[5]=INVALID_BITCOUNT;          
+  bitCount[6]=INVALID_BITCOUNT;          
+  bitCount[7]=INVALID_BITCOUNT;          
+  bitCount[8]=INVALID_BITCOUNT;          
+  bitCount[9]=INVALID_BITCOUNT;          
+  bitCount[10]=INVALID_BITCOUNT;         
+  bitCount[11]=bc11 + sc + ec;
 }
 
 
@@ -492,376 +492,376 @@
 * description:  write huffum bits 
 *
 *****************************************************************************/
-Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF hBitstream)

-{

-

-  Word32 i, t0, t1, t2, t3, t00, t01;

-  Word16 codeWord, codeLength;

-  Word16 sign, signLength;

-

-   

-  switch (codeBook) {

-    case CODE_BOOK_ZERO_NO:

-      break;

-

-    case CODE_BOOK_1_NO:

-      for(i=0; i<width; i+=4) {

-        t0         = values[i+0];                                        

-        t1         = values[i+1];                                        

-        t2         = values[i+2];                                        

-        t3         = values[i+3];                                        

-        codeWord   = huff_ctab1[t0+1][t1+1][t2+1][t3+1];                 

-        codeLength = HI_LTAB(huff_ltab1_2[t0+1][t1+1][t2+1][t3+1]);      

-        WriteBits(hBitstream, codeWord, codeLength);        

-      }

-      break;

-

-    case CODE_BOOK_2_NO:

-      for(i=0; i<width; i+=4) {

-        t0         = values[i+0];                                        

-        t1         = values[i+1];                                        

-        t2         = values[i+2];                                        

-        t3         = values[i+3];                                        

-        codeWord   = huff_ctab2[t0+1][t1+1][t2+1][t3+1];                 

-        codeLength = LO_LTAB(huff_ltab1_2[t0+1][t1+1][t2+1][t3+1]);      

-        WriteBits(hBitstream,codeWord,codeLength);

-      }

-      break;

-

-    case CODE_BOOK_3_NO:

-      for(i=0; i<width; i+=4) {

-        sign=0;                                                          

-        signLength=0;                                                    

-        t0 = values[i+0];                                                

-         

-        if(t0 != 0){

-          signLength = signLength + 1;

-          sign = sign << 1; 

-           

-          if(t0 < 0){

-            sign|=1;                                                     

-            t0=-t0;

-          }

-        }

-        t1 = values[i+1];                                                

-         

-        if(t1 != 0){

-          signLength = signLength + 1;

-          sign = sign << 1; 

-           

-          if(t1 < 0){

-            sign|=1;                                                     

-            t1=-t1;

-          }

-        }

-        t2 = values[i+2];                                                

-         

-        if(t2 != 0){

-          signLength = signLength + 1;

-          sign = sign << 1; 

-           

-          if(t2 < 0){

-            sign|=1;                                                     

-            t2=-t2;

-          }

-        }

-        t3 = values[i+3];                                                

-        if(t3 != 0){

-          signLength = signLength + 1;

-          sign = sign << 1; 

-           

-          if(t3 < 0){

-            sign|=1;                                                     

-            t3=-t3;

-          }

-        }

-

-        codeWord   = huff_ctab3[t0][t1][t2][t3];                         

-        codeLength = HI_LTAB(huff_ltab3_4[t0][t1][t2][t3]);              

-        WriteBits(hBitstream,codeWord,codeLength);

-        WriteBits(hBitstream,sign,signLength);

-      }

-      break;

-

-    case CODE_BOOK_4_NO:

-      for(i=0; i<width; i+=4) {

-        sign=0;                                                          

-        signLength=0;                                                    

-        t0 = values[i+0];                                                

-         

-        if(t0 != 0){                                                             

-          signLength = signLength + 1;

-          sign = sign << 1; 

-          if(t0 < 0){                                                            

-            sign|=1;                                                     

-            t0=-t0;                                                          

-          }

-        }                                                                        

-        t1 = values[i+1];                                                

-         

-        if(t1 != 0){                                                             

-          signLength = signLength + 1;

-          sign = sign << 1; 

-           

-          if(t1 < 0){                                                            

-            sign|=1;                                                     

-            t1=-t1;                                                          

-          }                                                                      

-        }                                                                        

-        t2 = values[i+2];                                                

-         

-        if(t2 != 0){                                                    

-          signLength = signLength + 1;

-          sign = sign << 1; 

-           

-          if(t2 < 0){                                                   

-            sign|=1;                                                     

-            t2=-t2;                                                 

-          }                                                             

-        }                                                               

-        t3 = values[i+3];                                                

-         

-        if(t3 != 0){                                                    

-          signLength = signLength + 1;

-          sign = sign << 1; 

-           

-          if(t3 < 0){                                                   

-            sign|=1;                                                     

-            t3=-t3;                                                 

-          }                                                             

-        }                                                               

-        codeWord   = huff_ctab4[t0][t1][t2][t3];                         

-        codeLength = LO_LTAB(huff_ltab3_4[t0][t1][t2][t3]);              

-        WriteBits(hBitstream,codeWord,codeLength);                      

-        WriteBits(hBitstream,sign,signLength);                          

-      }                                                                 

-      break;                                                            

-                                                                        

-    case CODE_BOOK_5_NO:                                                

-      for(i=0; i<width; i+=2) {                                         

-        t0         = values[i+0];                                         

-        t1         = values[i+1];                                        

-        codeWord   = huff_ctab5[t0+4][t1+4];                             

-        codeLength = HI_LTAB(huff_ltab5_6[t0+4][t1+4]);                  

-        WriteBits(hBitstream,codeWord,codeLength);

-      }

-      break;

-

-    case CODE_BOOK_6_NO:

-      for(i=0; i<width; i+=2) {

-        t0         = values[i+0];                                        

-        t1         = values[i+1];                                        

-        codeWord   = huff_ctab6[t0+4][t1+4];                             

-        codeLength = LO_LTAB(huff_ltab5_6[t0+4][t1+4]);                  

-        WriteBits(hBitstream,codeWord,codeLength);

-      }

-      break;

-

-    case CODE_BOOK_7_NO:

-      for(i=0; i<width; i+=2){

-        sign=0;                                                          

-        signLength=0;                                                    

-        t0 = values[i+0];                                                

-         

-        if(t0 != 0){

-          signLength = signLength + 1;

-          sign = sign << 1; 

-           

-          if(t0 < 0){

-            sign|=1;                                                     

-            t0=-t0;

-          }

-        }

-

-        t1 = values[i+1];                                                

-         

-        if(t1 != 0){

-          signLength = signLength + 1;

-          sign = sign << 1; 

-           

-          if(t1 < 0){

-            sign|=1;                                                     

-            t1=-t1;

-          }

-        }

-        codeWord   = huff_ctab7[t0][t1];                                 

-        codeLength = HI_LTAB(huff_ltab7_8[t0][t1]);                      

-        WriteBits(hBitstream,codeWord,codeLength);

-        WriteBits(hBitstream,sign,signLength);

-      }

-      break;

-

-    case CODE_BOOK_8_NO:

-      for(i=0; i<width; i+=2) {

-        sign=0;                                                          

-        signLength=0;                                                    

-        t0 = values[i+0];                                                

-                                                                           

-        if(t0 != 0){                                                             

-          signLength = signLength + 1;                                       

-          sign = sign << 1;                                                   

-                                                                           

-          if(t0 < 0){                                                            

-            sign|=1;                                                     

-            t0=-t0;                                                        

-          }                                                                      

-        }                                                                        

-                                                                                 

-        t1 = values[i+1];                                                

-                                                                           

-        if(t1 != 0){                                                             

-          signLength = signLength + 1;                                       

-          sign = sign << 1;                                                   

-                                                                           

-          if(t1 < 0){                                                            

-            sign|=1;                                                     

-            t1=-t1;                                                        

-          }                                                                      

-        }                                                                        

-        codeWord   = huff_ctab8[t0][t1];                                 

-        codeLength = LO_LTAB(huff_ltab7_8[t0][t1]);                      

-        WriteBits(hBitstream,codeWord,codeLength);

-        WriteBits(hBitstream,sign,signLength);

-      }

-      break;

-

-    case CODE_BOOK_9_NO:

-      for(i=0; i<width; i+=2) {

-        sign=0;                                                          

-        signLength=0;                                                    

-        t0 = values[i+0];                                                

-                                                                           

-        if(t0 != 0){                                                             

-          signLength = signLength + 1;                                       

-          sign = sign << 1;                                                   

-                                                                           

-          if(t0 < 0){                                                            

-            sign|=1;                                                     

-            t0=-t0;                                                        

-          }                                                                      

-        }                                                                        

-                                                                                 

-        t1 = values[i+1];                                                

-                                                                           

-        if(t1 != 0){                                                             

-          signLength = signLength + 1;                                       

-          sign = sign << 1;                                                   

-                                                                           

-          if(t1 < 0){                                                            

-            sign|=1;                                                     

-            t1=-t1;                                                        

-          }                                                                      

-        }                                                                        

-        codeWord   = huff_ctab9[t0][t1];                                 

-        codeLength = HI_LTAB(huff_ltab9_10[t0][t1]);                     

-        WriteBits(hBitstream,codeWord,codeLength);

-        WriteBits(hBitstream,sign,signLength);

-      }

-      break;

-

-    case CODE_BOOK_10_NO:

-      for(i=0; i<width; i+=2) {

-        sign=0;                                                          

-        signLength=0;                                                    

-        t0 = values[i+0];                                                

-                                                                           

-        if(t0 != 0){                                                             

-          signLength = signLength + 1;                                       

-          sign = sign << 1;                                                   

-                                                                           

-          if(t0 < 0){                                                            

-            sign|=1;                                                     

-            t0=-t0;                                                        

-          }                                                                      

-        }                                                                        

-                                                                                 

-        t1 = values[i+1];                                                

-                                                                           

-        if(t1 != 0){                                                             

-          signLength = signLength + 1;                                       

-          sign = sign << 1;                                                   

-                                                                           

-          if(t1 < 0){                                                            

-            sign|=1;                                                     

-            t1=-t1;                                                        

-          }                                                                      

-        }                                                                        

-        codeWord   = huff_ctab10[t0][t1];                                

-        codeLength = LO_LTAB(huff_ltab9_10[t0][t1]);                     

-        WriteBits(hBitstream,codeWord,codeLength);

-        WriteBits(hBitstream,sign,signLength);

-      }

-      break;

-

-    case CODE_BOOK_ESC_NO:

-      for(i=0; i<width; i+=2) {

-        sign=0;                                                  

-        signLength=0;                                            

-        t0 = values[i+0];                                        

-                                                                   

-        if(t0 != 0){                                                     

-          signLength = signLength + 1;                               

-          sign = sign << 1;                                           

-                                                                   

-          if(t0 < 0){                                                    

-            sign|=1;                                             

-            t0=-t0;                                                

-          }                                                              

-        }                                                                

-                                                                         

-        t1 = values[i+1];                                        

-                                                                   

-        if(t1 != 0){                                                     

-          signLength = signLength + 1;                               

-          sign = sign << 1;                                           

-                                                                   

-          if(t1 < 0){                                                    

-            sign|=1;                                             

-            t1=-t1;                                                

-          }                                                              

-        }                                                                

-        t00 = min(t0,16);

-        t01 = min(t1,16);

-

-        codeWord   = huff_ctab11[t00][t01];                      

-        codeLength = huff_ltab11[t00][t01];                      

-        WriteBits(hBitstream,codeWord,codeLength);

-        WriteBits(hBitstream,sign,signLength);

-         

-        if(t0 >= 16){

-          Word16 n, p;

-          n=0;                                                   

-          p=t0;                                                  

-          while(sub(p=(p >> 1), 16) >= 0){

-             

-            WriteBits(hBitstream,1,1);

-            n = n + 1;

-          }

-          WriteBits(hBitstream,0,1);

-          n = n + 4;

-          WriteBits(hBitstream,(t0 - (1 << n)),n);

-        }

-         

-        if(t1 >= 16){

-          Word16 n, p;

-          n=0;                                                   

-          p=t1;                                                  

-          while(sub(p=(p >> 1), 16) >= 0){

-             

-            WriteBits(hBitstream,1,1);

-            n = n + 1;

-          }

-          WriteBits(hBitstream,0,1);

-          n = n + 4;

-          WriteBits(hBitstream,(t1 - (1 << n)),n);

-        }

-      }

-      break;

-

-    default:

-      break;

-  }

-  return(0);

+Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF hBitstream)
+{
+
+  Word32 i, t0, t1, t2, t3, t00, t01;
+  Word16 codeWord, codeLength;
+  Word16 sign, signLength;
+
+   
+  switch (codeBook) {
+    case CODE_BOOK_ZERO_NO:
+      break;
+
+    case CODE_BOOK_1_NO:
+      for(i=0; i<width; i+=4) {
+        t0         = values[i+0];                                        
+        t1         = values[i+1];                                        
+        t2         = values[i+2];                                        
+        t3         = values[i+3];                                        
+        codeWord   = huff_ctab1[t0+1][t1+1][t2+1][t3+1];                 
+        codeLength = HI_LTAB(huff_ltab1_2[t0+1][t1+1][t2+1][t3+1]);      
+        WriteBits(hBitstream, codeWord, codeLength);        
+      }
+      break;
+
+    case CODE_BOOK_2_NO:
+      for(i=0; i<width; i+=4) {
+        t0         = values[i+0];                                        
+        t1         = values[i+1];                                        
+        t2         = values[i+2];                                        
+        t3         = values[i+3];                                        
+        codeWord   = huff_ctab2[t0+1][t1+1][t2+1][t3+1];                 
+        codeLength = LO_LTAB(huff_ltab1_2[t0+1][t1+1][t2+1][t3+1]);      
+        WriteBits(hBitstream,codeWord,codeLength);
+      }
+      break;
+
+    case CODE_BOOK_3_NO:
+      for(i=0; i<width; i+=4) {
+        sign=0;                                                          
+        signLength=0;                                                    
+        t0 = values[i+0];                                                
+         
+        if(t0 != 0){
+          signLength = signLength + 1;
+          sign = sign << 1; 
+           
+          if(t0 < 0){
+            sign|=1;                                                     
+            t0=-t0;
+          }
+        }
+        t1 = values[i+1];                                                
+         
+        if(t1 != 0){
+          signLength = signLength + 1;
+          sign = sign << 1; 
+           
+          if(t1 < 0){
+            sign|=1;                                                     
+            t1=-t1;
+          }
+        }
+        t2 = values[i+2];                                                
+         
+        if(t2 != 0){
+          signLength = signLength + 1;
+          sign = sign << 1; 
+           
+          if(t2 < 0){
+            sign|=1;                                                     
+            t2=-t2;
+          }
+        }
+        t3 = values[i+3];                                                
+        if(t3 != 0){
+          signLength = signLength + 1;
+          sign = sign << 1; 
+           
+          if(t3 < 0){
+            sign|=1;                                                     
+            t3=-t3;
+          }
+        }
+
+        codeWord   = huff_ctab3[t0][t1][t2][t3];                         
+        codeLength = HI_LTAB(huff_ltab3_4[t0][t1][t2][t3]);              
+        WriteBits(hBitstream,codeWord,codeLength);
+        WriteBits(hBitstream,sign,signLength);
+      }
+      break;
+
+    case CODE_BOOK_4_NO:
+      for(i=0; i<width; i+=4) {
+        sign=0;                                                          
+        signLength=0;                                                    
+        t0 = values[i+0];                                                
+         
+        if(t0 != 0){                                                             
+          signLength = signLength + 1;
+          sign = sign << 1; 
+          if(t0 < 0){                                                            
+            sign|=1;                                                     
+            t0=-t0;                                                          
+          }
+        }                                                                        
+        t1 = values[i+1];                                                
+         
+        if(t1 != 0){                                                             
+          signLength = signLength + 1;
+          sign = sign << 1; 
+           
+          if(t1 < 0){                                                            
+            sign|=1;                                                     
+            t1=-t1;                                                          
+          }                                                                      
+        }                                                                        
+        t2 = values[i+2];                                                
+         
+        if(t2 != 0){                                                    
+          signLength = signLength + 1;
+          sign = sign << 1; 
+           
+          if(t2 < 0){                                                   
+            sign|=1;                                                     
+            t2=-t2;                                                 
+          }                                                             
+        }                                                               
+        t3 = values[i+3];                                                
+         
+        if(t3 != 0){                                                    
+          signLength = signLength + 1;
+          sign = sign << 1; 
+           
+          if(t3 < 0){                                                   
+            sign|=1;                                                     
+            t3=-t3;                                                 
+          }                                                             
+        }                                                               
+        codeWord   = huff_ctab4[t0][t1][t2][t3];                         
+        codeLength = LO_LTAB(huff_ltab3_4[t0][t1][t2][t3]);              
+        WriteBits(hBitstream,codeWord,codeLength);                      
+        WriteBits(hBitstream,sign,signLength);                          
+      }                                                                 
+      break;                                                            
+                                                                        
+    case CODE_BOOK_5_NO:                                                
+      for(i=0; i<width; i+=2) {                                         
+        t0         = values[i+0];                                         
+        t1         = values[i+1];                                        
+        codeWord   = huff_ctab5[t0+4][t1+4];                             
+        codeLength = HI_LTAB(huff_ltab5_6[t0+4][t1+4]);                  
+        WriteBits(hBitstream,codeWord,codeLength);
+      }
+      break;
+
+    case CODE_BOOK_6_NO:
+      for(i=0; i<width; i+=2) {
+        t0         = values[i+0];                                        
+        t1         = values[i+1];                                        
+        codeWord   = huff_ctab6[t0+4][t1+4];                             
+        codeLength = LO_LTAB(huff_ltab5_6[t0+4][t1+4]);                  
+        WriteBits(hBitstream,codeWord,codeLength);
+      }
+      break;
+
+    case CODE_BOOK_7_NO:
+      for(i=0; i<width; i+=2){
+        sign=0;                                                          
+        signLength=0;                                                    
+        t0 = values[i+0];                                                
+         
+        if(t0 != 0){
+          signLength = signLength + 1;
+          sign = sign << 1; 
+           
+          if(t0 < 0){
+            sign|=1;                                                     
+            t0=-t0;
+          }
+        }
+
+        t1 = values[i+1];                                                
+         
+        if(t1 != 0){
+          signLength = signLength + 1;
+          sign = sign << 1; 
+           
+          if(t1 < 0){
+            sign|=1;                                                     
+            t1=-t1;
+          }
+        }
+        codeWord   = huff_ctab7[t0][t1];                                 
+        codeLength = HI_LTAB(huff_ltab7_8[t0][t1]);                      
+        WriteBits(hBitstream,codeWord,codeLength);
+        WriteBits(hBitstream,sign,signLength);
+      }
+      break;
+
+    case CODE_BOOK_8_NO:
+      for(i=0; i<width; i+=2) {
+        sign=0;                                                          
+        signLength=0;                                                    
+        t0 = values[i+0];                                                
+                                                                           
+        if(t0 != 0){                                                             
+          signLength = signLength + 1;                                       
+          sign = sign << 1;                                                   
+                                                                           
+          if(t0 < 0){                                                            
+            sign|=1;                                                     
+            t0=-t0;                                                        
+          }                                                                      
+        }                                                                        
+                                                                                 
+        t1 = values[i+1];                                                
+                                                                           
+        if(t1 != 0){                                                             
+          signLength = signLength + 1;                                       
+          sign = sign << 1;                                                   
+                                                                           
+          if(t1 < 0){                                                            
+            sign|=1;                                                     
+            t1=-t1;                                                        
+          }                                                                      
+        }                                                                        
+        codeWord   = huff_ctab8[t0][t1];                                 
+        codeLength = LO_LTAB(huff_ltab7_8[t0][t1]);                      
+        WriteBits(hBitstream,codeWord,codeLength);
+        WriteBits(hBitstream,sign,signLength);
+      }
+      break;
+
+    case CODE_BOOK_9_NO:
+      for(i=0; i<width; i+=2) {
+        sign=0;                                                          
+        signLength=0;                                                    
+        t0 = values[i+0];                                                
+                                                                           
+        if(t0 != 0){                                                             
+          signLength = signLength + 1;                                       
+          sign = sign << 1;                                                   
+                                                                           
+          if(t0 < 0){                                                            
+            sign|=1;                                                     
+            t0=-t0;                                                        
+          }                                                                      
+        }                                                                        
+                                                                                 
+        t1 = values[i+1];                                                
+                                                                           
+        if(t1 != 0){                                                             
+          signLength = signLength + 1;                                       
+          sign = sign << 1;                                                   
+                                                                           
+          if(t1 < 0){                                                            
+            sign|=1;                                                     
+            t1=-t1;                                                        
+          }                                                                      
+        }                                                                        
+        codeWord   = huff_ctab9[t0][t1];                                 
+        codeLength = HI_LTAB(huff_ltab9_10[t0][t1]);                     
+        WriteBits(hBitstream,codeWord,codeLength);
+        WriteBits(hBitstream,sign,signLength);
+      }
+      break;
+
+    case CODE_BOOK_10_NO:
+      for(i=0; i<width; i+=2) {
+        sign=0;                                                          
+        signLength=0;                                                    
+        t0 = values[i+0];                                                
+                                                                           
+        if(t0 != 0){                                                             
+          signLength = signLength + 1;                                       
+          sign = sign << 1;                                                   
+                                                                           
+          if(t0 < 0){                                                            
+            sign|=1;                                                     
+            t0=-t0;                                                        
+          }                                                                      
+        }                                                                        
+                                                                                 
+        t1 = values[i+1];                                                
+                                                                           
+        if(t1 != 0){                                                             
+          signLength = signLength + 1;                                       
+          sign = sign << 1;                                                   
+                                                                           
+          if(t1 < 0){                                                            
+            sign|=1;                                                     
+            t1=-t1;                                                        
+          }                                                                      
+        }                                                                        
+        codeWord   = huff_ctab10[t0][t1];                                
+        codeLength = LO_LTAB(huff_ltab9_10[t0][t1]);                     
+        WriteBits(hBitstream,codeWord,codeLength);
+        WriteBits(hBitstream,sign,signLength);
+      }
+      break;
+
+    case CODE_BOOK_ESC_NO:
+      for(i=0; i<width; i+=2) {
+        sign=0;                                                  
+        signLength=0;                                            
+        t0 = values[i+0];                                        
+                                                                   
+        if(t0 != 0){                                                     
+          signLength = signLength + 1;                               
+          sign = sign << 1;                                           
+                                                                   
+          if(t0 < 0){                                                    
+            sign|=1;                                             
+            t0=-t0;                                                
+          }                                                              
+        }                                                                
+                                                                         
+        t1 = values[i+1];                                        
+                                                                   
+        if(t1 != 0){                                                     
+          signLength = signLength + 1;                               
+          sign = sign << 1;                                           
+                                                                   
+          if(t1 < 0){                                                    
+            sign|=1;                                             
+            t1=-t1;                                                
+          }                                                              
+        }                                                                
+        t00 = min(t0,16);
+        t01 = min(t1,16);
+
+        codeWord   = huff_ctab11[t00][t01];                      
+        codeLength = huff_ltab11[t00][t01];                      
+        WriteBits(hBitstream,codeWord,codeLength);
+        WriteBits(hBitstream,sign,signLength);
+         
+        if(t0 >= 16){
+          Word16 n, p;
+          n=0;                                                   
+          p=t0;                                                  
+          while(sub(p=(p >> 1), 16) >= 0){
+             
+            WriteBits(hBitstream,1,1);
+            n = n + 1;
+          }
+          WriteBits(hBitstream,0,1);
+          n = n + 4;
+          WriteBits(hBitstream,(t0 - (1 << n)),n);
+        }
+         
+        if(t1 >= 16){
+          Word16 n, p;
+          n=0;                                                   
+          p=t1;                                                  
+          while(sub(p=(p >> 1), 16) >= 0){
+             
+            WriteBits(hBitstream,1,1);
+            n = n + 1;
+          }
+          WriteBits(hBitstream,0,1);
+          n = n + 4;
+          WriteBits(hBitstream,(t1 - (1 << n)),n);
+        }
+      }
+      break;
+
+    default:
+      break;
+  }
+  return(0);
 }
 
 Word16 bitCountScalefactorDelta(Word16 delta)
diff --git a/media/libstagefright/codecs/aacenc/src/bitbuffer.c b/media/libstagefright/codecs/aacenc/src/bitbuffer.c
index 3248f0b..ef13c13 100644
--- a/media/libstagefright/codecs/aacenc/src/bitbuffer.c
+++ b/media/libstagefright/codecs/aacenc/src/bitbuffer.c
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		bitbuffer.c

-

-	Content:	Bit Buffer Management functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		bitbuffer.c
+
+	Content:	Bit Buffer Management functions
+
 *******************************************************************************/
 
 #include "bitbuffer.h"
@@ -81,7 +81,7 @@
 *****************************************************************************/
 void DeleteBitBuffer(HANDLE_BIT_BUF *hBitBuf)
 {
-  if(*hBitBuf)

+  if(*hBitBuf)
 	(*hBitBuf)->isValid = 0;                                                               
   *hBitBuf = NULL;                                                                       
 }
diff --git a/media/libstagefright/codecs/aacenc/src/bitenc.c b/media/libstagefright/codecs/aacenc/src/bitenc.c
index 588c2da1..ea34407 100644
--- a/media/libstagefright/codecs/aacenc/src/bitenc.c
+++ b/media/libstagefright/codecs/aacenc/src/bitenc.c
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		bitenc.c

-

-	Content:	Bitstream encoder functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		bitenc.c
+
+	Content:	Bitstream encoder functions
+
 *******************************************************************************/
 
 #include "bitenc.h"
@@ -49,7 +49,7 @@
   dbgVal = GetBitsAvail(hBitStream);                                     
 
   for(i=0; i<sectionData->noOfSections; i++) {
-    psectioninfo = &(sectionData->sectionInfo[i]);

+    psectioninfo = &(sectionData->sectionInfo[i]);
 	/*
        huffencode spectral data for this section
     */
@@ -564,7 +564,7 @@
     }
   }
 }
-

+
 /*****************************************************************************
 *
 * function name: WriteBitStream
@@ -577,39 +577,39 @@
                        QC_OUT *qcOut,
                        PSY_OUT *psyOut,
                        Word16 *globUsedBits,					   
-                       const UWord8 *ancBytes,

+                       const UWord8 *ancBytes,
 					   Word16 sampindex
                        ) /* returns error code */
 {
   Word16 bitMarkUp;
   Word16 elementUsedBits;
-  Word16 frameBits=0;

-

-  /*   struct bitbuffer bsWriteCopy; */

-  bitMarkUp = GetBitsAvail(hBitStream); 

-  if(qcOut->qcElement.adtsUsed)  /*  write adts header*/

-  {

-	  WriteBits(hBitStream, 0xFFF, 12); /* 12 bit Syncword */

-	  WriteBits(hBitStream, 1, 1); /* ID == 0 for MPEG4 AAC, 1 for MPEG2 AAC */

-	  WriteBits(hBitStream, 0, 2); /* layer == 0 */

-	  WriteBits(hBitStream, 1, 1); /* protection absent */

-	  WriteBits(hBitStream, 1, 2); /* profile */

-	  WriteBits(hBitStream, sampindex, 4); /* sampling rate */

-	  WriteBits(hBitStream, 0, 1); /* private bit */

-	  WriteBits(hBitStream, elInfo.nChannelsInEl, 3); /* ch. config (must be > 0) */

-								   /* simply using numChannels only works for

-									6 channels or less, else a channel

-									configuration should be written */

-	  WriteBits(hBitStream, 0, 1); /* original/copy */

-	  WriteBits(hBitStream, 0, 1); /* home */	  

-	  

-	  /* Variable ADTS header */

-	  WriteBits(hBitStream, 0, 1); /* copyr. id. bit */

-	  WriteBits(hBitStream, 0, 1); /* copyr. id. start */

-	  WriteBits(hBitStream, *globUsedBits >> 3, 13);

-	  WriteBits(hBitStream, 0x7FF, 11); /* buffer fullness (0x7FF for VBR) */

-	  WriteBits(hBitStream, 0, 2); /* raw data blocks (0+1=1) */  

-  }

+  Word16 frameBits=0;
+
+  /*   struct bitbuffer bsWriteCopy; */
+  bitMarkUp = GetBitsAvail(hBitStream); 
+  if(qcOut->qcElement.adtsUsed)  /*  write adts header*/
+  {
+	  WriteBits(hBitStream, 0xFFF, 12); /* 12 bit Syncword */
+	  WriteBits(hBitStream, 1, 1); /* ID == 0 for MPEG4 AAC, 1 for MPEG2 AAC */
+	  WriteBits(hBitStream, 0, 2); /* layer == 0 */
+	  WriteBits(hBitStream, 1, 1); /* protection absent */
+	  WriteBits(hBitStream, 1, 2); /* profile */
+	  WriteBits(hBitStream, sampindex, 4); /* sampling rate */
+	  WriteBits(hBitStream, 0, 1); /* private bit */
+	  WriteBits(hBitStream, elInfo.nChannelsInEl, 3); /* ch. config (must be > 0) */
+								   /* simply using numChannels only works for
+									6 channels or less, else a channel
+									configuration should be written */
+	  WriteBits(hBitStream, 0, 1); /* original/copy */
+	  WriteBits(hBitStream, 0, 1); /* home */	  
+	  
+	  /* Variable ADTS header */
+	  WriteBits(hBitStream, 0, 1); /* copyr. id. bit */
+	  WriteBits(hBitStream, 0, 1); /* copyr. id. start */
+	  WriteBits(hBitStream, *globUsedBits >> 3, 13);
+	  WriteBits(hBitStream, 0x7FF, 11); /* buffer fullness (0x7FF for VBR) */
+	  WriteBits(hBitStream, 0, 2); /* raw data blocks (0+1=1) */  
+  }
 
   *globUsedBits=0;                                               
 
diff --git a/media/libstagefright/codecs/aacenc/src/block_switch.c b/media/libstagefright/codecs/aacenc/src/block_switch.c
index c0054f7..d54e32f 100644
--- a/media/libstagefright/codecs/aacenc/src/block_switch.c
+++ b/media/libstagefright/codecs/aacenc/src/block_switch.c
@@ -1,27 +1,27 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		block_switch.c

-

-	Content:	Block switching functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		block_switch.c
+
+	Content:	Block switching functions
+
 *******************************************************************************/
 
-#include "typedef.h"

-#include "basic_op.h"

+#include "typedef.h"
+#include "basic_op.h"
 #include "oper_32b.h"
 #include "psy_const.h"
 #include "block_switch.h"
@@ -132,7 +132,7 @@
 
   for (i=0; i<MAX_NO_OF_GROUPS; i++) {
     blockSwitchingControl->groupLen[i] = suggestedGroupingTable[blockSwitchingControl->attackIndex][i];  
-  }

+  }
 	
   /* if the samplerate is less than 16000, it should be all the short block, avoid pre&post echo */
   if(sampleRate >= 16000) {
@@ -274,7 +274,7 @@
 * returns:      TRUE if success
 *
 **********************************************************************************/
-#ifndef ARMV5E

+#ifndef ARMV5E
 Word32 CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
                         Word16 *timeSignal,
                         Word16 chIncrement,
@@ -283,14 +283,14 @@
   Word32 w, i, wOffset, tidx, ch;
   Word32 accuUE, accuFE;
   Word32 tempUnfiltered;
-  Word32 tempFiltered;

-  Word32 states0, states1;

-  Word32 Coeff0, Coeff1;

-

+  Word32 tempFiltered;
+  Word32 states0, states1;
+  Word32 Coeff0, Coeff1;
 
-  states0 = blockSwitchingControl->iirStates[0];

-  states1 = blockSwitchingControl->iirStates[1];

-  Coeff0 = hiPassCoeff[0];

+
+  states0 = blockSwitchingControl->iirStates[0];
+  states1 = blockSwitchingControl->iirStates[1];
+  Coeff0 = hiPassCoeff[0];
   Coeff1 = hiPassCoeff[1];
   tidx = 0;                                                   
   for (w=0; w < BLOCK_SWITCH_WINDOWS; w++) {
@@ -299,19 +299,19 @@
     accuFE = 0;                                                  
 
     for(i=0; i<windowLen; i++) {
-	  Word32 accu1, accu2, accu3;

-	  Word32 out;

+	  Word32 accu1, accu2, accu3;
+	  Word32 out;
 	  tempUnfiltered = timeSignal[tidx];
       tidx = tidx + chIncrement;
-

-	  accu1 = L_mpy_ls(Coeff1, tempUnfiltered);

-	  accu2 = fixmul( Coeff0, states1 );

-	  accu3 = accu1 - states0;

-	  out = accu3 - accu2;

-

-	  states0 = accu1;             

-	  states1 = out;               

-

+
+	  accu1 = L_mpy_ls(Coeff1, tempUnfiltered);
+	  accu2 = fixmul( Coeff0, states1 );
+	  accu3 = accu1 - states0;
+	  out = accu3 - accu2;
+
+	  states0 = accu1;             
+	  states1 = out;               
+
       tempFiltered = extract_h(out);	  
       accuUE += (tempUnfiltered * tempUnfiltered) >> ENERGY_SHIFT;
       accuFE += (tempFiltered * tempFiltered) >> ENERGY_SHIFT;
@@ -320,9 +320,9 @@
     blockSwitchingControl->windowNrg[1][w] = accuUE;             
     blockSwitchingControl->windowNrgF[1][w] = accuFE;            
 
-  }

-

-  blockSwitchingControl->iirStates[0] = states0;

+  }
+
+  blockSwitchingControl->iirStates[0] = states0;
   blockSwitchingControl->iirStates[1] = states1;
 
   return(TRUE);
diff --git a/media/libstagefright/codecs/aacenc/src/channel_map.c b/media/libstagefright/codecs/aacenc/src/channel_map.c
index 247293b..2d41f8c 100644
--- a/media/libstagefright/codecs/aacenc/src/channel_map.c
+++ b/media/libstagefright/codecs/aacenc/src/channel_map.c
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		channel_map.c

-

-	Content:	channel mapping functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		channel_map.c
+
+	Content:	channel mapping functions
+
 *******************************************************************************/
 
 #include "channel_map.h"
diff --git a/media/libstagefright/codecs/aacenc/src/dyn_bits.c b/media/libstagefright/codecs/aacenc/src/dyn_bits.c
index 3deacca..f3b3e02 100644
--- a/media/libstagefright/codecs/aacenc/src/dyn_bits.c
+++ b/media/libstagefright/codecs/aacenc/src/dyn_bits.c
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		dyn_bits.c

-

-	Content:	Noiseless coder module functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		dyn_bits.c
+
+	Content:	Noiseless coder module functions
+
 *******************************************************************************/
 
 #include "aac_rom.h"
@@ -177,14 +177,14 @@
          const Word16 maxSfb,
          const Word16 *sideInfoTab)
 {
-  SECTION_INFO * sectionInfo_s;

-  SECTION_INFO * sectionInfo_e;

+  SECTION_INFO * sectionInfo_s;
+  SECTION_INFO * sectionInfo_e;
   Word32 mergeStart, mergeEnd;
   mergeStart = 0;                                                        
 
   do {
 
-    sectionInfo_s = sectionInfo + mergeStart;

+    sectionInfo_s = sectionInfo + mergeStart;
 	for (mergeEnd=mergeStart+1; mergeEnd<maxSfb; mergeEnd++) {
       sectionInfo_e = sectionInfo + mergeEnd; 
       if (sectionInfo_s->codeBook != sectionInfo_e->codeBook)
@@ -372,9 +372,9 @@
                      SECTION_DATA * sectionData)
 
 {
-  SECTION_INFO *psectionInfo;

-  SECTION_INFO *psectionInfom;

-

+  SECTION_INFO *psectionInfo;
+  SECTION_INFO *psectionInfom;
+
   /* counter */
   Word32 i = 0; /* section counter */
   Word32 j = 0; /* sfb counter */
@@ -397,7 +397,7 @@
   }
 
   lastValScf = 0;                                                
-  sectionData->firstScf = 0;        

+  sectionData->firstScf = 0;        
   
   psectionInfo = sectionData->sectionInfo;
   for (i=0; i<sectionData->noOfSections; i++) {
@@ -406,9 +406,9 @@
       sectionData->firstScf = psectionInfo->sfbStart;      
       lastValScf = scalefacGain[sectionData->firstScf];                  
       break;
-    }

+    }
 	psectionInfo += 1;
-  }

+  }
 
   psectionInfo = sectionData->sectionInfo;
   for (i=0; i<sectionData->noOfSections; i++, psectionInfo += 1) {
@@ -451,7 +451,7 @@
                 scfSkipCounter = scfSkipCounter + 1;
               }
             }
-			

+			
 			psectionInfom = psectionInfo + 1;
             /* search for the next maxValueInSfb[] != 0 in all other sections */
             for (m = i + 1; (m < sectionData->noOfSections) && (found == 0); m++) {
@@ -477,8 +477,8 @@
                   /* count scalefactor skip */
                   scfSkipCounter = scfSkipCounter + 1;
                 }
-              }

-

+              }
+
 			  psectionInfom += 1;
             }
              
@@ -490,7 +490,7 @@
           else {
             deltaScf = 0;                                                
             scfSkipCounter = scfSkipCounter - 1;
-          }

+          }
         }
         else {
           deltaScf = lastValScf - scalefacGain[j];
@@ -539,7 +539,7 @@
            sectionData);
 
 
-  return (sectionData->huffmanBits + sectionData->sideInfoBits + 

+  return (sectionData->huffmanBits + sectionData->sideInfoBits + 
 	      sectionData->scalefacBits);
 }
 
diff --git a/media/libstagefright/codecs/aacenc/src/grp_data.c b/media/libstagefright/codecs/aacenc/src/grp_data.c
index 08d9a76..fb88654 100644
--- a/media/libstagefright/codecs/aacenc/src/grp_data.c
+++ b/media/libstagefright/codecs/aacenc/src/grp_data.c
@@ -1,26 +1,26 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		grp_data.c

-

-	Content:	Short block grouping function

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		grp_data.c
+
+	Content:	Short block grouping function
+
 *******************************************************************************/
 
-#include "basic_op.h"

+#include "basic_op.h"
 #include "psy_const.h"
 #include "interface.h"
 #include "grp_data.h"
@@ -179,9 +179,9 @@
   }
 
   for(i=0;i<FRAME_LEN_LONG;i+=4) {
-    mdctSpectrum[i] = tmpSpectrum[i];  

-	mdctSpectrum[i+1] = tmpSpectrum[i+1];  

-	mdctSpectrum[i+2] = tmpSpectrum[i+2];  

+    mdctSpectrum[i] = tmpSpectrum[i];  
+	mdctSpectrum[i+1] = tmpSpectrum[i+1];  
+	mdctSpectrum[i+2] = tmpSpectrum[i+2];  
 	mdctSpectrum[i+3] = tmpSpectrum[i+3];  	
   }
 }
diff --git a/media/libstagefright/codecs/aacenc/src/interface.c b/media/libstagefright/codecs/aacenc/src/interface.c
index 304b1d4..34fee00 100644
--- a/media/libstagefright/codecs/aacenc/src/interface.c
+++ b/media/libstagefright/codecs/aacenc/src/interface.c
@@ -1,27 +1,27 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		interface.c

-

-	Content:	Interface psychoaccoustic/quantizer functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		interface.c
+
+	Content:	Interface psychoaccoustic/quantizer functions
+
 *******************************************************************************/
 
-#include "basic_op.h"

-#include "oper_32b.h"

+#include "basic_op.h"
+#include "oper_32b.h"
 #include "psy_const.h"
 #include "interface.h"
 
@@ -50,7 +50,7 @@
 {
   Word32 j;
   Word32 grp; 
-  Word32 mask;

+  Word32 mask;
   Word16 *tmpV;
 
   /*
@@ -70,11 +70,11 @@
   psyOutCh->sfbThreshold      = groupedSfbThreshold->sfbLong;
   psyOutCh->sfbSpreadedEnergy = groupedSfbSpreadedEnergy->sfbLong;
   
-  tmpV = psyOutCh->sfbOffsets;

+  tmpV = psyOutCh->sfbOffsets;
   for(j=0; j<groupedSfbCnt + 1; j++) {
       *tmpV++ = groupedSfbOffset[j];
   }
-  

+  
   tmpV = psyOutCh->sfbMinSnr;
   for(j=0;j<groupedSfbCnt; j++) {
 	  *tmpV++ =   groupedSfbMinSnr[j];
@@ -98,8 +98,8 @@
   else {
     Word32 i;
     Word32 accuSumMS=0;
-    Word32 accuSumLR=0;        

-	Word32 *pSumMS = sfbEnergySumMS.sfbShort;

+    Word32 accuSumLR=0;        
+	Word32 *pSumMS = sfbEnergySumMS.sfbShort;
 	Word32 *pSumLR = sfbEnergySumLR.sfbShort;
 
     for (i=TRANS_FAC; i; i--) {
diff --git a/media/libstagefright/codecs/aacenc/src/line_pe.c b/media/libstagefright/codecs/aacenc/src/line_pe.c
index da57647..5e93cd0 100644
--- a/media/libstagefright/codecs/aacenc/src/line_pe.c
+++ b/media/libstagefright/codecs/aacenc/src/line_pe.c
@@ -1,26 +1,26 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		line_pe.c

-

-	Content:	Perceptual entropie module functions

-

-*******************************************************************************/

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		line_pe.c
 
-#include "basic_op.h"

+	Content:	Perceptual entropie module functions
+
+*******************************************************************************/
+
+#include "basic_op.h"
 #include "oper_32b.h"
 #include "typedef.h"
 #include "line_pe.h"
@@ -75,7 +75,7 @@
   Word32 ch;
   Word32 sfbGrp, sfb;
   Word32 nLines4;
-  Word32 ldThr, ldRatio;

+  Word32 ldThr, ldRatio;
   Word32 pe, constPart, nActiveLines;
 
   peData->pe = peData->offset;                                           
@@ -95,7 +95,7 @@
       for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
         Word32 nrg = sfbEnergy[sfbGrp+sfb];                             
         Word32 thres = sfbThreshold[sfbGrp+sfb];                           
-        Word32 sfbLDEn = peChanData->sfbLdEnergy[sfbGrp+sfb];

+        Word32 sfbLDEn = peChanData->sfbLdEnergy[sfbGrp+sfb];
 
         if (nrg > thres) {
           ldThr = iLog4(thres);
@@ -111,10 +111,10 @@
           }
           else {
 		  /* sfbPe = nl*(c2 + c3*log2(en/thr))*/
-            peChanData->sfbPe[sfbGrp+sfb] = extract_l((L_mpy_wx(

-                    (C2_I + C3_I * ldRatio * 2) << 4, nLines4) + 4) >> 3);

-            peChanData->sfbConstPart[sfbGrp+sfb] = extract_l(( L_mpy_wx(

-                    (C2_I + C3_I * sfbLDEn * 2) << 4, nLines4) + 4) >> 3);

+            peChanData->sfbPe[sfbGrp+sfb] = extract_l((L_mpy_wx(
+                    (C2_I + C3_I * ldRatio * 2) << 4, nLines4) + 4) >> 3);
+            peChanData->sfbConstPart[sfbGrp+sfb] = extract_l(( L_mpy_wx(
+                    (C2_I + C3_I * sfbLDEn * 2) << 4, nLines4) + 4) >> 3);
             nLines4 = (nLines4 * C3_I + (1024<<1)) >> 10;
           }
           peChanData->sfbNActiveLines[sfbGrp+sfb] = nLines4 >> 2;
@@ -129,10 +129,10 @@
         nActiveLines = nActiveLines + peChanData->sfbNActiveLines[sfbGrp+sfb];
       }
     }
-	

-	peChanData->pe = saturate(pe);                                                  

-    peChanData->constPart = saturate(constPart);                                           

-    peChanData->nActiveLines = saturate(nActiveLines);                                        

+	
+	peChanData->pe = saturate(pe);                                                  
+    peChanData->constPart = saturate(constPart);                                           
+    peChanData->nActiveLines = saturate(nActiveLines);                                        
 
     
 	pe += peData->pe;
diff --git a/media/libstagefright/codecs/aacenc/src/ms_stereo.c b/media/libstagefright/codecs/aacenc/src/ms_stereo.c
index c83d07b..44d45cc 100644
--- a/media/libstagefright/codecs/aacenc/src/ms_stereo.c
+++ b/media/libstagefright/codecs/aacenc/src/ms_stereo.c
@@ -1,26 +1,26 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		ms_stereo.c

-

-	Content:	MS stereo processing function

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		ms_stereo.c
+
+	Content:	MS stereo processing function
+
 *******************************************************************************/
 
-#include "basic_op.h"

+#include "basic_op.h"
 #include "oper_32b.h"
 #include "psy_const.h"
 #include "ms_stereo.h"
@@ -74,10 +74,10 @@
       minThreshold = min(thrL, thrR);
 
       nrgL = max(nrgL,thrL) + 1;
-      shift = norm_l(nrgL);

+      shift = norm_l(nrgL);
 	  nrgL = Div_32(thrL << shift, nrgL << shift);
       nrgR = max(nrgR,thrR) + 1;
-      shift = norm_l(nrgR);

+      shift = norm_l(nrgR);
 	  nrgR = Div_32(thrR << shift, nrgR << shift);
 
 	  pnlr = fixmul(nrgL, nrgR);
@@ -86,11 +86,11 @@
       nrgR = sfbEnergySide[idx];                                                                    
 
       nrgL = max(nrgL,minThreshold) + 1;
-      shift = norm_l(nrgL);

+      shift = norm_l(nrgL);
 	  nrgL = Div_32(minThreshold << shift, nrgL << shift);
 
       nrgR = max(nrgR,minThreshold) + 1;
-      shift = norm_l(nrgR);

+      shift = norm_l(nrgR);
 	  nrgR = Div_32(minThreshold << shift, nrgR << shift);
 
       pnms = fixmul(nrgL, nrgR);
diff --git a/media/libstagefright/codecs/aacenc/src/pre_echo_control.c b/media/libstagefright/codecs/aacenc/src/pre_echo_control.c
index f59216e..1e818a2 100644
--- a/media/libstagefright/codecs/aacenc/src/pre_echo_control.c
+++ b/media/libstagefright/codecs/aacenc/src/pre_echo_control.c
@@ -1,27 +1,27 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		pre_echo_control.c

-

-	Content:	Pre echo control functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		pre_echo_control.c
+
+	Content:	Pre echo control functions
+
 *******************************************************************************/
 
-#include "basic_op.h"

-#include "oper_32b.h"

+#include "basic_op.h"
+#include "oper_32b.h"
 
 #include "oper_32b.h"
 #include "pre_echo_control.h"
diff --git a/media/libstagefright/codecs/aacenc/src/psy_configuration.c b/media/libstagefright/codecs/aacenc/src/psy_configuration.c
index 586e00f..8e599b0 100644
--- a/media/libstagefright/codecs/aacenc/src/psy_configuration.c
+++ b/media/libstagefright/codecs/aacenc/src/psy_configuration.c
@@ -1,26 +1,26 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		psy_configuration.c

-

-	Content:	Psychoaccoustic configuration functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		psy_configuration.c
+
+	Content:	Psychoaccoustic configuration functions
+
 *******************************************************************************/
 
-#include "basic_op.h"

+#include "basic_op.h"
 #include "oper_32b.h"
 #include "psy_configuration.h"
 #include "adj_thr.h"
@@ -29,10 +29,10 @@
 
 
 #define BARC_SCALE	100 /* integer barc values are scaled with 100 */
-#define LOG2_1000	301 /* log2*1000 */

-#define PI2_1000	1571 /* pi/2*1000*/

-#define ATAN_COEF1	3560 /* 1000/0.280872f*/

-#define ATAN_COEF2	281 /* 1000*0.280872f*/

+#define LOG2_1000	301 /* log2*1000 */
+#define PI2_1000	1571 /* pi/2*1000*/
+#define ATAN_COEF1	3560 /* 1000/0.280872f*/
+#define ATAN_COEF2	281 /* 1000*0.280872f*/
 
 
 typedef struct{
@@ -57,30 +57,30 @@
 static const Word16 maskHighSprEnLong = 20;      /* in 1dB/bark */
 static const Word16 maskHighSprEnLongLowBr = 15; /* in 1dB/bark */
 static const Word16 maskLowSprEnShort = 20;      /* in 1dB/bark */
-static const Word16 maskHighSprEnShort = 15;     /* in 1dB/bark */

-static const Word16 c_minRemainingThresholdFactor = 0x0148;    /* 0.01 *(1 << 15)*/

-static const Word32 c_maxsnr = 0x66666666;		 /* upper limit is -1 dB */

-static const Word32 c_minsnr = 0x00624dd3;		 /* lower limit is -25 dB */

-

-static const Word32 c_maxClipEnergyLong = 0x77359400;  /* 2.0e9f*/

-static const Word32 c_maxClipEnergyShort = 0x01dcd650; /* 2.0e9f/(AACENC_TRANS_FAC*AACENC_TRANS_FAC)*/

-

-

-Word32 GetSRIndex(Word32 sampleRate)

-{

-    if (92017 <= sampleRate) return 0;

-    if (75132 <= sampleRate) return 1;

-    if (55426 <= sampleRate) return 2;

-    if (46009 <= sampleRate) return 3;

-    if (37566 <= sampleRate) return 4;

-    if (27713 <= sampleRate) return 5;

-    if (23004 <= sampleRate) return 6;

-    if (18783 <= sampleRate) return 7;

-    if (13856 <= sampleRate) return 8;

-    if (11502 <= sampleRate) return 9;

-    if (9391 <= sampleRate) return 10;

-

-    return 11;

+static const Word16 maskHighSprEnShort = 15;     /* in 1dB/bark */
+static const Word16 c_minRemainingThresholdFactor = 0x0148;    /* 0.01 *(1 << 15)*/
+static const Word32 c_maxsnr = 0x66666666;		 /* upper limit is -1 dB */
+static const Word32 c_minsnr = 0x00624dd3;		 /* lower limit is -25 dB */
+
+static const Word32 c_maxClipEnergyLong = 0x77359400;  /* 2.0e9f*/
+static const Word32 c_maxClipEnergyShort = 0x01dcd650; /* 2.0e9f/(AACENC_TRANS_FAC*AACENC_TRANS_FAC)*/
+
+
+Word32 GetSRIndex(Word32 sampleRate)
+{
+    if (92017 <= sampleRate) return 0;
+    if (75132 <= sampleRate) return 1;
+    if (55426 <= sampleRate) return 2;
+    if (46009 <= sampleRate) return 3;
+    if (37566 <= sampleRate) return 4;
+    if (27713 <= sampleRate) return 5;
+    if (23004 <= sampleRate) return 6;
+    if (18783 <= sampleRate) return 7;
+    if (13856 <= sampleRate) return 8;
+    if (11502 <= sampleRate) return 9;
+    if (9391 <= sampleRate) return 10;
+
+    return 11;
 }
 
 
@@ -89,8 +89,8 @@
 * function name: atan_1000
 * description:  calculates 1000*atan(x/1000)
 *               based on atan approx for x > 0				
-*				atan(x) = x/((float)1.0f+(float)0.280872f*x*x)  if x < 1

-*						= pi/2 - x/((float)0.280872f +x*x)	    if x >= 1

+*				atan(x) = x/((float)1.0f+(float)0.280872f*x*x)  if x < 1
+*						= pi/2 - x/((float)0.280872f +x*x)	    if x >= 1
 * return:       1000*atan(x/1000)
 *
 **********************************************************************************/
@@ -272,7 +272,7 @@
 *
 * function name: initMinSnr
 * description:  calculate min snr parameter
-*				minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5)

+*				minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5)
 *
 *****************************************************************************/
 static void initMinSnr(const Word32  bitrate,
@@ -303,7 +303,7 @@
     barcWidth = pbVal1 - pbVal0;
     pbVal0 = pbVal1;                                             
 
-    /* allow at least 2.4% of pe for each active barc */

+    /* allow at least 2.4% of pe for each active barc */
 	pePart = ((pePerWindow * 24) * (max_bark * barcWidth)) /
         (pbBarcVal[sfbActive-1] * (sfbOffset[sfb+1] - sfbOffset[sfb]));
    
@@ -311,15 +311,15 @@
     pePart = min(pePart, 8400); 
     pePart = max(pePart, 1400);
 
-    /* minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5)*/

+    /* minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5)*/
 	/* we add an offset of 2^16 to the pow functions */
-	/* 0xc000 = 1.5*(1 << 15)*/

+	/* 0xc000 = 1.5*(1 << 15)*/
       
     snr = pow2_xy((pePart - 16*1000),1000) - 0x0000c000;
       
-    if(snr > 0x00008000)

-	{

-		shift = norm_l(snr);

+    if(snr > 0x00008000)
+	{
+		shift = norm_l(snr);
 		snr = Div_32(0x00008000 << shift, snr << shift);  
 	}
 	else
@@ -347,16 +347,16 @@
                                 Word16 bandwidth,
                                 PSY_CONFIGURATION_LONG *psyConf)
 {
-  Word32 samplerateindex;

-  Word16 sfbBarcVal[MAX_SFB_LONG];

+  Word32 samplerateindex;
+  Word16 sfbBarcVal[MAX_SFB_LONG];
   Word16 sfb;
 
   /*
     init sfb table
-  */

-  samplerateindex = GetSRIndex(samplerate);  

-  psyConf->sfbCnt = sfBandTotalLong[samplerateindex];

-  psyConf->sfbOffset = sfBandTabLong + sfBandTabLongOffset[samplerateindex];

+  */
+  samplerateindex = GetSRIndex(samplerate);  
+  psyConf->sfbCnt = sfBandTotalLong[samplerateindex];
+  psyConf->sfbOffset = sfBandTabLong + sfBandTabLongOffset[samplerateindex];
   psyConf->sampRateIdx = samplerateindex;
 
   /*
@@ -429,7 +429,7 @@
 Word16 InitPsyConfigurationShort(Word32 bitrate,
                                  Word32 samplerate,
                                  Word16 bandwidth,
-                                 PSY_CONFIGURATION_SHORT *psyConf) 

+                                 PSY_CONFIGURATION_SHORT *psyConf) 
 {
   Word32 samplerateindex;
   Word16 sfbBarcVal[MAX_SFB_SHORT];
@@ -437,8 +437,8 @@
   /*
     init sfb table
   */
-  samplerateindex = GetSRIndex(samplerate);  

-  psyConf->sfbCnt = sfBandTotalShort[samplerateindex];

+  samplerateindex = GetSRIndex(samplerate);  
+  psyConf->sfbCnt = sfBandTotalShort[samplerateindex];
   psyConf->sfbOffset = sfBandTabShort + sfBandTabShortOffset[samplerateindex];
   psyConf->sampRateIdx = samplerateindex;
   /*
diff --git a/media/libstagefright/codecs/aacenc/src/psy_main.c b/media/libstagefright/codecs/aacenc/src/psy_main.c
index 8746a72..3d0a355 100644
--- a/media/libstagefright/codecs/aacenc/src/psy_main.c
+++ b/media/libstagefright/codecs/aacenc/src/psy_main.c
@@ -1,27 +1,27 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		psy_main.c

-

-	Content:	Psychoacoustic major functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		psy_main.c
+
+	Content:	Psychoacoustic major functions
+
 *******************************************************************************/
 
-#include "typedef.h"

-#include "basic_op.h"

+#include "typedef.h"
+#include "basic_op.h"
 #include "oper_32b.h"
 #include "psy_const.h"
 #include "block_switch.h"
@@ -77,27 +77,27 @@
 *****************************************************************************/
 Word16 PsyNew(PSY_KERNEL *hPsy, Word32 nChan, VO_MEM_OPERATOR *pMemOP)
 {
-  Word16 i;

-  Word32 *mdctSpectrum;

-  Word32 *scratchTNS;

-  Word16 *mdctDelayBuffer;

-  

-  mdctSpectrum = (Word32 *)mem_malloc(pMemOP, nChan * FRAME_LEN_LONG * sizeof(Word32), 32, VO_INDEX_ENC_AAC);

-  if(NULL == mdctSpectrum)

-	  return 1;

-

-  scratchTNS = (Word32 *)mem_malloc(pMemOP, nChan * FRAME_LEN_LONG * sizeof(Word32), 32, VO_INDEX_ENC_AAC);

-  if(NULL == scratchTNS)

-  {

-	  return 1;

-  }

-

-  mdctDelayBuffer = (Word16 *)mem_malloc(pMemOP, nChan * BLOCK_SWITCHING_OFFSET * sizeof(Word16), 32, VO_INDEX_ENC_AAC);

-  if(NULL == mdctDelayBuffer)

-  {

+  Word16 i;
+  Word32 *mdctSpectrum;
+  Word32 *scratchTNS;
+  Word16 *mdctDelayBuffer;
+  
+  mdctSpectrum = (Word32 *)mem_malloc(pMemOP, nChan * FRAME_LEN_LONG * sizeof(Word32), 32, VO_INDEX_ENC_AAC);
+  if(NULL == mdctSpectrum)
 	  return 1;
-  }

-

+
+  scratchTNS = (Word32 *)mem_malloc(pMemOP, nChan * FRAME_LEN_LONG * sizeof(Word32), 32, VO_INDEX_ENC_AAC);
+  if(NULL == scratchTNS)
+  {
+	  return 1;
+  }
+
+  mdctDelayBuffer = (Word16 *)mem_malloc(pMemOP, nChan * BLOCK_SWITCHING_OFFSET * sizeof(Word16), 32, VO_INDEX_ENC_AAC);
+  if(NULL == mdctDelayBuffer)
+  {
+	  return 1;
+  }
+
   for (i=0; i<nChan; i++){
     hPsy->psyData[i].mdctDelayBuffer = mdctDelayBuffer + i*BLOCK_SWITCHING_OFFSET;      
     hPsy->psyData[i].mdctSpectrum = mdctSpectrum + i*FRAME_LEN_LONG;
@@ -118,27 +118,27 @@
 *****************************************************************************/
 Word16 PsyDelete(PSY_KERNEL  *hPsy, VO_MEM_OPERATOR *pMemOP)
 {
-  Word32 nch;

-

-  if(hPsy)

-  {

-	if(hPsy->psyData[0].mdctDelayBuffer)

-		mem_free(pMemOP, hPsy->psyData[0].mdctDelayBuffer, VO_INDEX_ENC_AAC);

-      

-    if(hPsy->psyData[0].mdctSpectrum)

-		mem_free(pMemOP, hPsy->psyData[0].mdctSpectrum, VO_INDEX_ENC_AAC);

-

-    for (nch=0; nch<MAX_CHANNELS; nch++){

-	  hPsy->psyData[nch].mdctDelayBuffer = NULL;      

-	  hPsy->psyData[nch].mdctSpectrum = NULL;

-	}

-

-	if(hPsy->pScratchTns)

-	{

-		mem_free(pMemOP, hPsy->pScratchTns, VO_INDEX_ENC_AAC);

-		hPsy->pScratchTns = NULL;

-	}

-  }

+  Word32 nch;
+
+  if(hPsy)
+  {
+	if(hPsy->psyData[0].mdctDelayBuffer)
+		mem_free(pMemOP, hPsy->psyData[0].mdctDelayBuffer, VO_INDEX_ENC_AAC);
+      
+    if(hPsy->psyData[0].mdctSpectrum)
+		mem_free(pMemOP, hPsy->psyData[0].mdctSpectrum, VO_INDEX_ENC_AAC);
+
+    for (nch=0; nch<MAX_CHANNELS; nch++){
+	  hPsy->psyData[nch].mdctDelayBuffer = NULL;      
+	  hPsy->psyData[nch].mdctSpectrum = NULL;
+	}
+
+	if(hPsy->pScratchTns)
+	{
+		mem_free(pMemOP, hPsy->pScratchTns, VO_INDEX_ENC_AAC);
+		hPsy->pScratchTns = NULL;
+	}
+  }
 
   return 0;
 }
@@ -196,10 +196,10 @@
   err = InitPsyConfigurationLong(channelBitRate,
                                  sampleRate,
                                  bandwidth,
-                                 &(hPsy->psyConfLong));

-

+                                 &(hPsy->psyConfLong));
+
   if (!err) {
-      hPsy->sampleRateIdx = hPsy->psyConfLong.sampRateIdx;

+      hPsy->sampleRateIdx = hPsy->psyConfLong.sampRateIdx;
 	  err = InitTnsConfigurationLong(bitRate, sampleRate, channels,
                                    &hPsy->psyConfLong.tnsConf, &hPsy->psyConfLong, tnsMask&2);
   }
@@ -263,7 +263,7 @@
   channels = elemInfo->nChannelsInEl;                            
   maxScale = 0;                                                  
 
-  /* block switching */

+  /* block switching */
   for(ch = 0; ch < channels; ch++) {
     BlockSwitching(&psyData[ch].blockSwitchingControl,
                    timeSignal+elemInfo->ChannelIndex[ch],
@@ -477,11 +477,11 @@
 {
   Word32 i;
   Word32 normEnergyShift = (psyData->mdctScale + 1) << 1; /* in reference code, mdct spectrum must be multipied with 2, so +1 */
-  Word32 clipEnergy = hPsyConfLong->clipEnergy >> normEnergyShift;

+  Word32 clipEnergy = hPsyConfLong->clipEnergy >> normEnergyShift;
   Word32 *data0, *data1, tdata;
 
   /* low pass */
-  data0 = psyData->mdctSpectrum + hPsyConfLong->lowpassLine;

+  data0 = psyData->mdctSpectrum + hPsyConfLong->lowpassLine;
   for(i=hPsyConfLong->lowpassLine; i<FRAME_LEN_LONG; i++) {
     *data0++ = 0;                                
   }
@@ -525,11 +525,11 @@
             psyData->blockSwitchingControl.windowSequence);
 
   /* first part of threshold calculation */
-  data0 = psyData->sfbEnergy.sfbLong;

-  data1 = psyData->sfbThreshold.sfbLong;

+  data0 = psyData->sfbEnergy.sfbLong;
+  data1 = psyData->sfbThreshold.sfbLong;
   for (i=hPsyConfLong->sfbCnt; i; i--) {
     tdata = L_mpy_ls(*data0++, hPsyConfLong->ratio);
-    *data1++ = min(tdata, clipEnergy);

+    *data1++ = min(tdata, clipEnergy);
   }
 
   /* Calc sfb-bandwise mdct-energies for left and right channel again */   
@@ -540,12 +540,12 @@
                     hPsyConfLong->sfbActive - tnsStartBand,
                     psyData->sfbEnergy.sfbLong+tnsStartBand,
                     &psyData->sfbEnergySum.sfbLong);
-    

-	data0 = psyData->sfbEnergy.sfbLong;

-	tdata = psyData->sfbEnergySum.sfbLong;

+    
+	data0 = psyData->sfbEnergy.sfbLong;
+	tdata = psyData->sfbEnergySum.sfbLong;
 	for (i=0; i<tnsStartBand; i++)
-      tdata += *data0++;

-

+      tdata += *data0++;
+
 	psyData->sfbEnergySum.sfbLong = tdata;
   }
 
@@ -557,20 +557,20 @@
                psyData->sfbThreshold.sfbLong);
 
   /* threshold in quiet */
-  data0 = psyData->sfbThreshold.sfbLong;

-  data1 = hPsyConfLong->sfbThresholdQuiet;

+  data0 = psyData->sfbThreshold.sfbLong;
+  data1 = hPsyConfLong->sfbThresholdQuiet;
   for (i=hPsyConfLong->sfbCnt; i; i--)
-  {

-	  *data0 = max(*data0, (*data1 >> normEnergyShift));

-	  data0++; data1++;

+  {
+	  *data0 = max(*data0, (*data1 >> normEnergyShift));
+	  data0++; data1++;
   }
 
   /* preecho control */   
   if (psyData->blockSwitchingControl.windowSequence == STOP_WINDOW) {
-    data0 = psyData->sfbThresholdnm1;

-	for (i=hPsyConfLong->sfbCnt; i; i--) {

-      *data0++ = MAX_32;                              

-    }

+    data0 = psyData->sfbThresholdnm1;
+	for (i=hPsyConfLong->sfbCnt; i; i--) {
+      *data0++ = MAX_32;                              
+    }
     psyData->mdctScalenm1 = 0;                                           
   }
 
@@ -585,7 +585,7 @@
 
    
   if (psyData->blockSwitchingControl.windowSequence== START_WINDOW) {
-    data0 = psyData->sfbThresholdnm1;

+    data0 = psyData->sfbThresholdnm1;
 	for (i=hPsyConfLong->sfbCnt; i; i--) {
       *data0++ = MAX_32;                              
     }
@@ -600,10 +600,10 @@
 
 
   /* spreaded energy */
-  data0 = psyData->sfbSpreadedEnergy.sfbLong;

-  data1 = psyData->sfbEnergy.sfbLong;

+  data0 = psyData->sfbSpreadedEnergy.sfbLong;
+  data1 = psyData->sfbEnergy.sfbLong;
   for (i=hPsyConfLong->sfbCnt; i; i--) {
-    //psyData->sfbSpreadedEnergy.sfbLong[i] = psyData->sfbEnergy.sfbLong[i];       

+    //psyData->sfbSpreadedEnergy.sfbLong[i] = psyData->sfbEnergy.sfbLong[i];       
 	  *data0++ = *data1++;
   }
 
@@ -657,14 +657,14 @@
   Word32 w;
   Word32 normEnergyShift = (psyData->mdctScale + 1) << 1; /* in reference code, mdct spectrum must be multipied with 2, so +1 */
   Word32 clipEnergy = hPsyConfShort->clipEnergy >> normEnergyShift;
-  Word32 wOffset = 0;     

+  Word32 wOffset = 0;     
   Word32 *data0, *data1;
 
   for(w = 0; w < TRANS_FAC; w++) {
     Word32 i, tdata;
 
     /* low pass */
-    data0 = psyData->mdctSpectrum + wOffset + hPsyConfShort->lowpassLine;

+    data0 = psyData->mdctSpectrum + wOffset + hPsyConfShort->lowpassLine;
 	for(i=hPsyConfShort->lowpassLine; i<FRAME_LEN_SHORT; i++){
       *data0++ = 0;                                      
     }
@@ -706,11 +706,11 @@
               psyData->blockSwitchingControl.windowSequence);
 
     /* first part of threshold calculation */
-    data0 = psyData->sfbThreshold.sfbShort[w];

-	data1 = psyData->sfbEnergy.sfbShort[w];

+    data0 = psyData->sfbThreshold.sfbShort[w];
+	data1 = psyData->sfbEnergy.sfbShort[w];
 	for (i=hPsyConfShort->sfbCnt; i; i--) {
       tdata = L_mpy_ls(*data1++, hPsyConfShort->ratio);
-      *data0++ = min(tdata, clipEnergy);

+      *data0++ = min(tdata, clipEnergy);
     }
 
     /* Calc sfb-bandwise mdct-energies for left and right channel again */     
@@ -720,13 +720,13 @@
                       hPsyConfShort->sfbOffset+tnsStartBand,
                       (hPsyConfShort->sfbActive - tnsStartBand),
                       psyData->sfbEnergy.sfbShort[w]+tnsStartBand,
-                      &psyData->sfbEnergySum.sfbShort[w]);

+                      &psyData->sfbEnergySum.sfbShort[w]);
 
-      tdata = psyData->sfbEnergySum.sfbShort[w];

-	  data0 = psyData->sfbEnergy.sfbShort[w];

+      tdata = psyData->sfbEnergySum.sfbShort[w];
+	  data0 = psyData->sfbEnergy.sfbShort[w];
 	  for (i=tnsStartBand; i; i--)
-        tdata += *data0++;

-

+        tdata += *data0++;
+
 	  psyData->sfbEnergySum.sfbShort[w] = tdata;
     }
 
@@ -738,14 +738,14 @@
 
 
     /* threshold in quiet */
-    data0 = psyData->sfbThreshold.sfbShort[w];

-	data1 = hPsyConfShort->sfbThresholdQuiet;

+    data0 = psyData->sfbThreshold.sfbShort[w];
+	data1 = hPsyConfShort->sfbThresholdQuiet;
 	for (i=hPsyConfShort->sfbCnt; i; i--)
-    {

-		*data0 = max(*data0, (*data1 >> normEnergyShift));

-

-		data0++; data1++;

-	}

+    {
+		*data0 = max(*data0, (*data1 >> normEnergyShift));
+
+		data0++; data1++;
+	}
 
 
     /* preecho */     
@@ -764,8 +764,8 @@
                                psyData->sfbThreshold.sfbShort[w]);
 
     /* spreaded energy */
-    data0 = psyData->sfbSpreadedEnergy.sfbShort[w];

-	data1 = psyData->sfbEnergy.sfbShort[w];

+    data0 = psyData->sfbSpreadedEnergy.sfbShort[w];
+	data1 = psyData->sfbEnergy.sfbShort[w];
 	for (i=hPsyConfShort->sfbCnt; i; i--) {
 	  *data0++ = *data1++;
     }
diff --git a/media/libstagefright/codecs/aacenc/src/qc_main.c b/media/libstagefright/codecs/aacenc/src/qc_main.c
index a568020..e8c39e4 100644
--- a/media/libstagefright/codecs/aacenc/src/qc_main.c
+++ b/media/libstagefright/codecs/aacenc/src/qc_main.c
@@ -1,27 +1,27 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		qc_main.c

-

-	Content:	Quantizing & coding functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		qc_main.c
+
+	Content:	Quantizing & coding functions
+
 *******************************************************************************/
 
-#include "basic_op.h"

-#include "oper_32b.h"

+#include "basic_op.h"
+#include "oper_32b.h"
 #include "qc_main.h"
 #include "quantize.h"
 #include "interface.h"
@@ -120,25 +120,25 @@
 
 Word16 QCOutNew(QC_OUT *hQC, Word16 nChannels, VO_MEM_OPERATOR *pMemOP)
 {
-  Word32 i;

-  Word16 *quantSpec;

-  Word16 *scf;

+  Word32 i;
+  Word16 *quantSpec;
+  Word16 *scf;
   UWord16 *maxValueInSfb;	
-	

-  quantSpec = (Word16 *)mem_malloc(pMemOP, nChannels * FRAME_LEN_LONG * sizeof(Word16), 32, VO_INDEX_ENC_AAC);

-  if(NULL == quantSpec)

+	
+  quantSpec = (Word16 *)mem_malloc(pMemOP, nChannels * FRAME_LEN_LONG * sizeof(Word16), 32, VO_INDEX_ENC_AAC);
+  if(NULL == quantSpec)
 	  return 1;
-  scf = (Word16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(Word16), 32, VO_INDEX_ENC_AAC);     

-  if(NULL == scf)

-  {

-	  return 1;

+  scf = (Word16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(Word16), 32, VO_INDEX_ENC_AAC);     
+  if(NULL == scf)
+  {
+	  return 1;
   }
-  maxValueInSfb = (UWord16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(UWord16), 32, VO_INDEX_ENC_AAC);

-  if(NULL == maxValueInSfb)

-  {

-	  return 1;

-  }

-

+  maxValueInSfb = (UWord16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(UWord16), 32, VO_INDEX_ENC_AAC);
+  if(NULL == maxValueInSfb)
+  {
+	  return 1;
+  }
+
   for (i=0; i<nChannels; i++) {
     hQC->qcChannel[i].quantSpec = quantSpec + i*FRAME_LEN_LONG;
     
@@ -160,25 +160,25 @@
 **********************************************************************************/
 void QCOutDelete(QC_OUT* hQC, VO_MEM_OPERATOR *pMemOP)
 {
-   Word32 i;

-   if(hQC)

-   {

-      if(hQC->qcChannel[0].quantSpec);

-		 mem_free(pMemOP, hQC->qcChannel[0].quantSpec, VO_INDEX_ENC_AAC);

-    

-      if(hQC->qcChannel[0].maxValueInSfb)

-		  mem_free(pMemOP, hQC->qcChannel[0].maxValueInSfb, VO_INDEX_ENC_AAC);

-    

-	  if(hQC->qcChannel[0].scf)

-		  mem_free(pMemOP, hQC->qcChannel[0].scf, VO_INDEX_ENC_AAC);

-

-	  for (i=0; i<MAX_CHANNELS; i++) {

-		  hQC->qcChannel[i].quantSpec = NULL;

-		  

-		  hQC->qcChannel[i].maxValueInSfb = NULL;

-		  

-		  hQC->qcChannel[i].scf = NULL;

-	  }

+   Word32 i;
+   if(hQC)
+   {
+      if(hQC->qcChannel[0].quantSpec);
+		 mem_free(pMemOP, hQC->qcChannel[0].quantSpec, VO_INDEX_ENC_AAC);
+    
+      if(hQC->qcChannel[0].maxValueInSfb)
+		  mem_free(pMemOP, hQC->qcChannel[0].maxValueInSfb, VO_INDEX_ENC_AAC);
+    
+	  if(hQC->qcChannel[0].scf)
+		  mem_free(pMemOP, hQC->qcChannel[0].scf, VO_INDEX_ENC_AAC);
+
+	  for (i=0; i<MAX_CHANNELS; i++) {
+		  hQC->qcChannel[i].quantSpec = NULL;
+		  
+		  hQC->qcChannel[i].maxValueInSfb = NULL;
+		  
+		  hQC->qcChannel[i].scf = NULL;
+	  }
    } 
 }
 
@@ -278,7 +278,7 @@
 
   qcOutElement->staticBitsUsed = countStaticBitdemand(psyOutChannel,
                                                       psyOutElement,
-                                                      nChannels, 

+                                                      nChannels, 
 													  qcOutElement->adtsUsed);
 
    
@@ -474,8 +474,8 @@
 Word16 FinalizeBitConsumption(QC_STATE *qcKernel,
                               QC_OUT* qcOut)
 {
-  Word32 nFullFillElem;

-  Word32 totFillBits;

+  Word32 nFullFillElem;
+  Word32 totFillBits;
   Word16 diffBits;  
   Word16 bitsUsed;
 
@@ -491,7 +491,7 @@
     totFillBits += qcOut->qcElement.fillBits;
   }
 
-  nFullFillElem = (max((qcOut->totFillBits - 1), 0) / maxFillElemBits) * maxFillElemBits;

+  nFullFillElem = (max((qcOut->totFillBits - 1), 0) / maxFillElemBits) * maxFillElemBits;
   
   qcOut->totFillBits = qcOut->totFillBits - nFullFillElem;
 
diff --git a/media/libstagefright/codecs/aacenc/src/quantize.c b/media/libstagefright/codecs/aacenc/src/quantize.c
index 205f167..973554e 100644
--- a/media/libstagefright/codecs/aacenc/src/quantize.c
+++ b/media/libstagefright/codecs/aacenc/src/quantize.c
@@ -1,27 +1,27 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		quantize.c

-

-	Content:	quantization functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		quantize.c
+
+	Content:	quantization functions
+
 *******************************************************************************/
 
-#include "typedef.h"

-#include "basic_op.h"

+#include "typedef.h"
+#include "basic_op.h"
 #include "oper_32b.h"
 #include "quantize.h"
 #include "aac_rom.h"
@@ -77,14 +77,14 @@
 
       x += XROUND >> (INT_BITS - finalShift);
 
-      /* shift and quantize */

-	  finalShift--;

-

-	  if(finalShift >= 0)

-		  x >>= finalShift;

-	  else

-		  x <<= (-finalShift);

-		

+      /* shift and quantize */
+	  finalShift--;
+
+	  if(finalShift >= 0)
+		  x >>= finalShift;
+	  else
+		  x <<= (-finalShift);
+		
 	  qua = saturate(x);
     }
   }
@@ -108,29 +108,29 @@
 {
   Word32 line;
   Word32 m = gain&3;
-  Word32 g = (gain >> 2) + 4;

-  Word32 mdctSpeL;

+  Word32 g = (gain >> 2) + 4;
+  Word32 mdctSpeL;
   Word16 *pquat;
-    /* gain&3 */

-

-  pquat = quantBorders[m];

-

-  g += 16;

-  

-  if(g >= 0)

-  {

+    /* gain&3 */
+
+  pquat = quantBorders[m];
+
+  g += 16;
+  
+  if(g >= 0)
+  {
 	for (line=0; line<noOfLines; line++) {
 	  Word32 qua;
 	  qua = 0;                                                     
-    

-	  mdctSpeL = mdctSpectrum[line];

+    
+	  mdctSpeL = mdctSpectrum[line];
 	
 	  if (mdctSpeL) {
 		Word32 sa;
 		Word32 saShft;
 
         sa = L_abs(mdctSpeL);
-        //saShft = L_shr(sa, 16 + g);

+        //saShft = L_shr(sa, 16 + g);
 	    saShft = sa >> g;
 
         if (saShft > pquat[0]) {
@@ -163,54 +163,54 @@
 		}
 	  }
       quaSpectrum[line] = qua ;                                    
-	}

-  }

-  else

-  {

-	for (line=0; line<noOfLines; line++) {

-	  Word32 qua;

-	  qua = 0;                                                     

-    

-	  mdctSpeL = mdctSpectrum[line];

-	

-	  if (mdctSpeL) {

-		Word32 sa;

-		Word32 saShft;

-

-        sa = L_abs(mdctSpeL);

-        saShft = sa << g;

-

-        if (saShft > pquat[0]) {

-         

-          if (saShft < pquat[1]) {

-             

-            qua = mdctSpeL>0 ? 1 : -1;

-		  }

-          else {

-           

-            if (saShft < pquat[2]) {

-               

-              qua = mdctSpeL>0 ? 2 : -2;

-			}

-            else {

-             

-              if (saShft < pquat[3]) {

-                 

-                qua = mdctSpeL>0 ? 3 : -3;

-			  }

-              else {

-                qua = quantizeSingleLine(gain, sa);

-                /* adjust the sign. Since 0 < qua < 1, this cannot overflow. */

-               

-                if (mdctSpeL < 0)

-                  qua = -qua;

-			  }

-			}

-		  }

-		}

-	  }

-      quaSpectrum[line] = qua ;                                    

-	}	  

+	}
+  }
+  else
+  {
+	for (line=0; line<noOfLines; line++) {
+	  Word32 qua;
+	  qua = 0;                                                     
+    
+	  mdctSpeL = mdctSpectrum[line];
+	
+	  if (mdctSpeL) {
+		Word32 sa;
+		Word32 saShft;
+
+        sa = L_abs(mdctSpeL);
+        saShft = sa << g;
+
+        if (saShft > pquat[0]) {
+         
+          if (saShft < pquat[1]) {
+             
+            qua = mdctSpeL>0 ? 1 : -1;
+		  }
+          else {
+           
+            if (saShft < pquat[2]) {
+               
+              qua = mdctSpeL>0 ? 2 : -2;
+			}
+            else {
+             
+              if (saShft < pquat[3]) {
+                 
+                qua = mdctSpeL>0 ? 3 : -3;
+			  }
+              else {
+                qua = quantizeSingleLine(gain, sa);
+                /* adjust the sign. Since 0 < qua < 1, this cannot overflow. */
+               
+                if (mdctSpeL < 0)
+                  qua = -qua;
+			  }
+			}
+		  }
+		}
+	  }
+      quaSpectrum[line] = qua ;                                    
+	}	  
   }
 
 }
@@ -266,10 +266,10 @@
       /* get approperiate exponent shifter */
       specExp = specExpTableComb_enc[iquantizermod][specExp];                    
 
-      specExp += iquantizershift + 1;

-	  if(specExp >= 0)

-		  mdctSpectrum[line] = accu << specExp;

-	  else

+      specExp += iquantizershift + 1;
+	  if(specExp >= 0)
+		  mdctSpectrum[line] = accu << specExp;
+	  else
 		  mdctSpectrum[line] = accu >> (-specExp);
     }
     else {
@@ -331,19 +331,19 @@
   Word32 line;
   Word32 dist;
   Word32 m = gain&3;
-  Word32 g = (gain >> 2) + 4;

-  Word32 g2 = (g << 1) + 1;

-  Word16 *pquat, *repquat;

+  Word32 g = (gain >> 2) + 4;
+  Word32 g2 = (g << 1) + 1;
+  Word16 *pquat, *repquat;
     /* gain&3 */
-

-  pquat = quantBorders[m];

+
+  pquat = quantBorders[m];
   repquat = quantRecon[m];
-	

-  dist = 0;  

-  g += 16;

-  if(g2 < 0 && g >= 0)

+	
+  dist = 0;  
+  g += 16;
+  if(g2 < 0 && g >= 0)
   {	  
-	  g2 = -g2;

+	  g2 = -g2;
 	  for(line=0; line<sfbWidth; line++) {		  
 		  if (spec[line]) {			  
 			  Word32 diff;
@@ -352,93 +352,93 @@
 			  Word32 saShft;
 			  sa = L_abs(spec[line]);
 			  //saShft = round16(L_shr(sa, g));
-			  //saShft = L_shr(sa, 16+g);

-			  saShft = sa >> g;

+			  //saShft = L_shr(sa, 16+g);
+			  saShft = sa >> g;
 
-			  if (saShft < pquat[0]) {

-				  distSingle = (saShft * saShft) >> g2;

-			  }

-			  else {

-				  

-				  if (saShft < pquat[1]) {

-					  diff = saShft - repquat[0];

-					  distSingle = (diff * diff) >> g2;

-				  }

-				  else {

-					  

-					  if (saShft < pquat[2]) {

-						  diff = saShft - repquat[1];

-						  distSingle = (diff * diff) >> g2;

-					  }

-					  else {

-						  

-						  if (saShft < pquat[3]) {

-							  diff = saShft - repquat[2];

-							  distSingle = (diff * diff) >> g2;

-						  }

-						  else {

-							  Word16 qua = quantizeSingleLine(gain, sa);

-							  Word32 iqval, diff32;

-							  /* now that we have quantized x, re-quantize it. */

-							  iquantizeLines(gain, 1, &qua, &iqval);

-							  diff32 = sa - iqval;

-							  distSingle = fixmul(diff32, diff32);

-						  }

-					  }

-				  }

-			  }

-			  

-			  dist = L_add(dist, distSingle);

+			  if (saShft < pquat[0]) {
+				  distSingle = (saShft * saShft) >> g2;
+			  }
+			  else {
+				  
+				  if (saShft < pquat[1]) {
+					  diff = saShft - repquat[0];
+					  distSingle = (diff * diff) >> g2;
+				  }
+				  else {
+					  
+					  if (saShft < pquat[2]) {
+						  diff = saShft - repquat[1];
+						  distSingle = (diff * diff) >> g2;
+					  }
+					  else {
+						  
+						  if (saShft < pquat[3]) {
+							  diff = saShft - repquat[2];
+							  distSingle = (diff * diff) >> g2;
+						  }
+						  else {
+							  Word16 qua = quantizeSingleLine(gain, sa);
+							  Word32 iqval, diff32;
+							  /* now that we have quantized x, re-quantize it. */
+							  iquantizeLines(gain, 1, &qua, &iqval);
+							  diff32 = sa - iqval;
+							  distSingle = fixmul(diff32, diff32);
+						  }
+					  }
+				  }
+			  }
+			  
+			  dist = L_add(dist, distSingle);
 		  }
-	  }

-  }

-  else

-  {

-	  for(line=0; line<sfbWidth; line++) {		  

-		  if (spec[line]) {			  

-			  Word32 diff;

-			  Word32 distSingle;

-			  Word32 sa;

-			  Word32 saShft;

-			  sa = L_abs(spec[line]);

-			  //saShft = round16(L_shr(sa, g));

-			  saShft = L_shr(sa, g);

-

-			  if (saShft < pquat[0]) {

-				  distSingle = L_shl((saShft * saShft), g2);

-			  }

-			  else {

-				  

-				  if (saShft < pquat[1]) {

-					  diff = saShft - repquat[0];

-					  distSingle = L_shl((diff * diff), g2);

-				  }

-				  else {

-					  

-					  if (saShft < pquat[2]) {

-						  diff = saShft - repquat[1];

-						  distSingle = L_shl((diff * diff), g2);

-					  }

-					  else {

-						  

-						  if (saShft < pquat[3]) {

-							  diff = saShft - repquat[2];

-							  distSingle = L_shl((diff * diff), g2);

-						  }

-						  else {

-							  Word16 qua = quantizeSingleLine(gain, sa);

-							  Word32 iqval, diff32;

-							  /* now that we have quantized x, re-quantize it. */

-							  iquantizeLines(gain, 1, &qua, &iqval);

-							  diff32 = sa - iqval;

-							  distSingle = fixmul(diff32, diff32);

-						  }

-					  }

-				  }

-			  }

-			  dist = L_add(dist, distSingle);

-		  }

-	  }	  

+	  }
+  }
+  else
+  {
+	  for(line=0; line<sfbWidth; line++) {		  
+		  if (spec[line]) {			  
+			  Word32 diff;
+			  Word32 distSingle;
+			  Word32 sa;
+			  Word32 saShft;
+			  sa = L_abs(spec[line]);
+			  //saShft = round16(L_shr(sa, g));
+			  saShft = L_shr(sa, g);
+
+			  if (saShft < pquat[0]) {
+				  distSingle = L_shl((saShft * saShft), g2);
+			  }
+			  else {
+				  
+				  if (saShft < pquat[1]) {
+					  diff = saShft - repquat[0];
+					  distSingle = L_shl((diff * diff), g2);
+				  }
+				  else {
+					  
+					  if (saShft < pquat[2]) {
+						  diff = saShft - repquat[1];
+						  distSingle = L_shl((diff * diff), g2);
+					  }
+					  else {
+						  
+						  if (saShft < pquat[3]) {
+							  diff = saShft - repquat[2];
+							  distSingle = L_shl((diff * diff), g2);
+						  }
+						  else {
+							  Word16 qua = quantizeSingleLine(gain, sa);
+							  Word32 iqval, diff32;
+							  /* now that we have quantized x, re-quantize it. */
+							  iquantizeLines(gain, 1, &qua, &iqval);
+							  diff32 = sa - iqval;
+							  distSingle = fixmul(diff32, diff32);
+						  }
+					  }
+				  }
+			  }
+			  dist = L_add(dist, distSingle);
+		  }
+	  }	  
   }
 
   return dist;
diff --git a/media/libstagefright/codecs/aacenc/src/sf_estim.c b/media/libstagefright/codecs/aacenc/src/sf_estim.c
index d34b365..ffe2e83 100644
--- a/media/libstagefright/codecs/aacenc/src/sf_estim.c
+++ b/media/libstagefright/codecs/aacenc/src/sf_estim.c
@@ -1,26 +1,26 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		sf_estim.c

-

-	Content:	Scale factor estimation functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		sf_estim.c
+
+	Content:	Scale factor estimation functions
+
 *******************************************************************************/
 
-#include "basic_op.h"

+#include "basic_op.h"
 #include "oper_32b.h"
 #include "sf_estim.h"
 #include "quantize.h"
@@ -45,12 +45,12 @@
 
 #define FF_SQRT_BITS                    7
 #define FF_SQRT_TABLE_SIZE              (1<<FF_SQRT_BITS - 1<<(FF_SQRT_BITS-2))
-#define COEF08_31		0x66666666		/* 0.8*(1 << 31) */

-#define PE_C1_8			24				/* PE_C1*8 */

-#define PE_C2_16		21				/* PE_C2*8/PE_C3 */

-#define PE_SCALE		0x059a			/* 0.7 * (1 << (15 - 1 - 3))*/

-

-#define SCALE_ESTIMATE_COEF	0x5555		/* (8.8585/(4*log2(10))) * (1 << 15)*/

+#define COEF08_31		0x66666666		/* 0.8*(1 << 31) */
+#define PE_C1_8			24				/* PE_C1*8 */
+#define PE_C2_16		21				/* PE_C2*8/PE_C3 */
+#define PE_SCALE		0x059a			/* 0.7 * (1 << (15 - 1 - 3))*/
+
+#define SCALE_ESTIMATE_COEF	0x5555		/* (8.8585/(4*log2(10))) * (1 << 15)*/
 
 /*********************************************************************************
 *
@@ -69,17 +69,17 @@
 	postshift = preshift >> 1;
 	preshift  = postshift << 1;
 	postshift = postshift + 8;	  /* sqrt/256 */
-	if(preshift >= 0)

-		y = x << preshift;        /* now 1/4 <= y < 1 */

-	else

-		y = x >> (-preshift);

-	y = formfac_sqrttable[y-32];

-	

-	if(postshift >= 0)

-		y = y >> postshift;

-	else

-		y = y << (-postshift);

-	

+	if(preshift >= 0)
+		y = x << preshift;        /* now 1/4 <= y < 1 */
+	else
+		y = x >> (-preshift);
+	y = formfac_sqrttable[y-32];
+	
+	if(postshift >= 0)
+		y = y >> postshift;
+	else
+		y = y << (-postshift);
+	
 	return y;
 }
 
@@ -97,25 +97,25 @@
                       Word16 *logSfbEnergy,
                       PSY_OUT_CHANNEL *psyOutChan)
 {
-	Word32 sfbw, sfbw1;

+	Word32 sfbw, sfbw1;
 	Word32 i, j;
 	Word32 sfbOffs, sfb, shift;
-	

-	sfbw = sfbw1 = 0;

+	
+	sfbw = sfbw1 = 0;
 	for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup){
 		for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
 			i = sfbOffs+sfb;      
 			
 			if (psyOutChan->sfbEnergy[i] > psyOutChan->sfbThreshold[i]) {
-				Word32 accu, avgFormFactor,iSfbWidth;

+				Word32 accu, avgFormFactor,iSfbWidth;
 				Word32 *mdctSpec;
-				sfbw = psyOutChan->sfbOffsets[i+1] - psyOutChan->sfbOffsets[i];

-				iSfbWidth = invSBF[(sfbw >> 2) - 1];

+				sfbw = psyOutChan->sfbOffsets[i+1] - psyOutChan->sfbOffsets[i];
+				iSfbWidth = invSBF[(sfbw >> 2) - 1];
 				mdctSpec = psyOutChan->mdctSpectrum + psyOutChan->sfbOffsets[i];
 				accu = 0;                                                                       
 				/* calc sum of sqrt(spec) */
-				for (j=sfbw; j; j--) {

-					accu += formfac_sqrt(L_abs(*mdctSpec)); mdctSpec++;

+				for (j=sfbw; j; j--) {
+					accu += formfac_sqrt(L_abs(*mdctSpec)); mdctSpec++;
 				}
 				logSfbFormFactor[i] = iLog4(accu);
 				logSfbEnergy[i] = iLog4(psyOutChan->sfbEnergy[i]);
@@ -158,8 +158,8 @@
 	
 	/* calc real distortion */
 	sfbDist = calcSfbDist(spec, sfbWidth, scf);
-	*minScfCalculated = scf;     

-	if(!sfbDist)

+	*minScfCalculated = scf;     
+	if(!sfbDist)
 	  return scfBest;
 	
 	if (sfbDist > thresh125) {
@@ -194,7 +194,7 @@
 			}
 			*minScfCalculated = scf;                                       
 			cnt = cnt + 1;
-		}

+		}
 		*dist = sfbDistBest;                                              
 	}
 	else {
@@ -419,7 +419,7 @@
 		prevScfLast[j] = MAX_16;                                                    
 		prevScfNext[j] = MAX_16;                                                    
 		deltaPeLast[j] = MAX_16;                                                    
-	}

+	}
 	
 	sfbLast = -1;                                                                 
 	sfbAct = -1;                                                                  
@@ -713,20 +713,20 @@
 	
 	
 	for (i=0; i<psyOutChan->sfbCnt; i++) {
-		Word32 sbfwith, sbfStart;

+		Word32 sbfwith, sbfStart;
 		Word32 *mdctSpec;
 		thresh = psyOutChan->sfbThreshold[i];                                       
 		energy = psyOutChan->sfbEnergy[i];                                          
-		

-		sbfStart = psyOutChan->sfbOffsets[i];

-		sbfwith = psyOutChan->sfbOffsets[i+1] - sbfStart;

-		mdctSpec = psyOutChan->mdctSpectrum+sbfStart;

+		
+		sbfStart = psyOutChan->sfbOffsets[i];
+		sbfwith = psyOutChan->sfbOffsets[i+1] - sbfStart;
+		mdctSpec = psyOutChan->mdctSpectrum+sbfStart;
 		
 		maxSpec = 0;                                                                
 		/* maximum of spectrum */
-		for (j=sbfwith; j; j-- ) {

-			Word32 absSpec = L_abs(*mdctSpec); mdctSpec++;

-			maxSpec |= absSpec;                                                       

+		for (j=sbfwith; j; j-- ) {
+			Word32 absSpec = L_abs(*mdctSpec); mdctSpec++;
+			maxSpec |= absSpec;                                                       
 		}
 		
 		/* scfs without energy or with thresh>energy are marked with MIN_16 */
@@ -737,7 +737,7 @@
 			
 			energyPart = logSfbFormFactor[i];                                         
 			thresholdPart = iLog4(thresh);  
-			/* -20 = 4*log2(6.75) - 32 */

+			/* -20 = 4*log2(6.75) - 32 */
 			scfInt = ((thresholdPart - energyPart - 20) * SCALE_ESTIMATE_COEF) >> 15;
 			
 			minSfMaxQuant[i] = iLog4(maxSpec) - 68; /* 68  -16/3*log(MAX_QUANT+0.5-logCon)/log(2) + 1 */
@@ -748,9 +748,9 @@
 			}
 			
 			/* find better scalefactor with analysis by synthesis */
-			scfInt = improveScf(psyOutChan->mdctSpectrum+sbfStart,

-				sbfwith,

-				thresh, scfInt, minSfMaxQuant[i], 

+			scfInt = improveScf(psyOutChan->mdctSpectrum+sbfStart,
+				sbfwith,
+				thresh, scfInt, minSfMaxQuant[i], 
 				&sfbDist[i], &minScfCalculated[i]);
 			
 			scf[i] = scfInt;                                                          
diff --git a/media/libstagefright/codecs/aacenc/src/spreading.c b/media/libstagefright/codecs/aacenc/src/spreading.c
index e6fc7da..aaf2fff 100644
--- a/media/libstagefright/codecs/aacenc/src/spreading.c
+++ b/media/libstagefright/codecs/aacenc/src/spreading.c
@@ -1,29 +1,29 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		spreading.c

-

-	Content:	Spreading of energy function

-

-*******************************************************************************/

-

-#include "basic_op.h"

-#include "oper_32b.h"

-#include "spreading.h"

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		spreading.c
+
+	Content:	Spreading of energy function
+
+*******************************************************************************/
+
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "spreading.h"
+
 /*********************************************************************************
 *
 * function name: SpreadingMax
@@ -31,22 +31,22 @@
 *				 higher frequencies thr(n) = max(thr(n), sh(n)*thr(n-1))
 *				 lower frequencies  thr(n) = max(thr(n), sl(n)*thr(n+1))
 *
-**********************************************************************************/

-void SpreadingMax(const Word16 pbCnt,

-                  const Word16 *maskLowFactor,

-                  const Word16 *maskHighFactor,

-                  Word32       *pbSpreadedEnergy)

-{

-  Word32 i;

-

-  /* slope to higher frequencies */

-  for (i=1; i<pbCnt; i++) {

-    pbSpreadedEnergy[i] = max(pbSpreadedEnergy[i],

-                                L_mpy_ls(pbSpreadedEnergy[i-1], maskHighFactor[i]));

-  }

-  /* slope to lower frequencies */

-  for (i=pbCnt - 2; i>=0; i--) {

-    pbSpreadedEnergy[i] = max(pbSpreadedEnergy[i],

-                                L_mpy_ls(pbSpreadedEnergy[i+1], maskLowFactor[i]));

-  }

-}

+**********************************************************************************/
+void SpreadingMax(const Word16 pbCnt,
+                  const Word16 *maskLowFactor,
+                  const Word16 *maskHighFactor,
+                  Word32       *pbSpreadedEnergy)
+{
+  Word32 i;
+
+  /* slope to higher frequencies */
+  for (i=1; i<pbCnt; i++) {
+    pbSpreadedEnergy[i] = max(pbSpreadedEnergy[i],
+                                L_mpy_ls(pbSpreadedEnergy[i-1], maskHighFactor[i]));
+  }
+  /* slope to lower frequencies */
+  for (i=pbCnt - 2; i>=0; i--) {
+    pbSpreadedEnergy[i] = max(pbSpreadedEnergy[i],
+                                L_mpy_ls(pbSpreadedEnergy[i+1], maskLowFactor[i]));
+  }
+}
diff --git a/media/libstagefright/codecs/aacenc/src/stat_bits.c b/media/libstagefright/codecs/aacenc/src/stat_bits.c
index 556104e..baa289c8 100644
--- a/media/libstagefright/codecs/aacenc/src/stat_bits.c
+++ b/media/libstagefright/codecs/aacenc/src/stat_bits.c
@@ -1,23 +1,23 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		stat_bits.c

-

-	Content:	Static bit counter functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		stat_bits.c
+
+	Content:	Static bit counter functions
+
 *******************************************************************************/
 
 #include "stat_bits.h"
@@ -82,10 +82,10 @@
   Flag tnsPresent;
   Word32 numOfWindows;
   Word32 count;
-  Word32 coefBits;

+  Word32 coefBits;
   Word16 *ptcoef;
 
-  count = 0;       

+  count = 0;       
   
   if (blockType == 2)
     numOfWindows = 8;
@@ -127,7 +127,7 @@
           count += 1; /*coef_compression */	
            
           if (tnsInfo->coefRes[i] == 4) {
-            ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT;

+            ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT;
 			coefBits = 3;                                        
             for(k=0; k<tnsInfo->order[i]; k++) {
                  
@@ -139,7 +139,7 @@
           }
           else {
             coefBits = 2;                                        
-            ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT;

+            ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT;
 			for(k=0; k<tnsInfo->order[i]; k++) {
                  
               if ((ptcoef[k] > 1) || (ptcoef[k] < -2)) {
@@ -154,7 +154,7 @@
         }
       }
     }
-  }

+  }
   
   return count;
 }
@@ -178,14 +178,14 @@
 **********************************************************************************/
 Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
                             PSY_OUT_ELEMENT *psyOutElement,
-                            Word16 channels, 

+                            Word16 channels, 
 							Word16 adtsUsed)
 {
   Word32 statBits;
   Word32 ch;
   
-  statBits = 0;                                                  

-

+  statBits = 0;                                                  
+
   /* if adts used, add 56 bits */
   if(adtsUsed) statBits += 56;
 
diff --git a/media/libstagefright/codecs/aacenc/src/tns.c b/media/libstagefright/codecs/aacenc/src/tns.c
index 96d890e..473e0a0 100644
--- a/media/libstagefright/codecs/aacenc/src/tns.c
+++ b/media/libstagefright/codecs/aacenc/src/tns.c
@@ -1,27 +1,27 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		tns.c

-

-	Content:	Definition TNS tools functions

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		tns.c
+
+	Content:	Definition TNS tools functions
+
 *******************************************************************************/
 
-#include "basic_op.h"

-#include "oper_32b.h"

+#include "basic_op.h"
+#include "oper_32b.h"
 #include "assert.h"
 #include "aac_rom.h"
 #include "psy_const.h"
@@ -32,23 +32,23 @@
 
 #define TNS_MODIFY_BEGIN         2600  /* Hz */
 #define RATIO_PATCH_LOWER_BORDER 380   /* Hz */
-#define TNS_GAIN_THRESH			 141   /* 1.41*100 */

-#define NORM_COEF				 0x028f5c28

+#define TNS_GAIN_THRESH			 141   /* 1.41*100 */
+#define NORM_COEF				 0x028f5c28
 
-static const Word32 TNS_PARCOR_THRESH = 0x0ccccccd; /* 0.1*(1 << 31) */

-/* Limit bands to > 2.0 kHz */

-static unsigned short tnsMinBandNumberLong[12] =

-{ 11, 12, 15, 16, 17, 20, 25, 26, 24, 28, 30, 31 };

-static unsigned short tnsMinBandNumberShort[12] =

-{ 2, 2, 2, 3, 3, 4, 6, 6, 8, 10, 10, 12 };

-

-/**************************************/

-/* Main/Low Profile TNS Parameters    */

-/**************************************/

-static unsigned short tnsMaxBandsLongMainLow[12] =

-{ 31, 31, 34, 40, 42, 51, 46, 46, 42, 42, 42, 39 };

-

-static unsigned short tnsMaxBandsShortMainLow[12] =

+static const Word32 TNS_PARCOR_THRESH = 0x0ccccccd; /* 0.1*(1 << 31) */
+/* Limit bands to > 2.0 kHz */
+static unsigned short tnsMinBandNumberLong[12] =
+{ 11, 12, 15, 16, 17, 20, 25, 26, 24, 28, 30, 31 };
+static unsigned short tnsMinBandNumberShort[12] =
+{ 2, 2, 2, 3, 3, 4, 6, 6, 8, 10, 10, 12 };
+
+/**************************************/
+/* Main/Low Profile TNS Parameters    */
+/**************************************/
+static unsigned short tnsMaxBandsLongMainLow[12] =
+{ 31, 31, 34, 40, 42, 51, 46, 46, 42, 42, 42, 39 };
+
+static unsigned short tnsMaxBandsShortMainLow[12] =
 { 9, 9, 10, 14, 14, 14, 14, 14, 14, 14, 14, 14 };
 
 
@@ -178,8 +178,8 @@
   tC->lpcStopBand = tnsMaxBandsLongMainLow[pC->sampRateIdx];
   tC->lpcStopBand = min(tC->lpcStopBand, pC->sfbActive);
 
-  tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand];   

-  

+  tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand];   
+  
   tC->lpcStartBand = tnsMinBandNumberLong[pC->sampRateIdx];
 
   tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand];                                               
@@ -241,13 +241,13 @@
 
   tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand];                                               
 
-  tC->lpcStopBand = tnsMaxBandsShortMainLow[pC->sampRateIdx];

+  tC->lpcStopBand = tnsMaxBandsShortMainLow[pC->sampRateIdx];
 
   tC->lpcStopBand = min(tC->lpcStopBand, pC->sfbActive);
 
   tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand];                                                 
 
-  tC->lpcStartBand = tnsMinBandNumberShort[pC->sampRateIdx];

+  tC->lpcStartBand = tnsMinBandNumberShort[pC->sampRateIdx];
 
   tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand];                                               
 
@@ -399,12 +399,12 @@
 {
   Word32 i;
   Word32 temp_s;
-  Word32 temp;

+  Word32 temp;
   TNS_SUBBLOCK_INFO *psubBlockInfo;
 
   temp_s = blockType - SHORT_WINDOW;                                                             
   if ( temp_s != 0) {                                                                               
-    psubBlockInfo = &tnsData->dataRaw.tnsLong.subBlockInfo;

+    psubBlockInfo = &tnsData->dataRaw.tnsLong.subBlockInfo;
 	if (psubBlockInfo->tnsActive == 0) {
       tnsInfo->tnsActive[subBlockNumber] = 0;                                                       
       return(0);
@@ -449,7 +449,7 @@
     }
   }     /* if (blockType!=SHORT_WINDOW) */
   else /*short block*/ {                                                                            
-    psubBlockInfo = &tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber];

+    psubBlockInfo = &tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
 	if (psubBlockInfo->tnsActive == 0) {
       tnsInfo->tnsActive[subBlockNumber] = 0;                                                       
       return(0);
@@ -556,9 +556,9 @@
       tmp2 = sfbEnergy[sfb] - 2;                                                            
       if( tmp2 > 0) {
         tmp = rsqrt(sfbEnergy[sfb], INT_BITS);
-		if(tmp > INT_BITS_SCAL) 

-		{

-			shift =  norm_l(tmp);

+		if(tmp > INT_BITS_SCAL) 
+		{
+			shift =  norm_l(tmp);
 			tmp = Div_32( INT_BITS_SCAL << shift, tmp << shift ); 
 		}
 		else
@@ -601,20 +601,20 @@
       maxWS |= L_abs(pWork32[i]);                                                          
     }
     maxShift = norm_l(maxWS);
-

-	maxShift = 16 - maxShift;

-    if(maxShift >= 0)

-	{

-		for (i=lpcStartLine; i<lpcStopLine; i++){

-			weightedSpectrum[i] = pWork32[i] >> maxShift;

-		}

-    }

-	else

-	{

-		maxShift = -maxShift;

-		for (i=lpcStartLine; i<lpcStopLine; i++){

-			weightedSpectrum[i] = saturate(pWork32[i] << maxShift);

-		}

+
+	maxShift = 16 - maxShift;
+    if(maxShift >= 0)
+	{
+		for (i=lpcStartLine; i<lpcStopLine; i++){
+			weightedSpectrum[i] = pWork32[i] >> maxShift;
+		}
+    }
+	else
+	{
+		maxShift = -maxShift;
+		for (i=lpcStartLine; i<lpcStopLine; i++){
+			weightedSpectrum[i] = saturate(pWork32[i] << maxShift);
+		}
 	}
 }
 
@@ -669,7 +669,7 @@
 * output:       acf values
 *
 *****************************************************************************/
-#ifndef ARMV5E

+#ifndef ARMV5E
 void AutoCorrelation(const Word16		 input[],
                             Word32       corr[],
                             Word16       samples,
@@ -679,12 +679,12 @@
   Word32 scf;
 
   scf = 10 - 1;                                                                                      
-

+
   isamples = samples;
   /* calc first corrCoef:  R[0] = sum { t[i] * t[i] } ; i = 0..N-1 */
   accu = 0;                                                                                      
   for(j=0; j<isamples; j++) {
-    accu = L_add(accu, ((input[j] * input[j]) >> scf));

+    accu = L_add(accu, ((input[j] * input[j]) >> scf));
   }
   corr[0] = accu;                                                                                
 
@@ -696,7 +696,7 @@
     isamples = isamples - 1;
     accu = 0;                                                                                    
     for(j=0; j<isamples; j++) {
-      accu = L_add(accu, ((input[j] * input[j+i]) >> scf));

+      accu = L_add(accu, ((input[j] * input[j+i]) >> scf));
     }
     corr[i] = accu;                                                                              
   }
@@ -737,7 +737,7 @@
     if (workBuffer[0] < L_abs(workBuffer[i + numOfCoeff])) {
       return 0 ;
     }
-	shift = norm_l(workBuffer[0]);

+	shift = norm_l(workBuffer[0]);
 	workBuffer0 = Div_32(1 << shift, workBuffer[0] << shift);
     /* calculate refc = -workBuffer[numOfCoeff+i] / workBuffer[0]; -1 <= refc < 1 */
 	refc = L_negate(fixmul(workBuffer[numOfCoeff + i], workBuffer0));
@@ -758,8 +758,8 @@
   denom = MULHIGH(workBuffer[0], NORM_COEF);
    
   if (denom != 0) {
-    Word32 temp;

-	shift = norm_l(denom);

+    Word32 temp;
+	shift = norm_l(denom);
 	temp = Div_32(1 << shift, denom << shift);
     predictionGain = fixmul(num, temp);
   }
diff --git a/media/libstagefright/codecs/aacenc/src/transform.c b/media/libstagefright/codecs/aacenc/src/transform.c
index af17b5a..4d11f78 100644
--- a/media/libstagefright/codecs/aacenc/src/transform.c
+++ b/media/libstagefright/codecs/aacenc/src/transform.c
@@ -1,37 +1,37 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		transform.c

-

-	Content:	MDCT Transform functionss

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		transform.c
+
+	Content:	MDCT Transform functionss
+
 *******************************************************************************/
 
-#include "basic_op.h"

+#include "basic_op.h"
 #include "psy_const.h"
 #include "transform.h"
 #include "aac_rom.h"
-

-

-#define LS_TRANS ((FRAME_LEN_LONG-FRAME_LEN_SHORT)/2) /* 448 */

-#define SQRT1_2 0x5a82799a	/* sqrt(1/2) in Q31 */

-#define swap2(p0,p1) \

-	t = p0; t1 = *(&(p0)+1);	\

-	p0 = p1; *(&(p0)+1) = *(&(p1)+1);	\

-	p1 = t; *(&(p1)+1) = t1	

+
+
+#define LS_TRANS ((FRAME_LEN_LONG-FRAME_LEN_SHORT)/2) /* 448 */
+#define SQRT1_2 0x5a82799a	/* sqrt(1/2) in Q31 */
+#define swap2(p0,p1) \
+	t = p0; t1 = *(&(p0)+1);	\
+	p0 = p1; *(&(p0)+1) = *(&(p1)+1);	\
+	p1 = t; *(&(p1)+1) = t1	
 
 /*********************************************************************************
 *
@@ -39,343 +39,343 @@
 * description:  Shuffle points prepared function for fft
 *
 **********************************************************************************/
-static void Shuffle(int *buf, int num, const unsigned char* bitTab)

-{

-    int *part0, *part1;

-	int i, j;

-	int t, t1;

-

-	part0 = buf;

-    part1 = buf + num;

-	

-	while ((i = *bitTab++) != 0) {

-        j = *bitTab++;

-

-        swap2(part0[4*i+0], part0[4*j+0]);	

-        swap2(part0[4*i+2], part1[4*j+0]);	

-        swap2(part1[4*i+0], part0[4*j+2]);	

-        swap2(part1[4*i+2], part1[4*j+2]);	

-    }

-

-    do {

-        swap2(part0[4*i+2], part1[4*i+0]);	

-    } while ((i = *bitTab++) != 0);

-}

-

-#if !defined(ARMV5E) && !defined(ARMV7Neon)

+static void Shuffle(int *buf, int num, const unsigned char* bitTab)
+{
+    int *part0, *part1;
+	int i, j;
+	int t, t1;
+
+	part0 = buf;
+    part1 = buf + num;
+	
+	while ((i = *bitTab++) != 0) {
+        j = *bitTab++;
+
+        swap2(part0[4*i+0], part0[4*j+0]);	
+        swap2(part0[4*i+2], part1[4*j+0]);	
+        swap2(part1[4*i+0], part0[4*j+2]);	
+        swap2(part1[4*i+2], part1[4*j+2]);	
+    }
+
+    do {
+        swap2(part0[4*i+2], part1[4*i+0]);	
+    } while ((i = *bitTab++) != 0);
+}
+
+#if !defined(ARMV5E) && !defined(ARMV7Neon)
 
 /*****************************************************************************
 *
 * function name: Radix4First
 * description:  Radix 4 point prepared function for fft
 *
-**********************************************************************************/

-static void Radix4First(int *buf, int num)

-{

-    int r0, r1, r2, r3;

-	int r4, r5, r6, r7;

-	

-	for (; num != 0; num--) 

-	{

-		r0 = buf[0] + buf[2];

-		r1 = buf[1] + buf[3];

-		r2 = buf[0] - buf[2];

-		r3 = buf[1] - buf[3];

-		r4 = buf[4] + buf[6];

-		r5 = buf[5] + buf[7];

-		r6 = buf[4] - buf[6];

-		r7 = buf[5] - buf[7];

-

-		buf[0] = r0 + r4;

-		buf[1] = r1 + r5;

-		buf[4] = r0 - r4;

-		buf[5] = r1 - r5;

-		buf[2] = r2 + r7;

-		buf[3] = r3 - r6;

-		buf[6] = r2 - r7;

-		buf[7] = r3 + r6;

-

-		buf += 8;

-	}

-}

-

+**********************************************************************************/
+static void Radix4First(int *buf, int num)
+{
+    int r0, r1, r2, r3;
+	int r4, r5, r6, r7;
+	
+	for (; num != 0; num--) 
+	{
+		r0 = buf[0] + buf[2];
+		r1 = buf[1] + buf[3];
+		r2 = buf[0] - buf[2];
+		r3 = buf[1] - buf[3];
+		r4 = buf[4] + buf[6];
+		r5 = buf[5] + buf[7];
+		r6 = buf[4] - buf[6];
+		r7 = buf[5] - buf[7];
+
+		buf[0] = r0 + r4;
+		buf[1] = r1 + r5;
+		buf[4] = r0 - r4;
+		buf[5] = r1 - r5;
+		buf[2] = r2 + r7;
+		buf[3] = r3 - r6;
+		buf[6] = r2 - r7;
+		buf[7] = r3 + r6;
+
+		buf += 8;
+	}
+}
+
 /*****************************************************************************
 *
 * function name: Radix8First
 * description:  Radix 8 point prepared function for fft
 *
-**********************************************************************************/

-static void Radix8First(int *buf, int num)

-{

-   int r0, r1, r2, r3;

-   int i0, i1, i2, i3;

-   int r4, r5, r6, r7;

-   int i4, i5, i6, i7;

-   int t0, t1, t2, t3;

-

-	for ( ; num != 0; num--) 

-	{

-		r0 = buf[0] + buf[2];

-		i0 = buf[1] + buf[3];

-		r1 = buf[0] - buf[2];

-		i1 = buf[1] - buf[3];

-		r2 = buf[4] + buf[6];

-		i2 = buf[5] + buf[7];

-		r3 = buf[4] - buf[6];

-		i3 = buf[5] - buf[7];

-

-		r4 = (r0 + r2) >> 1;

-		i4 = (i0 + i2) >> 1;

-		r5 = (r0 - r2) >> 1;

-		i5 = (i0 - i2) >> 1;

-		r6 = (r1 - i3) >> 1;

-		i6 = (i1 + r3) >> 1;

-		r7 = (r1 + i3) >> 1;

-		i7 = (i1 - r3) >> 1;

-

-		r0 = buf[ 8] + buf[10];

-		i0 = buf[ 9] + buf[11];

-		r1 = buf[ 8] - buf[10];

-		i1 = buf[ 9] - buf[11];

-		r2 = buf[12] + buf[14];

-		i2 = buf[13] + buf[15];

-		r3 = buf[12] - buf[14];

-		i3 = buf[13] - buf[15];

-

-		t0 = (r0 + r2) >> 1;

-		t1 = (i0 + i2) >> 1;

-		t2 = (r0 - r2) >> 1;

-		t3 = (i0 - i2) >> 1;

-

-		buf[ 0] = r4 + t0;

-		buf[ 1] = i4 + t1;

-		buf[ 8] = r4 - t0;

-		buf[ 9] = i4 - t1;

-		buf[ 4] = r5 + t3;

-		buf[ 5] = i5 - t2;

-		buf[12] = r5 - t3;

-		buf[13] = i5 + t2;

-

-		r0 = r1 - i3;

-		i0 = i1 + r3;

-		r2 = r1 + i3;

-		i2 = i1 - r3;

-

-		t0 = MULHIGH(SQRT1_2, r0 - i0);

-		t1 = MULHIGH(SQRT1_2, r0 + i0);

-		t2 = MULHIGH(SQRT1_2, r2 - i2);

-		t3 = MULHIGH(SQRT1_2, r2 + i2);

-

-		buf[ 6] = r6 - t0;

-		buf[ 7] = i6 - t1;

-		buf[14] = r6 + t0;

-		buf[15] = i6 + t1;

-		buf[ 2] = r7 + t3;

-		buf[ 3] = i7 - t2;

-		buf[10] = r7 - t3;

-		buf[11] = i7 + t2;

-

-		buf += 16;

-	}

-}

-

+**********************************************************************************/
+static void Radix8First(int *buf, int num)
+{
+   int r0, r1, r2, r3;
+   int i0, i1, i2, i3;
+   int r4, r5, r6, r7;
+   int i4, i5, i6, i7;
+   int t0, t1, t2, t3;
+
+	for ( ; num != 0; num--) 
+	{
+		r0 = buf[0] + buf[2];
+		i0 = buf[1] + buf[3];
+		r1 = buf[0] - buf[2];
+		i1 = buf[1] - buf[3];
+		r2 = buf[4] + buf[6];
+		i2 = buf[5] + buf[7];
+		r3 = buf[4] - buf[6];
+		i3 = buf[5] - buf[7];
+
+		r4 = (r0 + r2) >> 1;
+		i4 = (i0 + i2) >> 1;
+		r5 = (r0 - r2) >> 1;
+		i5 = (i0 - i2) >> 1;
+		r6 = (r1 - i3) >> 1;
+		i6 = (i1 + r3) >> 1;
+		r7 = (r1 + i3) >> 1;
+		i7 = (i1 - r3) >> 1;
+
+		r0 = buf[ 8] + buf[10];
+		i0 = buf[ 9] + buf[11];
+		r1 = buf[ 8] - buf[10];
+		i1 = buf[ 9] - buf[11];
+		r2 = buf[12] + buf[14];
+		i2 = buf[13] + buf[15];
+		r3 = buf[12] - buf[14];
+		i3 = buf[13] - buf[15];
+
+		t0 = (r0 + r2) >> 1;
+		t1 = (i0 + i2) >> 1;
+		t2 = (r0 - r2) >> 1;
+		t3 = (i0 - i2) >> 1;
+
+		buf[ 0] = r4 + t0;
+		buf[ 1] = i4 + t1;
+		buf[ 8] = r4 - t0;
+		buf[ 9] = i4 - t1;
+		buf[ 4] = r5 + t3;
+		buf[ 5] = i5 - t2;
+		buf[12] = r5 - t3;
+		buf[13] = i5 + t2;
+
+		r0 = r1 - i3;
+		i0 = i1 + r3;
+		r2 = r1 + i3;
+		i2 = i1 - r3;
+
+		t0 = MULHIGH(SQRT1_2, r0 - i0);
+		t1 = MULHIGH(SQRT1_2, r0 + i0);
+		t2 = MULHIGH(SQRT1_2, r2 - i2);
+		t3 = MULHIGH(SQRT1_2, r2 + i2);
+
+		buf[ 6] = r6 - t0;
+		buf[ 7] = i6 - t1;
+		buf[14] = r6 + t0;
+		buf[15] = i6 + t1;
+		buf[ 2] = r7 + t3;
+		buf[ 3] = i7 - t2;
+		buf[10] = r7 - t3;
+		buf[11] = i7 + t2;
+
+		buf += 16;
+	}
+}
+
 /*****************************************************************************
 *
 * function name: Radix4FFT
 * description:  Radix 4 point fft core function
 *
-**********************************************************************************/

-static void Radix4FFT(int *buf, int num, int bgn, int *twidTab)

-{

-	int r0, r1, r2, r3;

-	int r4, r5, r6, r7;

-	int t0, t1;

-	int sinx, cosx;

-	int i, j, step;

-	int *xptr, *csptr;

-

-	for (num >>= 2; num != 0; num >>= 2) 

-	{

-		step = 2*bgn;

-		xptr = buf;

-

-    	for (i = num; i != 0; i--) 

-		{

-			csptr = twidTab;

-

-			for (j = bgn; j != 0; j--) 

-			{

-				r0 = xptr[0];

-				r1 = xptr[1];

-				xptr += step;

-				

-				t0 = xptr[0];

-				t1 = xptr[1];				

-				cosx = csptr[0];

-				sinx = csptr[1];

-				r2 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1);		/* cos*br + sin*bi */

-				r3 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0);		/* cos*bi - sin*br */

-				xptr += step;

-

-				t0 = r0 >> 2;

-				t1 = r1 >> 2;

-				r0 = t0 - r2;

-				r1 = t1 - r3;

-				r2 = t0 + r2;

-				r3 = t1 + r3;

-				

-				t0 = xptr[0];

-				t1 = xptr[1];

-				cosx = csptr[2];

-				sinx = csptr[3];

-				r4 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1);		/* cos*cr + sin*ci */

-				r5 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0);		/* cos*ci - sin*cr */

-				xptr += step;

-				

-				t0 = xptr[0];

-				t1 = xptr[1];

-				cosx = csptr[4];

-				sinx = csptr[5];

-				r6 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1);		/* cos*cr + sin*ci */

-				r7 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0);		/* cos*ci - sin*cr */

-				csptr += 6;

-

-				t0 = r4;

-				t1 = r5;

-				r4 = t0 + r6;

-				r5 = r7 - t1;

-				r6 = t0 - r6;

-				r7 = r7 + t1;

-

-				xptr[0] = r0 + r5;

-				xptr[1] = r1 + r6;

-				xptr -= step;

-

-				xptr[0] = r2 - r4;

-				xptr[1] = r3 - r7;

-				xptr -= step;

-

-				xptr[0] = r0 - r5;

-				xptr[1] = r1 - r6;

-				xptr -= step;

-

-				xptr[0] = r2 + r4;

-				xptr[1] = r3 + r7;

-				xptr += 2;

-			}

-			xptr += 3*step;

-		}

-		twidTab += 3*step;

-		bgn <<= 2;

-	}

-}

-

+**********************************************************************************/
+static void Radix4FFT(int *buf, int num, int bgn, int *twidTab)
+{
+	int r0, r1, r2, r3;
+	int r4, r5, r6, r7;
+	int t0, t1;
+	int sinx, cosx;
+	int i, j, step;
+	int *xptr, *csptr;
+
+	for (num >>= 2; num != 0; num >>= 2) 
+	{
+		step = 2*bgn;
+		xptr = buf;
+
+    	for (i = num; i != 0; i--) 
+		{
+			csptr = twidTab;
+
+			for (j = bgn; j != 0; j--) 
+			{
+				r0 = xptr[0];
+				r1 = xptr[1];
+				xptr += step;
+				
+				t0 = xptr[0];
+				t1 = xptr[1];				
+				cosx = csptr[0];
+				sinx = csptr[1];
+				r2 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1);		/* cos*br + sin*bi */
+				r3 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0);		/* cos*bi - sin*br */
+				xptr += step;
+
+				t0 = r0 >> 2;
+				t1 = r1 >> 2;
+				r0 = t0 - r2;
+				r1 = t1 - r3;
+				r2 = t0 + r2;
+				r3 = t1 + r3;
+				
+				t0 = xptr[0];
+				t1 = xptr[1];
+				cosx = csptr[2];
+				sinx = csptr[3];
+				r4 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1);		/* cos*cr + sin*ci */
+				r5 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0);		/* cos*ci - sin*cr */
+				xptr += step;
+				
+				t0 = xptr[0];
+				t1 = xptr[1];
+				cosx = csptr[4];
+				sinx = csptr[5];
+				r6 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1);		/* cos*cr + sin*ci */
+				r7 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0);		/* cos*ci - sin*cr */
+				csptr += 6;
+
+				t0 = r4;
+				t1 = r5;
+				r4 = t0 + r6;
+				r5 = r7 - t1;
+				r6 = t0 - r6;
+				r7 = r7 + t1;
+
+				xptr[0] = r0 + r5;
+				xptr[1] = r1 + r6;
+				xptr -= step;
+
+				xptr[0] = r2 - r4;
+				xptr[1] = r3 - r7;
+				xptr -= step;
+
+				xptr[0] = r0 - r5;
+				xptr[1] = r1 - r6;
+				xptr -= step;
+
+				xptr[0] = r2 + r4;
+				xptr[1] = r3 + r7;
+				xptr += 2;
+			}
+			xptr += 3*step;
+		}
+		twidTab += 3*step;
+		bgn <<= 2;
+	}
+}
+
 /*********************************************************************************
 *
 * function name: PreMDCT
 * description:  prepare MDCT process for next FFT compute
 *
-**********************************************************************************/

-static void PreMDCT(int *buf0, int num, const int *csptr)

-{

-	int i;

-	int tr1, ti1, tr2, ti2;

-	int cosa, sina, cosb, sinb;

-	int *buf1;

-	

-	buf1 = buf0 + num - 1;

-

-	for(i = num >> 2; i != 0; i--)

-	{

-		cosa = *csptr++;	

-		sina = *csptr++;	

-		cosb = *csptr++;	

-		sinb = *csptr++;		

-

-		tr1 = *(buf0 + 0);

-		ti2 = *(buf0 + 1);

-		tr2 = *(buf1 - 1);

-		ti1 = *(buf1 + 0);

-		

-		*buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);

-		*buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1);		

-		

-		*buf1-- = MULHIGH(cosb, ti2) - MULHIGH(sinb, tr2);		

-		*buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);

-	}

-}

-

+**********************************************************************************/
+static void PreMDCT(int *buf0, int num, const int *csptr)
+{
+	int i;
+	int tr1, ti1, tr2, ti2;
+	int cosa, sina, cosb, sinb;
+	int *buf1;
+	
+	buf1 = buf0 + num - 1;
+
+	for(i = num >> 2; i != 0; i--)
+	{
+		cosa = *csptr++;	
+		sina = *csptr++;	
+		cosb = *csptr++;	
+		sinb = *csptr++;		
+
+		tr1 = *(buf0 + 0);
+		ti2 = *(buf0 + 1);
+		tr2 = *(buf1 - 1);
+		ti1 = *(buf1 + 0);
+		
+		*buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);
+		*buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1);		
+		
+		*buf1-- = MULHIGH(cosb, ti2) - MULHIGH(sinb, tr2);		
+		*buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
+	}
+}
+
 /*********************************************************************************
 *
 * function name: PostMDCT
 * description:   post MDCT process after next FFT for MDCT
 *
-**********************************************************************************/

-static void PostMDCT(int *buf0, int num, const int *csptr)

-{

-	int i;

-	int tr1, ti1, tr2, ti2;

-	int cosa, sina, cosb, sinb;

-	int *buf1;

-

-	buf1 = buf0 + num - 1;

-	

-	for(i = num >> 2; i != 0; i--)

-	{

-		cosa = *csptr++;	

-		sina = *csptr++;	

-		cosb = *csptr++;	

-		sinb = *csptr++;

-

-		tr1 = *(buf0 + 0);

-		ti1 = *(buf0 + 1);

-		ti2 = *(buf1 + 0);

-		tr2 = *(buf1 - 1);

-

-		*buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);

-		*buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1);		

-		

-		*buf0++ = MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2);

-		*buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);	

-	}

-}

-#endif

-

-

+**********************************************************************************/
+static void PostMDCT(int *buf0, int num, const int *csptr)
+{
+	int i;
+	int tr1, ti1, tr2, ti2;
+	int cosa, sina, cosb, sinb;
+	int *buf1;
+
+	buf1 = buf0 + num - 1;
+	
+	for(i = num >> 2; i != 0; i--)
+	{
+		cosa = *csptr++;	
+		sina = *csptr++;	
+		cosb = *csptr++;	
+		sinb = *csptr++;
+
+		tr1 = *(buf0 + 0);
+		ti1 = *(buf0 + 1);
+		ti2 = *(buf1 + 0);
+		tr2 = *(buf1 - 1);
+
+		*buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);
+		*buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1);		
+		
+		*buf0++ = MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2);
+		*buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);	
+	}
+}
+#endif
+
+
 /**********************************************************************************
 *
 * function name: Mdct_Long
 * description:  the long block mdct, include long_start block, end_long block
 *
-**********************************************************************************/

-void Mdct_Long(int *buf)

-{

-	PreMDCT(buf, 1024, cossintab + 128);

-

-	Shuffle(buf, 512, bitrevTab + 17);

-	Radix8First(buf, 512 >> 3);						

-	Radix4FFT(buf, 512 >> 3, 8, (int *)twidTab512);

-

-	PostMDCT(buf, 1024, cossintab + 128);	

-}

-

-

+**********************************************************************************/
+void Mdct_Long(int *buf)
+{
+	PreMDCT(buf, 1024, cossintab + 128);
+
+	Shuffle(buf, 512, bitrevTab + 17);
+	Radix8First(buf, 512 >> 3);						
+	Radix4FFT(buf, 512 >> 3, 8, (int *)twidTab512);
+
+	PostMDCT(buf, 1024, cossintab + 128);	
+}
+
+
 /**********************************************************************************
 *
 * function name: Mdct_Short
 * description:  the short block mdct 
 *
-**********************************************************************************/

-void Mdct_Short(int *buf)

-{

-	PreMDCT(buf, 128, cossintab);

-

-	Shuffle(buf, 64, bitrevTab);

-	Radix4First(buf, 64 >> 2);						

-	Radix4FFT(buf, 64 >> 2, 4, (int *)twidTab64);	

-

-	PostMDCT(buf, 128, cossintab);	

-}

+**********************************************************************************/
+void Mdct_Short(int *buf)
+{
+	PreMDCT(buf, 128, cossintab);
+
+	Shuffle(buf, 64, bitrevTab);
+	Radix4First(buf, 64 >> 2);						
+	Radix4FFT(buf, 64 >> 2, 4, (int *)twidTab64);	
+
+	PostMDCT(buf, 128, cossintab);	
+}
 
 
 /*****************************************************************************
@@ -419,31 +419,31 @@
 		*srBuf++ = *dsBuf; dsBuf += chIncrement;
 		*srBuf++ = *dsBuf; dsBuf += chIncrement;
 	}
-}

-

-

+}
+
+
 /*****************************************************************************
 *
 * function name: getScalefactorOfShortVectorStride
 * description:  Calculate max possible scale factor for input vector of shorts
 * returns:      Maximum scale factor
 *
-**********************************************************************************/

-static Word16 getScalefactorOfShortVectorStride(const Word16 *vector, /*!< Pointer to input vector */

-												Word16 len,           /*!< Length of input vector */

-												Word16 stride)        /*!< Stride of input vector */

-{

-	Word16 maxVal = 0;

-	Word16 absVal;

-	Word16 i;

-

-	for(i=0; i<len; i++){

-		absVal = abs_s(vector[i*stride]);

-		maxVal |= absVal;

-	}

-

-	return( maxVal ? norm_s(maxVal) : 15);

-}

+**********************************************************************************/
+static Word16 getScalefactorOfShortVectorStride(const Word16 *vector, /*!< Pointer to input vector */
+												Word16 len,           /*!< Length of input vector */
+												Word16 stride)        /*!< Stride of input vector */
+{
+	Word16 maxVal = 0;
+	Word16 absVal;
+	Word16 i;
+
+	for(i=0; i<len; i++){
+		absVal = abs_s(vector[i*stride]);
+		maxVal |= absVal;
+	}
+
+	return( maxVal ? norm_s(maxVal) : 15);
+}
 
 
 /*****************************************************************************
@@ -464,8 +464,8 @@
 	Word32 i,w;
 	Word32 timeSignalSample;
 	Word32 ws1,ws2;
-	Word16 *dctIn0, *dctIn1;

-	Word32 *outData0, *outData1;

+	Word16 *dctIn0, *dctIn1;
+	Word32 *outData0, *outData1;
 	Word32 *winPtr;
 
 	Word32 delayBufferSf,timeSignalSf,minSf;
@@ -517,8 +517,8 @@
 			*outData0-- = -((ws1 >> 2) + (ws2 >> 2)); 
 		}
 
-		Mdct_Long(realOut);

-		/* update scale factor */

+		Mdct_Long(realOut);
+		/* update scale factor */
 		minSf = 14 - minSf;
 		*mdctScale=minSf; 
 		break;
@@ -543,7 +543,7 @@
 			timeSignalSample = (*dctIn1--) << minSf;
 			ws2 = timeSignalSample * (*winPtr & 0xffff);
 			winPtr ++;
-			*outData0++ = (ws1 >> 2) - (ws2 >> 2);  /* shift 2 to avoid overflow next */

+			*outData0++ = (ws1 >> 2) - (ws2 >> 2);  /* shift 2 to avoid overflow next */
 		}
 		
 		shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
@@ -564,7 +564,7 @@
 			timeSignalSample= (*dctIn1--) << minSf;
 			ws2 = timeSignalSample * (*winPtr >> 16);
 			winPtr++;
-			*outData0-- =  -((ws1 >> 2) + (ws2 >> 2));  /* shift 2 to avoid overflow next */

+			*outData0-- =  -((ws1 >> 2) + (ws2 >> 2));  /* shift 2 to avoid overflow next */
 		}
 
 		Mdct_Long(realOut);
@@ -600,7 +600,7 @@
 			timeSignalSample= (*dctIn1--) << minSf;
 			ws2 = timeSignalSample * (*winPtr & 0xffff);
 			winPtr++;
-			*outData0++ = (ws1 >> 2) - (ws2 >> 2);  /* shift 2 to avoid overflow next */

+			*outData0++ = (ws1 >> 2) - (ws2 >> 2);  /* shift 2 to avoid overflow next */
 		}
 		
 		shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
@@ -615,8 +615,8 @@
 			ws1 = timeSignalSample *(*winPtr & 0xffff);
 			timeSignalSample= (*dctIn1--) << minSf;
 			ws2 = timeSignalSample * (*winPtr >> 16);
-			*outData0-- =  -((ws1 >> 2) + (ws2 >> 2));  /* shift 2 to avoid overflow next */

-			winPtr++;

+			*outData0-- =  -((ws1 >> 2) + (ws2 >> 2));  /* shift 2 to avoid overflow next */
+			winPtr++;
 		}
 		
 		Mdct_Long(realOut);
@@ -645,23 +645,23 @@
 				ws1 = timeSignalSample * (*winPtr >> 16);
 				timeSignalSample= *dctIn1 << minSf;
 				ws2 = timeSignalSample * (*winPtr & 0xffff);
-				*outData0++ = (ws1 >> 2) - (ws2 >> 2);  /* shift 2 to avoid overflow next */

+				*outData0++ = (ws1 >> 2) - (ws2 >> 2);  /* shift 2 to avoid overflow next */
 				
 				timeSignalSample= *(dctIn0 + FRAME_LEN_SHORT) << minSf;
 				ws1 = timeSignalSample * (*winPtr & 0xffff);
 				timeSignalSample= *(dctIn1 + FRAME_LEN_SHORT) << minSf;
 				ws2 = timeSignalSample * (*winPtr >> 16);
-				*outData1-- =  -((ws1 >> 2) + (ws2 >> 2));  /* shift 2 to avoid overflow next */

-

-				winPtr++;

-				dctIn0++;

-				dctIn1--;

+				*outData1-- =  -((ws1 >> 2) + (ws2 >> 2));  /* shift 2 to avoid overflow next */
+
+				winPtr++;
+				dctIn0++;
+				dctIn1--;
 			}
 
 			Mdct_Short(realOut);
 			realOut += FRAME_LEN_SHORT;
 		}
-		

+		
 		minSf = 11 - minSf;
 		*mdctScale = minSf; /* update scale factor */
 		
diff --git a/media/libstagefright/codecs/amrwbenc/SampleCode/AMRWB_E_SAMPLE.c b/media/libstagefright/codecs/amrwbenc/SampleCode/AMRWB_E_SAMPLE.c
index 5e71a5b..4ff5f10 100644
--- a/media/libstagefright/codecs/amrwbenc/SampleCode/AMRWB_E_SAMPLE.c
+++ b/media/libstagefright/codecs/amrwbenc/SampleCode/AMRWB_E_SAMPLE.c
@@ -1,364 +1,364 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-#ifdef LINUX

-#include <dlfcn.h>

-#endif

-

-#include      <stdio.h>

-#include      <stdlib.h>

-#include      <time.h>

-#include      "voAMRWB.h"

-#include      "cmnMemory.h"

-

-#define VOAMRWB_RFC3267_HEADER_INFO "#!AMR-WB\n"

-

-#define  INPUT_SIZE   640

-#define  OUTPUT_SIZE  1024

-unsigned char  InputBuf[INPUT_SIZE];

-unsigned char  OutputBuf[OUTPUT_SIZE];

-

-void usage (void) {

-	printf ("AMR_WB Encoder HELP   Displays this text\n");

-	printf ("\n");

-	printf ("Usage:\n");

-	printf ("AMRWBEnc [options] Input_file output_file \n");

-	printf ("\n");

-	printf ("Options +M* +F* +DTX \n");

-	printf ("Support \n");

-	printf ("Options +M* for seting compression bitrate mode, default is 23.85kbps\n");

-	printf (" +M0 = 6.6kbps \n");

-	printf (" +M1 = 8.85kbps \n");

-	printf (" +M2 = 12.65kbps \n");

-	printf (" +M3 = 14.25kbps \n");

-	printf (" +M4 = 15.58kbps \n");

-	printf (" +M5 = 18.25kbps \n");

-	printf (" +M6 = 19.85kbps \n");

-	printf (" +M7 = 23.05kbps \n");

-	printf (" +M8 = 23.85kbps \n");

-	printf ("\n");

-	printf ("Options +F* for setting output frame Type, default is RFC3267 \n");

-	printf ("+F0 for AMR_WB Defualt bit extern short data frame type \n");

-	printf ("+F1 for AMR_WB_ITU bit extern short data frame type \n");

-	printf ("+F2 for RFC3267\n ");

-	printf ("\n");

-	printf ("Options +DTX enable DTX mode, default is disable.\n");

-	printf ("File names, input raw PCM data, and output is AMR_WB bit-stream file.\n");

-	printf ("\n");

-}

-

-int  GetNextBuf(FILE* inFile,unsigned char* dst,int size)

-{

-	int size2 = (int)fread(dst, sizeof(signed char), size,inFile);

-	return size2;

-}

-

-typedef int (VO_API * VOGETAUDIOENCAPI) (VO_AUDIO_CODECAPI * pEncHandle);

-

-int encode(

-		   int mode, 

-		   short   allow_dtx,

-		   VOAMRWBFRAMETYPE frameType,

-		   const char* srcfile, 

-		   const char* dstfile

-		   )

-{

-	int			ret = 0;

-	int         returnCode;

-	FILE		*fsrc = NULL;

-	FILE		*fdst = NULL;

-	int         framenum = 0;

-	int         eofFile = 0;

-	int         size1 = 0;

-	int         Relens;

-

-	VO_AUDIO_CODECAPI       AudioAPI;

-	VO_MEM_OPERATOR         moper;

-	VO_CODEC_INIT_USERDATA  useData;

-	VO_HANDLE               hCodec;

-	VO_CODECBUFFER          inData;

-	VO_CODECBUFFER          outData;

-	VO_AUDIO_OUTPUTINFO     outFormat;

-

-	unsigned char *inBuf = InputBuf;

-	unsigned char *outBuf = OutputBuf;

-

-

-#ifdef LINUX

-	void  *handle = NULL;

-	void  *pfunc;

-	VOGETAUDIOENCAPI pGetAPI;

-#endif

-

-	clock_t   start, finish;

-	double    duration = 0.0;

-

-	if ((fsrc = fopen (srcfile, "rb")) == NULL)

-	{

-		ret = -1;

-		goto safe_exit;

-	}

-

-	if ((fdst = fopen (dstfile, "wb")) == NULL)

-	{

-		ret = -1;

-		goto safe_exit;

-	}

-

-	moper.Alloc = cmnMemAlloc;

-	moper.Copy = cmnMemCopy;

-	moper.Free = cmnMemFree;

-	moper.Set = cmnMemSet;

-	moper.Check = cmnMemCheck;

-

-	useData.memflag = VO_IMF_USERMEMOPERATOR;

-	useData.memData = (VO_PTR)(&moper);

-

-#ifdef LINUX

-	handle = dlopen("libstagefright.so", RTLD_NOW);

-	if(handle == 0)

-	{

-		printf("open dll error......");

-		return -1;

-	}

-

-	pfunc = dlsym(handle, "voGetAMRWBEncAPI");	

-	if(pfunc == 0)

-	{

-		printf("open function error......");

-		return -1;

-	}

-

-	pGetAPI = (VOGETAUDIOENCAPI)pfunc;

-

-	returnCode  = pGetAPI(&AudioAPI);

-	if(returnCode)

-	{

-		printf("get APIs error......");

-		return -1;

-	}

-#else

-	ret = voGetAMRWBEncAPI(&AudioAPI);

-	if(ret)

-	{

-		ret = -1;

-		printf("get APIs error......");

-		goto safe_exit;

-	}

-#endif 

-

-	//#######################################   Init Encoding Section   #########################################

-	ret = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAMRWB, &useData);

-

-	if(ret)

-	{

-		ret = -1;

-		printf("APIs init error......");

-		goto safe_exit;

-	}

-

-	Relens = GetNextBuf(fsrc,InputBuf,INPUT_SIZE);

-	if(Relens!=INPUT_SIZE && !feof(fsrc))

-	{

-		ret = -1; //Invalid magic number

-		printf("get next buffer error......");

-		goto safe_exit;

-	}

-

-	//###################################### set encode Mode ##################################################

-	ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_FRAMETYPE, &frameType);

-	ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_MODE, &mode);

-	ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_DTX, &allow_dtx);

-

-	if(frameType == VOAMRWB_RFC3267)

-	{

-		/* write RFC3267 Header info to indicate single channel AMR file storage format */

-		size1 = (int)strlen(VOAMRWB_RFC3267_HEADER_INFO);

-		memcpy(outBuf, VOAMRWB_RFC3267_HEADER_INFO, size1);

-		outBuf += size1;

-	}

-

-	//#######################################   Encoding Section   #########################################

-	printf(" \n ---------------- Running -------------------------\n ");

-

-	do{

-		inData.Buffer = (unsigned char *)inBuf;

-		inData.Length = Relens;

-		outData.Buffer = outBuf;

-

-		start = clock();

-

-		/* decode one amr block */

-		returnCode = AudioAPI.SetInputData(hCodec,&inData);

-

-		do {

-			returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outFormat);

-			if(returnCode == 0)

-			{

-				framenum++;

-				printf(" Frames processed: %hd\r", framenum);

-				if(framenum == 1)

-				{

-					fwrite(OutputBuf, 1, outData.Length + size1, fdst);

-					fflush(fdst);	

-				}

-				else

-				{

-					fwrite(outData.Buffer, 1, outData.Length, fdst);

-					fflush(fdst);

-				}

-			}

-			else if(returnCode == VO_ERR_LICENSE_ERROR)

-			{

-		        printf("Encoder time reach upper limit......");

-		        goto safe_exit;

-			}

-		} while(returnCode != VO_ERR_INPUT_BUFFER_SMALL);

-

-		finish = clock();

-		duration += finish - start;

-

-		if (!eofFile) {

-			Relens = GetNextBuf(fsrc, InputBuf, INPUT_SIZE);

-			inBuf = InputBuf;

-			if (feof(fsrc) && Relens == 0)

-				eofFile = 1;

-		}

-	} while (!eofFile && returnCode);

-	//#######################################   End Encoding Section   #########################################

-

-safe_exit:

-	returnCode = AudioAPI.Uninit(hCodec);

-

-	printf( "\n%2.5f seconds\n", (double)duration/CLOCKS_PER_SEC);

-

-	if (fsrc)

-		fclose(fsrc);

-	if (fdst)

-		fclose(fdst);

-

-#ifdef LINUX

-	dlclose(handle);

-#endif

-

-	return ret;

-}

-

-int main(int argc, char **argv)  // for gcc compiler;

-{

-	int     mode, r;

-	int     arg, filename=0;

-	char    *inFileName = NULL;

-	char    *outFileName = NULL;

-	short   allow_dtx;

-	VOAMRWBFRAMETYPE frameType;

-

-	printf("\n");

-	printf("************************Adaptive Multi-Rate Wide Band Encoder (AMR-WB)*******************************\n");

-	printf("***********************************DEFINITIONS:*******************************************************\n");

-	printf("AMR-WB encoder scheme is based on the principle of Algebraic Code Excited Linear Prediction algorithm\n");

-	printf("The AMR-WB encoder compression MONO liner PCM speech input data at 16kHz sampling rate\n");

-	printf("to one of nine data rate modes-6.60, 8.85, 12.65, 14.25, 15.85, 18.25, 19.25, 23.05 and 23.85kbps.\n");

-	printf("The encoder supports output format AMRWB ITU, AMRWB RFC3267.\n");

-	printf("\n");

-

-	/*Encoder Default setting */

-	mode = VOAMRWB_MD2385;

-	allow_dtx = 0;

-	frameType = VOAMRWB_RFC3267;

-

-	if(argc < 3){

-		usage();

-		return 0;

-	}else{

-		for (arg = 1; arg < argc; arg++) {

-			if (argv [arg] [0] == '+') {

-				if(argv[arg][1] == 'M')

-				{

-					switch(argv[arg][2])

-					{

-					case '0': mode = VOAMRWB_MD66;

-						break;

-					case '1': mode = VOAMRWB_MD885;

-						break;

-					case '2': mode = VOAMRWB_MD1265;

-						break;

-					case '3': mode = VOAMRWB_MD1425;

-						break;

-					case '4': mode = VOAMRWB_MD1585;

-						break;

-					case '5': mode = VOAMRWB_MD1825;

-						break;

-					case '6': mode = VOAMRWB_MD1985;

-						break;

-					case '7': mode = VOAMRWB_MD2305;

-						break;

-					case '8': mode = VOAMRWB_MD2385;

-						break;

-					default:

-						usage();

-						printf ("Invalid parameter '%s'.\n", argv [arg]);

-						break;

-					}

-				}else if(argv[arg][1] == 'F')

-				{

-					switch(argv[arg][2])

-					{

-					case '0': frameType = VOAMRWB_DEFAULT;

-						break;

-					case '1': frameType = VOAMRWB_ITU;

-						break;

-					case '2': frameType = VOAMRWB_RFC3267 ;

-						break; 

-					default:

-						usage();

-						printf ("Invalid parameter '%s'.\n", argv [arg]);

-						break;

-

-

-					}

-				}else if(strcmp (argv[arg], "+DTX") == 0)

-				{

-					allow_dtx = 1;

-				}

-

-			} else {

-				switch (filename) {

-						case 0: 

-							inFileName  = argv[arg];

-							break;

-						case 1: 

-							outFileName = argv[arg]; 

-							break;

-						default:

-							usage ();

-							fprintf (stderr, "Invalid parameter '%s'.\n", argv [arg]);

-							return 0;

-				}

-				filename++;

-			}

-		}

-	}

-

-	r = encode(mode, allow_dtx, frameType, inFileName, outFileName);

-	if(r)

-	{

-		fprintf(stderr, "error: %d\n", r);

-	}

-	return r;

-}

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+#ifdef LINUX
+#include <dlfcn.h>
+#endif
+
+#include      <stdio.h>
+#include      <stdlib.h>
+#include      <time.h>
+#include      "voAMRWB.h"
+#include      "cmnMemory.h"
+
+#define VOAMRWB_RFC3267_HEADER_INFO "#!AMR-WB\n"
+
+#define  INPUT_SIZE   640
+#define  OUTPUT_SIZE  1024
+unsigned char  InputBuf[INPUT_SIZE];
+unsigned char  OutputBuf[OUTPUT_SIZE];
+
+void usage (void) {
+	printf ("AMR_WB Encoder HELP   Displays this text\n");
+	printf ("\n");
+	printf ("Usage:\n");
+	printf ("AMRWBEnc [options] Input_file output_file \n");
+	printf ("\n");
+	printf ("Options +M* +F* +DTX \n");
+	printf ("Support \n");
+	printf ("Options +M* for seting compression bitrate mode, default is 23.85kbps\n");
+	printf (" +M0 = 6.6kbps \n");
+	printf (" +M1 = 8.85kbps \n");
+	printf (" +M2 = 12.65kbps \n");
+	printf (" +M3 = 14.25kbps \n");
+	printf (" +M4 = 15.58kbps \n");
+	printf (" +M5 = 18.25kbps \n");
+	printf (" +M6 = 19.85kbps \n");
+	printf (" +M7 = 23.05kbps \n");
+	printf (" +M8 = 23.85kbps \n");
+	printf ("\n");
+	printf ("Options +F* for setting output frame Type, default is RFC3267 \n");
+	printf ("+F0 for AMR_WB Defualt bit extern short data frame type \n");
+	printf ("+F1 for AMR_WB_ITU bit extern short data frame type \n");
+	printf ("+F2 for RFC3267\n ");
+	printf ("\n");
+	printf ("Options +DTX enable DTX mode, default is disable.\n");
+	printf ("File names, input raw PCM data, and output is AMR_WB bit-stream file.\n");
+	printf ("\n");
+}
+
+int  GetNextBuf(FILE* inFile,unsigned char* dst,int size)
+{
+	int size2 = (int)fread(dst, sizeof(signed char), size,inFile);
+	return size2;
+}
+
+typedef int (VO_API * VOGETAUDIOENCAPI) (VO_AUDIO_CODECAPI * pEncHandle);
+
+int encode(
+		   int mode,
+		   short   allow_dtx,
+		   VOAMRWBFRAMETYPE frameType,
+		   const char* srcfile,
+		   const char* dstfile
+		   )
+{
+	int			ret = 0;
+	int         returnCode;
+	FILE		*fsrc = NULL;
+	FILE		*fdst = NULL;
+	int         framenum = 0;
+	int         eofFile = 0;
+	int         size1 = 0;
+	int         Relens;
+
+	VO_AUDIO_CODECAPI       AudioAPI;
+	VO_MEM_OPERATOR         moper;
+	VO_CODEC_INIT_USERDATA  useData;
+	VO_HANDLE               hCodec;
+	VO_CODECBUFFER          inData;
+	VO_CODECBUFFER          outData;
+	VO_AUDIO_OUTPUTINFO     outFormat;
+
+	unsigned char *inBuf = InputBuf;
+	unsigned char *outBuf = OutputBuf;
+
+
+#ifdef LINUX
+	void  *handle = NULL;
+	void  *pfunc;
+	VOGETAUDIOENCAPI pGetAPI;
+#endif
+
+	clock_t   start, finish;
+	double    duration = 0.0;
+
+	if ((fsrc = fopen (srcfile, "rb")) == NULL)
+	{
+		ret = -1;
+		goto safe_exit;
+	}
+
+	if ((fdst = fopen (dstfile, "wb")) == NULL)
+	{
+		ret = -1;
+		goto safe_exit;
+	}
+
+	moper.Alloc = cmnMemAlloc;
+	moper.Copy = cmnMemCopy;
+	moper.Free = cmnMemFree;
+	moper.Set = cmnMemSet;
+	moper.Check = cmnMemCheck;
+
+	useData.memflag = VO_IMF_USERMEMOPERATOR;
+	useData.memData = (VO_PTR)(&moper);
+
+#ifdef LINUX
+	handle = dlopen("libstagefright.so", RTLD_NOW);
+	if(handle == 0)
+	{
+		printf("open dll error......");
+		return -1;
+	}
+
+	pfunc = dlsym(handle, "voGetAMRWBEncAPI");
+	if(pfunc == 0)
+	{
+		printf("open function error......");
+		return -1;
+	}
+
+	pGetAPI = (VOGETAUDIOENCAPI)pfunc;
+
+	returnCode  = pGetAPI(&AudioAPI);
+	if(returnCode)
+	{
+		printf("get APIs error......");
+		return -1;
+	}
+#else
+	ret = voGetAMRWBEncAPI(&AudioAPI);
+	if(ret)
+	{
+		ret = -1;
+		printf("get APIs error......");
+		goto safe_exit;
+	}
+#endif
+
+	//#######################################   Init Encoding Section   #########################################
+	ret = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAMRWB, &useData);
+
+	if(ret)
+	{
+		ret = -1;
+		printf("APIs init error......");
+		goto safe_exit;
+	}
+
+	Relens = GetNextBuf(fsrc,InputBuf,INPUT_SIZE);
+	if(Relens!=INPUT_SIZE && !feof(fsrc))
+	{
+		ret = -1; //Invalid magic number
+		printf("get next buffer error......");
+		goto safe_exit;
+	}
+
+	//###################################### set encode Mode ##################################################
+	ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_FRAMETYPE, &frameType);
+	ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_MODE, &mode);
+	ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_DTX, &allow_dtx);
+
+	if(frameType == VOAMRWB_RFC3267)
+	{
+		/* write RFC3267 Header info to indicate single channel AMR file storage format */
+		size1 = (int)strlen(VOAMRWB_RFC3267_HEADER_INFO);
+		memcpy(outBuf, VOAMRWB_RFC3267_HEADER_INFO, size1);
+		outBuf += size1;
+	}
+
+	//#######################################   Encoding Section   #########################################
+	printf(" \n ---------------- Running -------------------------\n ");
+
+	do{
+		inData.Buffer = (unsigned char *)inBuf;
+		inData.Length = Relens;
+		outData.Buffer = outBuf;
+
+		start = clock();
+
+		/* decode one amr block */
+		returnCode = AudioAPI.SetInputData(hCodec,&inData);
+
+		do {
+			returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outFormat);
+			if(returnCode == 0)
+			{
+				framenum++;
+				printf(" Frames processed: %hd\r", framenum);
+				if(framenum == 1)
+				{
+					fwrite(OutputBuf, 1, outData.Length + size1, fdst);
+					fflush(fdst);
+				}
+				else
+				{
+					fwrite(outData.Buffer, 1, outData.Length, fdst);
+					fflush(fdst);
+				}
+			}
+			else if(returnCode == VO_ERR_LICENSE_ERROR)
+			{
+		        printf("Encoder time reach upper limit......");
+		        goto safe_exit;
+			}
+		} while(returnCode != VO_ERR_INPUT_BUFFER_SMALL);
+
+		finish = clock();
+		duration += finish - start;
+
+		if (!eofFile) {
+			Relens = GetNextBuf(fsrc, InputBuf, INPUT_SIZE);
+			inBuf = InputBuf;
+			if (feof(fsrc) && Relens == 0)
+				eofFile = 1;
+		}
+	} while (!eofFile && returnCode);
+	//#######################################   End Encoding Section   #########################################
+
+safe_exit:
+	returnCode = AudioAPI.Uninit(hCodec);
+
+	printf( "\n%2.5f seconds\n", (double)duration/CLOCKS_PER_SEC);
+
+	if (fsrc)
+		fclose(fsrc);
+	if (fdst)
+		fclose(fdst);
+
+#ifdef LINUX
+	dlclose(handle);
+#endif
+
+	return ret;
+}
+
+int main(int argc, char **argv)  // for gcc compiler;
+{
+	int     mode, r;
+	int     arg, filename=0;
+	char    *inFileName = NULL;
+	char    *outFileName = NULL;
+	short   allow_dtx;
+	VOAMRWBFRAMETYPE frameType;
+
+	printf("\n");
+	printf("************************Adaptive Multi-Rate Wide Band Encoder (AMR-WB)*******************************\n");
+	printf("***********************************DEFINITIONS:*******************************************************\n");
+	printf("AMR-WB encoder scheme is based on the principle of Algebraic Code Excited Linear Prediction algorithm\n");
+	printf("The AMR-WB encoder compression MONO liner PCM speech input data at 16kHz sampling rate\n");
+	printf("to one of nine data rate modes-6.60, 8.85, 12.65, 14.25, 15.85, 18.25, 19.25, 23.05 and 23.85kbps.\n");
+	printf("The encoder supports output format AMRWB ITU, AMRWB RFC3267.\n");
+	printf("\n");
+
+	/*Encoder Default setting */
+	mode = VOAMRWB_MD2385;
+	allow_dtx = 0;
+	frameType = VOAMRWB_RFC3267;
+
+	if(argc < 3){
+		usage();
+		return 0;
+	}else{
+		for (arg = 1; arg < argc; arg++) {
+			if (argv [arg] [0] == '+') {
+				if(argv[arg][1] == 'M')
+				{
+					switch(argv[arg][2])
+					{
+					case '0': mode = VOAMRWB_MD66;
+						break;
+					case '1': mode = VOAMRWB_MD885;
+						break;
+					case '2': mode = VOAMRWB_MD1265;
+						break;
+					case '3': mode = VOAMRWB_MD1425;
+						break;
+					case '4': mode = VOAMRWB_MD1585;
+						break;
+					case '5': mode = VOAMRWB_MD1825;
+						break;
+					case '6': mode = VOAMRWB_MD1985;
+						break;
+					case '7': mode = VOAMRWB_MD2305;
+						break;
+					case '8': mode = VOAMRWB_MD2385;
+						break;
+					default:
+						usage();
+						printf ("Invalid parameter '%s'.\n", argv [arg]);
+						break;
+					}
+				}else if(argv[arg][1] == 'F')
+				{
+					switch(argv[arg][2])
+					{
+					case '0': frameType = VOAMRWB_DEFAULT;
+						break;
+					case '1': frameType = VOAMRWB_ITU;
+						break;
+					case '2': frameType = VOAMRWB_RFC3267 ;
+						break;
+					default:
+						usage();
+						printf ("Invalid parameter '%s'.\n", argv [arg]);
+						break;
+
+
+					}
+				}else if(strcmp (argv[arg], "+DTX") == 0)
+				{
+					allow_dtx = 1;
+				}
+
+			} else {
+				switch (filename) {
+						case 0:
+							inFileName  = argv[arg];
+							break;
+						case 1:
+							outFileName = argv[arg];
+							break;
+						default:
+							usage ();
+							fprintf (stderr, "Invalid parameter '%s'.\n", argv [arg]);
+							return 0;
+				}
+				filename++;
+			}
+		}
+	}
+
+	r = encode(mode, allow_dtx, frameType, inFileName, outFileName);
+	if(r)
+	{
+		fprintf(stderr, "error: %d\n", r);
+	}
+	return r;
+}
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/acelp.h b/media/libstagefright/codecs/amrwbenc/inc/acelp.h
index 4cb38a1..5a1e536 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/acelp.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/acelp.h
@@ -1,521 +1,521 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/*--------------------------------------------------------------------------*

- *                         ACELP.H                                          *

- *--------------------------------------------------------------------------*

- *       Function			 			             *

- *--------------------------------------------------------------------------*/

-#ifndef __ACELP_H__

-#define __ACELP_H__

-

-#include "typedef.h"

-#include "cod_main.h"

-

-/*-----------------------------------------------------------------*

- *                        LPC prototypes                           *

- *-----------------------------------------------------------------*/

-

-Word16 median5(Word16 x[]);

-

-void Autocorr(

-		Word16 x[],                           /* (i)    : Input signal                      */

-		Word16 m,                             /* (i)    : LPC order                         */

-		Word16 r_h[],                         /* (o)    : Autocorrelations  (msb)           */

-		Word16 r_l[]                          /* (o)    : Autocorrelations  (lsb)           */

-	     );

-

-void Lag_window(

-		Word16 r_h[],                         /* (i/o)   : Autocorrelations  (msb)          */

-		Word16 r_l[]                          /* (i/o)   : Autocorrelations  (lsb)          */

-	       );

-

-void Init_Levinson(

-		Word16 * mem                          /* output  :static memory (18 words) */

-		);

-

-void Levinson(

-		Word16 Rh[],                          /* (i)     : Rh[M+1] Vector of autocorrelations (msb) */

-		Word16 Rl[],                          /* (i)     : Rl[M+1] Vector of autocorrelations (lsb) */

-		Word16 A[],                           /* (o) Q12 : A[M]    LPC coefficients  (m = 16)       */

-		Word16 rc[],                          /* (o) Q15 : rc[M]   Reflection coefficients.         */

-		Word16 * mem                          /* (i/o)   :static memory (18 words)                  */

-	     );

-

-void Az_isp(

-		Word16 a[],                           /* (i) Q12 : predictor coefficients                 */

-		Word16 isp[],                         /* (o) Q15 : Immittance spectral pairs              */

-		Word16 old_isp[]                      /* (i)     : old isp[] (in case not found M roots)  */

-	   );

-

-void Isp_Az(

-		Word16 isp[],                         /* (i) Q15 : Immittance spectral pairs            */

-		Word16 a[],                           /* (o) Q12 : predictor coefficients (order = M)   */

-		Word16 m,

-		Word16 adaptive_scaling               /* (i) 0   : adaptive scaling disabled */

-		/*     1   : adaptive scaling enabled  */

-	   );

-

-void Isp_isf(

-		Word16 isp[],                         /* (i) Q15 : isp[m] (range: -1<=val<1)                */

-		Word16 isf[],                         /* (o) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */

-		Word16 m                              /* (i)     : LPC order                                */

-	    );

-

-void Isf_isp(

-		Word16 isf[],                         /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */

-		Word16 isp[],                         /* (o) Q15 : isp[m] (range: -1<=val<1)                */

-		Word16 m                              /* (i)     : LPC order                                */

-	    );

-

-void Int_isp(

-		Word16 isp_old[],                     /* input : isps from past frame              */

-		Word16 isp_new[],                     /* input : isps from present frame           */

-		Word16 frac[],                        /* input : fraction for 3 first subfr (Q15)  */

-		Word16 Az[]                           /* output: LP coefficients in 4 subframes    */

-	    );

-

-void Weight_a(

-		Word16 a[],                           /* (i) Q12 : a[m+1]  LPC coefficients             */

-		Word16 ap[],                          /* (o) Q12 : Spectral expanded LPC coefficients   */

-		Word16 gamma,                         /* (i) Q15 : Spectral expansion factor.           */

-		Word16 m                              /* (i)     : LPC order.                           */

-	     );

-

-

-/*-----------------------------------------------------------------*

- *                        isf quantizers                           *

- *-----------------------------------------------------------------*/

-

-void Qpisf_2s_46b(

-		Word16 * isf1,                        /* (i) Q15 : ISF in the frequency domain (0..0.5) */

-		Word16 * isf_q,                       /* (o) Q15 : quantized ISF               (0..0.5) */

-		Word16 * past_isfq,                   /* (io)Q15 : past ISF quantizer                   */

-		Word16 * indice,                      /* (o)     : quantization indices                 */

-		Word16 nb_surv                        /* (i)     : number of survivor (1, 2, 3 or 4)    */

-		);

-

-void Qpisf_2s_36b(

-		Word16 * isf1,                        /* (i) Q15 : ISF in the frequency domain (0..0.5) */

-		Word16 * isf_q,                       /* (o) Q15 : quantized ISF               (0..0.5) */

-		Word16 * past_isfq,                   /* (io)Q15 : past ISF quantizer                   */

-		Word16 * indice,                      /* (o)     : quantization indices                 */

-		Word16 nb_surv                        /* (i)     : number of survivor (1, 2, 3 or 4)    */

-		);

-

-void Dpisf_2s_46b(

-		Word16 * indice,                      /* input:  quantization indices                       */

-		Word16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */

-		Word16 * past_isfq,                   /* i/0   : past ISF quantizer                    */

-		Word16 * isfold,                      /* input : past quantized ISF                    */

-		Word16 * isf_buf,                     /* input : isf buffer                                                        */

-		Word16 bfi,                           /* input : Bad frame indicator                   */

-		Word16 enc_dec

-		);

-

-void Dpisf_2s_36b(

-		Word16 * indice,                      /* input:  quantization indices                       */

-		Word16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */

-		Word16 * past_isfq,                   /* i/0   : past ISF quantizer                    */

-		Word16 * isfold,                      /* input : past quantized ISF                    */

-		Word16 * isf_buf,                     /* input : isf buffer                                                        */

-		Word16 bfi,                           /* input : Bad frame indicator                   */

-		Word16 enc_dec

-		);

-

-void Qisf_ns(

-		Word16 * isf1,                        /* input : ISF in the frequency domain (0..0.5) */

-		Word16 * isf_q,                       /* output: quantized ISF                        */

-		Word16 * indice                       /* output: quantization indices                 */

-	    );

-

-void Disf_ns(

-		Word16 * indice,                      /* input:  quantization indices                  */

-		Word16 * isf_q                        /* input : ISF in the frequency domain (0..0.5)  */

-	    );

-

-Word16 Sub_VQ(                             /* output: return quantization index     */

-		Word16 * x,                           /* input : ISF residual vector           */

-		Word16 * dico,                        /* input : quantization codebook         */

-		Word16 dim,                           /* input : dimention of vector           */

-		Word16 dico_size,                     /* input : size of quantization codebook */

-		Word32 * distance                     /* output: error of quantization         */

-	     );

-

-void Reorder_isf(

-		Word16 * isf,                         /* (i/o) Q15: ISF in the frequency domain (0..0.5) */

-		Word16 min_dist,                      /* (i) Q15  : minimum distance to keep             */

-		Word16 n                              /* (i)      : number of ISF                        */

-		);

-

-/*-----------------------------------------------------------------*

- *                       filter prototypes                         *

- *-----------------------------------------------------------------*/

-

-void Init_Decim_12k8(

-		Word16 mem[]                          /* output: memory (2*NB_COEF_DOWN) set to zeros */

-		);

-void Decim_12k8(

-		Word16 sig16k[],                      /* input:  signal to downsampling  */

-		Word16 lg,                            /* input:  length of input         */

-		Word16 sig12k8[],                     /* output: decimated signal        */

-		Word16 mem[]                          /* in/out: memory (2*NB_COEF_DOWN) */

-	       );

-

-void Init_HP50_12k8(Word16 mem[]);

-void HP50_12k8(

-		Word16 signal[],                      /* input/output signal */

-		Word16 lg,                            /* lenght of signal    */

-		Word16 mem[]                          /* filter memory [6]   */

-	      );

-void Init_HP400_12k8(Word16 mem[]);

-void HP400_12k8(

-		Word16 signal[],                      /* input/output signal */

-		Word16 lg,                            /* lenght of signal    */

-		Word16 mem[]                          /* filter memory [6]   */

-	       );

-

-void Init_Filt_6k_7k(Word16 mem[]);

-void Filt_6k_7k(

-		Word16 signal[],                      /* input:  signal                  */

-		Word16 lg,                            /* input:  length of input         */

-		Word16 mem[]                          /* in/out: memory (size=30)        */

-	       );

-void Filt_6k_7k_asm(

-		Word16 signal[],                      /* input:  signal                  */

-		Word16 lg,                            /* input:  length of input         */

-		Word16 mem[]                          /* in/out: memory (size=30)        */

-	       );

-

-void LP_Decim2(

-		Word16 x[],                           /* in/out: signal to process         */

-		Word16 l,                             /* input : size of filtering         */

-		Word16 mem[]                          /* in/out: memory (size=3)           */

-	      );

-

-void Preemph(

-		Word16 x[],                           /* (i/o)   : input signal overwritten by the output */

-		Word16 mu,                            /* (i) Q15 : preemphasis coefficient                */

-		Word16 lg,                            /* (i)     : lenght of filtering                    */

-		Word16 * mem                          /* (i/o)   : memory (x[-1])                         */

-	    );

-void Preemph2(

-		Word16 x[],                           /* (i/o)   : input signal overwritten by the output */

-		Word16 mu,                            /* (i) Q15 : preemphasis coefficient                */

-		Word16 lg,                            /* (i)     : lenght of filtering                    */

-		Word16 * mem                          /* (i/o)   : memory (x[-1])                         */

-	     );

-void Deemph(

-		Word16 x[],                           /* (i/o)   : input signal overwritten by the output */

-		Word16 mu,                            /* (i) Q15 : deemphasis factor                      */

-		Word16 L,                             /* (i)     : vector size                            */

-		Word16 * mem                          /* (i/o)   : memory (y[-1])                         */

-	   );

-void Deemph2(

-		Word16 x[],                           /* (i/o)   : input signal overwritten by the output */

-		Word16 mu,                            /* (i) Q15 : deemphasis factor                      */

-		Word16 L,                             /* (i)     : vector size                            */

-		Word16 * mem                          /* (i/o)   : memory (y[-1])                         */

-	    );

-void Deemph_32(

-		Word16 x_hi[],                        /* (i)     : input signal (bit31..16) */

-		Word16 x_lo[],                        /* (i)     : input signal (bit15..4)  */

-		Word16 y[],                           /* (o)     : output signal (x16)      */

-		Word16 mu,                            /* (i) Q15 : deemphasis factor        */

-		Word16 L,                             /* (i)     : vector size              */

-		Word16 * mem                          /* (i/o)   : memory (y[-1])           */

-	      );

-

-void Deemph_32_asm(

-		Word16 x_hi[],                        /* (i)     : input signal (bit31..16) */

-		Word16 x_lo[],                        /* (i)     : input signal (bit15..4)  */

-		Word16 y[],                           /* (o)     : output signal (x16)      */

-		Word16 * mem                          /* (i/o)   : memory (y[-1])           */

-	      );

-

-void Convolve(

-		Word16 x[],                           /* (i)     : input vector                              */

-		Word16 h[],                           /* (i) Q15    : impulse response                       */

-		Word16 y[],                           /* (o) 12 bits: output vector                          */

-		Word16 L                              /* (i)     : vector size                               */

-	     );

-

-void Convolve_asm(

-		Word16 x[],                           /* (i)     : input vector                              */

-		Word16 h[],                           /* (i) Q15    : impulse response                       */

-		Word16 y[],                           /* (o) 12 bits: output vector                          */

-		Word16 L                              /* (i)     : vector size                               */

-	     );

-

-void Residu(

-		Word16 a[],                           /* (i) Q12 : prediction coefficients                     */

-		Word16 x[],                           /* (i)     : speech (values x[-m..-1] are needed         */

-		Word16 y[],                           /* (o)     : residual signal                             */

-		Word16 lg                             /* (i)     : size of filtering                           */

-		);

-

-void Residu_opt(

-		Word16 a[],                           /* (i) Q12 : prediction coefficients                     */

-		Word16 x[],                           /* (i)     : speech (values x[-m..-1] are needed         */

-		Word16 y[],                           /* (o)     : residual signal                             */

-		Word16 lg                             /* (i)     : size of filtering                           */

-		);

-

-void Syn_filt(

-	Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients           */

-	Word16 x[],                           /* (i)     : input signal                             */

-	Word16 y[],                           /* (o)     : output signal                            */

-	Word16 lg,                            /* (i)     : size of filtering                        */

-	Word16 mem[],                         /* (i/o)   : memory associated with this filtering.   */

-	Word16 update                         /* (i)     : 0=no update, 1=update of memory.         */

-	);

-

-void Syn_filt_asm(

-	Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients           */

-	Word16 x[],                           /* (i)     : input signal                             */

-	Word16 y[],                           /* (o)     : output signal                            */

-	Word16 mem[]                          /* (i/o)   : memory associated with this filtering.   */

-	);

-

-void Syn_filt_32(

-	Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients */

-	Word16 m,                             /* (i)     : order of LP filter             */

-	Word16 exc[],                         /* (i) Qnew: excitation (exc[i] >> Qnew)    */

-	Word16 Qnew,                          /* (i)     : exc scaling = 0(min) to 8(max) */

-	Word16 sig_hi[],                      /* (o) /16 : synthesis high                 */

-	Word16 sig_lo[],                      /* (o) /16 : synthesis low                  */

-	Word16 lg                             /* (i)     : size of filtering              */

-	);

-

-void Syn_filt_32_asm(

-	Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients */

-	Word16 m,                             /* (i)     : order of LP filter             */

-	Word16 exc[],                         /* (i) Qnew: excitation (exc[i] >> Qnew)    */

-	Word16 Qnew,                          /* (i)     : exc scaling = 0(min) to 8(max) */

-	Word16 sig_hi[],                      /* (o) /16 : synthesis high                 */

-	Word16 sig_lo[],                      /* (o) /16 : synthesis low                  */

-	Word16 lg                             /* (i)     : size of filtering              */

-	);

-/*-----------------------------------------------------------------*

- *                       pitch prototypes                          *

- *-----------------------------------------------------------------*/

-

-Word16 Pitch_ol(                           /* output: open loop pitch lag                        */

-     Word16 signal[],                      /* input : signal used to compute the open loop pitch */

-/* signal[-pit_max] to signal[-1] should be known */

-     Word16 pit_min,                       /* input : minimum pitch lag                          */

-     Word16 pit_max,                       /* input : maximum pitch lag                          */

-     Word16 L_frame                        /* input : length of frame to compute pitch           */

-);

-

-Word16 Pitch_med_ol(                       /* output: open loop pitch lag                        */

-     Word16 wsp[],                         /* input : signal used to compute the open loop pitch */

-                                           /* wsp[-pit_max] to wsp[-1] should be known   */

-     Coder_State *st,                      /* i/o : global codec structure */

-     Word16 L_frame                        /* input : length of frame to compute pitch           */

-);

-

-Word16 Med_olag(                           /* output : median of  5 previous open-loop lags       */

-     Word16 prev_ol_lag,                   /* input  : previous open-loop lag                     */

-     Word16 old_ol_lag[5]

-);

-

-void Init_Hp_wsp(Word16 mem[]);

-void scale_mem_Hp_wsp(Word16 mem[], Word16 exp);

-void Hp_wsp(

-     Word16 wsp[],                         /* i   : wsp[]  signal       */

-     Word16 hp_wsp[],                      /* o   : hypass wsp[]        */

-     Word16 lg,                            /* i   : lenght of signal    */

-     Word16 mem[]                          /* i/o : filter memory [9]   */

-);

-

-Word16 Pitch_fr4(                          /* (o)     : pitch period.                         */

-     Word16 exc[],                         /* (i)     : excitation buffer                     */

-     Word16 xn[],                          /* (i)     : target vector                         */

-     Word16 h[],                           /* (i) Q15 : impulse response of synth/wgt filters */

-     Word16 t0_min,                        /* (i)     : minimum value in the searched range.  */

-     Word16 t0_max,                        /* (i)     : maximum value in the searched range.  */

-     Word16 * pit_frac,                    /* (o)     : chosen fraction (0, 1, 2 or 3).       */

-     Word16 i_subfr,                       /* (i)     : indicator for first subframe.         */

-     Word16 t0_fr2,                        /* (i)     : minimum value for resolution 1/2      */

-     Word16 t0_fr1,                        /* (i)     : minimum value for resolution 1        */

-     Word16 L_subfr                        /* (i)     : Length of subframe                    */

-);

-void Pred_lt4(

-     Word16 exc[],                         /* in/out: excitation buffer */

-     Word16 T0,                            /* input : integer pitch lag */

-     Word16 frac,                          /* input : fraction of lag   */

-     Word16 L_subfr                        /* input : subframe size     */

-);

-

-void pred_lt4_asm(

-     Word16 exc[],                         /* in/out: excitation buffer */

-     Word16 T0,                            /* input : integer pitch lag */

-     Word16 frac,                          /* input : fraction of lag   */

-     Word16 L_subfr                        /* input : subframe size     */

-);

-

-/*-----------------------------------------------------------------*

- *                       gain prototypes                           *

- *-----------------------------------------------------------------*/

-

-Word16 G_pitch(                            /* (o) Q14 : Gain of pitch lag saturated to 1.2   */

-     Word16 xn[],                          /* (i)     : Pitch target.                        */

-     Word16 y1[],                          /* (i)     : filtered adaptive codebook.          */

-     Word16 g_coeff[],                     /* : Correlations need for gain quantization. */

-     Word16 L_subfr                        /* : Length of subframe.                  */

-);

-void Init_Q_gain2(

-     Word16 * mem                          /* output  :static memory (2 words)      */

-);

-Word16 Q_gain2(                            /* Return index of quantization.        */

-     Word16 xn[],                          /* (i) Q_xn:Target vector.               */

-     Word16 y1[],                          /* (i) Q_xn:Adaptive codebook.           */

-     Word16 Q_xn,                          /* (i)     :xn and y1 format             */

-     Word16 y2[],                          /* (i) Q9  :Filtered innovative vector.  */

-     Word16 code[],                        /* (i) Q9  :Innovative vector.           */

-     Word16 g_coeff[],                     /* (i)     :Correlations <xn y1> <y1 y1> */

-/* Compute in G_pitch().        */

-     Word16 L_subfr,                       /* (i)     :Subframe lenght.             */

-     Word16 nbits,                         /* (i)     : number of bits (6 or 7)     */

-     Word16 * gain_pit,                    /* (i/o)Q14:Pitch gain.                  */

-     Word32 * gain_cod,                    /* (o) Q16 :Code gain.                   */

-     Word16 gp_clip,                       /* (i)     : Gp Clipping flag            */

-     Word16 * mem                          /* (i/o)   :static memory (2 words)      */

-);

-

-void Init_D_gain2(

-     Word16 * mem                          /* output  :static memory (4 words)      */

-);

-void D_gain2(

-     Word16 index,                         /* (i)     :index of quantization.       */

-     Word16 nbits,                         /* (i)     : number of bits (6 or 7)     */

-     Word16 code[],                        /* (i) Q9  :Innovative vector.           */

-     Word16 L_subfr,                       /* (i)     :Subframe lenght.             */

-     Word16 * gain_pit,                    /* (o) Q14 :Pitch gain.                  */

-     Word32 * gain_cod,                    /* (o) Q16 :Code gain.                   */

-     Word16 bfi,                           /* (i)     :bad frame indicator          */

-     Word16 prev_bfi,                      /* (i) : Previous BF indicator      */

-     Word16 state,                         /* (i) : State of BFH               */

-     Word16 unusable_frame,                /* (i) : UF indicator            */

-     Word16 vad_hist,                      /* (i)         :number of non-speech frames  */

-     Word16 * mem                          /* (i/o)   :static memory (4 words)      */

-);

-

-/*-----------------------------------------------------------------*

- *                       acelp prototypes                          *

- *-----------------------------------------------------------------*/

-

-void cor_h_x(

-     Word16 h[],                           /* (i) Q12 : impulse response of weighted synthesis filter */

-     Word16 x[],                           /* (i) Q0  : target vector                                 */

-     Word16 dn[]                           /* (o) <12bit : correlation between target and h[]         */

-);

-void ACELP_2t64_fx(

-     Word16 dn[],                          /* (i) <12b : correlation between target x[] and H[]      */

-     Word16 cn[],                          /* (i) <12b : residual after long term prediction         */

-     Word16 H[],                           /* (i) Q12: impulse response of weighted synthesis filter */

-     Word16 code[],                        /* (o) Q9 : algebraic (fixed) codebook excitation         */

-     Word16 y[],                           /* (o) Q9 : filtered fixed codebook excitation            */

-     Word16 * index                        /* (o) : index (12): 5+1+5+1 = 11 bits.                     */

-);

-

-void ACELP_4t64_fx(

-     Word16 dn[],                          /* (i) <12b : correlation between target x[] and H[]      */

-     Word16 cn[],                          /* (i) <12b : residual after long term prediction         */

-     Word16 H[],                           /* (i) Q12: impulse response of weighted synthesis filter */

-     Word16 code[],                        /* (o) Q9 : algebraic (fixed) codebook excitation         */

-     Word16 y[],                           /* (o) Q9 : filtered fixed codebook excitation            */

-     Word16 nbbits,                        /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits                */

-     Word16 ser_size,                      /* (i) : bit rate                                         */

-     Word16 _index[]                       /* (o) : index (20): 5+5+5+5 = 20 bits.                   */

-					   /* (o) : index (36): 9+9+9+9 = 36 bits.                   */

-					   /* (o) : index (44): 13+9+13+9 = 44 bits.                 */

-					   /* (o) : index (52): 13+13+13+13 = 52 bits.               */

-					   /* (o) : index (64): 2+2+2+2+14+14+14+14 = 64 bits.       */

-					   /* (o) : index (72): 10+2+10+2+10+14+10+14 = 72 bits.     */

-					   /* (o) : index (88): 11+11+11+11+11+11+11+11 = 88 bits.   */

-);

-

-void Pit_shrp(

-     Word16 * x,                           /* in/out: impulse response (or algebraic code) */

-     Word16 pit_lag,                       /* input : pitch lag                            */

-     Word16 sharp,                         /* input : pitch sharpening factor (Q15)        */

-     Word16 L_subfr                        /* input : subframe size                        */

-);

-

-

-/*-----------------------------------------------------------------*

- *                        others prototypes                        *

- *-----------------------------------------------------------------*/

-

-void Copy(

-     Word16 x[],                           /* (i)   : input vector   */

-     Word16 y[],                           /* (o)   : output vector  */

-     Word16 L                              /* (i)   : vector length  */

-);

-void Set_zero(

-     Word16 x[],                           /* (o)    : vector to clear     */

-     Word16 L                              /* (i)    : length of vector    */

-);

-void Updt_tar(

-     Word16 * x,                           /* (i) Q0  : old target (for pitch search)     */

-     Word16 * x2,                          /* (o) Q0  : new target (for codebook search)  */

-     Word16 * y,                           /* (i) Q0  : filtered adaptive codebook vector */

-     Word16 gain,                          /* (i) Q14 : adaptive codebook gain            */

-     Word16 L                              /* (i)     : subframe size                     */

-);

-Word16 voice_factor(                       /* (o) Q15 : factor (-1=unvoiced to 1=voiced) */

-     Word16 exc[],                         /* (i) Q_exc: pitch excitation                */

-     Word16 Q_exc,                         /* (i)     : exc format                       */

-     Word16 gain_pit,                      /* (i) Q14 : gain of pitch                    */

-     Word16 code[],                        /* (i) Q9  : Fixed codebook excitation        */

-     Word16 gain_code,                     /* (i) Q0  : gain of code                     */

-     Word16 L_subfr                        /* (i)     : subframe length                  */

-);

-void Scale_sig(

-     Word16 x[],                           /* (i/o) : signal to scale               */

-     Word16 lg,                            /* (i)   : size of x[]                   */

-     Word16 exp                            /* (i)   : exponent: x = round(x << exp) */

-);

-

-void Scale_sig_opt(

-     Word16 x[],                           /* (i/o) : signal to scale               */

-     Word16 lg,                            /* (i)   : size of x[]                   */

-     Word16 exp                            /* (i)   : exponent: x = round(x << exp) */

-);

-

-Word16 Random(Word16 * seed);

-

-void Init_gp_clip(

-     Word16 mem[]                          /* (o) : memory of gain of pitch clipping algorithm */

-);

-Word16 Gp_clip(

-     Word16 mem[]                          /* (i/o) : memory of gain of pitch clipping algorithm */

-);

-void Gp_clip_test_isf(

-     Word16 isf[],                         /* (i)   : isf values (in frequency domain)           */

-     Word16 mem[]                          /* (i/o) : memory of gain of pitch clipping algorithm */

-);

-void Gp_clip_test_gain_pit(

-     Word16 gain_pit,                      /* (i)   : gain of quantized pitch                    */

-     Word16 mem[]                          /* (i/o) : memory of gain of pitch clipping algorithm */

-);

-

-

-#endif   //__ACELP_H__

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*--------------------------------------------------------------------------*
+ *                         ACELP.H                                          *
+ *--------------------------------------------------------------------------*
+ *       Function			 			             *
+ *--------------------------------------------------------------------------*/
+#ifndef __ACELP_H__
+#define __ACELP_H__
+
+#include "typedef.h"
+#include "cod_main.h"
+
+/*-----------------------------------------------------------------*
+ *                        LPC prototypes                           *
+ *-----------------------------------------------------------------*/
+
+Word16 median5(Word16 x[]);
+
+void Autocorr(
+		Word16 x[],                           /* (i)    : Input signal                      */
+		Word16 m,                             /* (i)    : LPC order                         */
+		Word16 r_h[],                         /* (o)    : Autocorrelations  (msb)           */
+		Word16 r_l[]                          /* (o)    : Autocorrelations  (lsb)           */
+	     );
+
+void Lag_window(
+		Word16 r_h[],                         /* (i/o)   : Autocorrelations  (msb)          */
+		Word16 r_l[]                          /* (i/o)   : Autocorrelations  (lsb)          */
+	       );
+
+void Init_Levinson(
+		Word16 * mem                          /* output  :static memory (18 words) */
+		);
+
+void Levinson(
+		Word16 Rh[],                          /* (i)     : Rh[M+1] Vector of autocorrelations (msb) */
+		Word16 Rl[],                          /* (i)     : Rl[M+1] Vector of autocorrelations (lsb) */
+		Word16 A[],                           /* (o) Q12 : A[M]    LPC coefficients  (m = 16)       */
+		Word16 rc[],                          /* (o) Q15 : rc[M]   Reflection coefficients.         */
+		Word16 * mem                          /* (i/o)   :static memory (18 words)                  */
+	     );
+
+void Az_isp(
+		Word16 a[],                           /* (i) Q12 : predictor coefficients                 */
+		Word16 isp[],                         /* (o) Q15 : Immittance spectral pairs              */
+		Word16 old_isp[]                      /* (i)     : old isp[] (in case not found M roots)  */
+	   );
+
+void Isp_Az(
+		Word16 isp[],                         /* (i) Q15 : Immittance spectral pairs            */
+		Word16 a[],                           /* (o) Q12 : predictor coefficients (order = M)   */
+		Word16 m,
+		Word16 adaptive_scaling               /* (i) 0   : adaptive scaling disabled */
+		/*     1   : adaptive scaling enabled  */
+	   );
+
+void Isp_isf(
+		Word16 isp[],                         /* (i) Q15 : isp[m] (range: -1<=val<1)                */
+		Word16 isf[],                         /* (o) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
+		Word16 m                              /* (i)     : LPC order                                */
+	    );
+
+void Isf_isp(
+		Word16 isf[],                         /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
+		Word16 isp[],                         /* (o) Q15 : isp[m] (range: -1<=val<1)                */
+		Word16 m                              /* (i)     : LPC order                                */
+	    );
+
+void Int_isp(
+		Word16 isp_old[],                     /* input : isps from past frame              */
+		Word16 isp_new[],                     /* input : isps from present frame           */
+		Word16 frac[],                        /* input : fraction for 3 first subfr (Q15)  */
+		Word16 Az[]                           /* output: LP coefficients in 4 subframes    */
+	    );
+
+void Weight_a(
+		Word16 a[],                           /* (i) Q12 : a[m+1]  LPC coefficients             */
+		Word16 ap[],                          /* (o) Q12 : Spectral expanded LPC coefficients   */
+		Word16 gamma,                         /* (i) Q15 : Spectral expansion factor.           */
+		Word16 m                              /* (i)     : LPC order.                           */
+	     );
+
+
+/*-----------------------------------------------------------------*
+ *                        isf quantizers                           *
+ *-----------------------------------------------------------------*/
+
+void Qpisf_2s_46b(
+		Word16 * isf1,                        /* (i) Q15 : ISF in the frequency domain (0..0.5) */
+		Word16 * isf_q,                       /* (o) Q15 : quantized ISF               (0..0.5) */
+		Word16 * past_isfq,                   /* (io)Q15 : past ISF quantizer                   */
+		Word16 * indice,                      /* (o)     : quantization indices                 */
+		Word16 nb_surv                        /* (i)     : number of survivor (1, 2, 3 or 4)    */
+		);
+
+void Qpisf_2s_36b(
+		Word16 * isf1,                        /* (i) Q15 : ISF in the frequency domain (0..0.5) */
+		Word16 * isf_q,                       /* (o) Q15 : quantized ISF               (0..0.5) */
+		Word16 * past_isfq,                   /* (io)Q15 : past ISF quantizer                   */
+		Word16 * indice,                      /* (o)     : quantization indices                 */
+		Word16 nb_surv                        /* (i)     : number of survivor (1, 2, 3 or 4)    */
+		);
+
+void Dpisf_2s_46b(
+		Word16 * indice,                      /* input:  quantization indices                       */
+		Word16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */
+		Word16 * past_isfq,                   /* i/0   : past ISF quantizer                    */
+		Word16 * isfold,                      /* input : past quantized ISF                    */
+		Word16 * isf_buf,                     /* input : isf buffer                                                        */
+		Word16 bfi,                           /* input : Bad frame indicator                   */
+		Word16 enc_dec
+		);
+
+void Dpisf_2s_36b(
+		Word16 * indice,                      /* input:  quantization indices                       */
+		Word16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */
+		Word16 * past_isfq,                   /* i/0   : past ISF quantizer                    */
+		Word16 * isfold,                      /* input : past quantized ISF                    */
+		Word16 * isf_buf,                     /* input : isf buffer                                                        */
+		Word16 bfi,                           /* input : Bad frame indicator                   */
+		Word16 enc_dec
+		);
+
+void Qisf_ns(
+		Word16 * isf1,                        /* input : ISF in the frequency domain (0..0.5) */
+		Word16 * isf_q,                       /* output: quantized ISF                        */
+		Word16 * indice                       /* output: quantization indices                 */
+	    );
+
+void Disf_ns(
+		Word16 * indice,                      /* input:  quantization indices                  */
+		Word16 * isf_q                        /* input : ISF in the frequency domain (0..0.5)  */
+	    );
+
+Word16 Sub_VQ(                             /* output: return quantization index     */
+		Word16 * x,                           /* input : ISF residual vector           */
+		Word16 * dico,                        /* input : quantization codebook         */
+		Word16 dim,                           /* input : dimention of vector           */
+		Word16 dico_size,                     /* input : size of quantization codebook */
+		Word32 * distance                     /* output: error of quantization         */
+	     );
+
+void Reorder_isf(
+		Word16 * isf,                         /* (i/o) Q15: ISF in the frequency domain (0..0.5) */
+		Word16 min_dist,                      /* (i) Q15  : minimum distance to keep             */
+		Word16 n                              /* (i)      : number of ISF                        */
+		);
+
+/*-----------------------------------------------------------------*
+ *                       filter prototypes                         *
+ *-----------------------------------------------------------------*/
+
+void Init_Decim_12k8(
+		Word16 mem[]                          /* output: memory (2*NB_COEF_DOWN) set to zeros */
+		);
+void Decim_12k8(
+		Word16 sig16k[],                      /* input:  signal to downsampling  */
+		Word16 lg,                            /* input:  length of input         */
+		Word16 sig12k8[],                     /* output: decimated signal        */
+		Word16 mem[]                          /* in/out: memory (2*NB_COEF_DOWN) */
+	       );
+
+void Init_HP50_12k8(Word16 mem[]);
+void HP50_12k8(
+		Word16 signal[],                      /* input/output signal */
+		Word16 lg,                            /* lenght of signal    */
+		Word16 mem[]                          /* filter memory [6]   */
+	      );
+void Init_HP400_12k8(Word16 mem[]);
+void HP400_12k8(
+		Word16 signal[],                      /* input/output signal */
+		Word16 lg,                            /* lenght of signal    */
+		Word16 mem[]                          /* filter memory [6]   */
+	       );
+
+void Init_Filt_6k_7k(Word16 mem[]);
+void Filt_6k_7k(
+		Word16 signal[],                      /* input:  signal                  */
+		Word16 lg,                            /* input:  length of input         */
+		Word16 mem[]                          /* in/out: memory (size=30)        */
+	       );
+void Filt_6k_7k_asm(
+		Word16 signal[],                      /* input:  signal                  */
+		Word16 lg,                            /* input:  length of input         */
+		Word16 mem[]                          /* in/out: memory (size=30)        */
+	       );
+
+void LP_Decim2(
+		Word16 x[],                           /* in/out: signal to process         */
+		Word16 l,                             /* input : size of filtering         */
+		Word16 mem[]                          /* in/out: memory (size=3)           */
+	      );
+
+void Preemph(
+		Word16 x[],                           /* (i/o)   : input signal overwritten by the output */
+		Word16 mu,                            /* (i) Q15 : preemphasis coefficient                */
+		Word16 lg,                            /* (i)     : lenght of filtering                    */
+		Word16 * mem                          /* (i/o)   : memory (x[-1])                         */
+	    );
+void Preemph2(
+		Word16 x[],                           /* (i/o)   : input signal overwritten by the output */
+		Word16 mu,                            /* (i) Q15 : preemphasis coefficient                */
+		Word16 lg,                            /* (i)     : lenght of filtering                    */
+		Word16 * mem                          /* (i/o)   : memory (x[-1])                         */
+	     );
+void Deemph(
+		Word16 x[],                           /* (i/o)   : input signal overwritten by the output */
+		Word16 mu,                            /* (i) Q15 : deemphasis factor                      */
+		Word16 L,                             /* (i)     : vector size                            */
+		Word16 * mem                          /* (i/o)   : memory (y[-1])                         */
+	   );
+void Deemph2(
+		Word16 x[],                           /* (i/o)   : input signal overwritten by the output */
+		Word16 mu,                            /* (i) Q15 : deemphasis factor                      */
+		Word16 L,                             /* (i)     : vector size                            */
+		Word16 * mem                          /* (i/o)   : memory (y[-1])                         */
+	    );
+void Deemph_32(
+		Word16 x_hi[],                        /* (i)     : input signal (bit31..16) */
+		Word16 x_lo[],                        /* (i)     : input signal (bit15..4)  */
+		Word16 y[],                           /* (o)     : output signal (x16)      */
+		Word16 mu,                            /* (i) Q15 : deemphasis factor        */
+		Word16 L,                             /* (i)     : vector size              */
+		Word16 * mem                          /* (i/o)   : memory (y[-1])           */
+	      );
+
+void Deemph_32_asm(
+		Word16 x_hi[],                        /* (i)     : input signal (bit31..16) */
+		Word16 x_lo[],                        /* (i)     : input signal (bit15..4)  */
+		Word16 y[],                           /* (o)     : output signal (x16)      */
+		Word16 * mem                          /* (i/o)   : memory (y[-1])           */
+	      );
+
+void Convolve(
+		Word16 x[],                           /* (i)     : input vector                              */
+		Word16 h[],                           /* (i) Q15    : impulse response                       */
+		Word16 y[],                           /* (o) 12 bits: output vector                          */
+		Word16 L                              /* (i)     : vector size                               */
+	     );
+
+void Convolve_asm(
+		Word16 x[],                           /* (i)     : input vector                              */
+		Word16 h[],                           /* (i) Q15    : impulse response                       */
+		Word16 y[],                           /* (o) 12 bits: output vector                          */
+		Word16 L                              /* (i)     : vector size                               */
+	     );
+
+void Residu(
+		Word16 a[],                           /* (i) Q12 : prediction coefficients                     */
+		Word16 x[],                           /* (i)     : speech (values x[-m..-1] are needed         */
+		Word16 y[],                           /* (o)     : residual signal                             */
+		Word16 lg                             /* (i)     : size of filtering                           */
+		);
+
+void Residu_opt(
+		Word16 a[],                           /* (i) Q12 : prediction coefficients                     */
+		Word16 x[],                           /* (i)     : speech (values x[-m..-1] are needed         */
+		Word16 y[],                           /* (o)     : residual signal                             */
+		Word16 lg                             /* (i)     : size of filtering                           */
+		);
+
+void Syn_filt(
+	Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients           */
+	Word16 x[],                           /* (i)     : input signal                             */
+	Word16 y[],                           /* (o)     : output signal                            */
+	Word16 lg,                            /* (i)     : size of filtering                        */
+	Word16 mem[],                         /* (i/o)   : memory associated with this filtering.   */
+	Word16 update                         /* (i)     : 0=no update, 1=update of memory.         */
+	);
+
+void Syn_filt_asm(
+	Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients           */
+	Word16 x[],                           /* (i)     : input signal                             */
+	Word16 y[],                           /* (o)     : output signal                            */
+	Word16 mem[]                          /* (i/o)   : memory associated with this filtering.   */
+	);
+
+void Syn_filt_32(
+	Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients */
+	Word16 m,                             /* (i)     : order of LP filter             */
+	Word16 exc[],                         /* (i) Qnew: excitation (exc[i] >> Qnew)    */
+	Word16 Qnew,                          /* (i)     : exc scaling = 0(min) to 8(max) */
+	Word16 sig_hi[],                      /* (o) /16 : synthesis high                 */
+	Word16 sig_lo[],                      /* (o) /16 : synthesis low                  */
+	Word16 lg                             /* (i)     : size of filtering              */
+	);
+
+void Syn_filt_32_asm(
+	Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients */
+	Word16 m,                             /* (i)     : order of LP filter             */
+	Word16 exc[],                         /* (i) Qnew: excitation (exc[i] >> Qnew)    */
+	Word16 Qnew,                          /* (i)     : exc scaling = 0(min) to 8(max) */
+	Word16 sig_hi[],                      /* (o) /16 : synthesis high                 */
+	Word16 sig_lo[],                      /* (o) /16 : synthesis low                  */
+	Word16 lg                             /* (i)     : size of filtering              */
+	);
+/*-----------------------------------------------------------------*
+ *                       pitch prototypes                          *
+ *-----------------------------------------------------------------*/
+
+Word16 Pitch_ol(                           /* output: open loop pitch lag                        */
+     Word16 signal[],                      /* input : signal used to compute the open loop pitch */
+/* signal[-pit_max] to signal[-1] should be known */
+     Word16 pit_min,                       /* input : minimum pitch lag                          */
+     Word16 pit_max,                       /* input : maximum pitch lag                          */
+     Word16 L_frame                        /* input : length of frame to compute pitch           */
+);
+
+Word16 Pitch_med_ol(                       /* output: open loop pitch lag                        */
+     Word16 wsp[],                         /* input : signal used to compute the open loop pitch */
+                                           /* wsp[-pit_max] to wsp[-1] should be known   */
+     Coder_State *st,                      /* i/o : global codec structure */
+     Word16 L_frame                        /* input : length of frame to compute pitch           */
+);
+
+Word16 Med_olag(                           /* output : median of  5 previous open-loop lags       */
+     Word16 prev_ol_lag,                   /* input  : previous open-loop lag                     */
+     Word16 old_ol_lag[5]
+);
+
+void Init_Hp_wsp(Word16 mem[]);
+void scale_mem_Hp_wsp(Word16 mem[], Word16 exp);
+void Hp_wsp(
+     Word16 wsp[],                         /* i   : wsp[]  signal       */
+     Word16 hp_wsp[],                      /* o   : hypass wsp[]        */
+     Word16 lg,                            /* i   : lenght of signal    */
+     Word16 mem[]                          /* i/o : filter memory [9]   */
+);
+
+Word16 Pitch_fr4(                          /* (o)     : pitch period.                         */
+     Word16 exc[],                         /* (i)     : excitation buffer                     */
+     Word16 xn[],                          /* (i)     : target vector                         */
+     Word16 h[],                           /* (i) Q15 : impulse response of synth/wgt filters */
+     Word16 t0_min,                        /* (i)     : minimum value in the searched range.  */
+     Word16 t0_max,                        /* (i)     : maximum value in the searched range.  */
+     Word16 * pit_frac,                    /* (o)     : chosen fraction (0, 1, 2 or 3).       */
+     Word16 i_subfr,                       /* (i)     : indicator for first subframe.         */
+     Word16 t0_fr2,                        /* (i)     : minimum value for resolution 1/2      */
+     Word16 t0_fr1,                        /* (i)     : minimum value for resolution 1        */
+     Word16 L_subfr                        /* (i)     : Length of subframe                    */
+);
+void Pred_lt4(
+     Word16 exc[],                         /* in/out: excitation buffer */
+     Word16 T0,                            /* input : integer pitch lag */
+     Word16 frac,                          /* input : fraction of lag   */
+     Word16 L_subfr                        /* input : subframe size     */
+);
+
+void pred_lt4_asm(
+     Word16 exc[],                         /* in/out: excitation buffer */
+     Word16 T0,                            /* input : integer pitch lag */
+     Word16 frac,                          /* input : fraction of lag   */
+     Word16 L_subfr                        /* input : subframe size     */
+);
+
+/*-----------------------------------------------------------------*
+ *                       gain prototypes                           *
+ *-----------------------------------------------------------------*/
+
+Word16 G_pitch(                            /* (o) Q14 : Gain of pitch lag saturated to 1.2   */
+     Word16 xn[],                          /* (i)     : Pitch target.                        */
+     Word16 y1[],                          /* (i)     : filtered adaptive codebook.          */
+     Word16 g_coeff[],                     /* : Correlations need for gain quantization. */
+     Word16 L_subfr                        /* : Length of subframe.                  */
+);
+void Init_Q_gain2(
+     Word16 * mem                          /* output  :static memory (2 words)      */
+);
+Word16 Q_gain2(                            /* Return index of quantization.        */
+     Word16 xn[],                          /* (i) Q_xn:Target vector.               */
+     Word16 y1[],                          /* (i) Q_xn:Adaptive codebook.           */
+     Word16 Q_xn,                          /* (i)     :xn and y1 format             */
+     Word16 y2[],                          /* (i) Q9  :Filtered innovative vector.  */
+     Word16 code[],                        /* (i) Q9  :Innovative vector.           */
+     Word16 g_coeff[],                     /* (i)     :Correlations <xn y1> <y1 y1> */
+/* Compute in G_pitch().        */
+     Word16 L_subfr,                       /* (i)     :Subframe lenght.             */
+     Word16 nbits,                         /* (i)     : number of bits (6 or 7)     */
+     Word16 * gain_pit,                    /* (i/o)Q14:Pitch gain.                  */
+     Word32 * gain_cod,                    /* (o) Q16 :Code gain.                   */
+     Word16 gp_clip,                       /* (i)     : Gp Clipping flag            */
+     Word16 * mem                          /* (i/o)   :static memory (2 words)      */
+);
+
+void Init_D_gain2(
+     Word16 * mem                          /* output  :static memory (4 words)      */
+);
+void D_gain2(
+     Word16 index,                         /* (i)     :index of quantization.       */
+     Word16 nbits,                         /* (i)     : number of bits (6 or 7)     */
+     Word16 code[],                        /* (i) Q9  :Innovative vector.           */
+     Word16 L_subfr,                       /* (i)     :Subframe lenght.             */
+     Word16 * gain_pit,                    /* (o) Q14 :Pitch gain.                  */
+     Word32 * gain_cod,                    /* (o) Q16 :Code gain.                   */
+     Word16 bfi,                           /* (i)     :bad frame indicator          */
+     Word16 prev_bfi,                      /* (i) : Previous BF indicator      */
+     Word16 state,                         /* (i) : State of BFH               */
+     Word16 unusable_frame,                /* (i) : UF indicator            */
+     Word16 vad_hist,                      /* (i)         :number of non-speech frames  */
+     Word16 * mem                          /* (i/o)   :static memory (4 words)      */
+);
+
+/*-----------------------------------------------------------------*
+ *                       acelp prototypes                          *
+ *-----------------------------------------------------------------*/
+
+void cor_h_x(
+     Word16 h[],                           /* (i) Q12 : impulse response of weighted synthesis filter */
+     Word16 x[],                           /* (i) Q0  : target vector                                 */
+     Word16 dn[]                           /* (o) <12bit : correlation between target and h[]         */
+);
+void ACELP_2t64_fx(
+     Word16 dn[],                          /* (i) <12b : correlation between target x[] and H[]      */
+     Word16 cn[],                          /* (i) <12b : residual after long term prediction         */
+     Word16 H[],                           /* (i) Q12: impulse response of weighted synthesis filter */
+     Word16 code[],                        /* (o) Q9 : algebraic (fixed) codebook excitation         */
+     Word16 y[],                           /* (o) Q9 : filtered fixed codebook excitation            */
+     Word16 * index                        /* (o) : index (12): 5+1+5+1 = 11 bits.                     */
+);
+
+void ACELP_4t64_fx(
+     Word16 dn[],                          /* (i) <12b : correlation between target x[] and H[]      */
+     Word16 cn[],                          /* (i) <12b : residual after long term prediction         */
+     Word16 H[],                           /* (i) Q12: impulse response of weighted synthesis filter */
+     Word16 code[],                        /* (o) Q9 : algebraic (fixed) codebook excitation         */
+     Word16 y[],                           /* (o) Q9 : filtered fixed codebook excitation            */
+     Word16 nbbits,                        /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits                */
+     Word16 ser_size,                      /* (i) : bit rate                                         */
+     Word16 _index[]                       /* (o) : index (20): 5+5+5+5 = 20 bits.                   */
+					   /* (o) : index (36): 9+9+9+9 = 36 bits.                   */
+					   /* (o) : index (44): 13+9+13+9 = 44 bits.                 */
+					   /* (o) : index (52): 13+13+13+13 = 52 bits.               */
+					   /* (o) : index (64): 2+2+2+2+14+14+14+14 = 64 bits.       */
+					   /* (o) : index (72): 10+2+10+2+10+14+10+14 = 72 bits.     */
+					   /* (o) : index (88): 11+11+11+11+11+11+11+11 = 88 bits.   */
+);
+
+void Pit_shrp(
+     Word16 * x,                           /* in/out: impulse response (or algebraic code) */
+     Word16 pit_lag,                       /* input : pitch lag                            */
+     Word16 sharp,                         /* input : pitch sharpening factor (Q15)        */
+     Word16 L_subfr                        /* input : subframe size                        */
+);
+
+
+/*-----------------------------------------------------------------*
+ *                        others prototypes                        *
+ *-----------------------------------------------------------------*/
+
+void Copy(
+     Word16 x[],                           /* (i)   : input vector   */
+     Word16 y[],                           /* (o)   : output vector  */
+     Word16 L                              /* (i)   : vector length  */
+);
+void Set_zero(
+     Word16 x[],                           /* (o)    : vector to clear     */
+     Word16 L                              /* (i)    : length of vector    */
+);
+void Updt_tar(
+     Word16 * x,                           /* (i) Q0  : old target (for pitch search)     */
+     Word16 * x2,                          /* (o) Q0  : new target (for codebook search)  */
+     Word16 * y,                           /* (i) Q0  : filtered adaptive codebook vector */
+     Word16 gain,                          /* (i) Q14 : adaptive codebook gain            */
+     Word16 L                              /* (i)     : subframe size                     */
+);
+Word16 voice_factor(                       /* (o) Q15 : factor (-1=unvoiced to 1=voiced) */
+     Word16 exc[],                         /* (i) Q_exc: pitch excitation                */
+     Word16 Q_exc,                         /* (i)     : exc format                       */
+     Word16 gain_pit,                      /* (i) Q14 : gain of pitch                    */
+     Word16 code[],                        /* (i) Q9  : Fixed codebook excitation        */
+     Word16 gain_code,                     /* (i) Q0  : gain of code                     */
+     Word16 L_subfr                        /* (i)     : subframe length                  */
+);
+void Scale_sig(
+     Word16 x[],                           /* (i/o) : signal to scale               */
+     Word16 lg,                            /* (i)   : size of x[]                   */
+     Word16 exp                            /* (i)   : exponent: x = round(x << exp) */
+);
+
+void Scale_sig_opt(
+     Word16 x[],                           /* (i/o) : signal to scale               */
+     Word16 lg,                            /* (i)   : size of x[]                   */
+     Word16 exp                            /* (i)   : exponent: x = round(x << exp) */
+);
+
+Word16 Random(Word16 * seed);
+
+void Init_gp_clip(
+     Word16 mem[]                          /* (o) : memory of gain of pitch clipping algorithm */
+);
+Word16 Gp_clip(
+     Word16 mem[]                          /* (i/o) : memory of gain of pitch clipping algorithm */
+);
+void Gp_clip_test_isf(
+     Word16 isf[],                         /* (i)   : isf values (in frequency domain)           */
+     Word16 mem[]                          /* (i/o) : memory of gain of pitch clipping algorithm */
+);
+void Gp_clip_test_gain_pit(
+     Word16 gain_pit,                      /* (i)   : gain of quantized pitch                    */
+     Word16 mem[]                          /* (i/o) : memory of gain of pitch clipping algorithm */
+);
+
+
+#endif   //__ACELP_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/basic_op.h b/media/libstagefright/codecs/amrwbenc/inc/basic_op.h
index 6a2f860..7734913 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/basic_op.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/basic_op.h
@@ -1,1094 +1,1094 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-#ifndef __BASIC_OP_H__

-#define __BASIC_OP_H__

-

-#include <stdio.h>

-#include <stdlib.h>

-#include "typedef.h"

-

-#define MAX_32 (Word32)0x7fffffffL

-#define MIN_32 (Word32)0x80000000L

-

-#define MAX_16 (Word16)+32767	/* 0x7fff */

-#define MIN_16 (Word16)-32768	/* 0x8000 */

-

-

-#ifdef LINUX

-#define  static_vo  static __inline__

-#else

-#define  static_vo  static __inline

-#endif 

-

-#define saturate(L_var1) (((L_var1) > 0X00007fffL) ? (MAX_16): (((L_var1) < (Word32) 0xffff8000L) ? (MIN_16): ((L_var1) & 0xffff)))

-

-#define abs_s(x)       ((Word16)(((x) != MIN_16) ? (((x) >= 0) ? (x) : (-(x))) : MAX_16))  /* Short abs,           1   */

-#define L_deposit_h(x) (((Word32)(x)) << 16)                                               /* 16 bit var1 -> MSB,     2 */

-#define L_deposit_l(x) ((Word32)(x))                                                       /* 16 bit var1 -> LSB,     2 */

-#define L_abs(x) (((x) != MIN_32) ? (((x) >= 0) ? (x) : (-(x))) : MAX_32)                  /* Long abs,              3*/

-#define negate(var1) ((Word16)(((var1) == MIN_16) ? MAX_16 : (-(var1))))                   /* Short negate,        1*/

-#define L_negate(L_var1) (((L_var1) == (MIN_32)) ? (MAX_32) : (-(L_var1)))                 /* Long negate,     2*/

-

-

-#define extract_h(a)			((Word16)(a >> 16))

-#define extract_l(x)            	(Word16)((x))

-#define add1(a,b)			(a + b)

-#define vo_L_msu(a,b,c)			( a - (( b * c ) << 1) )

-#define vo_mult32(a, b)         ((a) * (b))

-#define vo_mult(a,b)			(( a * b ) >> 15 )

-#define	vo_L_mult(a,b)	    		(((a) * (b)) << 1)

-#define vo_shr_r(var1, var2)   		((var1+((Word16)(1L<<(var2-1))))>>var2)

-#define vo_sub(a,b)			(a - b)

-#define vo_L_deposit_h(a)		((Word32)((a) << 16))

-#define vo_round(a)			((a + 0x00008000) >> 16)

-#define vo_extract_l(a)			((Word16)(a))

-#define vo_L_add(a,b)			(a + b)

-#define vo_L_sub(a,b)			(a - b)

-#define vo_mult_r(a,b)			((( a * b ) + 0x4000 ) >> 15 )

-#define vo_negate(a)		        (-a)

-#define vo_L_shr_r(L_var1, var2)        ((L_var1+((Word32)(1L<<(var2-1))))>>var2)

-

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Prototypes for basic arithmetic operators                               |

-|___________________________________________________________________________|

-*/

-static_vo Word16 add (Word16 var1, Word16 var2);				/* Short add,1 */

-static_vo Word16 sub (Word16 var1, Word16 var2);				/* Short sub,1 */

-static_vo Word16 shl (Word16 var1, Word16 var2);                                /* Short shift left,    1   */

-static_vo Word16 shr (Word16 var1, Word16 var2);                                /* Short shift right,   1   */

-static_vo Word16 mult (Word16 var1, Word16 var2);                               /* Short mult,          1   */

-static_vo Word32 L_mult (Word16 var1, Word16 var2);                             /* Long mult,           1   */

-static_vo Word16 voround (Word32 L_var1);                                       /* Round,               1   */

-static_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2);            	/* Mac,  1  */

-static_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);   		/* Msu,  1  */

-static_vo Word32 L_add (Word32 L_var1, Word32 L_var2);   		 	/* Long add,        2 */

-static_vo Word32 L_sub (Word32 L_var1, Word32 L_var2);   			/* Long sub,        2 */

-static_vo Word16 mult_r (Word16 var1, Word16 var2);      		 	/* Mult with round, 2 */

-static_vo Word32 L_shl2(Word32 L_var1, Word16 var2);             		/* var2 > 0*/

-static_vo Word32 L_shl (Word32 L_var1, Word16 var2);    	 	 	/* Long shift left, 2 */

-static_vo Word32 L_shr (Word32 L_var1, Word16 var2);    	 	 	/* Long shift right, 2*/

-static_vo Word32 L_shr_r (Word32 L_var1, Word16 var2); 				/* Long shift right with round,  3   */

-static_vo Word16 norm_s (Word16 var1);             				/* Short norm,           15  */

-static_vo Word16 div_s (Word16 var1, Word16 var2); 				/* Short division,       18  */

-static_vo Word16 norm_l (Word32 L_var1);           				/* Long norm,            30  */   

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Functions                                                               |

-|___________________________________________________________________________|

-*/

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : add                                                     |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|    Performs the addition (var1+var2) with overflow control and saturation;|

-|    the 16 bit result is set at +32767 when overflow occurs or at -32768   |

-|    when underflow occurs.                                                 |

-|                                                                           |

-|   Complexity weight : 1                                                   |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    var1                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|    var2                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    var_out                                                                |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

-|___________________________________________________________________________|

-*/

-static_vo Word16 add (Word16 var1, Word16 var2)

-{

-	Word16 var_out;

-	Word32 L_sum;

-	L_sum = (Word32) var1 + var2;

-	var_out = saturate (L_sum);

-	return (var_out);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : sub                                                     |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|    Performs the subtraction (var1+var2) with overflow control and satu-   |

-|    ration; the 16 bit result is set at +32767 when overflow occurs or at  |

-|    -32768 when underflow occurs.                                          |

-|                                                                           |

-|   Complexity weight : 1                                                   |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    var1                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|    var2                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    var_out                                                                |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

-|___________________________________________________________________________|

-*/

-

-static_vo Word16 sub (Word16 var1, Word16 var2)

-{

-	Word16 var_out;

-	Word32 L_diff;

-	L_diff = (Word32) var1 - var2;

-	var_out = saturate (L_diff);

-	return (var_out);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : shl                                                     |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|   Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill|

-|   the var2 LSB of the result. If var2 is negative, arithmetically shift   |

-|   var1 right by -var2 with sign extension. Saturate the result in case of |

-|   underflows or overflows.                                                |

-|                                                                           |

-|   Complexity weight : 1                                                   |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    var1                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|    var2                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    var_out                                                                |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

-|___________________________________________________________________________|

-*/

-

-static_vo Word16 shl (Word16 var1, Word16 var2)

-{

-	Word16 var_out;

-	Word32 result;

-	if (var2 < 0)

-	{

-		if (var2 < -16)

-			var2 = -16;

-		var_out = var1 >> ((Word16)-var2);

-	}

-	else

-	{

-		result = (Word32) var1 *((Word32) 1 << var2);

-		if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result)))

-		{

-			var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16);

-		}

-		else

-		{

-			var_out = extract_l (result);

-		}

-	}

-	return (var_out);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : shr                                                     |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|   Arithmetically shift the 16 bit input var1 right var2 positions with    |

-|   sign extension. If var2 is negative, arithmetically shift var1 left by  |

-|   -var2 with sign extension. Saturate the result in case of underflows or |

-|   overflows.                                                              |

-|                                                                           |

-|   Complexity weight : 1                                                   |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    var1                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|    var2                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    var_out                                                                |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

-|___________________________________________________________________________|

-*/

-

-static_vo Word16 shr (Word16 var1, Word16 var2)

-{

-	Word16 var_out;

-	if (var2 < 0)

-	{

-		if (var2 < -16)

-			var2 = -16;

-		var_out = shl(var1, (Word16)-var2);

-	}

-	else

-	{

-		if (var2 >= 15)

-		{

-			var_out = (Word16)((var1 < 0) ? -1 : 0);

-		}

-		else

-		{

-			if (var1 < 0)

-			{

-				var_out = (Word16)(~((~var1) >> var2));

-			}

-			else

-			{

-				var_out = (Word16)(var1 >> var2);

-			}

-		}

-	}

-	return (var_out);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : mult                                                    |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|    Performs the multiplication of var1 by var2 and gives a 16 bit result  |

-|    which is scaled i.e.:                                                  |

-|             mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and  |

-|             mult(-32768,-32768) = 32767.                                  |

-|                                                                           |

-|   Complexity weight : 1                                                   |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    var1                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|    var2                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    var_out                                                                |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

-|___________________________________________________________________________|

-*/

-

-static_vo Word16 mult (Word16 var1, Word16 var2)

-{

-	Word16 var_out;

-	Word32 L_product;

-	L_product = (Word32) var1 *(Word32) var2;

-	L_product = (L_product & (Word32) 0xffff8000L) >> 15;

-	if (L_product & (Word32) 0x00010000L)

-		L_product = L_product | (Word32) 0xffff0000L;

-	var_out = saturate (L_product);

-	return (var_out);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : L_mult                                                  |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|   L_mult is the 32 bit result of the multiplication of var1 times var2    |

-|   with one shift left i.e.:                                               |

-|        L_mult(var1,var2) = L_shl((var1 times var2),1) and                   |

-|        L_mult(-32768,-32768) = 2147483647.                                |

-|                                                                           |

-|   Complexity weight : 1                                                   |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    var1                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|    var2                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    L_var_out                                                              |

-|             32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |

-|___________________________________________________________________________|

-*/

-

-static_vo Word32 L_mult (Word16 var1, Word16 var2)

-{

-	Word32 L_var_out;

-	L_var_out = (Word32) var1 *(Word32) var2;

-	if (L_var_out != (Word32) 0x40000000L)

-	{

-		L_var_out *= 2;

-	}

-	else

-	{

-		L_var_out = MAX_32;

-	}

-	return (L_var_out);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : round                                                   |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|   Round the lower 16 bits of the 32 bit input number into the MS 16 bits  |

-|   with saturation. Shift the resulting bits right by 16 and return the 16 |

-|   bit number:                                                             |

-|               round(L_var1) = extract_h(L_add(L_var1,32768))              |

-|                                                                           |

-|   Complexity weight : 1                                                   |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    L_var1                                                                 |

-|             32 bit long signed integer (Word32 ) whose value falls in the |

-|             range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.                 |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    var_out                                                                |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

-|___________________________________________________________________________|

-*/

-

-static_vo Word16 voround (Word32 L_var1)

-{

-	Word16 var_out;

-	Word32 L_rounded;

-	L_rounded = L_add (L_var1, (Word32) 0x00008000L);

-	var_out = extract_h (L_rounded);

-	return (var_out);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : L_mac                                                   |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|   Multiply var1 by var2 and shift the result left by 1. Add the 32 bit    |

-|   result to L_var3 with saturation, return a 32 bit result:               |

-|        L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)).         |

-|                                                                           |

-|   Complexity weight : 1                                                   |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    L_var3   32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

-|                                                                           |

-|    var1                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|    var2                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    L_var_out                                                              |

-|             32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |

-|___________________________________________________________________________|

-*/

-

-static_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)

-{

-	Word32 L_var_out;

-	Word32 L_product;

-	L_product = ((var1 * var2) << 1);

-	L_var_out = L_add (L_var3, L_product);

-	return (L_var_out);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : L_msu                                                   |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|   Multiply var1 by var2 and shift the result left by 1. Subtract the 32   |

-|   bit result to L_var3 with saturation, return a 32 bit result:           |

-|        L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)).         |

-|                                                                           |

-|   Complexity weight : 1                                                   |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    L_var3   32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

-|                                                                           |

-|    var1                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|    var2                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    L_var_out                                                              |

-|             32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |

-|___________________________________________________________________________|

-*/

-

-static_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)

-{

-	Word32 L_var_out;

-	Word32 L_product;

-	L_product = (var1 * var2)<<1;

-	L_var_out = L_sub (L_var3, L_product);

-	return (L_var_out);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : L_add                                                   |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|   32 bits addition of the two 32 bits variables (L_var1+L_var2) with      |

-|   overflow control and saturation; the result is set at +2147483647 when  |

-|   overflow occurs or at -2147483648 when underflow occurs.                |

-|                                                                           |

-|   Complexity weight : 2                                                   |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    L_var1   32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

-|                                                                           |

-|    L_var2   32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    L_var_out                                                              |

-|             32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |

-|___________________________________________________________________________|

-*/

-

-static_vo Word32 L_add (Word32 L_var1, Word32 L_var2)

-{

-	Word32 L_var_out;

-	L_var_out = L_var1 + L_var2;

-	if (((L_var1 ^ L_var2) & MIN_32) == 0)

-	{

-		if ((L_var_out ^ L_var1) & MIN_32)

-		{

-			L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;

-		}

-	}

-	return (L_var_out);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : L_sub                                                   |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|   32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with   |

-|   overflow control and saturation; the result is set at +2147483647 when  |

-|   overflow occurs or at -2147483648 when underflow occurs.                |

-|                                                                           |

-|   Complexity weight : 2                                                   |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    L_var1   32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

-|                                                                           |

-|    L_var2   32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    L_var_out                                                              |

-|             32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |

-|___________________________________________________________________________|

-*/

-

-static_vo Word32 L_sub (Word32 L_var1, Word32 L_var2)

-{

-	Word32 L_var_out;

-	L_var_out = L_var1 - L_var2;

-	if (((L_var1 ^ L_var2) & MIN_32) != 0)

-	{

-		if ((L_var_out ^ L_var1) & MIN_32)

-		{

-			L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;

-		}

-	}

-	return (L_var_out);

-}

-

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : mult_r                                                  |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|   Same as mult with rounding, i.e.:                                       |

-|     mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and  |

-|     mult_r(-32768,-32768) = 32767.                                        |

-|                                                                           |

-|   Complexity weight : 2                                                   |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    var1                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|    var2                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    var_out                                                                |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |

-|___________________________________________________________________________|

-*/

-

-static_vo Word16 mult_r (Word16 var1, Word16 var2)

-{

-	Word16 var_out;

-	Word32 L_product_arr;

-	L_product_arr = (Word32) var1 *(Word32) var2;       /* product */

-	L_product_arr += (Word32) 0x00004000L;      /* round */

-	L_product_arr &= (Word32) 0xffff8000L;

-	L_product_arr >>= 15;       /* shift */

-	if (L_product_arr & (Word32) 0x00010000L)   /* sign extend when necessary */

-	{

-		L_product_arr |= (Word32) 0xffff0000L;

-	}

-	var_out = saturate (L_product_arr);

-	return (var_out);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : L_shl                                                   |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|   Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero  |

-|   fill the var2 LSB of the result. If var2 is negative, arithmetically    |

-|   shift L_var1 right by -var2 with sign extension. Saturate the result in |

-|   case of underflows or overflows.                                        |

-|                                                                           |

-|   Complexity weight : 2                                                   |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    L_var1   32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

-|                                                                           |

-|    var2                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    L_var_out                                                              |

-|             32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |

-|___________________________________________________________________________|

-*/

-

-static_vo Word32 L_shl (Word32 L_var1, Word16 var2)

-{

-	Word32 L_var_out = 0L;

-	if (var2 <= 0)

-	{

-		if (var2 < -32)

-			var2 = -32;

-		L_var_out = (L_var1 >> (Word16)-var2);

-	}

-	else

-	{

-		for (; var2 > 0; var2--)

-		{

-			if (L_var1 > (Word32) 0X3fffffffL)

-			{

-				L_var_out = MAX_32;

-				break;

-			}

-			else

-			{

-				if (L_var1 < (Word32) 0xc0000000L)

-				{

-					//Overflow = 1;

-					L_var_out = MIN_32;

-					break;

-				}

-			}

-			L_var1 *= 2;

-			L_var_out = L_var1;

-		}

-	}

-	return (L_var_out);

-}

-

-static_vo Word32 L_shl2(Word32 L_var1, Word16 var2)

-{

-	Word32 L_var_out = 0L;

-

-	for (; var2 > 0; var2--)

-	{

-		if (L_var1 > (Word32) 0X3fffffffL)

-		{

-			L_var_out = MAX_32;

-			break;

-		}

-		else

-		{

-			if (L_var1 < (Word32) 0xc0000000L)

-			{

-				L_var_out = MIN_32;

-				break;

-			}

-		}

-		L_var1 <<=1 ;

-		L_var_out = L_var1;

-	}

-	return (L_var_out);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : L_shr                                                   |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|   Arithmetically shift the 32 bit input L_var1 right var2 positions with  |

-|   sign extension. If var2 is negative, arithmetically shift L_var1 left   |

-|   by -var2 and zero fill the -var2 LSB of the result. Saturate the result |

-|   in case of underflows or overflows.                                     |

-|                                                                           |

-|   Complexity weight : 2                                                   |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    L_var1   32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |

-|                                                                           |

-|    var2                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    L_var_out                                                              |

-|             32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |

-|___________________________________________________________________________|

-*/

-

-static_vo Word32 L_shr (Word32 L_var1, Word16 var2)

-{

-	Word32 L_var_out;

-	if (var2 < 0)

-	{

-		if (var2 < -32)

-			var2 = -32;

-		L_var_out = L_shl2(L_var1, (Word16)-var2);

-	}

-	else

-	{

-		if (var2 >= 31)

-		{

-			L_var_out = (L_var1 < 0L) ? -1 : 0;

-		}

-		else

-		{

-			if (L_var1 < 0)

-			{

-				L_var_out = ~((~L_var1) >> var2);

-			}

-			else

-			{

-				L_var_out = L_var1 >> var2;

-			}

-		}

-	}

-	return (L_var_out);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : L_shr_r                                                 |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|   Same as L_shr(L_var1,var2) but with rounding. Saturate the result in    |

-|   case of underflows or overflows :                                       |

-|    - If var2 is greater than zero :                                       |

-|          if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))|

-|          is equal to zero                                                 |

-|                     then                                                  |

-|                     L_shr_r(L_var1,var2) = L_shr(L_var1,var2)             |

-|                     else                                                  |

-|                     L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1)    |

-|    - If var2 is less than or equal to zero :                              |

-|                     L_shr_r(L_var1,var2) = L_shr(L_var1,var2).            |

-|                                                                           |

-|   Complexity weight : 3                                                   |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    L_var1                                                                 |

-|             32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |

-|                                                                           |

-|    var2                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    L_var_out                                                              |

-|             32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= var_out <= 0x7fff ffff.                |

-|___________________________________________________________________________|

-*/

-

-static_vo Word32 L_shr_r (Word32 L_var1, Word16 var2)

-{

-	Word32 L_var_out;

-	if (var2 > 31)

-	{

-		L_var_out = 0;

-	}

-	else

-	{

-		L_var_out = L_shr (L_var1, var2);

-		if (var2 > 0)

-		{

-			if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)

-			{

-				L_var_out++;

-			}

-		}

-	}

-	return (L_var_out);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : norm_s                                                  |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|   Produces the number of left shift needed to normalize the 16 bit varia- |

-|   ble var1 for positive values on the interval with minimum of 16384 and  |

-|   maximum of 32767, and for negative values on the interval with minimum  |

-|   of -32768 and maximum of -16384; in order to normalize the result, the  |

-|   following operation must be done :                                      |

-|                    norm_var1 = shl(var1,norm_s(var1)).                    |

-|                                                                           |

-|   Complexity weight : 15                                                  |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    var1                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    var_out                                                                |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0x0000 0000 <= var_out <= 0x0000 000f.                |

-|___________________________________________________________________________|

-*/

-

-static_vo Word16 norm_s (Word16 var1)

-{

-	Word16 var_out = 0;

-	if (var1 == 0)

-	{

-		var_out = 0;

-	}

-	else

-	{

-		if (var1 == -1)

-		{

-			var_out = 15;

-		}

-		else

-		{

-			if (var1 < 0)

-			{

-				var1 = (Word16)~var1;

-			}

-			for (var_out = 0; var1 < 0x4000; var_out++)

-			{

-				var1 <<= 1;

-			}

-		}

-	}

-	return (var_out);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : div_s                                                   |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|   Produces a result which is the fractional integer division of var1  by  |

-|   var2; var1 and var2 must be positive and var2 must be greater or equal  |

-|   to var1; the result is positive (leading bit equal to 0) and truncated  |

-|   to 16 bits.                                                             |

-|   If var1 = var2 then div(var1,var2) = 32767.                             |

-|                                                                           |

-|   Complexity weight : 18                                                  |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    var1                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0x0000 0000 <= var1 <= var2 and var2 != 0.            |

-|                                                                           |

-|    var2                                                                   |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : var1 <= var2 <= 0x0000 7fff and var2 != 0.            |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    var_out                                                                |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0x0000 0000 <= var_out <= 0x0000 7fff.                |

-|             It's a Q15 value (point between b15 and b14).                 |

-|___________________________________________________________________________|

-*/

-

-static_vo Word16 div_s (Word16 var1, Word16 var2)

-{

-	Word16 var_out = 0;

-	Word16 iteration;

-	Word32 L_num;

-	Word32 L_denom;

-	if ((var1 < 0) || (var2 < 0))

-	{

-		var_out = MAX_16;

-		return var_out;

-	}

-	if (var2 == 0)

-	{

-		var_out = MAX_16;

-		return var_out;

-	}

-	if (var1 == 0)

-	{

-		var_out = 0;

-	}

-	else

-	{

-		if (var1 == var2)

-		{

-			var_out = MAX_16;

-		}

-		else

-		{

-			L_num = L_deposit_l (var1);

-			L_denom = L_deposit_l(var2);

-			for (iteration = 0; iteration < 15; iteration++)

-			{

-				var_out <<= 1;

-				L_num <<= 1;

-				if (L_num >= L_denom)

-				{

-					L_num -= L_denom;      

-					var_out += 1;          

-				}

-			}

-		}

-	}

-	return (var_out);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : norm_l                                                  |

-|                                                                           |

-|   Purpose :                                                               |

-|                                                                           |

-|   Produces the number of left shifts needed to normalize the 32 bit varia-|

-|   ble L_var1 for positive values on the interval with minimum of          |

-|   1073741824 and maximum of 2147483647, and for negative values on the in-|

-|   terval with minimum of -2147483648 and maximum of -1073741824; in order |

-|   to normalize the result, the following operation must be done :         |

-|                   norm_L_var1 = L_shl(L_var1,norm_l(L_var1)).             |

-|                                                                           |

-|   Complexity weight : 30                                                  |

-|                                                                           |

-|   Inputs :                                                                |

-|                                                                           |

-|    L_var1                                                                 |

-|             32 bit long signed integer (Word32) whose value falls in the  |

-|             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |

-|                                                                           |

-|   Outputs :                                                               |

-|                                                                           |

-|    none                                                                   |

-|                                                                           |

-|   Return Value :                                                          |

-|                                                                           |

-|    var_out                                                                |

-|             16 bit short signed integer (Word16) whose value falls in the |

-|             range : 0x0000 0000 <= var_out <= 0x0000 001f.                |

-|___________________________________________________________________________|

-*/

-

-static_vo Word16 norm_l (Word32 L_var1)

-{

-	Word16 var_out = 0;

-	if (L_var1 != 0)

-	{

-		var_out = 31;

-		if (L_var1 != (Word32) 0xffffffffL)

-		{

-			L_var1 ^= (L_var1 >>31);

-			for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)

-			{

-				L_var1 <<= 1;

-			}

-		}

-	}

-	return (var_out);

-}

-

-#endif //__BASIC_OP_H__

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+#ifndef __BASIC_OP_H__
+#define __BASIC_OP_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "typedef.h"
+
+#define MAX_32 (Word32)0x7fffffffL
+#define MIN_32 (Word32)0x80000000L
+
+#define MAX_16 (Word16)+32767	/* 0x7fff */
+#define MIN_16 (Word16)-32768	/* 0x8000 */
+
+
+#ifdef LINUX
+#define  static_vo  static __inline__
+#else
+#define  static_vo  static __inline
+#endif 
+
+#define saturate(L_var1) (((L_var1) > 0X00007fffL) ? (MAX_16): (((L_var1) < (Word32) 0xffff8000L) ? (MIN_16): ((L_var1) & 0xffff)))
+
+#define abs_s(x)       ((Word16)(((x) != MIN_16) ? (((x) >= 0) ? (x) : (-(x))) : MAX_16))  /* Short abs,           1   */
+#define L_deposit_h(x) (((Word32)(x)) << 16)                                               /* 16 bit var1 -> MSB,     2 */
+#define L_deposit_l(x) ((Word32)(x))                                                       /* 16 bit var1 -> LSB,     2 */
+#define L_abs(x) (((x) != MIN_32) ? (((x) >= 0) ? (x) : (-(x))) : MAX_32)                  /* Long abs,              3*/
+#define negate(var1) ((Word16)(((var1) == MIN_16) ? MAX_16 : (-(var1))))                   /* Short negate,        1*/
+#define L_negate(L_var1) (((L_var1) == (MIN_32)) ? (MAX_32) : (-(L_var1)))                 /* Long negate,     2*/
+
+
+#define extract_h(a)			((Word16)(a >> 16))
+#define extract_l(x)            	(Word16)((x))
+#define add1(a,b)			(a + b)
+#define vo_L_msu(a,b,c)			( a - (( b * c ) << 1) )
+#define vo_mult32(a, b)         ((a) * (b))
+#define vo_mult(a,b)			(( a * b ) >> 15 )
+#define	vo_L_mult(a,b)	    		(((a) * (b)) << 1)
+#define vo_shr_r(var1, var2)   		((var1+((Word16)(1L<<(var2-1))))>>var2)
+#define vo_sub(a,b)			(a - b)
+#define vo_L_deposit_h(a)		((Word32)((a) << 16))
+#define vo_round(a)			((a + 0x00008000) >> 16)
+#define vo_extract_l(a)			((Word16)(a))
+#define vo_L_add(a,b)			(a + b)
+#define vo_L_sub(a,b)			(a - b)
+#define vo_mult_r(a,b)			((( a * b ) + 0x4000 ) >> 15 )
+#define vo_negate(a)		        (-a)
+#define vo_L_shr_r(L_var1, var2)        ((L_var1+((Word32)(1L<<(var2-1))))>>var2)
+
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Prototypes for basic arithmetic operators                               |
+|___________________________________________________________________________|
+*/
+static_vo Word16 add (Word16 var1, Word16 var2);				/* Short add,1 */
+static_vo Word16 sub (Word16 var1, Word16 var2);				/* Short sub,1 */
+static_vo Word16 shl (Word16 var1, Word16 var2);                                /* Short shift left,    1   */
+static_vo Word16 shr (Word16 var1, Word16 var2);                                /* Short shift right,   1   */
+static_vo Word16 mult (Word16 var1, Word16 var2);                               /* Short mult,          1   */
+static_vo Word32 L_mult (Word16 var1, Word16 var2);                             /* Long mult,           1   */
+static_vo Word16 voround (Word32 L_var1);                                       /* Round,               1   */
+static_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2);            	/* Mac,  1  */
+static_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);   		/* Msu,  1  */
+static_vo Word32 L_add (Word32 L_var1, Word32 L_var2);   		 	/* Long add,        2 */
+static_vo Word32 L_sub (Word32 L_var1, Word32 L_var2);   			/* Long sub,        2 */
+static_vo Word16 mult_r (Word16 var1, Word16 var2);      		 	/* Mult with round, 2 */
+static_vo Word32 L_shl2(Word32 L_var1, Word16 var2);             		/* var2 > 0*/
+static_vo Word32 L_shl (Word32 L_var1, Word16 var2);    	 	 	/* Long shift left, 2 */
+static_vo Word32 L_shr (Word32 L_var1, Word16 var2);    	 	 	/* Long shift right, 2*/
+static_vo Word32 L_shr_r (Word32 L_var1, Word16 var2); 				/* Long shift right with round,  3   */
+static_vo Word16 norm_s (Word16 var1);             				/* Short norm,           15  */
+static_vo Word16 div_s (Word16 var1, Word16 var2); 				/* Short division,       18  */
+static_vo Word16 norm_l (Word32 L_var1);           				/* Long norm,            30  */   
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Functions                                                               |
+|___________________________________________________________________________|
+*/
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : add                                                     |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|    Performs the addition (var1+var2) with overflow control and saturation;|
+|    the 16 bit result is set at +32767 when overflow occurs or at -32768   |
+|    when underflow occurs.                                                 |
+|                                                                           |
+|   Complexity weight : 1                                                   |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    var1                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|    var2                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    var_out                                                                |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+|___________________________________________________________________________|
+*/
+static_vo Word16 add (Word16 var1, Word16 var2)
+{
+	Word16 var_out;
+	Word32 L_sum;
+	L_sum = (Word32) var1 + var2;
+	var_out = saturate (L_sum);
+	return (var_out);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : sub                                                     |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|    Performs the subtraction (var1+var2) with overflow control and satu-   |
+|    ration; the 16 bit result is set at +32767 when overflow occurs or at  |
+|    -32768 when underflow occurs.                                          |
+|                                                                           |
+|   Complexity weight : 1                                                   |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    var1                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|    var2                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    var_out                                                                |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 sub (Word16 var1, Word16 var2)
+{
+	Word16 var_out;
+	Word32 L_diff;
+	L_diff = (Word32) var1 - var2;
+	var_out = saturate (L_diff);
+	return (var_out);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : shl                                                     |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|   Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill|
+|   the var2 LSB of the result. If var2 is negative, arithmetically shift   |
+|   var1 right by -var2 with sign extension. Saturate the result in case of |
+|   underflows or overflows.                                                |
+|                                                                           |
+|   Complexity weight : 1                                                   |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    var1                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|    var2                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    var_out                                                                |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 shl (Word16 var1, Word16 var2)
+{
+	Word16 var_out;
+	Word32 result;
+	if (var2 < 0)
+	{
+		if (var2 < -16)
+			var2 = -16;
+		var_out = var1 >> ((Word16)-var2);
+	}
+	else
+	{
+		result = (Word32) var1 *((Word32) 1 << var2);
+		if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result)))
+		{
+			var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16);
+		}
+		else
+		{
+			var_out = extract_l (result);
+		}
+	}
+	return (var_out);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : shr                                                     |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|   Arithmetically shift the 16 bit input var1 right var2 positions with    |
+|   sign extension. If var2 is negative, arithmetically shift var1 left by  |
+|   -var2 with sign extension. Saturate the result in case of underflows or |
+|   overflows.                                                              |
+|                                                                           |
+|   Complexity weight : 1                                                   |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    var1                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|    var2                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    var_out                                                                |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 shr (Word16 var1, Word16 var2)
+{
+	Word16 var_out;
+	if (var2 < 0)
+	{
+		if (var2 < -16)
+			var2 = -16;
+		var_out = shl(var1, (Word16)-var2);
+	}
+	else
+	{
+		if (var2 >= 15)
+		{
+			var_out = (Word16)((var1 < 0) ? -1 : 0);
+		}
+		else
+		{
+			if (var1 < 0)
+			{
+				var_out = (Word16)(~((~var1) >> var2));
+			}
+			else
+			{
+				var_out = (Word16)(var1 >> var2);
+			}
+		}
+	}
+	return (var_out);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : mult                                                    |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|    Performs the multiplication of var1 by var2 and gives a 16 bit result  |
+|    which is scaled i.e.:                                                  |
+|             mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and  |
+|             mult(-32768,-32768) = 32767.                                  |
+|                                                                           |
+|   Complexity weight : 1                                                   |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    var1                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|    var2                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    var_out                                                                |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 mult (Word16 var1, Word16 var2)
+{
+	Word16 var_out;
+	Word32 L_product;
+	L_product = (Word32) var1 *(Word32) var2;
+	L_product = (L_product & (Word32) 0xffff8000L) >> 15;
+	if (L_product & (Word32) 0x00010000L)
+		L_product = L_product | (Word32) 0xffff0000L;
+	var_out = saturate (L_product);
+	return (var_out);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : L_mult                                                  |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|   L_mult is the 32 bit result of the multiplication of var1 times var2    |
+|   with one shift left i.e.:                                               |
+|        L_mult(var1,var2) = L_shl((var1 times var2),1) and                   |
+|        L_mult(-32768,-32768) = 2147483647.                                |
+|                                                                           |
+|   Complexity weight : 1                                                   |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    var1                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|    var2                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    L_var_out                                                              |
+|             32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+|___________________________________________________________________________|
+*/
+
+static_vo Word32 L_mult (Word16 var1, Word16 var2)
+{
+	Word32 L_var_out;
+	L_var_out = (Word32) var1 *(Word32) var2;
+	if (L_var_out != (Word32) 0x40000000L)
+	{
+		L_var_out *= 2;
+	}
+	else
+	{
+		L_var_out = MAX_32;
+	}
+	return (L_var_out);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : round                                                   |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|   Round the lower 16 bits of the 32 bit input number into the MS 16 bits  |
+|   with saturation. Shift the resulting bits right by 16 and return the 16 |
+|   bit number:                                                             |
+|               round(L_var1) = extract_h(L_add(L_var1,32768))              |
+|                                                                           |
+|   Complexity weight : 1                                                   |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    L_var1                                                                 |
+|             32 bit long signed integer (Word32 ) whose value falls in the |
+|             range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.                 |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    var_out                                                                |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 voround (Word32 L_var1)
+{
+	Word16 var_out;
+	Word32 L_rounded;
+	L_rounded = L_add (L_var1, (Word32) 0x00008000L);
+	var_out = extract_h (L_rounded);
+	return (var_out);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : L_mac                                                   |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|   Multiply var1 by var2 and shift the result left by 1. Add the 32 bit    |
+|   result to L_var3 with saturation, return a 32 bit result:               |
+|        L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)).         |
+|                                                                           |
+|   Complexity weight : 1                                                   |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    L_var3   32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+|                                                                           |
+|    var1                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|    var2                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    L_var_out                                                              |
+|             32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+|___________________________________________________________________________|
+*/
+
+static_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
+{
+	Word32 L_var_out;
+	Word32 L_product;
+	L_product = ((var1 * var2) << 1);
+	L_var_out = L_add (L_var3, L_product);
+	return (L_var_out);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : L_msu                                                   |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|   Multiply var1 by var2 and shift the result left by 1. Subtract the 32   |
+|   bit result to L_var3 with saturation, return a 32 bit result:           |
+|        L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)).         |
+|                                                                           |
+|   Complexity weight : 1                                                   |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    L_var3   32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+|                                                                           |
+|    var1                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|    var2                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    L_var_out                                                              |
+|             32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+|___________________________________________________________________________|
+*/
+
+static_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
+{
+	Word32 L_var_out;
+	Word32 L_product;
+	L_product = (var1 * var2)<<1;
+	L_var_out = L_sub (L_var3, L_product);
+	return (L_var_out);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : L_add                                                   |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|   32 bits addition of the two 32 bits variables (L_var1+L_var2) with      |
+|   overflow control and saturation; the result is set at +2147483647 when  |
+|   overflow occurs or at -2147483648 when underflow occurs.                |
+|                                                                           |
+|   Complexity weight : 2                                                   |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+|                                                                           |
+|    L_var2   32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    L_var_out                                                              |
+|             32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+|___________________________________________________________________________|
+*/
+
+static_vo Word32 L_add (Word32 L_var1, Word32 L_var2)
+{
+	Word32 L_var_out;
+	L_var_out = L_var1 + L_var2;
+	if (((L_var1 ^ L_var2) & MIN_32) == 0)
+	{
+		if ((L_var_out ^ L_var1) & MIN_32)
+		{
+			L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;
+		}
+	}
+	return (L_var_out);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : L_sub                                                   |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|   32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with   |
+|   overflow control and saturation; the result is set at +2147483647 when  |
+|   overflow occurs or at -2147483648 when underflow occurs.                |
+|                                                                           |
+|   Complexity weight : 2                                                   |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+|                                                                           |
+|    L_var2   32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    L_var_out                                                              |
+|             32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+|___________________________________________________________________________|
+*/
+
+static_vo Word32 L_sub (Word32 L_var1, Word32 L_var2)
+{
+	Word32 L_var_out;
+	L_var_out = L_var1 - L_var2;
+	if (((L_var1 ^ L_var2) & MIN_32) != 0)
+	{
+		if ((L_var_out ^ L_var1) & MIN_32)
+		{
+			L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
+		}
+	}
+	return (L_var_out);
+}
+
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : mult_r                                                  |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|   Same as mult with rounding, i.e.:                                       |
+|     mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and  |
+|     mult_r(-32768,-32768) = 32767.                                        |
+|                                                                           |
+|   Complexity weight : 2                                                   |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    var1                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|    var2                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    var_out                                                                |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 mult_r (Word16 var1, Word16 var2)
+{
+	Word16 var_out;
+	Word32 L_product_arr;
+	L_product_arr = (Word32) var1 *(Word32) var2;       /* product */
+	L_product_arr += (Word32) 0x00004000L;      /* round */
+	L_product_arr &= (Word32) 0xffff8000L;
+	L_product_arr >>= 15;       /* shift */
+	if (L_product_arr & (Word32) 0x00010000L)   /* sign extend when necessary */
+	{
+		L_product_arr |= (Word32) 0xffff0000L;
+	}
+	var_out = saturate (L_product_arr);
+	return (var_out);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : L_shl                                                   |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|   Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero  |
+|   fill the var2 LSB of the result. If var2 is negative, arithmetically    |
+|   shift L_var1 right by -var2 with sign extension. Saturate the result in |
+|   case of underflows or overflows.                                        |
+|                                                                           |
+|   Complexity weight : 2                                                   |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+|                                                                           |
+|    var2                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    L_var_out                                                              |
+|             32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+|___________________________________________________________________________|
+*/
+
+static_vo Word32 L_shl (Word32 L_var1, Word16 var2)
+{
+	Word32 L_var_out = 0L;
+	if (var2 <= 0)
+	{
+		if (var2 < -32)
+			var2 = -32;
+		L_var_out = (L_var1 >> (Word16)-var2);
+	}
+	else
+	{
+		for (; var2 > 0; var2--)
+		{
+			if (L_var1 > (Word32) 0X3fffffffL)
+			{
+				L_var_out = MAX_32;
+				break;
+			}
+			else
+			{
+				if (L_var1 < (Word32) 0xc0000000L)
+				{
+					//Overflow = 1;
+					L_var_out = MIN_32;
+					break;
+				}
+			}
+			L_var1 *= 2;
+			L_var_out = L_var1;
+		}
+	}
+	return (L_var_out);
+}
+
+static_vo Word32 L_shl2(Word32 L_var1, Word16 var2)
+{
+	Word32 L_var_out = 0L;
+
+	for (; var2 > 0; var2--)
+	{
+		if (L_var1 > (Word32) 0X3fffffffL)
+		{
+			L_var_out = MAX_32;
+			break;
+		}
+		else
+		{
+			if (L_var1 < (Word32) 0xc0000000L)
+			{
+				L_var_out = MIN_32;
+				break;
+			}
+		}
+		L_var1 <<=1 ;
+		L_var_out = L_var1;
+	}
+	return (L_var_out);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : L_shr                                                   |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|   Arithmetically shift the 32 bit input L_var1 right var2 positions with  |
+|   sign extension. If var2 is negative, arithmetically shift L_var1 left   |
+|   by -var2 and zero fill the -var2 LSB of the result. Saturate the result |
+|   in case of underflows or overflows.                                     |
+|                                                                           |
+|   Complexity weight : 2                                                   |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
+|                                                                           |
+|    var2                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    L_var_out                                                              |
+|             32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
+|___________________________________________________________________________|
+*/
+
+static_vo Word32 L_shr (Word32 L_var1, Word16 var2)
+{
+	Word32 L_var_out;
+	if (var2 < 0)
+	{
+		if (var2 < -32)
+			var2 = -32;
+		L_var_out = L_shl2(L_var1, (Word16)-var2);
+	}
+	else
+	{
+		if (var2 >= 31)
+		{
+			L_var_out = (L_var1 < 0L) ? -1 : 0;
+		}
+		else
+		{
+			if (L_var1 < 0)
+			{
+				L_var_out = ~((~L_var1) >> var2);
+			}
+			else
+			{
+				L_var_out = L_var1 >> var2;
+			}
+		}
+	}
+	return (L_var_out);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : L_shr_r                                                 |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|   Same as L_shr(L_var1,var2) but with rounding. Saturate the result in    |
+|   case of underflows or overflows :                                       |
+|    - If var2 is greater than zero :                                       |
+|          if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))|
+|          is equal to zero                                                 |
+|                     then                                                  |
+|                     L_shr_r(L_var1,var2) = L_shr(L_var1,var2)             |
+|                     else                                                  |
+|                     L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1)    |
+|    - If var2 is less than or equal to zero :                              |
+|                     L_shr_r(L_var1,var2) = L_shr(L_var1,var2).            |
+|                                                                           |
+|   Complexity weight : 3                                                   |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    L_var1                                                                 |
+|             32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |
+|                                                                           |
+|    var2                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    L_var_out                                                              |
+|             32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= var_out <= 0x7fff ffff.                |
+|___________________________________________________________________________|
+*/
+
+static_vo Word32 L_shr_r (Word32 L_var1, Word16 var2)
+{
+	Word32 L_var_out;
+	if (var2 > 31)
+	{
+		L_var_out = 0;
+	}
+	else
+	{
+		L_var_out = L_shr (L_var1, var2);
+		if (var2 > 0)
+		{
+			if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)
+			{
+				L_var_out++;
+			}
+		}
+	}
+	return (L_var_out);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : norm_s                                                  |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|   Produces the number of left shift needed to normalize the 16 bit varia- |
+|   ble var1 for positive values on the interval with minimum of 16384 and  |
+|   maximum of 32767, and for negative values on the interval with minimum  |
+|   of -32768 and maximum of -16384; in order to normalize the result, the  |
+|   following operation must be done :                                      |
+|                    norm_var1 = shl(var1,norm_s(var1)).                    |
+|                                                                           |
+|   Complexity weight : 15                                                  |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    var1                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    var_out                                                                |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0x0000 0000 <= var_out <= 0x0000 000f.                |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 norm_s (Word16 var1)
+{
+	Word16 var_out = 0;
+	if (var1 == 0)
+	{
+		var_out = 0;
+	}
+	else
+	{
+		if (var1 == -1)
+		{
+			var_out = 15;
+		}
+		else
+		{
+			if (var1 < 0)
+			{
+				var1 = (Word16)~var1;
+			}
+			for (var_out = 0; var1 < 0x4000; var_out++)
+			{
+				var1 <<= 1;
+			}
+		}
+	}
+	return (var_out);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : div_s                                                   |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|   Produces a result which is the fractional integer division of var1  by  |
+|   var2; var1 and var2 must be positive and var2 must be greater or equal  |
+|   to var1; the result is positive (leading bit equal to 0) and truncated  |
+|   to 16 bits.                                                             |
+|   If var1 = var2 then div(var1,var2) = 32767.                             |
+|                                                                           |
+|   Complexity weight : 18                                                  |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    var1                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0x0000 0000 <= var1 <= var2 and var2 != 0.            |
+|                                                                           |
+|    var2                                                                   |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : var1 <= var2 <= 0x0000 7fff and var2 != 0.            |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    var_out                                                                |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0x0000 0000 <= var_out <= 0x0000 7fff.                |
+|             It's a Q15 value (point between b15 and b14).                 |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 div_s (Word16 var1, Word16 var2)
+{
+	Word16 var_out = 0;
+	Word16 iteration;
+	Word32 L_num;
+	Word32 L_denom;
+	if ((var1 < 0) || (var2 < 0))
+	{
+		var_out = MAX_16;
+		return var_out;
+	}
+	if (var2 == 0)
+	{
+		var_out = MAX_16;
+		return var_out;
+	}
+	if (var1 == 0)
+	{
+		var_out = 0;
+	}
+	else
+	{
+		if (var1 == var2)
+		{
+			var_out = MAX_16;
+		}
+		else
+		{
+			L_num = L_deposit_l (var1);
+			L_denom = L_deposit_l(var2);
+			for (iteration = 0; iteration < 15; iteration++)
+			{
+				var_out <<= 1;
+				L_num <<= 1;
+				if (L_num >= L_denom)
+				{
+					L_num -= L_denom;      
+					var_out += 1;          
+				}
+			}
+		}
+	}
+	return (var_out);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : norm_l                                                  |
+|                                                                           |
+|   Purpose :                                                               |
+|                                                                           |
+|   Produces the number of left shifts needed to normalize the 32 bit varia-|
+|   ble L_var1 for positive values on the interval with minimum of          |
+|   1073741824 and maximum of 2147483647, and for negative values on the in-|
+|   terval with minimum of -2147483648 and maximum of -1073741824; in order |
+|   to normalize the result, the following operation must be done :         |
+|                   norm_L_var1 = L_shl(L_var1,norm_l(L_var1)).             |
+|                                                                           |
+|   Complexity weight : 30                                                  |
+|                                                                           |
+|   Inputs :                                                                |
+|                                                                           |
+|    L_var1                                                                 |
+|             32 bit long signed integer (Word32) whose value falls in the  |
+|             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |
+|                                                                           |
+|   Outputs :                                                               |
+|                                                                           |
+|    none                                                                   |
+|                                                                           |
+|   Return Value :                                                          |
+|                                                                           |
+|    var_out                                                                |
+|             16 bit short signed integer (Word16) whose value falls in the |
+|             range : 0x0000 0000 <= var_out <= 0x0000 001f.                |
+|___________________________________________________________________________|
+*/
+
+static_vo Word16 norm_l (Word32 L_var1)
+{
+	Word16 var_out = 0;
+	if (L_var1 != 0)
+	{
+		var_out = 31;
+		if (L_var1 != (Word32) 0xffffffffL)
+		{
+			L_var1 ^= (L_var1 >>31);
+			for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)
+			{
+				L_var1 <<= 1;
+			}
+		}
+	}
+	return (var_out);
+}
+
+#endif //__BASIC_OP_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/bits.h b/media/libstagefright/codecs/amrwbenc/inc/bits.h
index 77146de..e880684 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/bits.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/bits.h
@@ -1,92 +1,92 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/*--------------------------------------------------------------------------*

-*                         BITS.H                                           *

-*--------------------------------------------------------------------------*

-*       Number of bits for different modes			           *

-*--------------------------------------------------------------------------*/

-

-#ifndef __BITS_H__

-#define __BITS_H__

-

-#include <stdio.h>

-#include "typedef.h"

-#include "cnst.h"

-#include "cod_main.h"

-

-#define NBBITS_7k     132                  /* 6.60k  */

-#define NBBITS_9k     177                  /* 8.85k  */

-#define NBBITS_12k    253                  /* 12.65k */

-#define NBBITS_14k    285                  /* 14.25k */

-#define NBBITS_16k    317                  /* 15.85k */

-#define NBBITS_18k    365                  /* 18.25k */

-#define NBBITS_20k    397                  /* 19.85k */

-#define NBBITS_23k    461                  /* 23.05k */

-#define NBBITS_24k    477                  /* 23.85k */

-

-#define NBBITS_SID    35

-#define NB_BITS_MAX   NBBITS_24k

-

-#define BIT_0     (Word16)-127

-#define BIT_1     (Word16)127

-#define BIT_0_ITU (Word16)0x007F

-#define BIT_1_ITU (Word16)0x0081

-

-#define SIZE_MAX1  (3+NB_BITS_MAX)          /* serial size max */

-#define TX_FRAME_TYPE (Word16)0x6b21

-#define RX_FRAME_TYPE (Word16)0x6b20

-

-static const Word16 nb_of_bits[NUM_OF_MODES] = {

-	NBBITS_7k,

-	NBBITS_9k,

-	NBBITS_12k,

-	NBBITS_14k,

-	NBBITS_16k,

-	NBBITS_18k,

-	NBBITS_20k,

-	NBBITS_23k,

-	NBBITS_24k,

-	NBBITS_SID

-};

-

-/*typedef struct

-{

-Word16 sid_update_counter;

-Word16 sid_handover_debt;

-Word16 prev_ft;

-} TX_State;

-*/

-

-//typedef struct

-//{

-//	Word16 prev_ft;

-//	Word16 prev_mode;

-//} RX_State;

-

-int PackBits(Word16 prms[], Word16 coding_mode, Word16 mode, Coder_State *st);

-

-

-void Parm_serial(

-		Word16 value,                         /* input : parameter value */

-		Word16 no_of_bits,                    /* input : number of bits  */

-		Word16 ** prms

-		);

-

-

-#endif  //__BITS_H__

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*--------------------------------------------------------------------------*
+*                         BITS.H                                           *
+*--------------------------------------------------------------------------*
+*       Number of bits for different modes			           *
+*--------------------------------------------------------------------------*/
+
+#ifndef __BITS_H__
+#define __BITS_H__
+
+#include <stdio.h>
+#include "typedef.h"
+#include "cnst.h"
+#include "cod_main.h"
+
+#define NBBITS_7k     132                  /* 6.60k  */
+#define NBBITS_9k     177                  /* 8.85k  */
+#define NBBITS_12k    253                  /* 12.65k */
+#define NBBITS_14k    285                  /* 14.25k */
+#define NBBITS_16k    317                  /* 15.85k */
+#define NBBITS_18k    365                  /* 18.25k */
+#define NBBITS_20k    397                  /* 19.85k */
+#define NBBITS_23k    461                  /* 23.05k */
+#define NBBITS_24k    477                  /* 23.85k */
+
+#define NBBITS_SID    35
+#define NB_BITS_MAX   NBBITS_24k
+
+#define BIT_0     (Word16)-127
+#define BIT_1     (Word16)127
+#define BIT_0_ITU (Word16)0x007F
+#define BIT_1_ITU (Word16)0x0081
+
+#define SIZE_MAX1  (3+NB_BITS_MAX)          /* serial size max */
+#define TX_FRAME_TYPE (Word16)0x6b21
+#define RX_FRAME_TYPE (Word16)0x6b20
+
+static const Word16 nb_of_bits[NUM_OF_MODES] = {
+	NBBITS_7k,
+	NBBITS_9k,
+	NBBITS_12k,
+	NBBITS_14k,
+	NBBITS_16k,
+	NBBITS_18k,
+	NBBITS_20k,
+	NBBITS_23k,
+	NBBITS_24k,
+	NBBITS_SID
+};
+
+/*typedef struct
+{
+Word16 sid_update_counter;
+Word16 sid_handover_debt;
+Word16 prev_ft;
+} TX_State;
+*/
+
+//typedef struct
+//{
+//	Word16 prev_ft;
+//	Word16 prev_mode;
+//} RX_State;
+
+int PackBits(Word16 prms[], Word16 coding_mode, Word16 mode, Coder_State *st);
+
+
+void Parm_serial(
+		Word16 value,                         /* input : parameter value */
+		Word16 no_of_bits,                    /* input : number of bits  */
+		Word16 ** prms
+		);
+
+
+#endif  //__BITS_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/cnst.h b/media/libstagefright/codecs/amrwbenc/inc/cnst.h
index ffdbd88..5395d2d 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/cnst.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/cnst.h
@@ -1,81 +1,81 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/*--------------------------------------------------------------------------*

- *                         CNST.H                                           *

- *--------------------------------------------------------------------------*

- *       Codec constant parameters (coder and decoder)                      *

- *--------------------------------------------------------------------------*/

-

-#ifndef __CNST_H__

-#define __CNST_H__

-

-#define L_FRAME16k   320                   /* Frame size at 16kHz                        */

-#define L_FRAME      256                   /* Frame size                                 */

-#define L_SUBFR16k   80                    /* Subframe size at 16kHz                     */

-

-#define L_SUBFR      64                    /* Subframe size                              */

-#define NB_SUBFR     4                     /* Number of subframe per frame               */

-

-#define L_NEXT       64                    /* Overhead in LP analysis                    */

-#define L_WINDOW     384                   /* window size in LP analysis                 */

-#define L_TOTAL      384                   /* Total size of speech buffer.               */

-#define M            16                    /* Order of LP filter                         */

-#define M16k         20

-

-#define L_FILT16k    15                    /* Delay of down-sampling filter              */

-#define L_FILT       12                    /* Delay of up-sampling filter                */

-

-#define GP_CLIP      15565                 /* Pitch gain clipping = 0.95 Q14             */

-#define PIT_SHARP    27853                 /* pitch sharpening factor = 0.85 Q15         */

-

-#define PIT_MIN      34                    /* Minimum pitch lag with resolution 1/4      */

-#define PIT_FR2      128                   /* Minimum pitch lag with resolution 1/2      */

-#define PIT_FR1_9b   160                   /* Minimum pitch lag with resolution 1        */

-#define PIT_FR1_8b   92                    /* Minimum pitch lag with resolution 1        */

-#define PIT_MAX      231                   /* Maximum pitch lag                          */

-#define L_INTERPOL   (16+1)                /* Length of filter for interpolation         */

-

-#define OPL_DECIM    2                     /* Decimation in open-loop pitch analysis     */

-

-#define PREEMPH_FAC  22282                 /* preemphasis factor (0.68 in Q15)           */

-#define GAMMA1       30147                 /* Weighting factor (numerator) (0.92 in Q15) */

-#define TILT_FAC     22282                 /* tilt factor (denominator) (0.68 in Q15)    */

-

-#define Q_MAX        8                     /* scaling max for signal (see syn_filt_32)   */

-

-#define RANDOM_INITSEED  21845             /* own random init value                      */

-

-#define L_MEANBUF        3

-#define ONE_PER_MEANBUF 10923

-

-#define MODE_7k       0

-#define MODE_9k       1

-#define MODE_12k      2

-#define MODE_14k      3

-#define MODE_16k      4

-#define MODE_18k      5

-#define MODE_20k      6

-#define MODE_23k      7

-#define MODE_24k      8

-#define MRDTX         9

-#define NUM_OF_MODES  10                   /* see bits.h for bits definition             */

-

-#define EHF_MASK (Word16)0x0008            /* homing frame pattern                       */

-

-#endif //__CNST_H__

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*--------------------------------------------------------------------------*
+ *                         CNST.H                                           *
+ *--------------------------------------------------------------------------*
+ *       Codec constant parameters (coder and decoder)                      *
+ *--------------------------------------------------------------------------*/
+
+#ifndef __CNST_H__
+#define __CNST_H__
+
+#define L_FRAME16k   320                   /* Frame size at 16kHz                        */
+#define L_FRAME      256                   /* Frame size                                 */
+#define L_SUBFR16k   80                    /* Subframe size at 16kHz                     */
+
+#define L_SUBFR      64                    /* Subframe size                              */
+#define NB_SUBFR     4                     /* Number of subframe per frame               */
+
+#define L_NEXT       64                    /* Overhead in LP analysis                    */
+#define L_WINDOW     384                   /* window size in LP analysis                 */
+#define L_TOTAL      384                   /* Total size of speech buffer.               */
+#define M            16                    /* Order of LP filter                         */
+#define M16k         20
+
+#define L_FILT16k    15                    /* Delay of down-sampling filter              */
+#define L_FILT       12                    /* Delay of up-sampling filter                */
+
+#define GP_CLIP      15565                 /* Pitch gain clipping = 0.95 Q14             */
+#define PIT_SHARP    27853                 /* pitch sharpening factor = 0.85 Q15         */
+
+#define PIT_MIN      34                    /* Minimum pitch lag with resolution 1/4      */
+#define PIT_FR2      128                   /* Minimum pitch lag with resolution 1/2      */
+#define PIT_FR1_9b   160                   /* Minimum pitch lag with resolution 1        */
+#define PIT_FR1_8b   92                    /* Minimum pitch lag with resolution 1        */
+#define PIT_MAX      231                   /* Maximum pitch lag                          */
+#define L_INTERPOL   (16+1)                /* Length of filter for interpolation         */
+
+#define OPL_DECIM    2                     /* Decimation in open-loop pitch analysis     */
+
+#define PREEMPH_FAC  22282                 /* preemphasis factor (0.68 in Q15)           */
+#define GAMMA1       30147                 /* Weighting factor (numerator) (0.92 in Q15) */
+#define TILT_FAC     22282                 /* tilt factor (denominator) (0.68 in Q15)    */
+
+#define Q_MAX        8                     /* scaling max for signal (see syn_filt_32)   */
+
+#define RANDOM_INITSEED  21845             /* own random init value                      */
+
+#define L_MEANBUF        3
+#define ONE_PER_MEANBUF 10923
+
+#define MODE_7k       0
+#define MODE_9k       1
+#define MODE_12k      2
+#define MODE_14k      3
+#define MODE_16k      4
+#define MODE_18k      5
+#define MODE_20k      6
+#define MODE_23k      7
+#define MODE_24k      8
+#define MRDTX         9
+#define NUM_OF_MODES  10                   /* see bits.h for bits definition             */
+
+#define EHF_MASK (Word16)0x0008            /* homing frame pattern                       */
+
+#endif //__CNST_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/cod_main.h b/media/libstagefright/codecs/amrwbenc/inc/cod_main.h
index 1fd5787..53ca55e 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/cod_main.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/cod_main.h
@@ -1,103 +1,103 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/*--------------------------------------------------------------------------*

- *                         COD_MAIN.H                                       *

- *--------------------------------------------------------------------------*

- *       Static memory in the encoder				            *

- *--------------------------------------------------------------------------*/

-#ifndef __COD_MAIN_H__

-#define __COD_MAIN_H__

-

-#include "cnst.h"                          /* coder constant parameters */

-

-#include "wb_vad.h"

-#include "dtx.h"

-#include "stream.h"

-#include "voAMRWB.h"

-

-typedef struct

-{

-    Word16 mem_decim[2 * L_FILT16k];       /* speech decimated filter memory */

-    Word16 mem_sig_in[6];                  /* hp50 filter memory */

-    Word16 mem_preemph;                    /* speech preemph filter memory */

-    Word16 old_speech[L_TOTAL - L_FRAME];  /* old speech vector at 12.8kHz */

-    Word16 old_wsp[PIT_MAX / OPL_DECIM];   /* old decimated weighted speech vector */

-    Word16 old_exc[PIT_MAX + L_INTERPOL];  /* old excitation vector */

-    Word16 mem_levinson[M + 2];            /* levinson routine memory */

-    Word16 ispold[M];                      /* old isp (immittance spectral pairs) */

-    Word16 ispold_q[M];                    /* quantized old isp */

-    Word16 past_isfq[M];                   /* past isf quantizer */

-    Word16 mem_wsp;                        /* wsp vector memory */

-    Word16 mem_decim2[3];                  /* wsp decimation filter memory */

-    Word16 mem_w0;                         /* target vector memory */

-    Word16 mem_syn[M];                     /* synthesis memory */

-    Word16 tilt_code;                      /* tilt of code */

-    Word16 old_wsp_max;                    /* old wsp maximum value */

-    Word16 old_wsp_shift;                  /* old wsp shift */

-    Word16 Q_old;                          /* old scaling factor */

-    Word16 Q_max[2];                       /* old maximum scaling factor */

-    Word16 gp_clip[2];                     /* gain of pitch clipping memory */

-    Word16 qua_gain[4];                    /* gain quantizer memory */

-

-    Word16 old_T0_med;

-    Word16 ol_gain;

-    Word16 ada_w;

-    Word16 ol_wght_flg;

-    Word16 old_ol_lag[5];

-    Word16 hp_wsp_mem[9];

-    Word16 old_hp_wsp[L_FRAME / OPL_DECIM + (PIT_MAX / OPL_DECIM)];

-    VadVars *vadSt;

-    dtx_encState *dtx_encSt;

-    Word16 first_frame;

-    Word16 isfold[M];                      /* old isf (frequency domain) */

-    Word32 L_gc_thres;                     /* threshold for noise enhancer */

-    Word16 mem_syn_hi[M];                  /* modified synthesis memory (MSB) */

-    Word16 mem_syn_lo[M];                  /* modified synthesis memory (LSB) */

-    Word16 mem_deemph;                     /* speech deemph filter memory */

-    Word16 mem_sig_out[6];                 /* hp50 filter memory for synthesis */

-    Word16 mem_hp400[6];                   /* hp400 filter memory for synthesis */

-    Word16 mem_oversamp[2 * L_FILT];       /* synthesis oversampled filter memory */

-    Word16 mem_syn_hf[M];                  /* HF synthesis memory */

-    Word16 mem_hf[2 * L_FILT16k];          /* HF band-pass filter memory */

-    Word16 mem_hf2[2 * L_FILT16k];         /* HF band-pass filter memory */

-    Word16 seed2;                          /* random memory for HF generation */

-    Word16 vad_hist;

-    Word16 gain_alpha;

-    /*  TX_State structure  */

-	Word16 sid_update_counter;

-    Word16 sid_handover_debt;

-    Word16 prev_ft;

-	Word16 allow_dtx;

-	/*some input/output buffer parameters */

-	unsigned char       *inputStream;

-	int			        inputSize;

-	VOAMRWBMODE  		mode;

-	VOAMRWBFRAMETYPE	frameType;

-	unsigned short      *outputStream;

-	int			        outputSize;

-	FrameStream         *stream;

-	VO_MEM_OPERATOR     *pvoMemop;

-	VO_MEM_OPERATOR     voMemoprator;

-	VO_PTR              hCheck;

-} Coder_State;

-

-typedef void* HAMRENC;

-

-#endif  //__COD_MAIN_H__

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*--------------------------------------------------------------------------*
+ *                         COD_MAIN.H                                       *
+ *--------------------------------------------------------------------------*
+ *       Static memory in the encoder				            *
+ *--------------------------------------------------------------------------*/
+#ifndef __COD_MAIN_H__
+#define __COD_MAIN_H__
+
+#include "cnst.h"                          /* coder constant parameters */
+
+#include "wb_vad.h"
+#include "dtx.h"
+#include "stream.h"
+#include "voAMRWB.h"
+
+typedef struct
+{
+    Word16 mem_decim[2 * L_FILT16k];       /* speech decimated filter memory */
+    Word16 mem_sig_in[6];                  /* hp50 filter memory */
+    Word16 mem_preemph;                    /* speech preemph filter memory */
+    Word16 old_speech[L_TOTAL - L_FRAME];  /* old speech vector at 12.8kHz */
+    Word16 old_wsp[PIT_MAX / OPL_DECIM];   /* old decimated weighted speech vector */
+    Word16 old_exc[PIT_MAX + L_INTERPOL];  /* old excitation vector */
+    Word16 mem_levinson[M + 2];            /* levinson routine memory */
+    Word16 ispold[M];                      /* old isp (immittance spectral pairs) */
+    Word16 ispold_q[M];                    /* quantized old isp */
+    Word16 past_isfq[M];                   /* past isf quantizer */
+    Word16 mem_wsp;                        /* wsp vector memory */
+    Word16 mem_decim2[3];                  /* wsp decimation filter memory */
+    Word16 mem_w0;                         /* target vector memory */
+    Word16 mem_syn[M];                     /* synthesis memory */
+    Word16 tilt_code;                      /* tilt of code */
+    Word16 old_wsp_max;                    /* old wsp maximum value */
+    Word16 old_wsp_shift;                  /* old wsp shift */
+    Word16 Q_old;                          /* old scaling factor */
+    Word16 Q_max[2];                       /* old maximum scaling factor */
+    Word16 gp_clip[2];                     /* gain of pitch clipping memory */
+    Word16 qua_gain[4];                    /* gain quantizer memory */
+
+    Word16 old_T0_med;
+    Word16 ol_gain;
+    Word16 ada_w;
+    Word16 ol_wght_flg;
+    Word16 old_ol_lag[5];
+    Word16 hp_wsp_mem[9];
+    Word16 old_hp_wsp[L_FRAME / OPL_DECIM + (PIT_MAX / OPL_DECIM)];
+    VadVars *vadSt;
+    dtx_encState *dtx_encSt;
+    Word16 first_frame;
+    Word16 isfold[M];                      /* old isf (frequency domain) */
+    Word32 L_gc_thres;                     /* threshold for noise enhancer */
+    Word16 mem_syn_hi[M];                  /* modified synthesis memory (MSB) */
+    Word16 mem_syn_lo[M];                  /* modified synthesis memory (LSB) */
+    Word16 mem_deemph;                     /* speech deemph filter memory */
+    Word16 mem_sig_out[6];                 /* hp50 filter memory for synthesis */
+    Word16 mem_hp400[6];                   /* hp400 filter memory for synthesis */
+    Word16 mem_oversamp[2 * L_FILT];       /* synthesis oversampled filter memory */
+    Word16 mem_syn_hf[M];                  /* HF synthesis memory */
+    Word16 mem_hf[2 * L_FILT16k];          /* HF band-pass filter memory */
+    Word16 mem_hf2[2 * L_FILT16k];         /* HF band-pass filter memory */
+    Word16 seed2;                          /* random memory for HF generation */
+    Word16 vad_hist;
+    Word16 gain_alpha;
+    /*  TX_State structure  */
+	Word16 sid_update_counter;
+    Word16 sid_handover_debt;
+    Word16 prev_ft;
+	Word16 allow_dtx;
+	/*some input/output buffer parameters */
+	unsigned char       *inputStream;
+	int			        inputSize;
+	VOAMRWBMODE  		mode;
+	VOAMRWBFRAMETYPE	frameType;
+	unsigned short      *outputStream;
+	int			        outputSize;
+	FrameStream         *stream;
+	VO_MEM_OPERATOR     *pvoMemop;
+	VO_MEM_OPERATOR     voMemoprator;
+	VO_PTR              hCheck;
+} Coder_State;
+
+typedef void* HAMRENC;
+
+#endif  //__COD_MAIN_H__
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/dtx.h b/media/libstagefright/codecs/amrwbenc/inc/dtx.h
index e52c2d0..0bdda67 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/dtx.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/dtx.h
@@ -1,115 +1,115 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/*--------------------------------------------------------------------------*

- *                         DTX.H					    *

- *--------------------------------------------------------------------------*

- *       Static memory, constants and frametypes for the DTX 		    *

- *--------------------------------------------------------------------------*/

-

-#ifndef __DTX_H__

-#define __DTX_H__

-

-#define DTX_MAX_EMPTY_THRESH 50

-#define DTX_HIST_SIZE 8

-#define DTX_HIST_SIZE_MIN_ONE 7

-#define DTX_ELAPSED_FRAMES_THRESH (24 + 7 -1)

-#define DTX_HANG_CONST 7                   /* yields eight frames of SP HANGOVER  */

-#define INV_MED_THRESH 14564

-#define ISF_GAP  128                       /* 50 */

-#define ONE_MINUS_ISF_GAP 16384 - ISF_GAP

-#define ISF_GAP   128

-#define ISF_DITH_GAP   448

-#define ISF_FACTOR_LOW 256

-#define ISF_FACTOR_STEP 2

-#define GAIN_THR 180

-#define GAIN_FACTOR 75

-

-typedef struct

-{

-    Word16 isf_hist[M * DTX_HIST_SIZE];

-    Word16 log_en_hist[DTX_HIST_SIZE];

-    Word16 hist_ptr;

-    Word16 log_en_index;

-    Word16 cng_seed;

-    /* DTX handler stuff */

-    Word16 dtxHangoverCount;

-    Word16 decAnaElapsedCount;

-    Word32 D[28];

-    Word32 sumD[DTX_HIST_SIZE];

-} dtx_encState;

-

-#define SPEECH 0

-#define DTX 1

-#define DTX_MUTE 2

-

-#define TX_SPEECH 0

-#define TX_SID_FIRST 1

-#define TX_SID_UPDATE 2

-#define TX_NO_DATA 3

-

-#define RX_SPEECH_GOOD 0

-#define RX_SPEECH_PROBABLY_DEGRADED 1

-#define RX_SPEECH_LOST 2

-#define RX_SPEECH_BAD 3

-#define RX_SID_FIRST 4

-#define RX_SID_UPDATE 5

-#define RX_SID_BAD 6

-#define RX_NO_DATA 7

-

-/*****************************************************************************

- *

- * DEFINITION OF DATA TYPES

- *****************************************************************************/

-

-Word16 dtx_enc_init(dtx_encState ** st, Word16 isf_init[], VO_MEM_OPERATOR *pMemOP);

-Word16 dtx_enc_reset(dtx_encState * st, Word16 isf_init[]);

-void dtx_enc_exit(dtx_encState ** st, VO_MEM_OPERATOR *pMemOP);

-

-Word16 dtx_enc(

-     dtx_encState * st,                    /* i/o : State struct                                         */

-     Word16 isf[M],                        /* o   : CN ISF vector                                        */

-     Word16 * exc2,                        /* o   : CN excitation                                        */

-     Word16 ** prms

-);

-

-Word16 dtx_buffer(

-     dtx_encState * st,                    /* i/o : State struct                    */

-     Word16 isf_new[],                     /* i   : isf vector                      */

-     Word32 enr,                           /* i   : residual energy (in L_FRAME)    */

-     Word16 codec_mode

-);

-

-void tx_dtx_handler(dtx_encState * st,     /* i/o : State struct           */

-     Word16 vad_flag,                      /* i   : vad decision           */

-     Word16 * usedMode                     /* i/o : mode changed or not    */

-);

-

-void Qisf_ns(

-     Word16 * isf1,                        /* input : ISF in the frequency domain (0..0.5) */

-     Word16 * isf_q,                       /* output: quantized ISF                        */

-     Word16 * indice                       /* output: quantization indices                 */

-);

-

-

-void Disf_ns(

-     Word16 * indice,                      /* input:  quantization indices                  */

-     Word16 * isf_q                        /* input : ISF in the frequency domain (0..0.5)  */

-);

-

-#endif  //__DTX_H__

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*--------------------------------------------------------------------------*
+ *                         DTX.H					    *
+ *--------------------------------------------------------------------------*
+ *       Static memory, constants and frametypes for the DTX 		    *
+ *--------------------------------------------------------------------------*/
+
+#ifndef __DTX_H__
+#define __DTX_H__
+
+#define DTX_MAX_EMPTY_THRESH 50
+#define DTX_HIST_SIZE 8
+#define DTX_HIST_SIZE_MIN_ONE 7
+#define DTX_ELAPSED_FRAMES_THRESH (24 + 7 -1)
+#define DTX_HANG_CONST 7                   /* yields eight frames of SP HANGOVER  */
+#define INV_MED_THRESH 14564
+#define ISF_GAP  128                       /* 50 */
+#define ONE_MINUS_ISF_GAP 16384 - ISF_GAP
+#define ISF_GAP   128
+#define ISF_DITH_GAP   448
+#define ISF_FACTOR_LOW 256
+#define ISF_FACTOR_STEP 2
+#define GAIN_THR 180
+#define GAIN_FACTOR 75
+
+typedef struct
+{
+    Word16 isf_hist[M * DTX_HIST_SIZE];
+    Word16 log_en_hist[DTX_HIST_SIZE];
+    Word16 hist_ptr;
+    Word16 log_en_index;
+    Word16 cng_seed;
+    /* DTX handler stuff */
+    Word16 dtxHangoverCount;
+    Word16 decAnaElapsedCount;
+    Word32 D[28];
+    Word32 sumD[DTX_HIST_SIZE];
+} dtx_encState;
+
+#define SPEECH 0
+#define DTX 1
+#define DTX_MUTE 2
+
+#define TX_SPEECH 0
+#define TX_SID_FIRST 1
+#define TX_SID_UPDATE 2
+#define TX_NO_DATA 3
+
+#define RX_SPEECH_GOOD 0
+#define RX_SPEECH_PROBABLY_DEGRADED 1
+#define RX_SPEECH_LOST 2
+#define RX_SPEECH_BAD 3
+#define RX_SID_FIRST 4
+#define RX_SID_UPDATE 5
+#define RX_SID_BAD 6
+#define RX_NO_DATA 7
+
+/*****************************************************************************
+ *
+ * DEFINITION OF DATA TYPES
+ *****************************************************************************/
+
+Word16 dtx_enc_init(dtx_encState ** st, Word16 isf_init[], VO_MEM_OPERATOR *pMemOP);
+Word16 dtx_enc_reset(dtx_encState * st, Word16 isf_init[]);
+void dtx_enc_exit(dtx_encState ** st, VO_MEM_OPERATOR *pMemOP);
+
+Word16 dtx_enc(
+     dtx_encState * st,                    /* i/o : State struct                                         */
+     Word16 isf[M],                        /* o   : CN ISF vector                                        */
+     Word16 * exc2,                        /* o   : CN excitation                                        */
+     Word16 ** prms
+);
+
+Word16 dtx_buffer(
+     dtx_encState * st,                    /* i/o : State struct                    */
+     Word16 isf_new[],                     /* i   : isf vector                      */
+     Word32 enr,                           /* i   : residual energy (in L_FRAME)    */
+     Word16 codec_mode
+);
+
+void tx_dtx_handler(dtx_encState * st,     /* i/o : State struct           */
+     Word16 vad_flag,                      /* i   : vad decision           */
+     Word16 * usedMode                     /* i/o : mode changed or not    */
+);
+
+void Qisf_ns(
+     Word16 * isf1,                        /* input : ISF in the frequency domain (0..0.5) */
+     Word16 * isf_q,                       /* output: quantized ISF                        */
+     Word16 * indice                       /* output: quantization indices                 */
+);
+
+
+void Disf_ns(
+     Word16 * indice,                      /* input:  quantization indices                  */
+     Word16 * isf_q                        /* input : ISF in the frequency domain (0..0.5)  */
+);
+
+#endif  //__DTX_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/grid100.tab b/media/libstagefright/codecs/amrwbenc/inc/grid100.tab
index efee18d..658d28d 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/grid100.tab
+++ b/media/libstagefright/codecs/amrwbenc/inc/grid100.tab
@@ -1,53 +1,53 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-

-/*-------------------------------------------------------------*

- *  Table for az_isp()                                         *

- *                                                             *

- * Vector grid[] is in Q15                                     *

- *                                                             *

- * grid[0] = 1.0;                                              *

- * grid[grid_points+1] = -1.0;                                 *

- * for (i = 1; i < grid_points; i++)                           *

- *   grid[i] = cos((6.283185307*i)/(2.0*grid_points));         *

- *                                                             *

- *-------------------------------------------------------------*/

-

-/* Version 101 points */

-

-#define   GRID_POINTS     100

-

-const Word16 vogrid[GRID_POINTS+1] ={

-    32767,     32751,     32703,     32622,     32509,     32364,

-    32187,     31978,     31738,     31466,     31164,     30830,

-    30466,     30072,     29649,     29196,     28714,     28204,

-    27666,     27101,     26509,     25891,     25248,     24579,

-    23886,     23170,     22431,     21669,     20887,     20083,

-    19260,     18418,     17557,     16680,     15786,     14876,

-    13951,     13013,     12062,     11099,     10125,      9141,

-     8149,      7148,      6140,      5126,      4106,      3083,

-     2057,      1029,         0,     -1029,     -2057,     -3083,

-    -4106,     -5126,     -6140,     -7148,     -8149,     -9141,

-   -10125,    -11099,    -12062,    -13013,    -13951,    -14876,

-   -15786,    -16680,    -17557,    -18418,    -19260,    -20083,

-   -20887,    -21669,    -22431,    -23170,    -23886,    -24579,

-   -25248,    -25891,    -26509,    -27101,    -27666,    -28204,

-   -28714,    -29196,    -29649,    -30072,    -30466,    -30830,

-   -31164,    -31466,    -31738,    -31978,    -32187,    -32364,

-   -32509,    -32622,    -32703,    -32751,    -32760};

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+
+/*-------------------------------------------------------------*
+ *  Table for az_isp()                                         *
+ *                                                             *
+ * Vector grid[] is in Q15                                     *
+ *                                                             *
+ * grid[0] = 1.0;                                              *
+ * grid[grid_points+1] = -1.0;                                 *
+ * for (i = 1; i < grid_points; i++)                           *
+ *   grid[i] = cos((6.283185307*i)/(2.0*grid_points));         *
+ *                                                             *
+ *-------------------------------------------------------------*/
+
+/* Version 101 points */
+
+#define   GRID_POINTS     100
+
+const Word16 vogrid[GRID_POINTS+1] ={
+    32767,     32751,     32703,     32622,     32509,     32364,
+    32187,     31978,     31738,     31466,     31164,     30830,
+    30466,     30072,     29649,     29196,     28714,     28204,
+    27666,     27101,     26509,     25891,     25248,     24579,
+    23886,     23170,     22431,     21669,     20887,     20083,
+    19260,     18418,     17557,     16680,     15786,     14876,
+    13951,     13013,     12062,     11099,     10125,      9141,
+     8149,      7148,      6140,      5126,      4106,      3083,
+     2057,      1029,         0,     -1029,     -2057,     -3083,
+    -4106,     -5126,     -6140,     -7148,     -8149,     -9141,
+   -10125,    -11099,    -12062,    -13013,    -13951,    -14876,
+   -15786,    -16680,    -17557,    -18418,    -19260,    -20083,
+   -20887,    -21669,    -22431,    -23170,    -23886,    -24579,
+   -25248,    -25891,    -26509,    -27101,    -27666,    -28204,
+   -28714,    -29196,    -29649,    -30072,    -30466,    -30830,
+   -31164,    -31466,    -31738,    -31978,    -32187,    -32364,
+   -32509,    -32622,    -32703,    -32751,    -32760};
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/ham_wind.tab b/media/libstagefright/codecs/amrwbenc/inc/ham_wind.tab
index 91f8690..560a9973 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/ham_wind.tab
+++ b/media/libstagefright/codecs/amrwbenc/inc/ham_wind.tab
@@ -1,73 +1,73 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/* Hamming_cos window for LPC analysis.                 */

-/*   Create with function hamm_cos(window,384-128,128)  */

-

-#define L_WINDOW 384

-

-const Word16 vo_window[L_WINDOW] = {

-    2621,    2622,    2626,    2632,    2640,    2650,    2662,    2677,

-    2694,    2714,    2735,    2759,    2785,    2814,    2844,    2877,

-    2912,    2949,    2989,    3031,    3075,    3121,    3169,    3220,

-    3273,    3328,    3385,    3444,    3506,    3569,    3635,    3703,

-    3773,    3845,    3919,    3996,    4074,    4155,    4237,    4321,

-    4408,    4496,    4587,    4680,    4774,    4870,    4969,    5069,

-    5171,    5275,    5381,    5489,    5599,    5710,    5824,    5939,

-    6056,    6174,    6295,    6417,    6541,    6666,    6793,    6922,

-    7052,    7185,    7318,    7453,    7590,    7728,    7868,    8009,

-    8152,    8296,    8442,    8589,    8737,    8887,    9038,    9191,

-    9344,    9499,    9655,    9813,    9971,   10131,   10292,   10454,

-   10617,   10781,   10946,   11113,   11280,   11448,   11617,   11787,

-   11958,   12130,   12303,   12476,   12650,   12825,   13001,   13178,

-   13355,   13533,   13711,   13890,   14070,   14250,   14431,   14612,

-   14793,   14975,   15158,   15341,   15524,   15708,   15891,   16076,

-   16260,   16445,   16629,   16814,   16999,   17185,   17370,   17555,

-   17740,   17926,   18111,   18296,   18481,   18666,   18851,   19036,

-   19221,   19405,   19589,   19773,   19956,   20139,   20322,   20504,

-   20686,   20867,   21048,   21229,   21408,   21588,   21767,   21945,

-   22122,   22299,   22475,   22651,   22825,   22999,   23172,   23344,

-   23516,   23686,   23856,   24025,   24192,   24359,   24525,   24689,

-   24853,   25016,   25177,   25337,   25496,   25654,   25811,   25967,

-   26121,   26274,   26426,   26576,   26725,   26873,   27019,   27164,

-   27308,   27450,   27590,   27729,   27867,   28003,   28137,   28270,

-   28401,   28531,   28659,   28785,   28910,   29033,   29154,   29274,

-   29391,   29507,   29622,   29734,   29845,   29953,   30060,   30165,

-   30268,   30370,   30469,   30566,   30662,   30755,   30847,   30936,

-   31024,   31109,   31193,   31274,   31354,   31431,   31506,   31579,

-   31651,   31719,   31786,   31851,   31914,   31974,   32032,   32088,

-   32142,   32194,   32243,   32291,   32336,   32379,   32419,   32458,

-   32494,   32528,   32560,   32589,   32617,   32642,   32664,   32685,

-   32703,   32719,   32733,   32744,   32753,   32760,   32764,   32767,

-   32767,   32765,   32757,   32745,   32727,   32705,   32678,   32646,

-   32609,   32567,   32520,   32468,   32411,   32349,   32283,   32211,

-   32135,   32054,   31968,   31877,   31781,   31681,   31575,   31465,

-   31351,   31231,   31107,   30978,   30844,   30706,   30563,   30415,

-   30263,   30106,   29945,   29779,   29609,   29434,   29255,   29071,

-   28883,   28691,   28494,   28293,   28087,   27878,   27664,   27446,

-   27224,   26997,   26767,   26533,   26294,   26052,   25806,   25555,

-   25301,   25043,   24782,   24516,   24247,   23974,   23698,   23418,

-   23134,   22847,   22557,   22263,   21965,   21665,   21361,   21054,

-   20743,   20430,   20113,   19794,   19471,   19146,   18817,   18486,

-   18152,   17815,   17476,   17134,   16789,   16442,   16092,   15740,

-   15385,   15028,   14669,   14308,   13944,   13579,   13211,   12841,

-   12470,   12096,   11721,   11344,   10965,   10584,   10202,    9819,

-    9433,    9047,    8659,    8270,    7879,    7488,    7095,    6701,

-    6306,    5910,    5514,    5116,    4718,    4319,    3919,    3519,

-    3118,    2716,    2315,    1913,    1510,    1108,     705,     302};

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/* Hamming_cos window for LPC analysis.                 */
+/*   Create with function hamm_cos(window,384-128,128)  */
+
+#define L_WINDOW 384
+
+const Word16 vo_window[L_WINDOW] = {
+    2621,    2622,    2626,    2632,    2640,    2650,    2662,    2677,
+    2694,    2714,    2735,    2759,    2785,    2814,    2844,    2877,
+    2912,    2949,    2989,    3031,    3075,    3121,    3169,    3220,
+    3273,    3328,    3385,    3444,    3506,    3569,    3635,    3703,
+    3773,    3845,    3919,    3996,    4074,    4155,    4237,    4321,
+    4408,    4496,    4587,    4680,    4774,    4870,    4969,    5069,
+    5171,    5275,    5381,    5489,    5599,    5710,    5824,    5939,
+    6056,    6174,    6295,    6417,    6541,    6666,    6793,    6922,
+    7052,    7185,    7318,    7453,    7590,    7728,    7868,    8009,
+    8152,    8296,    8442,    8589,    8737,    8887,    9038,    9191,
+    9344,    9499,    9655,    9813,    9971,   10131,   10292,   10454,
+   10617,   10781,   10946,   11113,   11280,   11448,   11617,   11787,
+   11958,   12130,   12303,   12476,   12650,   12825,   13001,   13178,
+   13355,   13533,   13711,   13890,   14070,   14250,   14431,   14612,
+   14793,   14975,   15158,   15341,   15524,   15708,   15891,   16076,
+   16260,   16445,   16629,   16814,   16999,   17185,   17370,   17555,
+   17740,   17926,   18111,   18296,   18481,   18666,   18851,   19036,
+   19221,   19405,   19589,   19773,   19956,   20139,   20322,   20504,
+   20686,   20867,   21048,   21229,   21408,   21588,   21767,   21945,
+   22122,   22299,   22475,   22651,   22825,   22999,   23172,   23344,
+   23516,   23686,   23856,   24025,   24192,   24359,   24525,   24689,
+   24853,   25016,   25177,   25337,   25496,   25654,   25811,   25967,
+   26121,   26274,   26426,   26576,   26725,   26873,   27019,   27164,
+   27308,   27450,   27590,   27729,   27867,   28003,   28137,   28270,
+   28401,   28531,   28659,   28785,   28910,   29033,   29154,   29274,
+   29391,   29507,   29622,   29734,   29845,   29953,   30060,   30165,
+   30268,   30370,   30469,   30566,   30662,   30755,   30847,   30936,
+   31024,   31109,   31193,   31274,   31354,   31431,   31506,   31579,
+   31651,   31719,   31786,   31851,   31914,   31974,   32032,   32088,
+   32142,   32194,   32243,   32291,   32336,   32379,   32419,   32458,
+   32494,   32528,   32560,   32589,   32617,   32642,   32664,   32685,
+   32703,   32719,   32733,   32744,   32753,   32760,   32764,   32767,
+   32767,   32765,   32757,   32745,   32727,   32705,   32678,   32646,
+   32609,   32567,   32520,   32468,   32411,   32349,   32283,   32211,
+   32135,   32054,   31968,   31877,   31781,   31681,   31575,   31465,
+   31351,   31231,   31107,   30978,   30844,   30706,   30563,   30415,
+   30263,   30106,   29945,   29779,   29609,   29434,   29255,   29071,
+   28883,   28691,   28494,   28293,   28087,   27878,   27664,   27446,
+   27224,   26997,   26767,   26533,   26294,   26052,   25806,   25555,
+   25301,   25043,   24782,   24516,   24247,   23974,   23698,   23418,
+   23134,   22847,   22557,   22263,   21965,   21665,   21361,   21054,
+   20743,   20430,   20113,   19794,   19471,   19146,   18817,   18486,
+   18152,   17815,   17476,   17134,   16789,   16442,   16092,   15740,
+   15385,   15028,   14669,   14308,   13944,   13579,   13211,   12841,
+   12470,   12096,   11721,   11344,   10965,   10584,   10202,    9819,
+    9433,    9047,    8659,    8270,    7879,    7488,    7095,    6701,
+    6306,    5910,    5514,    5116,    4718,    4319,    3919,    3519,
+    3118,    2716,    2315,    1913,    1510,    1108,     705,     302};
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/homing.tab b/media/libstagefright/codecs/amrwbenc/inc/homing.tab
index 2963da7..edcccdd 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/homing.tab
+++ b/media/libstagefright/codecs/amrwbenc/inc/homing.tab
@@ -1,123 +1,123 @@
-

-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-

-#define DHF_PARMS_MAX 32               /* homing frame pattern  */

-#define NUM_OF_SPMODES 9

-

-#define PRML 15

-#define PRMN_7k NBBITS_7k/PRML + 1

-#define PRMN_9k NBBITS_9k/PRML + 1

-#define PRMN_12k NBBITS_12k/PRML + 1

-#define PRMN_14k NBBITS_14k/PRML + 1

-#define PRMN_16k NBBITS_16k/PRML + 1

-#define PRMN_18k NBBITS_18k/PRML + 1

-#define PRMN_20k NBBITS_20k/PRML + 1

-#define PRMN_23k NBBITS_23k/PRML + 1

-#define PRMN_24k NBBITS_24k/PRML + 1

-

-static const Word16 dfh_M7k[PRMN_7k] =

-{

-  3168, 29954, 29213, 16121, 

-	64, 13440, 30624, 16430, 

- 19008

-};

-

-static const Word16 dfh_M9k[PRMN_9k] =

-{

-   3168, 31665,  9943, 9123, 

-  15599,  4358, 20248, 2048, 

-  17040, 27787, 16816, 13888

-};

-

-static const Word16 dfh_M12k[PRMN_12k] =

-{

-  3168, 31665,  9943,  9128, 

-  3647,  8129, 30930, 27926, 

- 18880, 12319,   496,  1042, 

-  4061, 20446, 25629, 28069, 

- 13948

-};

-

-static const Word16 dfh_M14k[PRMN_14k] =

-{

-    3168, 31665,  9943,  9131, 

-   24815,   655, 26616, 26764, 

-    7238, 19136,  6144,    88, 

-	4158, 25733, 30567, 30494, 

-	221, 20321, 17823

-};

-

-static const Word16 dfh_M16k[PRMN_16k] =

-{

-    3168, 31665,  9943,  9131, 

-   24815,   700,  3824,  7271, 

-   26400,  9528,  6594, 26112, 

-     108,  2068, 12867, 16317, 

-   23035, 24632,  7528,  1752, 

-    6759, 24576

-};

-

-static const Word16 dfh_M18k[PRMN_18k] =

-{

-     3168, 31665,  9943,  9135, 

-	14787, 14423, 30477, 24927, 

-	25345, 30154,   916,  5728, 

-	18978,  2048,   528, 16449, 

-	 2436,  3581, 23527, 29479, 

-	 8237, 16810, 27091, 19052, 

-	    0

-};

-

-static const Word16 dfh_M20k[PRMN_20k] =

-{

-     3168, 31665,  9943,  9129, 

-	 8637, 31807, 24646,   736, 

-	28643,  2977,  2566, 25564, 

-	12930, 13960,  2048,   834, 

-	 3270,  4100, 26920, 16237, 

-	31227, 17667, 15059, 20589, 

-	30249, 29123, 0

-};

-

-static const Word16 dfh_M23k[PRMN_23k] =

-{

-	 3168, 31665,  9943,  9132, 

-	16748,  3202, 28179, 16317, 

-	30590, 15857, 19960,  8818, 

-	21711, 21538,  4260, 16690, 

-	20224,  3666,  4194,  9497, 

-	16320, 15388,  5755, 31551, 

-	14080,  3574, 15932,    50, 

-	23392, 26053, 31216

-};

-

-static const Word16 dfh_M24k[PRMN_24k] =

-{

-	 3168, 31665,  9943,  9134, 

-	24776,  5857, 18475, 28535, 

-	29662, 14321, 16725,  4396, 

-	29353, 10003, 17068, 20504, 

-	  720,     0,  8465, 12581, 

-	28863, 24774,  9709, 26043, 

-	 7941, 27649, 13965, 15236, 

-	18026, 22047, 16681,  3968

-};

-

-

-

+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+
+#define DHF_PARMS_MAX 32               /* homing frame pattern  */
+#define NUM_OF_SPMODES 9
+
+#define PRML 15
+#define PRMN_7k NBBITS_7k/PRML + 1
+#define PRMN_9k NBBITS_9k/PRML + 1
+#define PRMN_12k NBBITS_12k/PRML + 1
+#define PRMN_14k NBBITS_14k/PRML + 1
+#define PRMN_16k NBBITS_16k/PRML + 1
+#define PRMN_18k NBBITS_18k/PRML + 1
+#define PRMN_20k NBBITS_20k/PRML + 1
+#define PRMN_23k NBBITS_23k/PRML + 1
+#define PRMN_24k NBBITS_24k/PRML + 1
+
+static const Word16 dfh_M7k[PRMN_7k] =
+{
+  3168, 29954, 29213, 16121, 
+	64, 13440, 30624, 16430, 
+ 19008
+};
+
+static const Word16 dfh_M9k[PRMN_9k] =
+{
+   3168, 31665,  9943, 9123, 
+  15599,  4358, 20248, 2048, 
+  17040, 27787, 16816, 13888
+};
+
+static const Word16 dfh_M12k[PRMN_12k] =
+{
+  3168, 31665,  9943,  9128, 
+  3647,  8129, 30930, 27926, 
+ 18880, 12319,   496,  1042, 
+  4061, 20446, 25629, 28069, 
+ 13948
+};
+
+static const Word16 dfh_M14k[PRMN_14k] =
+{
+    3168, 31665,  9943,  9131, 
+   24815,   655, 26616, 26764, 
+    7238, 19136,  6144,    88, 
+	4158, 25733, 30567, 30494, 
+	221, 20321, 17823
+};
+
+static const Word16 dfh_M16k[PRMN_16k] =
+{
+    3168, 31665,  9943,  9131, 
+   24815,   700,  3824,  7271, 
+   26400,  9528,  6594, 26112, 
+     108,  2068, 12867, 16317, 
+   23035, 24632,  7528,  1752, 
+    6759, 24576
+};
+
+static const Word16 dfh_M18k[PRMN_18k] =
+{
+     3168, 31665,  9943,  9135, 
+	14787, 14423, 30477, 24927, 
+	25345, 30154,   916,  5728, 
+	18978,  2048,   528, 16449, 
+	 2436,  3581, 23527, 29479, 
+	 8237, 16810, 27091, 19052, 
+	    0
+};
+
+static const Word16 dfh_M20k[PRMN_20k] =
+{
+     3168, 31665,  9943,  9129, 
+	 8637, 31807, 24646,   736, 
+	28643,  2977,  2566, 25564, 
+	12930, 13960,  2048,   834, 
+	 3270,  4100, 26920, 16237, 
+	31227, 17667, 15059, 20589, 
+	30249, 29123, 0
+};
+
+static const Word16 dfh_M23k[PRMN_23k] =
+{
+	 3168, 31665,  9943,  9132, 
+	16748,  3202, 28179, 16317, 
+	30590, 15857, 19960,  8818, 
+	21711, 21538,  4260, 16690, 
+	20224,  3666,  4194,  9497, 
+	16320, 15388,  5755, 31551, 
+	14080,  3574, 15932,    50, 
+	23392, 26053, 31216
+};
+
+static const Word16 dfh_M24k[PRMN_24k] =
+{
+	 3168, 31665,  9943,  9134, 
+	24776,  5857, 18475, 28535, 
+	29662, 14321, 16725,  4396, 
+	29353, 10003, 17068, 20504, 
+	  720,     0,  8465, 12581, 
+	28863, 24774,  9709, 26043, 
+	 7941, 27649, 13965, 15236, 
+	18026, 22047, 16681,  3968
+};
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/isp_isf.tab b/media/libstagefright/codecs/amrwbenc/inc/isp_isf.tab
index ff20e38..2322845 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/isp_isf.tab
+++ b/media/libstagefright/codecs/amrwbenc/inc/isp_isf.tab
@@ -1,62 +1,62 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/*-----------------------------------------------------*

- | Tables for function Isf_isp() and Isp_isf()         |

- *-----------------------------------------------------*/

-

-/* table of cos(x) in Q15 */

-

-const static Word16 table[129] = {

-  32767,

-  32758,  32729,  32679,  32610,  32522,  32413,  32286,  32138,

-  31972,  31786,  31581,  31357,  31114,  30853,  30572,  30274,

-  29957,  29622,  29269,  28899,  28511,  28106,  27684,  27246,

-  26791,  26320,  25833,  25330,  24812,  24279,  23732,  23170,

-  22595,  22006,  21403,  20788,  20160,  19520,  18868,  18205,

-  17531,  16846,  16151,  15447,  14733,  14010,  13279,  12540,

-  11793,  11039,  10279,   9512,   8740,   7962,   7180,   6393,

-   5602,   4808,   4011,   3212,   2411,   1608,    804,      0,

-   -804,  -1608,  -2411,  -3212,  -4011,  -4808,  -5602,  -6393,

-  -7180,  -7962,  -8740,  -9512, -10279, -11039, -11793, -12540,

- -13279, -14010, -14733, -15447, -16151, -16846, -17531, -18205,

- -18868, -19520, -20160, -20788, -21403, -22006, -22595, -23170,

- -23732, -24279, -24812, -25330, -25833, -26320, -26791, -27246,

- -27684, -28106, -28511, -28899, -29269, -29622, -29957, -30274,

- -30572, -30853, -31114, -31357, -31581, -31786, -31972, -32138,

- -32286, -32413, -32522, -32610, -32679, -32729, -32758, -32768};

-

-/* slope in Q11 used to compute y = acos(x) */

-

-const static Word16 slope[128] = { 

- -26214, -9039, -5243, -3799, -2979, -2405, -2064, -1771,

- -1579, -1409, -1279, -1170, -1079, -1004, -933, -880,

- -827, -783, -743, -708, -676, -647, -621, -599,

- -576, -557, -538, -521, -506, -492, -479, -466,

- -456, -445, -435, -426, -417, -410, -402, -395,

- -389, -383, -377, -372, -367, -363, -359, -355,

- -351, -348, -345, -342, -340, -337, -335, -333,

- -331, -330, -329, -328, -327, -326, -326, -326,

- -326, -326, -326, -327, -328, -329, -330, -331,

- -333, -335, -337, -340, -342, -345, -348, -351,

- -355, -359, -363, -367, -372, -377, -383, -389,

- -395, -402, -410, -417, -426, -435, -445, -456,

- -466, -479, -492, -506, -521, -538, -557, -576,

- -599, -621, -647, -676, -708, -743, -783, -827,

- -880, -933, -1004, -1079, -1170, -1279, -1409, -1579,

- -1771, -2064, -2405, -2979, -3799, -5243, -9039, -26214};

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*-----------------------------------------------------*
+ | Tables for function Isf_isp() and Isp_isf()         |
+ *-----------------------------------------------------*/
+
+/* table of cos(x) in Q15 */
+
+const static Word16 table[129] = {
+  32767,
+  32758,  32729,  32679,  32610,  32522,  32413,  32286,  32138,
+  31972,  31786,  31581,  31357,  31114,  30853,  30572,  30274,
+  29957,  29622,  29269,  28899,  28511,  28106,  27684,  27246,
+  26791,  26320,  25833,  25330,  24812,  24279,  23732,  23170,
+  22595,  22006,  21403,  20788,  20160,  19520,  18868,  18205,
+  17531,  16846,  16151,  15447,  14733,  14010,  13279,  12540,
+  11793,  11039,  10279,   9512,   8740,   7962,   7180,   6393,
+   5602,   4808,   4011,   3212,   2411,   1608,    804,      0,
+   -804,  -1608,  -2411,  -3212,  -4011,  -4808,  -5602,  -6393,
+  -7180,  -7962,  -8740,  -9512, -10279, -11039, -11793, -12540,
+ -13279, -14010, -14733, -15447, -16151, -16846, -17531, -18205,
+ -18868, -19520, -20160, -20788, -21403, -22006, -22595, -23170,
+ -23732, -24279, -24812, -25330, -25833, -26320, -26791, -27246,
+ -27684, -28106, -28511, -28899, -29269, -29622, -29957, -30274,
+ -30572, -30853, -31114, -31357, -31581, -31786, -31972, -32138,
+ -32286, -32413, -32522, -32610, -32679, -32729, -32758, -32768};
+
+/* slope in Q11 used to compute y = acos(x) */
+
+const static Word16 slope[128] = { 
+ -26214, -9039, -5243, -3799, -2979, -2405, -2064, -1771,
+ -1579, -1409, -1279, -1170, -1079, -1004, -933, -880,
+ -827, -783, -743, -708, -676, -647, -621, -599,
+ -576, -557, -538, -521, -506, -492, -479, -466,
+ -456, -445, -435, -426, -417, -410, -402, -395,
+ -389, -383, -377, -372, -367, -363, -359, -355,
+ -351, -348, -345, -342, -340, -337, -335, -333,
+ -331, -330, -329, -328, -327, -326, -326, -326,
+ -326, -326, -326, -327, -328, -329, -330, -331,
+ -333, -335, -337, -340, -342, -345, -348, -351,
+ -355, -359, -363, -367, -372, -377, -383, -389,
+ -395, -402, -410, -417, -426, -435, -445, -456,
+ -466, -479, -492, -506, -521, -538, -557, -576,
+ -599, -621, -647, -676, -708, -743, -783, -827,
+ -880, -933, -1004, -1079, -1170, -1279, -1409, -1579,
+ -1771, -2064, -2405, -2979, -3799, -5243, -9039, -26214};
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/lag_wind.tab b/media/libstagefright/codecs/amrwbenc/inc/lag_wind.tab
index 4175d66..9c73357 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/lag_wind.tab
+++ b/media/libstagefright/codecs/amrwbenc/inc/lag_wind.tab
@@ -1,81 +1,81 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/*-----------------------------------------------------*

- | Table of lag_window for autocorrelation.            |

- | noise floor = 1.0001   = (0.9999  on r[1] ..r[16])  |

- | Bandwidth expansion = 60 Hz                         |

- | Sampling frequency  = 12800 Hz                      |

- |                                                     |

- | Special double precision format. See "math_op.c"    |

- |                                                     |

- | lag_wind[0] =  1.00000000    (not stored)           |

- | lag_wind[1] =  0.99946642                           |

- | lag_wind[2] =  0.99816680                           |

- | lag_wind[3] =  0.99600452                           |

- | lag_wind[4] =  0.99298513                           |

- | lag_wind[5] =  0.98911655                           |

- | lag_wind[6] =  0.98440880                           |

- | lag_wind[7] =  0.97887397                           |

- | lag_wind[8] =  0.97252619                           |

- | lag_wind[9] =  0.96538186                           |

- | lag_wind[10]=  0.95745903                           |

- | lag_wind[11]=  0.94877797                           |

- | lag_wind[12]=  0.93936038                           |

- | lag_wind[13]=  0.92922986                           |

- | lag_wind[14]=  0.91841155                           |

- | lag_wind[15]=  0.90693212                           |

- | lag_wind[16]=  0.89481968                           |

- ------------------------------------------------------*/

-

-#define M 16

-

-static Word16 volag_h[M] = {

-      32750,

-      32707,

-      32637,

-      32538,

-      32411,

-      32257,

-      32075,

-      31867,

-      31633,

-      31374,

-      31089,

-      30780,

-      30449,

-      30094,

-      29718,

-      29321};

-

-static Word16 volag_l[M] = {

-      16896,

-      30464,

-       2496,

-       4480,

-      12160,

-       3520,

-      24320,

-      24192,

-      20736,

-        576,

-      18240,

-      31488,

-        128,

-      16704,

-      11520,

-      14784};

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*-----------------------------------------------------*
+ | Table of lag_window for autocorrelation.            |
+ | noise floor = 1.0001   = (0.9999  on r[1] ..r[16])  |
+ | Bandwidth expansion = 60 Hz                         |
+ | Sampling frequency  = 12800 Hz                      |
+ |                                                     |
+ | Special double precision format. See "math_op.c"    |
+ |                                                     |
+ | lag_wind[0] =  1.00000000    (not stored)           |
+ | lag_wind[1] =  0.99946642                           |
+ | lag_wind[2] =  0.99816680                           |
+ | lag_wind[3] =  0.99600452                           |
+ | lag_wind[4] =  0.99298513                           |
+ | lag_wind[5] =  0.98911655                           |
+ | lag_wind[6] =  0.98440880                           |
+ | lag_wind[7] =  0.97887397                           |
+ | lag_wind[8] =  0.97252619                           |
+ | lag_wind[9] =  0.96538186                           |
+ | lag_wind[10]=  0.95745903                           |
+ | lag_wind[11]=  0.94877797                           |
+ | lag_wind[12]=  0.93936038                           |
+ | lag_wind[13]=  0.92922986                           |
+ | lag_wind[14]=  0.91841155                           |
+ | lag_wind[15]=  0.90693212                           |
+ | lag_wind[16]=  0.89481968                           |
+ ------------------------------------------------------*/
+
+#define M 16
+
+static Word16 volag_h[M] = {
+      32750,
+      32707,
+      32637,
+      32538,
+      32411,
+      32257,
+      32075,
+      31867,
+      31633,
+      31374,
+      31089,
+      30780,
+      30449,
+      30094,
+      29718,
+      29321};
+
+static Word16 volag_l[M] = {
+      16896,
+      30464,
+       2496,
+       4480,
+      12160,
+       3520,
+      24320,
+      24192,
+      20736,
+        576,
+      18240,
+      31488,
+        128,
+      16704,
+      11520,
+      14784};
diff --git a/media/libstagefright/codecs/amrwbenc/inc/log2.h b/media/libstagefright/codecs/amrwbenc/inc/log2.h
index 91bdbec..6a35019 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/log2.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/log2.h
@@ -1,62 +1,62 @@
-

-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/********************************************************************************

-*

-*      File             : log2.h

-*      Purpose          : Computes log2(L_x)

-*

-********************************************************************************

-*/

-#ifndef __LOG2_H__

-#define __LOG2_H__

- 

-/*

-********************************************************************************

-*                         INCLUDE FILES

-********************************************************************************

-*/

-#include "typedef.h"

- 

-/*

-********************************************************************************

-*                         DEFINITION OF DATA TYPES

-********************************************************************************

-*/

- 

-/*

-********************************************************************************

-*                         DECLARATION OF PROTOTYPES

-********************************************************************************

-*/

-void Log2 (

-		Word32 L_x,        /* (i) : input value                                 */

-		Word16 *exponent,  /* (o) : Integer part of Log2.   (range: 0<=val<=30) */

-		Word16 *fraction   /* (o) : Fractional part of Log2. (range: 0<=val<1)*/

-	  );

-

-void Log2_norm (

-		Word32 L_x,         /* (i) : input value (normalized)                    */

-		Word16 exp,         /* (i) : norm_l (L_x)                                */

-		Word16 *exponent,   /* (o) : Integer part of Log2.   (range: 0<=val<=30) */

-		Word16 *fraction    /* (o) : Fractional part of Log2. (range: 0<=val<1)  */

-	       );

-

-#endif  //__LOG2_H__

-

-

+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/********************************************************************************
+*
+*      File             : log2.h
+*      Purpose          : Computes log2(L_x)
+*
+********************************************************************************
+*/
+#ifndef __LOG2_H__
+#define __LOG2_H__
+ 
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include "typedef.h"
+ 
+/*
+********************************************************************************
+*                         DEFINITION OF DATA TYPES
+********************************************************************************
+*/
+ 
+/*
+********************************************************************************
+*                         DECLARATION OF PROTOTYPES
+********************************************************************************
+*/
+void Log2 (
+		Word32 L_x,        /* (i) : input value                                 */
+		Word16 *exponent,  /* (o) : Integer part of Log2.   (range: 0<=val<=30) */
+		Word16 *fraction   /* (o) : Fractional part of Log2. (range: 0<=val<1)*/
+	  );
+
+void Log2_norm (
+		Word32 L_x,         /* (i) : input value (normalized)                    */
+		Word16 exp,         /* (i) : norm_l (L_x)                                */
+		Word16 *exponent,   /* (o) : Integer part of Log2.   (range: 0<=val<=30) */
+		Word16 *fraction    /* (o) : Fractional part of Log2. (range: 0<=val<1)  */
+	       );
+
+#endif  //__LOG2_H__
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/log2_tab.h b/media/libstagefright/codecs/amrwbenc/inc/log2_tab.h
index 7761ae6..85fa73c 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/log2_tab.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/log2_tab.h
@@ -1,35 +1,35 @@
-

-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-

-/*******************************************************************************

-*

-*      File             : log2.tab

-*      Purpose          : Table for routine Log2().

-*      $Id $

-*

-********************************************************************************

-*/

-static const Word16 table[33] =

-{

-    0, 1455, 2866, 4236, 5568, 6863, 8124, 9352, 10549, 11716,

-    12855, 13967, 15054, 16117, 17156, 18172, 19167, 20142, 21097, 22033,

-    22951, 23852, 24735, 25603, 26455, 27291, 28113, 28922, 29716, 30497,

-    31266, 32023, 32767

-};

-

+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+
+/*******************************************************************************
+*
+*      File             : log2.tab
+*      Purpose          : Table for routine Log2().
+*      $Id $
+*
+********************************************************************************
+*/
+static const Word16 table[33] =
+{
+    0, 1455, 2866, 4236, 5568, 6863, 8124, 9352, 10549, 11716,
+    12855, 13967, 15054, 16117, 17156, 18172, 19167, 20142, 21097, 22033,
+    22951, 23852, 24735, 25603, 26455, 27291, 28113, 28922, 29716, 30497,
+    31266, 32023, 32767
+};
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/main.h b/media/libstagefright/codecs/amrwbenc/inc/main.h
index d7e7c67..3a6f963 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/main.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/main.h
@@ -1,45 +1,45 @@
-

-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/*--------------------------------------------------------------------------*

- *                         MAIN.H	                                    *

- *--------------------------------------------------------------------------*

- *       Main functions							    *

- *--------------------------------------------------------------------------*/

-

-#ifndef __MAIN_H__

-#define __MAIN_H__

-

-void coder(

-     Word16 * mode,                        /* input :  used mode                             */

-     Word16 speech16k[],                   /* input :  320 new speech samples (at 16 kHz)    */

-     Word16 prms[],                        /* output:  output parameters           */

-     Word16 * ser_size,                    /* output:  bit rate of the used mode   */

-     void *spe_state,                      /* i/o   :  State structure                       */

-     Word16 allow_dtx                      /* input :  DTX ON/OFF                            */

-);

-

-

-

-void Reset_encoder(void *st, Word16 reset_all);

-

-

-Word16 encoder_homing_frame_test(Word16 input_frame[]);

-

-#endif //__MAIN_H__

-

+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*--------------------------------------------------------------------------*
+ *                         MAIN.H	                                    *
+ *--------------------------------------------------------------------------*
+ *       Main functions							    *
+ *--------------------------------------------------------------------------*/
+
+#ifndef __MAIN_H__
+#define __MAIN_H__
+
+void coder(
+     Word16 * mode,                        /* input :  used mode                             */
+     Word16 speech16k[],                   /* input :  320 new speech samples (at 16 kHz)    */
+     Word16 prms[],                        /* output:  output parameters           */
+     Word16 * ser_size,                    /* output:  bit rate of the used mode   */
+     void *spe_state,                      /* i/o   :  State structure                       */
+     Word16 allow_dtx                      /* input :  DTX ON/OFF                            */
+);
+
+
+
+void Reset_encoder(void *st, Word16 reset_all);
+
+
+Word16 encoder_homing_frame_test(Word16 input_frame[]);
+
+#endif //__MAIN_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/math_op.h b/media/libstagefright/codecs/amrwbenc/inc/math_op.h
index 25e29f7..7b6196b 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/math_op.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/math_op.h
@@ -1,55 +1,55 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/*--------------------------------------------------------------------------*

- *                         MATH_OP.H	                                    *

- *--------------------------------------------------------------------------*

- *       Mathematical operations					    *

- *--------------------------------------------------------------------------*/

-

-#ifndef __MATH_OP_H__

-#define __MATH_OP_H__

-

-Word32 Isqrt(                              /* (o) Q31 : output value (range: 0<=val<1)         */

-		Word32 L_x                            /* (i) Q0  : input value  (range: 0<=val<=7fffffff) */

-	    );

-

-void Isqrt_n(

-		Word32 * frac,                        /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */

-		Word16 * exp                          /* (i/o)    : exponent (value = frac x 2^exponent) */

-	    );

-

-Word32 Pow2(                               /* (o) Q0  : result       (range: 0<=val<=0x7fffffff) */

-		Word16 exponant,                      /* (i) Q0  : Integer part.      (range: 0<=val<=30)   */

-		Word16 fraction                       /* (i) Q15 : Fractionnal part.  (range: 0.0<=val<1.0) */

-	   );

-

-Word32 Dot_product12(                      /* (o) Q31: normalized result (1 < val <= -1) */

-		Word16 x[],                           /* (i) 12bits: x vector                       */

-		Word16 y[],                           /* (i) 12bits: y vector                       */

-		Word16 lg,                            /* (i)    : vector length                     */

-		Word16 * exp                          /* (o)    : exponent of result (0..+30)       */

-		);

-

-Word32 Dot_product12_asm(                      /* (o) Q31: normalized result (1 < val <= -1) */

-		Word16 x[],                           /* (i) 12bits: x vector                       */

-		Word16 y[],                           /* (i) 12bits: y vector                       */

-		Word16 lg,                            /* (i)    : vector length                     */

-		Word16 * exp                          /* (o)    : exponent of result (0..+30)       */

-		);

-#endif //__MATH_OP_H__

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*--------------------------------------------------------------------------*
+ *                         MATH_OP.H	                                    *
+ *--------------------------------------------------------------------------*
+ *       Mathematical operations					    *
+ *--------------------------------------------------------------------------*/
+
+#ifndef __MATH_OP_H__
+#define __MATH_OP_H__
+
+Word32 Isqrt(                              /* (o) Q31 : output value (range: 0<=val<1)         */
+		Word32 L_x                            /* (i) Q0  : input value  (range: 0<=val<=7fffffff) */
+	    );
+
+void Isqrt_n(
+		Word32 * frac,                        /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */
+		Word16 * exp                          /* (i/o)    : exponent (value = frac x 2^exponent) */
+	    );
+
+Word32 Pow2(                               /* (o) Q0  : result       (range: 0<=val<=0x7fffffff) */
+		Word16 exponant,                      /* (i) Q0  : Integer part.      (range: 0<=val<=30)   */
+		Word16 fraction                       /* (i) Q15 : Fractionnal part.  (range: 0.0<=val<1.0) */
+	   );
+
+Word32 Dot_product12(                      /* (o) Q31: normalized result (1 < val <= -1) */
+		Word16 x[],                           /* (i) 12bits: x vector                       */
+		Word16 y[],                           /* (i) 12bits: y vector                       */
+		Word16 lg,                            /* (i)    : vector length                     */
+		Word16 * exp                          /* (o)    : exponent of result (0..+30)       */
+		);
+
+Word32 Dot_product12_asm(                      /* (o) Q31: normalized result (1 < val <= -1) */
+		Word16 x[],                           /* (i) 12bits: x vector                       */
+		Word16 y[],                           /* (i) 12bits: y vector                       */
+		Word16 lg,                            /* (i)    : vector length                     */
+		Word16 * exp                          /* (o)    : exponent of result (0..+30)       */
+		);
+#endif //__MATH_OP_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/mem_align.h b/media/libstagefright/codecs/amrwbenc/inc/mem_align.h
index d6ddec3..442786a1 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/mem_align.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/mem_align.h
@@ -1,35 +1,35 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		mem_align.h

-

-	Content:	Memory alloc alignments functions

-

-*******************************************************************************/

-

-#ifndef __VO_MEM_ALIGN_H__

-#define __VO_MEM_ALIGN_H__

-

-#include "voMem.h"

-#include "typedef.h"

-

-extern void *mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID);

-extern void mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID);

-

-#endif	/* __VO_MEM_ALIGN_H__ */

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		mem_align.h
+
+	Content:	Memory alloc alignments functions
+
+*******************************************************************************/
+
+#ifndef __VO_MEM_ALIGN_H__
+#define __VO_MEM_ALIGN_H__
+
+#include "voMem.h"
+#include "typedef.h"
+
+extern void *mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID);
+extern void mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID);
+
+#endif	/* __VO_MEM_ALIGN_H__ */
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/mime_io.tab b/media/libstagefright/codecs/amrwbenc/inc/mime_io.tab
index ffc86a1..5f85dd0 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/mime_io.tab
+++ b/media/libstagefright/codecs/amrwbenc/inc/mime_io.tab
@@ -1,368 +1,368 @@
-

-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-#include <stdio.h>

-#include "typedef.h"

-

-static UWord8 toc_byte[16] = {0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x34, 0x3C,

-                              0x44, 0x4C, 0x54, 0x5C, 0x64, 0x6C, 0x74, 0x7C};

-

-/* number of speech bits for all modes */

-static Word16 unpacked_size[16] = {132,  177, 253, 285, 317, 365, 397, 461,

-                                   477,   35,   0,   0,   0,   0,   0,   0};

-

-/* size of packed frame for each mode, excluding TOC byte */

-static Word16 packed_size[16] = {17, 23, 32, 36, 40, 46, 50, 58,

-                                 60,  5,  0,  0,  0,  0,  0,  0};

-

-/* number of unused speech bits in packed format for each mode */

-static Word16 unused_size[16] = {4, 7, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0};

-

-/* sorting tables for all modes */

-

-static Word16 sort_660[132] = {

-     0,   5,   6,   7,  61,  84, 107, 130,  62,  85,

-     8,   4,  37,  38,  39,  40,  58,  81, 104, 127,

-    60,  83, 106, 129, 108, 131, 128,  41,  42,  80,

-   126,   1,   3,  57, 103,  82, 105,  59,   2,  63,

-   109, 110,  86,  19,  22,  23,  64,  87,  18,  20,

-    21,  17,  13,  88,  43,  89,  65, 111,  14,  24,

-    25,  26,  27,  28,  15,  16,  44,  90,  66, 112,

-     9,  11,  10,  12,  67, 113,  29,  30,  31,  32,

-    34,  33,  35,  36,  45,  51,  68,  74,  91,  97,

-   114, 120,  46,  69,  92, 115,  52,  75,  98, 121,

-    47,  70,  93, 116,  53,  76,  99, 122,  48,  71,

-    94, 117,  54,  77, 100, 123,  49,  72,  95, 118,

-    55,  78, 101, 124,  50,  73,  96, 119,  56,  79,

-   102, 125

-};

-

-static Word16 sort_885[177] = {

-     0,   4,   6,   7,   5,   3,  47,  48,  49, 112,

-   113, 114,  75, 106, 140, 171,  80, 111, 145, 176,

-    77, 108, 142, 173,  78, 109, 143, 174,  79, 110,

-   144, 175,  76, 107, 141, 172,  50, 115,  51,   2,

-     1,  81, 116, 146,  19,  21,  12,  17,  18,  20,

-    16,  25,  13,  10,  14,  24,  23,  22,  26,   8,

-    15,  52, 117,  31,  82, 147,   9,  33,  11,  83,

-   148,  53, 118,  28,  27,  84, 149,  34,  35,  29,

-    46,  32,  30,  54, 119,  37,  36,  39,  38,  40,

-    85, 150,  41,  42,  43,  44,  45,  55,  60,  65,

-    70,  86,  91,  96, 101, 120, 125, 130, 135, 151,

-   156, 161, 166,  56,  87, 121, 152,  61,  92, 126,

-   157,  66,  97, 131, 162,  71, 102, 136, 167,  57,

-    88, 122, 153,  62,  93, 127, 158,  67,  98, 132,

-   163,  72, 103, 137, 168,  58,  89, 123, 154,  63,

-    94, 128, 159,  68,  99, 133, 164,  73, 104, 138,

-   169,  59,  90, 124, 155,  64,  95, 129, 160,  69,

-   100, 134, 165,  74, 105, 139, 170

-};

-

-static Word16 sort_1265[253] = {

-     0,   4,   6,  93, 143, 196, 246,   7,   5,   3,

-    47,  48,  49,  50,  51, 150, 151, 152, 153, 154,

-    94, 144, 197, 247,  99, 149, 202, 252,  96, 146,

-   199, 249,  97, 147, 200, 250, 100, 203,  98, 148,

-   201, 251,  95, 145, 198, 248,  52,   2,   1, 101,

-   204, 155,  19,  21,  12,  17,  18,  20,  16,  25,

-    13,  10,  14,  24,  23,  22,  26,   8,  15,  53,

-   156,  31, 102, 205,   9,  33,  11, 103, 206,  54,

-   157,  28,  27, 104, 207,  34,  35,  29,  46,  32,

-    30,  55, 158,  37,  36,  39,  38,  40, 105, 208,

-    41,  42,  43,  44,  45,  56, 106, 159, 209,  57,

-    66,  75,  84, 107, 116, 125, 134, 160, 169, 178,

-   187, 210, 219, 228, 237,  58, 108, 161, 211,  62,

-   112, 165, 215,  67, 117, 170, 220,  71, 121, 174,

-   224,  76, 126, 179, 229,  80, 130, 183, 233,  85,

-   135, 188, 238,  89, 139, 192, 242,  59, 109, 162,

-   212,  63, 113, 166, 216,  68, 118, 171, 221,  72,

-   122, 175, 225,  77, 127, 180, 230,  81, 131, 184,

-   234,  86, 136, 189, 239,  90, 140, 193, 243,  60,

-   110, 163, 213,  64, 114, 167, 217,  69, 119, 172,

-   222,  73, 123, 176, 226,  78, 128, 181, 231,  82,

-   132, 185, 235,  87, 137, 190, 240,  91, 141, 194,

-   244,  61, 111, 164, 214,  65, 115, 168, 218,  70,

-   120, 173, 223,  74, 124, 177, 227,  79, 129, 182,

-   232,  83, 133, 186, 236,  88, 138, 191, 241,  92,

-   142, 195, 245                         

-};

-

-static Word16 sort_1425[285] = {

-     0,   4,   6, 101, 159, 220, 278,   7,   5,   3,

-    47,  48,  49,  50,  51, 166, 167, 168, 169, 170,

-   102, 160, 221, 279, 107, 165, 226, 284, 104, 162,

-   223, 281, 105, 163, 224, 282, 108, 227, 106, 164,

-   225, 283, 103, 161, 222, 280,  52,   2,   1, 109,

-   228, 171,  19,  21,  12,  17,  18,  20,  16,  25,

-    13,  10,  14,  24,  23,  22,  26,   8,  15,  53,

-   172,  31, 110, 229,   9,  33,  11, 111, 230,  54,

-   173,  28,  27, 112, 231,  34,  35,  29,  46,  32,

-    30,  55, 174,  37,  36,  39,  38,  40, 113, 232,

-    41,  42,  43,  44,  45,  56, 114, 175, 233,  62,

-   120, 181, 239,  75, 133, 194, 252,  57, 115, 176,

-   234,  63, 121, 182, 240,  70, 128, 189, 247,  76,

-   134, 195, 253,  83, 141, 202, 260,  92, 150, 211,

-   269,  84, 142, 203, 261,  93, 151, 212, 270,  85,

-   143, 204, 262,  94, 152, 213, 271,  86, 144, 205,

-   263,  95, 153, 214, 272,  64, 122, 183, 241,  77,

-   135, 196, 254,  65, 123, 184, 242,  78, 136, 197,

-   255,  87, 145, 206, 264,  96, 154, 215, 273,  58,

-   116, 177, 235,  66, 124, 185, 243,  71, 129, 190,

-   248,  79, 137, 198, 256,  88, 146, 207, 265,  97,

-   155, 216, 274,  59, 117, 178, 236,  67, 125, 186,

-   244,  72, 130, 191, 249,  80, 138, 199, 257,  89,

-   147, 208, 266,  98, 156, 217, 275,  60, 118, 179,

-   237,  68, 126, 187, 245,  73, 131, 192, 250,  81,

-   139, 200, 258,  90, 148, 209, 267,  99, 157, 218,

-   276,  61, 119, 180, 238,  69, 127, 188, 246,  74,

-   132, 193, 251,  82, 140, 201, 259,  91, 149, 210,

-   268, 100, 158, 219, 277

-};

-

-static Word16 sort_1585[317] = {

-     0,   4,   6, 109, 175, 244, 310,   7,   5,   3,

-    47,  48,  49,  50,  51, 182, 183, 184, 185, 186,

-   110, 176, 245, 311, 115, 181, 250, 316, 112, 178,

-   247, 313, 113, 179, 248, 314, 116, 251, 114, 180,

-   249, 315, 111, 177, 246, 312,  52,   2,   1, 117,

-   252, 187,  19,  21,  12,  17,  18,  20,  16,  25,

-    13,  10,  14,  24,  23,  22,  26,   8,  15,  53,

-   188,  31, 118, 253,   9,  33,  11, 119, 254,  54,

-   189,  28,  27, 120, 255,  34,  35,  29,  46,  32,

-    30,  55, 190,  37,  36,  39,  38,  40, 121, 256,

-    41,  42,  43,  44,  45,  56, 122, 191, 257,  63,

-   129, 198, 264,  76, 142, 211, 277,  89, 155, 224,

-   290, 102, 168, 237, 303,  57, 123, 192, 258,  70,

-   136, 205, 271,  83, 149, 218, 284,  96, 162, 231,

-   297,  62, 128, 197, 263,  75, 141, 210, 276,  88,

-   154, 223, 289, 101, 167, 236, 302,  58, 124, 193,

-   259,  71, 137, 206, 272,  84, 150, 219, 285,  97,

-   163, 232, 298,  59, 125, 194, 260,  64, 130, 199,

-   265,  67, 133, 202, 268,  72, 138, 207, 273,  77,

-   143, 212, 278,  80, 146, 215, 281,  85, 151, 220,

-   286,  90, 156, 225, 291,  93, 159, 228, 294,  98,

-   164, 233, 299, 103, 169, 238, 304, 106, 172, 241,

-   307,  60, 126, 195, 261,  65, 131, 200, 266,  68,

-   134, 203, 269,  73, 139, 208, 274,  78, 144, 213,

-   279,  81, 147, 216, 282,  86, 152, 221, 287,  91,

-   157, 226, 292,  94, 160, 229, 295,  99, 165, 234,

-   300, 104, 170, 239, 305, 107, 173, 242, 308,  61,

-   127, 196, 262,  66, 132, 201, 267,  69, 135, 204,

-   270,  74, 140, 209, 275,  79, 145, 214, 280,  82,

-   148, 217, 283,  87, 153, 222, 288,  92, 158, 227,

-   293,  95, 161, 230, 296, 100, 166, 235, 301, 105,

-   171, 240, 306, 108, 174, 243, 309

-};

-

-static Word16 sort_1825[365] = {

-     0,   4,   6, 121, 199, 280, 358,   7,   5,   3,

-    47,  48,  49,  50,  51, 206, 207, 208, 209, 210,

-   122, 200, 281, 359, 127, 205, 286, 364, 124, 202,

-   283, 361, 125, 203, 284, 362, 128, 287, 126, 204,

-   285, 363, 123, 201, 282, 360,  52,   2,   1, 129,

-   288, 211,  19,  21,  12,  17,  18,  20,  16,  25,

-    13,  10,  14,  24,  23,  22,  26,   8,  15,  53,

-   212,  31, 130, 289,   9,  33,  11, 131, 290,  54,

-   213,  28,  27, 132, 291,  34,  35,  29,  46,  32,

-    30,  55, 214,  37,  36,  39,  38,  40, 133, 292,

-    41,  42,  43,  44,  45,  56, 134, 215, 293, 198,

-   299, 136, 120, 138,  60, 279,  58,  62, 357, 139,

-   140, 295, 156,  57, 219, 297,  63, 217, 137, 170,

-   300, 222,  64, 106,  61,  78, 294,  92, 142, 141,

-   135, 221, 296, 301, 343,  59, 298, 184, 329, 315,

-   220, 216, 265, 251, 218, 237, 352, 223, 157,  86,

-   171,  87, 164, 351, 111, 302,  65, 178, 115, 323,

-    72, 192, 101, 179,  93,  73, 193, 151, 337, 309,

-   143, 274,  69, 324, 165, 150,  97, 338, 110, 310,

-   330, 273,  68, 107, 175, 245, 114,  79, 113, 189,

-   246, 259, 174,  71, 185,  96, 344, 100, 322,  83,

-   334, 316, 333, 252, 161, 348, 147,  82, 269, 232,

-   260, 308, 353, 347, 163, 231, 306, 320, 188, 270,

-   146, 177, 266, 350, 256,  85, 149, 116, 191, 160,

-   238, 258, 336, 305, 255,  88, 224,  99, 339, 230,

-   228, 227, 272, 242, 241, 319, 233, 311, 102,  74,

-   180, 275,  66, 194, 152, 325, 172, 247, 244, 261,

-   117, 158, 166, 354,  75, 144, 108, 312,  94, 186,

-   303,  80, 234,  89, 195, 112, 340, 181, 345, 317,

-   326, 276, 239, 167, 118, 313,  70, 355, 327, 253,

-   190, 176, 271, 104,  98, 153, 103,  90,  76, 267,

-   277, 248, 225, 262, 182,  84, 154, 235, 335, 168,

-   331, 196, 341, 249, 162, 307, 148, 349, 263, 321,

-   257, 243, 229, 356, 159, 119,  67, 187, 173, 145,

-   240,  77, 304, 332, 314, 342, 109, 254,  81, 278,

-   105,  91, 346, 318, 183, 250, 197, 328,  95, 155,

-   169, 268, 226, 236, 264                 

-};

-

-static Word16 sort_1985[397] = {

-     0,   4,   6, 129, 215, 304, 390,   7,   5,   3,

-    47,  48,  49,  50,  51, 222, 223, 224, 225, 226,

-   130, 216, 305, 391, 135, 221, 310, 396, 132, 218,

-   307, 393, 133, 219, 308, 394, 136, 311, 134, 220,

-   309, 395, 131, 217, 306, 392,  52,   2,   1, 137,

-   312, 227,  19,  21,  12,  17,  18,  20,  16,  25,

-    13,  10,  14,  24,  23,  22,  26,   8,  15,  53,

-   228,  31, 138, 313,   9,  33,  11, 139, 314,  54,

-   229,  28,  27, 140, 315,  34,  35,  29,  46,  32,

-    30,  55, 230,  37,  36,  39,  38,  40, 141, 316,

-    41,  42,  43,  44,  45,  56, 142, 231, 317,  63,

-    73,  92, 340,  82, 324, 149, 353, 159, 334, 165,

-   338, 178, 163, 254,  77, 168, 257, 153, 343,  57,

-   248, 238,  79, 252, 166,  67,  80, 201, 101, 267,

-   143, 164, 341, 255, 339, 187, 376, 318,  78, 328,

-   362, 115, 232, 242, 253, 290, 276,  62,  58, 158,

-    68,  93, 179, 319, 148, 169, 154,  72, 385, 329,

-   333, 344, 102,  83, 144, 233, 323, 124, 243, 192,

-   354, 237,  64, 247, 202, 209, 150, 116, 335, 268,

-   239, 299, 188, 196, 298,  94, 195, 258, 123, 363,

-   384, 109, 325, 371, 170, 370,  84, 110, 295, 180,

-    74, 210, 191, 106, 291, 205, 367, 381, 377, 206,

-   355, 122, 119, 120, 383, 160, 105, 108, 277, 380,

-   294, 284, 285, 345, 208, 269, 249, 366, 386, 300,

-   297, 259, 125, 369, 197,  97, 194, 286, 211, 281,

-   280, 183, 372,  87, 155, 283,  59, 348, 327, 184,

-    76, 111, 330, 203, 349,  69,  98, 152, 145, 189,

-    66, 320, 337, 173, 358, 251, 198, 174, 263, 262,

-   126, 241, 193,  88, 388, 117,  95, 387, 112, 359,

-   287, 244, 103, 272, 301, 171, 162, 234, 273, 127,

-   373, 181, 292,  85, 378, 302, 121, 107, 364, 346,

-   356, 212, 278, 213,  65, 382, 288, 207, 113, 175,

-    99, 296, 374, 368, 199, 260, 185, 336, 331, 161,

-   270, 264, 250, 240,  75, 350, 151,  60,  89, 321,

-   156, 274, 360, 326,  70, 282, 167, 146, 352,  81,

-    91, 389, 266, 245, 177, 235, 190, 256, 204, 342,

-   128, 118, 303, 104, 379, 182, 114, 375, 200,  96,

-   293, 172, 214, 365, 279,  86, 289, 351, 347, 357,

-   261, 186, 176, 271,  90, 100, 147, 322, 275, 361,

-    71, 332,  61, 265, 157, 246, 236         

-};

-

-static Word16 sort_2305[461] = {

-     0,   4,   6, 145, 247, 352, 454,   7,   5,   3,

-    47,  48,  49,  50,  51, 254, 255, 256, 257, 258,

-   146, 248, 353, 455, 151, 253, 358, 460, 148, 250,

-   355, 457, 149, 251, 356, 458, 152, 359, 150, 252,

-   357, 459, 147, 249, 354, 456,  52,   2,   1, 153,

-   360, 259,  19,  21,  12,  17,  18,  20,  16,  25,

-    13,  10,  14,  24,  23,  22,  26,   8,  15,  53,

-   260,  31, 154, 361,   9,  33,  11, 155, 362,  54,

-   261,  28,  27, 156, 363,  34,  35,  29,  46,  32,

-    30,  55, 262,  37,  36,  39,  38,  40, 157, 364,

-    41,  42,  43,  44,  45,  56, 158, 263, 365, 181,

-   192, 170,  79,  57, 399,  90, 159, 297, 377, 366,

-   275,  68, 183, 388, 286, 194, 299, 92 ,  70, 182,

-   401, 172,  59,  91,  58, 400, 368, 161,  81, 160,

-   264, 171,  80, 389, 390, 378, 379, 193, 298,  69,

-   266, 265, 367, 277, 288, 276, 287, 184,  60, 195,

-    82,  93,  71, 369, 402, 173, 162, 444, 300, 391,

-    98,  76, 278,  61, 267, 374, 135, 411, 167, 102,

-   380, 200,  87, 178,  65,  94, 204, 124,  72, 342,

-   189, 305, 381, 396, 433, 301, 226, 407, 289, 237,

-   113, 215, 185, 128, 309, 403, 116, 320, 196, 331,

-   370, 422, 174,  64, 392,  83, 425, 219, 134, 188,

-   432, 112, 427, 139, 279, 163, 436, 208, 447, 218,

-   236, 229,  97, 294, 385, 230, 166, 268, 177, 443,

-   225, 426, 101, 272, 138, 127, 290, 117, 347, 199,

-   414,  95, 140, 240, 410, 395, 209, 129, 283, 346,

-   105, 241, 437,  86, 308, 448, 203, 345, 186, 107,

-   220, 415, 334, 319, 106, 313, 118, 123,  73, 207,

-   421, 214, 384, 373, 438,  62, 371, 341,  75, 449,

-   168, 323, 164, 242, 416, 324, 304, 197, 335, 404,

-   271,  63, 191, 325,  96, 169, 231, 280, 312, 187,

-   406,  84, 201, 100,  67, 382, 175, 336, 202, 330,

-   269, 393, 376, 383, 293, 307, 409, 179, 285, 314,

-   302, 372, 398, 190, 180,  89,  99, 103, 232,  78,

-    88,  77, 136, 387, 165, 198, 394, 125, 176, 428,

-    74, 375, 238, 227,  66, 273, 282, 141, 306, 412,

-   114,  85, 130, 348, 119, 291, 296, 386, 233, 397,

-   303, 405, 284, 445, 423, 221, 210, 205, 450, 108,

-   274, 434, 216, 343, 337, 142, 243, 321, 408, 451,

-   310, 292, 120, 109, 281, 439, 270, 429, 332, 295,

-   418, 211, 315, 222, 326, 131, 430, 244, 327, 349,

-   417, 316, 143, 338, 440, 234, 110, 212, 452, 245,

-   121, 419, 350, 223, 132, 441, 328, 413, 317, 339,

-   126, 104, 137, 446, 344, 239, 435, 115, 333, 206,

-   322, 217, 228, 424, 453, 311, 351, 111, 442, 224,

-   213, 122, 431, 340, 235, 246, 133, 144, 420, 329,

-   318

-};

-

-static Word16 sort_2385[477] = {

-     0,   4,   6, 145, 251, 360, 466,   7,   5,   3,

-    47,  48,  49,  50,  51, 262, 263, 264, 265, 266,

-   146, 252, 361, 467, 151, 257, 366, 472, 148, 254,

-   363, 469, 149, 255, 364, 470, 156, 371, 150, 256,

-   365, 471, 147, 253, 362, 468,  52,   2,   1, 157,

-   372, 267,  19,  21,  12,  17,  18,  20,  16,  25,

-    13,  10,  14,  24,  23,  22,  26,   8,  15,  53,

-   268,  31, 152, 153, 154, 155, 258, 259, 260, 261,

-   367, 368, 369, 370, 473, 474, 475, 476, 158, 373,

-     9,  33,  11, 159, 374,  54, 269,  28,  27, 160,

-   375,  34,  35,  29,  46,  32,  30,  55, 270, 37,

-    36,  39,  38,  40, 161, 376,  41,  42,  43,  44,

-    45,  56, 162, 271, 377, 185, 196, 174,  79,  57,

-   411,  90, 163, 305, 389, 378, 283,  68, 187, 400,

-   294, 198, 307,  92,  70, 186, 413, 176,  59,  91,

-    58, 412, 380, 165,  81, 164, 272, 175,  80, 401,

-   402, 390, 391, 197, 306,  69, 274, 273, 379, 285,

-   296, 284, 295, 188,  60, 199,  82,  93,  71, 381,

-   414, 177, 166, 456, 308, 403,  98,  76, 286,  61,

-   275, 386, 135, 423, 171, 102, 392, 204,  87, 182,

-    65,  94, 208, 124,  72, 350, 193, 313, 393, 408,

-   445, 309, 230, 419, 297, 241, 113, 219, 189, 128,

-   317, 415, 116, 328, 200, 339, 382, 434, 178,  64,

-   404,  83, 437, 223, 134, 192, 444, 112, 439, 139,

-   287, 167, 448, 212, 459, 222, 240, 233,  97, 302,

-   397, 234, 170, 276, 181, 455, 229, 438, 101, 280,

-   138, 127, 298, 117, 355, 203, 426,  95, 140, 244,

-   422, 407, 213, 129, 291, 354, 105, 245, 449,  86,

-   316, 460, 207, 353, 190, 107, 224, 427, 342, 327,

-   106, 321, 118, 123,  73, 211, 433, 218, 396, 385,

-   450,  62, 383, 349,  75, 461, 172, 331, 168, 246,

-   428, 332, 312, 201, 343, 416, 279,  63, 195, 333,

-    96, 173, 235, 288, 320, 191, 418,  84, 205, 100,

-    67, 394, 179, 344, 206, 338, 277, 405, 388, 395,

-   301, 315, 421, 183, 293, 322, 310, 384, 410, 194,

-   184,  89,  99, 103, 236,  78,  88,  77, 136, 399,

-   169, 202, 406, 125, 180, 440,  74, 387, 242, 231,

-    66, 281, 290, 141, 314, 424, 114,  85, 130, 356,

-   119, 299, 304, 398, 237, 409, 311, 417, 292, 457,

-   435, 225, 214, 209, 462, 108, 282, 446, 220, 351,

-   345, 142, 247, 329, 420, 463, 318, 300, 120, 109,

-   289, 451, 278, 441, 340, 303, 430, 215, 323, 226,

-   334, 131, 442, 248, 335, 357, 429, 324, 143, 346,

-   452, 238, 110, 216, 464, 249, 121, 431, 358, 227,

-   132, 453, 336, 425, 325, 347, 126, 104, 137, 458,

-   352, 243, 447, 115, 341, 210, 330, 221, 232, 436,

-   465, 319, 359, 111, 454, 228, 217, 122, 443, 348,

-   239, 250, 133, 144, 432, 337, 326         

-};

-

-static Word16 sort_SID[35] = {

-    0,  1,  2,  3,  4,  5,  6,  7,  8,  9,

-   10, 11, 12, 13, 14, 15, 16, 17, 18, 19,

-   20, 21, 22, 23, 24, 25, 26, 27, 28, 29,

-   30, 31, 32, 33, 34

-};

-

-/* pointer table for bit sorting tables */

-static Word16 *sort_ptr[16] = { sort_660, sort_885, sort_1265, sort_1425, sort_1585, sort_1825, sort_1985, sort_2305,

-                               sort_2385, sort_SID,      NULL,      NULL,      NULL,      NULL,      NULL,      NULL};

-

-

-

-

+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+#include <stdio.h>
+#include "typedef.h"
+
+static UWord8 toc_byte[16] = {0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x34, 0x3C,
+                              0x44, 0x4C, 0x54, 0x5C, 0x64, 0x6C, 0x74, 0x7C};
+
+/* number of speech bits for all modes */
+static Word16 unpacked_size[16] = {132,  177, 253, 285, 317, 365, 397, 461,
+                                   477,   35,   0,   0,   0,   0,   0,   0};
+
+/* size of packed frame for each mode, excluding TOC byte */
+static Word16 packed_size[16] = {17, 23, 32, 36, 40, 46, 50, 58,
+                                 60,  5,  0,  0,  0,  0,  0,  0};
+
+/* number of unused speech bits in packed format for each mode */
+static Word16 unused_size[16] = {4, 7, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0};
+
+/* sorting tables for all modes */
+
+static Word16 sort_660[132] = {
+     0,   5,   6,   7,  61,  84, 107, 130,  62,  85,
+     8,   4,  37,  38,  39,  40,  58,  81, 104, 127,
+    60,  83, 106, 129, 108, 131, 128,  41,  42,  80,
+   126,   1,   3,  57, 103,  82, 105,  59,   2,  63,
+   109, 110,  86,  19,  22,  23,  64,  87,  18,  20,
+    21,  17,  13,  88,  43,  89,  65, 111,  14,  24,
+    25,  26,  27,  28,  15,  16,  44,  90,  66, 112,
+     9,  11,  10,  12,  67, 113,  29,  30,  31,  32,
+    34,  33,  35,  36,  45,  51,  68,  74,  91,  97,
+   114, 120,  46,  69,  92, 115,  52,  75,  98, 121,
+    47,  70,  93, 116,  53,  76,  99, 122,  48,  71,
+    94, 117,  54,  77, 100, 123,  49,  72,  95, 118,
+    55,  78, 101, 124,  50,  73,  96, 119,  56,  79,
+   102, 125
+};
+
+static Word16 sort_885[177] = {
+     0,   4,   6,   7,   5,   3,  47,  48,  49, 112,
+   113, 114,  75, 106, 140, 171,  80, 111, 145, 176,
+    77, 108, 142, 173,  78, 109, 143, 174,  79, 110,
+   144, 175,  76, 107, 141, 172,  50, 115,  51,   2,
+     1,  81, 116, 146,  19,  21,  12,  17,  18,  20,
+    16,  25,  13,  10,  14,  24,  23,  22,  26,   8,
+    15,  52, 117,  31,  82, 147,   9,  33,  11,  83,
+   148,  53, 118,  28,  27,  84, 149,  34,  35,  29,
+    46,  32,  30,  54, 119,  37,  36,  39,  38,  40,
+    85, 150,  41,  42,  43,  44,  45,  55,  60,  65,
+    70,  86,  91,  96, 101, 120, 125, 130, 135, 151,
+   156, 161, 166,  56,  87, 121, 152,  61,  92, 126,
+   157,  66,  97, 131, 162,  71, 102, 136, 167,  57,
+    88, 122, 153,  62,  93, 127, 158,  67,  98, 132,
+   163,  72, 103, 137, 168,  58,  89, 123, 154,  63,
+    94, 128, 159,  68,  99, 133, 164,  73, 104, 138,
+   169,  59,  90, 124, 155,  64,  95, 129, 160,  69,
+   100, 134, 165,  74, 105, 139, 170
+};
+
+static Word16 sort_1265[253] = {
+     0,   4,   6,  93, 143, 196, 246,   7,   5,   3,
+    47,  48,  49,  50,  51, 150, 151, 152, 153, 154,
+    94, 144, 197, 247,  99, 149, 202, 252,  96, 146,
+   199, 249,  97, 147, 200, 250, 100, 203,  98, 148,
+   201, 251,  95, 145, 198, 248,  52,   2,   1, 101,
+   204, 155,  19,  21,  12,  17,  18,  20,  16,  25,
+    13,  10,  14,  24,  23,  22,  26,   8,  15,  53,
+   156,  31, 102, 205,   9,  33,  11, 103, 206,  54,
+   157,  28,  27, 104, 207,  34,  35,  29,  46,  32,
+    30,  55, 158,  37,  36,  39,  38,  40, 105, 208,
+    41,  42,  43,  44,  45,  56, 106, 159, 209,  57,
+    66,  75,  84, 107, 116, 125, 134, 160, 169, 178,
+   187, 210, 219, 228, 237,  58, 108, 161, 211,  62,
+   112, 165, 215,  67, 117, 170, 220,  71, 121, 174,
+   224,  76, 126, 179, 229,  80, 130, 183, 233,  85,
+   135, 188, 238,  89, 139, 192, 242,  59, 109, 162,
+   212,  63, 113, 166, 216,  68, 118, 171, 221,  72,
+   122, 175, 225,  77, 127, 180, 230,  81, 131, 184,
+   234,  86, 136, 189, 239,  90, 140, 193, 243,  60,
+   110, 163, 213,  64, 114, 167, 217,  69, 119, 172,
+   222,  73, 123, 176, 226,  78, 128, 181, 231,  82,
+   132, 185, 235,  87, 137, 190, 240,  91, 141, 194,
+   244,  61, 111, 164, 214,  65, 115, 168, 218,  70,
+   120, 173, 223,  74, 124, 177, 227,  79, 129, 182,
+   232,  83, 133, 186, 236,  88, 138, 191, 241,  92,
+   142, 195, 245                         
+};
+
+static Word16 sort_1425[285] = {
+     0,   4,   6, 101, 159, 220, 278,   7,   5,   3,
+    47,  48,  49,  50,  51, 166, 167, 168, 169, 170,
+   102, 160, 221, 279, 107, 165, 226, 284, 104, 162,
+   223, 281, 105, 163, 224, 282, 108, 227, 106, 164,
+   225, 283, 103, 161, 222, 280,  52,   2,   1, 109,
+   228, 171,  19,  21,  12,  17,  18,  20,  16,  25,
+    13,  10,  14,  24,  23,  22,  26,   8,  15,  53,
+   172,  31, 110, 229,   9,  33,  11, 111, 230,  54,
+   173,  28,  27, 112, 231,  34,  35,  29,  46,  32,
+    30,  55, 174,  37,  36,  39,  38,  40, 113, 232,
+    41,  42,  43,  44,  45,  56, 114, 175, 233,  62,
+   120, 181, 239,  75, 133, 194, 252,  57, 115, 176,
+   234,  63, 121, 182, 240,  70, 128, 189, 247,  76,
+   134, 195, 253,  83, 141, 202, 260,  92, 150, 211,
+   269,  84, 142, 203, 261,  93, 151, 212, 270,  85,
+   143, 204, 262,  94, 152, 213, 271,  86, 144, 205,
+   263,  95, 153, 214, 272,  64, 122, 183, 241,  77,
+   135, 196, 254,  65, 123, 184, 242,  78, 136, 197,
+   255,  87, 145, 206, 264,  96, 154, 215, 273,  58,
+   116, 177, 235,  66, 124, 185, 243,  71, 129, 190,
+   248,  79, 137, 198, 256,  88, 146, 207, 265,  97,
+   155, 216, 274,  59, 117, 178, 236,  67, 125, 186,
+   244,  72, 130, 191, 249,  80, 138, 199, 257,  89,
+   147, 208, 266,  98, 156, 217, 275,  60, 118, 179,
+   237,  68, 126, 187, 245,  73, 131, 192, 250,  81,
+   139, 200, 258,  90, 148, 209, 267,  99, 157, 218,
+   276,  61, 119, 180, 238,  69, 127, 188, 246,  74,
+   132, 193, 251,  82, 140, 201, 259,  91, 149, 210,
+   268, 100, 158, 219, 277
+};
+
+static Word16 sort_1585[317] = {
+     0,   4,   6, 109, 175, 244, 310,   7,   5,   3,
+    47,  48,  49,  50,  51, 182, 183, 184, 185, 186,
+   110, 176, 245, 311, 115, 181, 250, 316, 112, 178,
+   247, 313, 113, 179, 248, 314, 116, 251, 114, 180,
+   249, 315, 111, 177, 246, 312,  52,   2,   1, 117,
+   252, 187,  19,  21,  12,  17,  18,  20,  16,  25,
+    13,  10,  14,  24,  23,  22,  26,   8,  15,  53,
+   188,  31, 118, 253,   9,  33,  11, 119, 254,  54,
+   189,  28,  27, 120, 255,  34,  35,  29,  46,  32,
+    30,  55, 190,  37,  36,  39,  38,  40, 121, 256,
+    41,  42,  43,  44,  45,  56, 122, 191, 257,  63,
+   129, 198, 264,  76, 142, 211, 277,  89, 155, 224,
+   290, 102, 168, 237, 303,  57, 123, 192, 258,  70,
+   136, 205, 271,  83, 149, 218, 284,  96, 162, 231,
+   297,  62, 128, 197, 263,  75, 141, 210, 276,  88,
+   154, 223, 289, 101, 167, 236, 302,  58, 124, 193,
+   259,  71, 137, 206, 272,  84, 150, 219, 285,  97,
+   163, 232, 298,  59, 125, 194, 260,  64, 130, 199,
+   265,  67, 133, 202, 268,  72, 138, 207, 273,  77,
+   143, 212, 278,  80, 146, 215, 281,  85, 151, 220,
+   286,  90, 156, 225, 291,  93, 159, 228, 294,  98,
+   164, 233, 299, 103, 169, 238, 304, 106, 172, 241,
+   307,  60, 126, 195, 261,  65, 131, 200, 266,  68,
+   134, 203, 269,  73, 139, 208, 274,  78, 144, 213,
+   279,  81, 147, 216, 282,  86, 152, 221, 287,  91,
+   157, 226, 292,  94, 160, 229, 295,  99, 165, 234,
+   300, 104, 170, 239, 305, 107, 173, 242, 308,  61,
+   127, 196, 262,  66, 132, 201, 267,  69, 135, 204,
+   270,  74, 140, 209, 275,  79, 145, 214, 280,  82,
+   148, 217, 283,  87, 153, 222, 288,  92, 158, 227,
+   293,  95, 161, 230, 296, 100, 166, 235, 301, 105,
+   171, 240, 306, 108, 174, 243, 309
+};
+
+static Word16 sort_1825[365] = {
+     0,   4,   6, 121, 199, 280, 358,   7,   5,   3,
+    47,  48,  49,  50,  51, 206, 207, 208, 209, 210,
+   122, 200, 281, 359, 127, 205, 286, 364, 124, 202,
+   283, 361, 125, 203, 284, 362, 128, 287, 126, 204,
+   285, 363, 123, 201, 282, 360,  52,   2,   1, 129,
+   288, 211,  19,  21,  12,  17,  18,  20,  16,  25,
+    13,  10,  14,  24,  23,  22,  26,   8,  15,  53,
+   212,  31, 130, 289,   9,  33,  11, 131, 290,  54,
+   213,  28,  27, 132, 291,  34,  35,  29,  46,  32,
+    30,  55, 214,  37,  36,  39,  38,  40, 133, 292,
+    41,  42,  43,  44,  45,  56, 134, 215, 293, 198,
+   299, 136, 120, 138,  60, 279,  58,  62, 357, 139,
+   140, 295, 156,  57, 219, 297,  63, 217, 137, 170,
+   300, 222,  64, 106,  61,  78, 294,  92, 142, 141,
+   135, 221, 296, 301, 343,  59, 298, 184, 329, 315,
+   220, 216, 265, 251, 218, 237, 352, 223, 157,  86,
+   171,  87, 164, 351, 111, 302,  65, 178, 115, 323,
+    72, 192, 101, 179,  93,  73, 193, 151, 337, 309,
+   143, 274,  69, 324, 165, 150,  97, 338, 110, 310,
+   330, 273,  68, 107, 175, 245, 114,  79, 113, 189,
+   246, 259, 174,  71, 185,  96, 344, 100, 322,  83,
+   334, 316, 333, 252, 161, 348, 147,  82, 269, 232,
+   260, 308, 353, 347, 163, 231, 306, 320, 188, 270,
+   146, 177, 266, 350, 256,  85, 149, 116, 191, 160,
+   238, 258, 336, 305, 255,  88, 224,  99, 339, 230,
+   228, 227, 272, 242, 241, 319, 233, 311, 102,  74,
+   180, 275,  66, 194, 152, 325, 172, 247, 244, 261,
+   117, 158, 166, 354,  75, 144, 108, 312,  94, 186,
+   303,  80, 234,  89, 195, 112, 340, 181, 345, 317,
+   326, 276, 239, 167, 118, 313,  70, 355, 327, 253,
+   190, 176, 271, 104,  98, 153, 103,  90,  76, 267,
+   277, 248, 225, 262, 182,  84, 154, 235, 335, 168,
+   331, 196, 341, 249, 162, 307, 148, 349, 263, 321,
+   257, 243, 229, 356, 159, 119,  67, 187, 173, 145,
+   240,  77, 304, 332, 314, 342, 109, 254,  81, 278,
+   105,  91, 346, 318, 183, 250, 197, 328,  95, 155,
+   169, 268, 226, 236, 264                 
+};
+
+static Word16 sort_1985[397] = {
+     0,   4,   6, 129, 215, 304, 390,   7,   5,   3,
+    47,  48,  49,  50,  51, 222, 223, 224, 225, 226,
+   130, 216, 305, 391, 135, 221, 310, 396, 132, 218,
+   307, 393, 133, 219, 308, 394, 136, 311, 134, 220,
+   309, 395, 131, 217, 306, 392,  52,   2,   1, 137,
+   312, 227,  19,  21,  12,  17,  18,  20,  16,  25,
+    13,  10,  14,  24,  23,  22,  26,   8,  15,  53,
+   228,  31, 138, 313,   9,  33,  11, 139, 314,  54,
+   229,  28,  27, 140, 315,  34,  35,  29,  46,  32,
+    30,  55, 230,  37,  36,  39,  38,  40, 141, 316,
+    41,  42,  43,  44,  45,  56, 142, 231, 317,  63,
+    73,  92, 340,  82, 324, 149, 353, 159, 334, 165,
+   338, 178, 163, 254,  77, 168, 257, 153, 343,  57,
+   248, 238,  79, 252, 166,  67,  80, 201, 101, 267,
+   143, 164, 341, 255, 339, 187, 376, 318,  78, 328,
+   362, 115, 232, 242, 253, 290, 276,  62,  58, 158,
+    68,  93, 179, 319, 148, 169, 154,  72, 385, 329,
+   333, 344, 102,  83, 144, 233, 323, 124, 243, 192,
+   354, 237,  64, 247, 202, 209, 150, 116, 335, 268,
+   239, 299, 188, 196, 298,  94, 195, 258, 123, 363,
+   384, 109, 325, 371, 170, 370,  84, 110, 295, 180,
+    74, 210, 191, 106, 291, 205, 367, 381, 377, 206,
+   355, 122, 119, 120, 383, 160, 105, 108, 277, 380,
+   294, 284, 285, 345, 208, 269, 249, 366, 386, 300,
+   297, 259, 125, 369, 197,  97, 194, 286, 211, 281,
+   280, 183, 372,  87, 155, 283,  59, 348, 327, 184,
+    76, 111, 330, 203, 349,  69,  98, 152, 145, 189,
+    66, 320, 337, 173, 358, 251, 198, 174, 263, 262,
+   126, 241, 193,  88, 388, 117,  95, 387, 112, 359,
+   287, 244, 103, 272, 301, 171, 162, 234, 273, 127,
+   373, 181, 292,  85, 378, 302, 121, 107, 364, 346,
+   356, 212, 278, 213,  65, 382, 288, 207, 113, 175,
+    99, 296, 374, 368, 199, 260, 185, 336, 331, 161,
+   270, 264, 250, 240,  75, 350, 151,  60,  89, 321,
+   156, 274, 360, 326,  70, 282, 167, 146, 352,  81,
+    91, 389, 266, 245, 177, 235, 190, 256, 204, 342,
+   128, 118, 303, 104, 379, 182, 114, 375, 200,  96,
+   293, 172, 214, 365, 279,  86, 289, 351, 347, 357,
+   261, 186, 176, 271,  90, 100, 147, 322, 275, 361,
+    71, 332,  61, 265, 157, 246, 236         
+};
+
+static Word16 sort_2305[461] = {
+     0,   4,   6, 145, 247, 352, 454,   7,   5,   3,
+    47,  48,  49,  50,  51, 254, 255, 256, 257, 258,
+   146, 248, 353, 455, 151, 253, 358, 460, 148, 250,
+   355, 457, 149, 251, 356, 458, 152, 359, 150, 252,
+   357, 459, 147, 249, 354, 456,  52,   2,   1, 153,
+   360, 259,  19,  21,  12,  17,  18,  20,  16,  25,
+    13,  10,  14,  24,  23,  22,  26,   8,  15,  53,
+   260,  31, 154, 361,   9,  33,  11, 155, 362,  54,
+   261,  28,  27, 156, 363,  34,  35,  29,  46,  32,
+    30,  55, 262,  37,  36,  39,  38,  40, 157, 364,
+    41,  42,  43,  44,  45,  56, 158, 263, 365, 181,
+   192, 170,  79,  57, 399,  90, 159, 297, 377, 366,
+   275,  68, 183, 388, 286, 194, 299, 92 ,  70, 182,
+   401, 172,  59,  91,  58, 400, 368, 161,  81, 160,
+   264, 171,  80, 389, 390, 378, 379, 193, 298,  69,
+   266, 265, 367, 277, 288, 276, 287, 184,  60, 195,
+    82,  93,  71, 369, 402, 173, 162, 444, 300, 391,
+    98,  76, 278,  61, 267, 374, 135, 411, 167, 102,
+   380, 200,  87, 178,  65,  94, 204, 124,  72, 342,
+   189, 305, 381, 396, 433, 301, 226, 407, 289, 237,
+   113, 215, 185, 128, 309, 403, 116, 320, 196, 331,
+   370, 422, 174,  64, 392,  83, 425, 219, 134, 188,
+   432, 112, 427, 139, 279, 163, 436, 208, 447, 218,
+   236, 229,  97, 294, 385, 230, 166, 268, 177, 443,
+   225, 426, 101, 272, 138, 127, 290, 117, 347, 199,
+   414,  95, 140, 240, 410, 395, 209, 129, 283, 346,
+   105, 241, 437,  86, 308, 448, 203, 345, 186, 107,
+   220, 415, 334, 319, 106, 313, 118, 123,  73, 207,
+   421, 214, 384, 373, 438,  62, 371, 341,  75, 449,
+   168, 323, 164, 242, 416, 324, 304, 197, 335, 404,
+   271,  63, 191, 325,  96, 169, 231, 280, 312, 187,
+   406,  84, 201, 100,  67, 382, 175, 336, 202, 330,
+   269, 393, 376, 383, 293, 307, 409, 179, 285, 314,
+   302, 372, 398, 190, 180,  89,  99, 103, 232,  78,
+    88,  77, 136, 387, 165, 198, 394, 125, 176, 428,
+    74, 375, 238, 227,  66, 273, 282, 141, 306, 412,
+   114,  85, 130, 348, 119, 291, 296, 386, 233, 397,
+   303, 405, 284, 445, 423, 221, 210, 205, 450, 108,
+   274, 434, 216, 343, 337, 142, 243, 321, 408, 451,
+   310, 292, 120, 109, 281, 439, 270, 429, 332, 295,
+   418, 211, 315, 222, 326, 131, 430, 244, 327, 349,
+   417, 316, 143, 338, 440, 234, 110, 212, 452, 245,
+   121, 419, 350, 223, 132, 441, 328, 413, 317, 339,
+   126, 104, 137, 446, 344, 239, 435, 115, 333, 206,
+   322, 217, 228, 424, 453, 311, 351, 111, 442, 224,
+   213, 122, 431, 340, 235, 246, 133, 144, 420, 329,
+   318
+};
+
+static Word16 sort_2385[477] = {
+     0,   4,   6, 145, 251, 360, 466,   7,   5,   3,
+    47,  48,  49,  50,  51, 262, 263, 264, 265, 266,
+   146, 252, 361, 467, 151, 257, 366, 472, 148, 254,
+   363, 469, 149, 255, 364, 470, 156, 371, 150, 256,
+   365, 471, 147, 253, 362, 468,  52,   2,   1, 157,
+   372, 267,  19,  21,  12,  17,  18,  20,  16,  25,
+    13,  10,  14,  24,  23,  22,  26,   8,  15,  53,
+   268,  31, 152, 153, 154, 155, 258, 259, 260, 261,
+   367, 368, 369, 370, 473, 474, 475, 476, 158, 373,
+     9,  33,  11, 159, 374,  54, 269,  28,  27, 160,
+   375,  34,  35,  29,  46,  32,  30,  55, 270, 37,
+    36,  39,  38,  40, 161, 376,  41,  42,  43,  44,
+    45,  56, 162, 271, 377, 185, 196, 174,  79,  57,
+   411,  90, 163, 305, 389, 378, 283,  68, 187, 400,
+   294, 198, 307,  92,  70, 186, 413, 176,  59,  91,
+    58, 412, 380, 165,  81, 164, 272, 175,  80, 401,
+   402, 390, 391, 197, 306,  69, 274, 273, 379, 285,
+   296, 284, 295, 188,  60, 199,  82,  93,  71, 381,
+   414, 177, 166, 456, 308, 403,  98,  76, 286,  61,
+   275, 386, 135, 423, 171, 102, 392, 204,  87, 182,
+    65,  94, 208, 124,  72, 350, 193, 313, 393, 408,
+   445, 309, 230, 419, 297, 241, 113, 219, 189, 128,
+   317, 415, 116, 328, 200, 339, 382, 434, 178,  64,
+   404,  83, 437, 223, 134, 192, 444, 112, 439, 139,
+   287, 167, 448, 212, 459, 222, 240, 233,  97, 302,
+   397, 234, 170, 276, 181, 455, 229, 438, 101, 280,
+   138, 127, 298, 117, 355, 203, 426,  95, 140, 244,
+   422, 407, 213, 129, 291, 354, 105, 245, 449,  86,
+   316, 460, 207, 353, 190, 107, 224, 427, 342, 327,
+   106, 321, 118, 123,  73, 211, 433, 218, 396, 385,
+   450,  62, 383, 349,  75, 461, 172, 331, 168, 246,
+   428, 332, 312, 201, 343, 416, 279,  63, 195, 333,
+    96, 173, 235, 288, 320, 191, 418,  84, 205, 100,
+    67, 394, 179, 344, 206, 338, 277, 405, 388, 395,
+   301, 315, 421, 183, 293, 322, 310, 384, 410, 194,
+   184,  89,  99, 103, 236,  78,  88,  77, 136, 399,
+   169, 202, 406, 125, 180, 440,  74, 387, 242, 231,
+    66, 281, 290, 141, 314, 424, 114,  85, 130, 356,
+   119, 299, 304, 398, 237, 409, 311, 417, 292, 457,
+   435, 225, 214, 209, 462, 108, 282, 446, 220, 351,
+   345, 142, 247, 329, 420, 463, 318, 300, 120, 109,
+   289, 451, 278, 441, 340, 303, 430, 215, 323, 226,
+   334, 131, 442, 248, 335, 357, 429, 324, 143, 346,
+   452, 238, 110, 216, 464, 249, 121, 431, 358, 227,
+   132, 453, 336, 425, 325, 347, 126, 104, 137, 458,
+   352, 243, 447, 115, 341, 210, 330, 221, 232, 436,
+   465, 319, 359, 111, 454, 228, 217, 122, 443, 348,
+   239, 250, 133, 144, 432, 337, 326         
+};
+
+static Word16 sort_SID[35] = {
+    0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
+   10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+   20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+   30, 31, 32, 33, 34
+};
+
+/* pointer table for bit sorting tables */
+static Word16 *sort_ptr[16] = { sort_660, sort_885, sort_1265, sort_1425, sort_1585, sort_1825, sort_1985, sort_2305,
+                               sort_2385, sort_SID,      NULL,      NULL,      NULL,      NULL,      NULL,      NULL};
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/oper_32b.h b/media/libstagefright/codecs/amrwbenc/inc/oper_32b.h
index 4159d84..7a0f564 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/oper_32b.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/oper_32b.h
@@ -1,31 +1,31 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/* Double precision operations */

-/* $Id$ */

-

-#ifndef __OPER_32B_H__

-#define __OPER_32B_H__

-

-void VO_L_Extract (Word32 L_32, Word16 *hi, Word16 *lo);

-Word32 L_Comp (Word16 hi, Word16 lo);

-Word32 Mpy_32 (Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2);

-Word32 Mpy_32_16 (Word16 hi, Word16 lo, Word16 n);

-Word32 Div_32 (Word32 L_num, Word16 denom_hi, Word16 denom_lo);

-

-#endif //__OPER_32B_H__

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/* Double precision operations */
+/* $Id$ */
+
+#ifndef __OPER_32B_H__
+#define __OPER_32B_H__
+
+void VO_L_Extract (Word32 L_32, Word16 *hi, Word16 *lo);
+Word32 L_Comp (Word16 hi, Word16 lo);
+Word32 Mpy_32 (Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2);
+Word32 Mpy_32_16 (Word16 hi, Word16 lo, Word16 n);
+Word32 Div_32 (Word32 L_num, Word16 denom_hi, Word16 denom_lo);
+
+#endif //__OPER_32B_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/p_med_o.h b/media/libstagefright/codecs/amrwbenc/inc/p_med_o.h
index 27c4c7e..4a13f16 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/p_med_o.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/p_med_o.h
@@ -1,52 +1,52 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/*--------------------------------------------------------------------------*

- *                         P_MED_O.H                                        *

- *--------------------------------------------------------------------------*

- *       Median open-loop lag search				            *

- *--------------------------------------------------------------------------*/

-

-#ifndef __P_MED_O_H__

-#define __P_MED_O_H__

-

-Word16 Pitch_med_ol(                       /* output: open loop pitch lag                        */

-		Word16 wsp[],                         /* input : signal used to compute the open loop pitch */

-		/* wsp[-pit_max] to wsp[-1] should be known   */

-		Word16 L_min,                         /* input : minimum pitch lag                          */

-		Word16 L_max,                         /* input : maximum pitch lag                          */

-		Word16 L_frame,                       /* input : length of frame to compute pitch           */

-		Word16 L_0,                           /* input : old_ open-loop pitch                       */

-		Word16 * gain,                        /* output: normalize correlation of hp_wsp for the Lag */

-		Word16 * hp_wsp_mem,                  /* i:o   : memory of the hypass filter for hp_wsp[] (lg=9)   */

-		Word16 * old_hp_wsp,                  /* i:o   : hypass wsp[]                               */

-		Word16 wght_flg                       /* input : is weighting function used                 */

-		);

-

-Word16 Med_olag(                           /* output : median of  5 previous open-loop lags       */

-		Word16 prev_ol_lag,                   /* input  : previous open-loop lag                     */

-		Word16 old_ol_lag[5]

-	       );

-

-void Hp_wsp(

-		Word16 wsp[],                         /* i   : wsp[]  signal       */

-		Word16 hp_wsp[],                      /* o   : hypass wsp[]        */

-		Word16 lg,                            /* i   : lenght of signal    */

-		Word16 mem[]                          /* i/o : filter memory [9]   */

-	   );

-

-#endif  //__P_MED_O_H__

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/*--------------------------------------------------------------------------*
+ *                         P_MED_O.H                                        *
+ *--------------------------------------------------------------------------*
+ *       Median open-loop lag search				            *
+ *--------------------------------------------------------------------------*/
+
+#ifndef __P_MED_O_H__
+#define __P_MED_O_H__
+
+Word16 Pitch_med_ol(                       /* output: open loop pitch lag                        */
+		Word16 wsp[],                         /* input : signal used to compute the open loop pitch */
+		/* wsp[-pit_max] to wsp[-1] should be known   */
+		Word16 L_min,                         /* input : minimum pitch lag                          */
+		Word16 L_max,                         /* input : maximum pitch lag                          */
+		Word16 L_frame,                       /* input : length of frame to compute pitch           */
+		Word16 L_0,                           /* input : old_ open-loop pitch                       */
+		Word16 * gain,                        /* output: normalize correlation of hp_wsp for the Lag */
+		Word16 * hp_wsp_mem,                  /* i:o   : memory of the hypass filter for hp_wsp[] (lg=9)   */
+		Word16 * old_hp_wsp,                  /* i:o   : hypass wsp[]                               */
+		Word16 wght_flg                       /* input : is weighting function used                 */
+		);
+
+Word16 Med_olag(                           /* output : median of  5 previous open-loop lags       */
+		Word16 prev_ol_lag,                   /* input  : previous open-loop lag                     */
+		Word16 old_ol_lag[5]
+	       );
+
+void Hp_wsp(
+		Word16 wsp[],                         /* i   : wsp[]  signal       */
+		Word16 hp_wsp[],                      /* o   : hypass wsp[]        */
+		Word16 lg,                            /* i   : lenght of signal    */
+		Word16 mem[]                          /* i/o : filter memory [9]   */
+	   );
+
+#endif  //__P_MED_O_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/p_med_ol.tab b/media/libstagefright/codecs/amrwbenc/inc/p_med_ol.tab
index 14bd1d5..d74ec8e 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/p_med_ol.tab
+++ b/media/libstagefright/codecs/amrwbenc/inc/p_med_ol.tab
@@ -1,47 +1,47 @@
-

-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/*-----------------------------------------------------*

- | Table for function Pitch_med_ol()				   |

- *-----------------------------------------------------*/

-

- static Word16 corrweight[199]= {

-

- 10772, 10794, 10816, 10839, 10862, 10885, 10908, 10932, 10955, 10980,

- 11004, 11029, 11054, 11079, 11105, 11131, 11157, 11183, 11210, 11238,

- 11265, 11293, 11322, 11350, 11379, 11409, 11439, 11469, 11500, 11531,

- 11563, 11595, 11628, 11661, 11694, 11728, 11763, 11798, 11834, 11870,

- 11907, 11945, 11983, 12022, 12061, 12101, 12142, 12184, 12226, 12270,

- 12314, 12358, 12404, 12451, 12498, 12547, 12596, 12647, 12699, 12751,

- 12805, 12861, 12917, 12975, 13034, 13095, 13157, 13221, 13286, 13353,

- 13422, 13493, 13566, 13641, 13719, 13798, 13880, 13965, 14053, 14143,

- 14237, 14334, 14435, 14539, 14648, 14761, 14879, 15002, 15130, 15265,

- 15406, 15554, 15710, 15874, 16056, 16384, 16384, 16384, 16384, 16384,

- 16384, 16384, 16056, 15874, 15710, 15554, 15406, 15265, 15130, 15002,

- 14879, 14761, 14648, 14539, 14435, 14334, 14237, 14143, 14053, 13965,

- 13880, 13798, 13719, 13641, 13566, 13493, 13422, 13353, 13286, 13221,

- 13157, 13095, 13034, 12975, 12917, 12861, 12805, 12751, 12699, 12647,

- 12596, 12547, 12498, 12451, 12404, 12358, 12314, 12270, 12226, 12184,

- 12142, 12101, 12061, 12022, 11983, 11945, 11907, 11870, 11834, 11798,

- 11763, 11728, 11694, 11661, 11628, 11595, 11563, 11531, 11500, 11469,

- 11439, 11409, 11379, 11350, 11322, 11293, 11265, 11238, 11210, 11183,

- 11157, 11131, 11105, 11079, 11054, 11029, 11004, 10980, 10955, 10932,

- 10908, 10885, 10862, 10839, 10816, 10794, 10772, 10750, 10728};

-

-

-

+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*-----------------------------------------------------*
+ | Table for function Pitch_med_ol()				   |
+ *-----------------------------------------------------*/
+
+ static Word16 corrweight[199]= {
+
+ 10772, 10794, 10816, 10839, 10862, 10885, 10908, 10932, 10955, 10980,
+ 11004, 11029, 11054, 11079, 11105, 11131, 11157, 11183, 11210, 11238,
+ 11265, 11293, 11322, 11350, 11379, 11409, 11439, 11469, 11500, 11531,
+ 11563, 11595, 11628, 11661, 11694, 11728, 11763, 11798, 11834, 11870,
+ 11907, 11945, 11983, 12022, 12061, 12101, 12142, 12184, 12226, 12270,
+ 12314, 12358, 12404, 12451, 12498, 12547, 12596, 12647, 12699, 12751,
+ 12805, 12861, 12917, 12975, 13034, 13095, 13157, 13221, 13286, 13353,
+ 13422, 13493, 13566, 13641, 13719, 13798, 13880, 13965, 14053, 14143,
+ 14237, 14334, 14435, 14539, 14648, 14761, 14879, 15002, 15130, 15265,
+ 15406, 15554, 15710, 15874, 16056, 16384, 16384, 16384, 16384, 16384,
+ 16384, 16384, 16056, 15874, 15710, 15554, 15406, 15265, 15130, 15002,
+ 14879, 14761, 14648, 14539, 14435, 14334, 14237, 14143, 14053, 13965,
+ 13880, 13798, 13719, 13641, 13566, 13493, 13422, 13353, 13286, 13221,
+ 13157, 13095, 13034, 12975, 12917, 12861, 12805, 12751, 12699, 12647,
+ 12596, 12547, 12498, 12451, 12404, 12358, 12314, 12270, 12226, 12184,
+ 12142, 12101, 12061, 12022, 11983, 11945, 11907, 11870, 11834, 11798,
+ 11763, 11728, 11694, 11661, 11628, 11595, 11563, 11531, 11500, 11469,
+ 11439, 11409, 11379, 11350, 11322, 11293, 11265, 11238, 11210, 11183,
+ 11157, 11131, 11105, 11079, 11054, 11029, 11004, 10980, 10955, 10932,
+ 10908, 10885, 10862, 10839, 10816, 10794, 10772, 10750, 10728};
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/q_gain2.tab b/media/libstagefright/codecs/amrwbenc/inc/q_gain2.tab
index 1a0deee..bc36489 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/q_gain2.tab
+++ b/media/libstagefright/codecs/amrwbenc/inc/q_gain2.tab
@@ -1,228 +1,228 @@
-

-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/*------------------------------------------------------*

- * Tables for function q_gain2()                        *

- *                                                      *

- *  g_pitch(Q14),  g_code(Q11)                          *

- *                                                      *

- * pitch gain are ordered in table to reduce complexity *

- * during quantization of gains.                        *

- *------------------------------------------------------*/

-

-#define nb_qua_gain6b  64     /* Number of quantization level */

-#define nb_qua_gain7b  128    /* Number of quantization level */

-

-

-static Word16 t_qua_gain6b[64*2] = {

-   1566,  1332,

-   1577,  3557,

-   3071,  6490,

-   4193, 10163,

-   4496,  2534,

-   5019,  4488,

-   5586, 15614,

-   5725,  1422,

-   6453,   580,

-   6724,  6831,

-   7657,  3527,

-   8072,  2099,

-   8232,  5319,

-   8827,  8775,

-   9740,  2868,

-   9856,  1465,

-  10087, 12488,

-  10241,  4453,

-  10859,  6618,

-  11321,  3587,

-  11417,  1800,

-  11643,  2428,

-  11718,   988,

-  12312,  5093,

-  12523,  8413,

-  12574, 26214,

-  12601,  3396,

-  13172,  1623,

-  13285,  2423,

-  13418,  6087,

-  13459, 12810,

-  13656,  3607,

-  14111,  4521,

-  14144,  1229,

-  14425,  1871,

-  14431,  7234,

-  14445,  2834,

-  14628, 10036,

-  14860, 17496,

-  15161,  3629,

-  15209,  5819,

-  15299,  2256,

-  15518,  4722,

-  15663,  1060,

-  15759,  7972,

-  15939, 11964,

-  16020,  2996,

-  16086,  1707,

-  16521,  4254,

-  16576,  6224,

-  16894,  2380,

-  16906,   681,

-  17213,  8406,

-  17610,  3418,

-  17895,  5269,

-  18168, 11748,

-  18230,  1575,

-  18607, 32767,

-  18728, 21684,

-  19137,  2543,

-  19422,  6577,

-  19446,  4097,

-  19450,  9056,

-  20371, 14885};

-

-static Word16 t_qua_gain7b[128*2] = {

-    204,   441,

-    464,  1977,

-    869,  1077,

-   1072,  3062,

-   1281,  4759,

-   1647,  1539,

-   1845,  7020,

-   1853,   634,

-   1995,  2336,

-   2351, 15400,

-   2661,  1165,

-   2702,  3900,

-   2710, 10133,

-   3195,  1752,

-   3498,  2624,

-   3663,   849,

-   3984,  5697,

-   4214,  3399,

-   4415,  1304,

-   4695,  2056,

-   5376,  4558,

-   5386,   676,

-   5518, 23554,

-   5567,  7794,

-   5644,  3061,

-   5672,  1513,

-   5957,  2338,

-   6533,  1060,

-   6804,  5998,

-   6820,  1767,

-   6937,  3837,

-   7277,   414,

-   7305,  2665,

-   7466, 11304,

-   7942,   794,

-   8007,  1982,

-   8007,  1366,

-   8326,  3105,

-   8336,  4810,

-   8708,  7954,

-   8989,  2279,

-   9031,  1055,

-   9247,  3568,

-   9283,  1631,

-   9654,  6311,

-   9811,  2605,

-  10120,   683,

-  10143,  4179,

-  10245,  1946,

-  10335,  1218,

-  10468,  9960,

-  10651,  3000,

-  10951,  1530,

-  10969,  5290,

-  11203,  2305,

-  11325,  3562,

-  11771,  6754,

-  11839,  1849,

-  11941,  4495,

-  11954,  1298,

-  11975, 15223,

-  11977,   883,

-  11986,  2842,

-  12438,  2141,

-  12593,  3665,

-  12636,  8367,

-  12658,  1594,

-  12886,  2628,

-  12984,  4942,

-  13146,  1115,

-  13224,   524,

-  13341,  3163,

-  13399,  1923,

-  13549,  5961,

-  13606,  1401,

-  13655,  2399,

-  13782,  3909,

-  13868, 10923,

-  14226,  1723,

-  14232,  2939,

-  14278,  7528,

-  14439,  4598,

-  14451,   984,

-  14458,  2265,

-  14792,  1403,

-  14818,  3445,

-  14899,  5709,

-  15017, 15362,

-  15048,  1946,

-  15069,  2655,

-  15405,  9591,

-  15405,  4079,

-  15570,  7183,

-  15687,  2286,

-  15691,  1624,

-  15699,  3068,

-  15772,  5149,

-  15868,  1205,

-  15970,   696,

-  16249,  3584,

-  16338,  1917,

-  16424,  2560,

-  16483,  4438,

-  16529,  6410,

-  16620, 11966,

-  16839,  8780,

-  17030,  3050,

-  17033, 18325,

-  17092,  1568,

-  17123,  5197,

-  17351,  2113,

-  17374,   980,

-  17566, 26214,

-  17609,  3912,

-  17639, 32767,

-  18151,  7871,

-  18197,  2516,

-  18202,  5649,

-  18679,  3283,

-  18930,  1370,

-  19271, 13757,

-  19317,  4120,

-  19460,  1973,

-  19654, 10018,

-  19764,  6792,

-  19912,  5135,

-  20040,  2841,

-  21234, 19833};

-

-

+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*------------------------------------------------------*
+ * Tables for function q_gain2()                        *
+ *                                                      *
+ *  g_pitch(Q14),  g_code(Q11)                          *
+ *                                                      *
+ * pitch gain are ordered in table to reduce complexity *
+ * during quantization of gains.                        *
+ *------------------------------------------------------*/
+
+#define nb_qua_gain6b  64     /* Number of quantization level */
+#define nb_qua_gain7b  128    /* Number of quantization level */
+
+
+static Word16 t_qua_gain6b[64*2] = {
+   1566,  1332,
+   1577,  3557,
+   3071,  6490,
+   4193, 10163,
+   4496,  2534,
+   5019,  4488,
+   5586, 15614,
+   5725,  1422,
+   6453,   580,
+   6724,  6831,
+   7657,  3527,
+   8072,  2099,
+   8232,  5319,
+   8827,  8775,
+   9740,  2868,
+   9856,  1465,
+  10087, 12488,
+  10241,  4453,
+  10859,  6618,
+  11321,  3587,
+  11417,  1800,
+  11643,  2428,
+  11718,   988,
+  12312,  5093,
+  12523,  8413,
+  12574, 26214,
+  12601,  3396,
+  13172,  1623,
+  13285,  2423,
+  13418,  6087,
+  13459, 12810,
+  13656,  3607,
+  14111,  4521,
+  14144,  1229,
+  14425,  1871,
+  14431,  7234,
+  14445,  2834,
+  14628, 10036,
+  14860, 17496,
+  15161,  3629,
+  15209,  5819,
+  15299,  2256,
+  15518,  4722,
+  15663,  1060,
+  15759,  7972,
+  15939, 11964,
+  16020,  2996,
+  16086,  1707,
+  16521,  4254,
+  16576,  6224,
+  16894,  2380,
+  16906,   681,
+  17213,  8406,
+  17610,  3418,
+  17895,  5269,
+  18168, 11748,
+  18230,  1575,
+  18607, 32767,
+  18728, 21684,
+  19137,  2543,
+  19422,  6577,
+  19446,  4097,
+  19450,  9056,
+  20371, 14885};
+
+static Word16 t_qua_gain7b[128*2] = {
+    204,   441,
+    464,  1977,
+    869,  1077,
+   1072,  3062,
+   1281,  4759,
+   1647,  1539,
+   1845,  7020,
+   1853,   634,
+   1995,  2336,
+   2351, 15400,
+   2661,  1165,
+   2702,  3900,
+   2710, 10133,
+   3195,  1752,
+   3498,  2624,
+   3663,   849,
+   3984,  5697,
+   4214,  3399,
+   4415,  1304,
+   4695,  2056,
+   5376,  4558,
+   5386,   676,
+   5518, 23554,
+   5567,  7794,
+   5644,  3061,
+   5672,  1513,
+   5957,  2338,
+   6533,  1060,
+   6804,  5998,
+   6820,  1767,
+   6937,  3837,
+   7277,   414,
+   7305,  2665,
+   7466, 11304,
+   7942,   794,
+   8007,  1982,
+   8007,  1366,
+   8326,  3105,
+   8336,  4810,
+   8708,  7954,
+   8989,  2279,
+   9031,  1055,
+   9247,  3568,
+   9283,  1631,
+   9654,  6311,
+   9811,  2605,
+  10120,   683,
+  10143,  4179,
+  10245,  1946,
+  10335,  1218,
+  10468,  9960,
+  10651,  3000,
+  10951,  1530,
+  10969,  5290,
+  11203,  2305,
+  11325,  3562,
+  11771,  6754,
+  11839,  1849,
+  11941,  4495,
+  11954,  1298,
+  11975, 15223,
+  11977,   883,
+  11986,  2842,
+  12438,  2141,
+  12593,  3665,
+  12636,  8367,
+  12658,  1594,
+  12886,  2628,
+  12984,  4942,
+  13146,  1115,
+  13224,   524,
+  13341,  3163,
+  13399,  1923,
+  13549,  5961,
+  13606,  1401,
+  13655,  2399,
+  13782,  3909,
+  13868, 10923,
+  14226,  1723,
+  14232,  2939,
+  14278,  7528,
+  14439,  4598,
+  14451,   984,
+  14458,  2265,
+  14792,  1403,
+  14818,  3445,
+  14899,  5709,
+  15017, 15362,
+  15048,  1946,
+  15069,  2655,
+  15405,  9591,
+  15405,  4079,
+  15570,  7183,
+  15687,  2286,
+  15691,  1624,
+  15699,  3068,
+  15772,  5149,
+  15868,  1205,
+  15970,   696,
+  16249,  3584,
+  16338,  1917,
+  16424,  2560,
+  16483,  4438,
+  16529,  6410,
+  16620, 11966,
+  16839,  8780,
+  17030,  3050,
+  17033, 18325,
+  17092,  1568,
+  17123,  5197,
+  17351,  2113,
+  17374,   980,
+  17566, 26214,
+  17609,  3912,
+  17639, 32767,
+  18151,  7871,
+  18197,  2516,
+  18202,  5649,
+  18679,  3283,
+  18930,  1370,
+  19271, 13757,
+  19317,  4120,
+  19460,  1973,
+  19654, 10018,
+  19764,  6792,
+  19912,  5135,
+  20040,  2841,
+  21234, 19833};
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/q_pulse.h b/media/libstagefright/codecs/amrwbenc/inc/q_pulse.h
index baf5525..b5d5280 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/q_pulse.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/q_pulse.h
@@ -1,66 +1,66 @@
-

-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/*--------------------------------------------------------------------------*

- *                         Q_PULSE.H                                        *

- *--------------------------------------------------------------------------*

- * Coding and decoding of algebraic codebook			            *

- *--------------------------------------------------------------------------*/

-

-#ifndef  __Q_PULSE_H__

-#define  __Q_PULSE_H__

-

-#include "typedef.h"

-

-Word32 quant_1p_N1(                        /* (o) return (N+1) bits           */

-		Word16 pos,                           /* (i) position of the pulse       */

-		Word16 N);                            /* (i) number of bits for position */

-

-Word32 quant_2p_2N1(                       /* (o) return (2*N)+1 bits         */

-		Word16 pos1,                          /* (i) position of the pulse 1     */

-		Word16 pos2,                          /* (i) position of the pulse 2     */

-		Word16 N);                            /* (i) number of bits for position */

-

-Word32 quant_3p_3N1(                       /* (o) return (3*N)+1 bits         */

-		Word16 pos1,                          /* (i) position of the pulse 1     */

-		Word16 pos2,                          /* (i) position of the pulse 2     */

-		Word16 pos3,                          /* (i) position of the pulse 3     */

-		Word16 N);                            /* (i) number of bits for position */

-

-Word32 quant_4p_4N1(                       /* (o) return (4*N)+1 bits         */

-		Word16 pos1,                          /* (i) position of the pulse 1     */

-		Word16 pos2,                          /* (i) position of the pulse 2     */

-		Word16 pos3,                          /* (i) position of the pulse 3     */

-		Word16 pos4,                          /* (i) position of the pulse 4     */

-		Word16 N);                            /* (i) number of bits for position */

-

-Word32 quant_4p_4N(                        /* (o) return 4*N bits             */

-		Word16 pos[],                         /* (i) position of the pulse 1..4  */

-		Word16 N);                            /* (i) number of bits for position */

-

-Word32 quant_5p_5N(                        /* (o) return 5*N bits             */

-		Word16 pos[],                         /* (i) position of the pulse 1..5  */

-		Word16 N);                            /* (i) number of bits for position */

-

-Word32 quant_6p_6N_2(                      /* (o) return (6*N)-2 bits         */

-		Word16 pos[],                         /* (i) position of the pulse 1..6  */

-		Word16 N);                            /* (i) number of bits for position */

-

-

-#endif //__Q_PULSE_H__

-

+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*--------------------------------------------------------------------------*
+ *                         Q_PULSE.H                                        *
+ *--------------------------------------------------------------------------*
+ * Coding and decoding of algebraic codebook			            *
+ *--------------------------------------------------------------------------*/
+
+#ifndef  __Q_PULSE_H__
+#define  __Q_PULSE_H__
+
+#include "typedef.h"
+
+Word32 quant_1p_N1(                        /* (o) return (N+1) bits           */
+		Word16 pos,                           /* (i) position of the pulse       */
+		Word16 N);                            /* (i) number of bits for position */
+
+Word32 quant_2p_2N1(                       /* (o) return (2*N)+1 bits         */
+		Word16 pos1,                          /* (i) position of the pulse 1     */
+		Word16 pos2,                          /* (i) position of the pulse 2     */
+		Word16 N);                            /* (i) number of bits for position */
+
+Word32 quant_3p_3N1(                       /* (o) return (3*N)+1 bits         */
+		Word16 pos1,                          /* (i) position of the pulse 1     */
+		Word16 pos2,                          /* (i) position of the pulse 2     */
+		Word16 pos3,                          /* (i) position of the pulse 3     */
+		Word16 N);                            /* (i) number of bits for position */
+
+Word32 quant_4p_4N1(                       /* (o) return (4*N)+1 bits         */
+		Word16 pos1,                          /* (i) position of the pulse 1     */
+		Word16 pos2,                          /* (i) position of the pulse 2     */
+		Word16 pos3,                          /* (i) position of the pulse 3     */
+		Word16 pos4,                          /* (i) position of the pulse 4     */
+		Word16 N);                            /* (i) number of bits for position */
+
+Word32 quant_4p_4N(                        /* (o) return 4*N bits             */
+		Word16 pos[],                         /* (i) position of the pulse 1..4  */
+		Word16 N);                            /* (i) number of bits for position */
+
+Word32 quant_5p_5N(                        /* (o) return 5*N bits             */
+		Word16 pos[],                         /* (i) position of the pulse 1..5  */
+		Word16 N);                            /* (i) number of bits for position */
+
+Word32 quant_6p_6N_2(                      /* (o) return (6*N)-2 bits         */
+		Word16 pos[],                         /* (i) position of the pulse 1..6  */
+		Word16 N);                            /* (i) number of bits for position */
+
+
+#endif //__Q_PULSE_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/qisf_ns.tab b/media/libstagefright/codecs/amrwbenc/inc/qisf_ns.tab
index 52f0daf..43c47e9 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/qisf_ns.tab
+++ b/media/libstagefright/codecs/amrwbenc/inc/qisf_ns.tab
@@ -1,347 +1,347 @@
-

-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/*-------------------------------------------------------------------*

- *                         qisf_ns.h

- *-------------------------------------------------------------------*

- * Quantization tables for split by 5 VQ of ISFs for a background noise database

- * Version whith no prediction

- *-------------------------------------------------------------------*/

-

-#define ORDER   16            /* order of linear prediction filter */

-#define ISF_GAP 128

-

-#define SIZE_BK_NOISE1  64

-#define SIZE_BK_NOISE2  64

-#define SIZE_BK_NOISE3  64

-#define SIZE_BK_NOISE4  32

-#define SIZE_BK_NOISE5  32

-

-

-/* means of ISFs */

- static Word16 mean_isf_noise[ORDER] = {

-

-   478,  1100,  2213,  3267,  4219,  5222,  6198,  7240,

-  8229,  9153, 10098, 11108, 12144, 13184, 14165,  3803};

-

-

-/* 28 bits */

-/*-------------------------------------------------------------------*

- *  isf codebooks:  split-by-5 VQ                                    *

- *                                                                   *

- *  codebook   vector dimension    number of vectors                 *

- *  ~~~~~~~~   ~~~~~~~~~~~~~~~~    ~~~~~~~~~~~~~~~~~                 *

- *     1            2                  64                            *

- *     2            3                  64                            *

- *     3            3                  64                            *

- *     4            4                  32                            *

- *     5            4                  32                            *

- *-------------------------------------------------------------------*/

-

-/*------------------------------------------------*

- * 1st split:   isf0 to isf1

- *------------------------------------------------*/

-

-

- static Word16 dico1_isf_noise[SIZE_BK_NOISE1*2] = {

-

-  -269,  -673,

-  -222,  -537,

-  -233,  -430,

-  -138,  -451,

-  -212,  -331,

-  -192,  -241,

-   -87,  -231,

-  -191,  -128,

-   -70,  -106,

-  -164,    -6,

-    74,  -179,

-    27,   -33,

-  -102,    74,

-  -162,   115,

-   -94,   172,

-    -6,   130,

-  -143,   234,

-    14,   218,

-   -65,   270,

-    88,   182,

-  -124,   341,

-   -44,   381,

-    38,   335,

-   117,   274,

-  -112,   454,

-    74,   431,

-    -5,   488,

-   175,   384,

-   -83,   561,

-   122,   529,

-    21,   601,

-   229,   481,

-   231,   303,

-   226,   608,

-   300,   372,

-   210,   187,

-   306,   265,

-   328,   473,

-   382,   331,

-   371,   132,

-   139,    58,

-   365,    21,

-   250,   -82,

-   443,   218,

-   483,   110,

-   426,   415,

-   579,   222,

-   518,   333,

-   573,   448,

-   455,   529,

-   685,   329,

-   332,   580,

-   595,   593,

-   468,   645,

-   762,   517,

-   326,   709,

-   485,   793,

-   130,   684,

-   671,   737,

-   354,   876,

-    88,   806,

-   -65,   706,

-   -35,  1016,

-   266,  1123};

-

-

-/*------------------------------------------------*

- * 2nd split:   isf2 to isf4

- *------------------------------------------------*/

-

- static Word16 dico2_isf_noise[SIZE_BK_NOISE2*3] = {

-

-  -824,  -884,  -949,

-  -805,  -456,  -418,

-  -442,  -438,  -541,

-  -217,  -578,  -793,

-  -168,  -444,  -582,

-  -287,  -492,  -274,

-  -552,  -297,  -300,

-  -163,  -333,  -358,

-  -370,  -232,  -232,

-  -175,  -358,  -159,

-  -381,   -21,  -357,

-  -184,  -159,  -162,

-   -53,  -191,  -280,

-    18,  -267,  -215,

-  -138,    61,  -283,

-    71,   -95,  -294,

-    13,  -156,  -546,

-     0,   -83,   -79,

-    44,    97,  -316,

-   178,   -52,  -213,

-   222,  -261,  -422,

-   237,  -118,   -44,

-   141,   145,  -132,

-   363,    81,  -287,

-   213,    65,    34,

-  -107,    94,    -5,

-    91,   -29,   126,

-  -355,    51,   -41,

-  -219,   -76,   145,

-   -63,   100,   244,

-  -719,    44,    27,

-  -572,  -124,   155,

-  -423,   133,   315,

-  -917,    71,   224,

-  -268,   318,   131,

-   -93,  -190,   420,

-   -97,   122,   491,

-   -79,   317,   355,

-   130,   100,   325,

-    86,  -293,   210,

-   133,   258,   161,

-   176,   -73,   465,

-   195,   300,   384,

-   348,    22,   221,

-   376,   183,   409,

-   377,   286,   202,

-   242,   213,   659,

-   257,   565,   248,

-   344,   408,   -76,

-   405,   440,   509,

-   612,   385,   379,

-   536,   607,   216,

-   -56,   582,   192,

-   100,   517,   567,

-  -365,   448,   445,

-   728,   347,    10,

-   505,   357,   759,

-   636,   582,   658,

-   335,   517,   852,

-   378,   809,   572,

-  -195,   878,   829,

-   529,   707,   987,

-   918,   726,   392,

-  1250,   997,  1063};

-

-/*------------------------------------------------*

- * 3rd split:   isf5 to isf7

- *------------------------------------------------*/

-

- static Word16 dico3_isf_noise[SIZE_BK_NOISE3*3] = {

-

-  -805,  -838,  -774,

-  -522,  -627,  -828,

-  -477,  -486,  -603,

-  -295,  -481,  -634,

-  -366,  -384,  -393,

-  -186,  -414,  -396,

-  -237,  -394,  -106,

-  -252,  -202,  -275,

-   -61,  -177,  -442,

-   -84,  -198,  -199,

-  -179,  -125,   -31,

-   -72,   -47,  -163,

-  -298,  -220,   215,

-   -64,  -168,   251,

-  -133,   156,   -59,

-   -30,    -2,   127,

-    54,    66,   -61,

-  -233,    21,   251,

-   209,   -50,    32,

-    33,   194,   136,

-  -117,   -18,   475,

-   202,    46,   309,

-   256,   185,    53,

-    35,   200,   390,

-   200,   263,   242,

-  -216,   302,   294,

-   128,   358,     0,

-    19,   431,   287,

-   224,   447,   280,

-   367,   165,   213,

-   397,   314,   319,

-   383,   379,    75,

-   277,   325,   462,

-   394,   505,   334,

-   251,    98,  -213,

-   450,   153,   448,

-   565,   226,    76,

-   470,   383,   502,

-   635,   390,   278,

-   237,   135,   620,

-   342,   401,   649,

-   331,   551,   518,

-   130,   418,   592,

-   531,   306,   737,

-   729,   389,   580,

-   497,   557,   699,

-   296,   383,   874,

-   283,   624,   759,

-   126,   622,   476,

-   559,   595,   472,

-   382,   770,   616,

-   719,   613,   745,

-   540,   639,   928,

-   517,   826,   801,

-   684,   811,   604,

-   752,   786,   857,

-   933,   661,   350,

-   694,   450,  1061,

-   562,   911,  1051,

-   824,   813,  1104,

-   758,  1047,   882,

-  1140,   917,   889,

-  1039,  1246,  1426,

-  1483,  1666,  1876};

-

-/*------------------------------------------------*

- * 4th split:   isf8 to isf11

- *------------------------------------------------*/

-

- static Word16 dico4_isf_noise[SIZE_BK_NOISE4*4] = {

-

-  -776,  -854,  -891,  -920,

-  -552,  -610,  -663,  -741,

-  -321,  -370,  -476,  -565,

-   274,  -160,  -456,   201,

-   265,    67,  -160,  -306,

-    -8,  -210,    79,   272,

-   163,   236,   307,   308,

-   578,   317,    64,   298,

-    -9,   197,   342,   620,

-   343,   232,   314,   622,

-   173,   149,   548,   527,

-   356,   370,   481,   376,

-   135,   444,   488,   556,

-   391,   471,   487,   653,

-   228,   424,   576,   835,

-   422,   372,   722,   682,

-   295,   673,   693,   635,

-   539,   596,   590,   449,

-   475,   618,   659,   818,

-   735,   517,   491,   673,

-   602,   346,   257,   877,

-   625,   635,   849,   720,

-   727,   818,   698,   595,

-   653,   481,   690,  1139,

-   814,   762,   704,   908,

-   507,   747,   898,   936,

-   848,   855,   924,   785,

-   646,  1037,   882,   795,

-   772,   845,  1024,  1151,

-  1133,   983,   818,   921,

-   940,  1068,  1252,  1302,

-  1588,  1767,  1718,  1513};

-

-/*------------------------------------------------*

- * 5th split:   isf12 to isf15

- *------------------------------------------------*/

-

- static Word16 dico5_isf_noise[SIZE_BK_NOISE5*4] = {

-  -810,  -879,  -945,  -254,

-   248,   184,   671,   128,

-   288,   703,   918,    99,

-   658,   558,   662,   219,

-   552,   585,   910,   208,

-   559,   804,   759,   119,

-   606,   774,   921,  -139,

-   782,   761,   748,   208,

-   756,   708,   983,    56,

-   544,   864,  1010,   152,

-   737,   698,   987,   299,

-   771,   924,   879,   103,

-   536,   785,   961,   405,

-   667,   916,   801,   328,

-   738,   705,   773,   439,

-   823,   871,   992,   355,

-   640,  1004,  1052,   369,

-   724,   822,   949,   597,

-   415,   655,   729,   482,

-  1009,   896,   793,   363,

-   908,   803,   687,   -25,

-  1016,   838,  1011,   189,

-   947,  1112,   942,   222,

-   914,  1049,   981,   527,

-   956,   987,  1011,  -120,

-   781,  1049,  1121,    92,

-  1178,  1053,   884,    47,

-  1123,  1059,  1182,   118,

-   933,   972,  1277,   357,

-  1109,   918,  1101,   503,

-  1039,  1286,  1220,   317,

-  1351,  1207,  1010,   326};

-

+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*-------------------------------------------------------------------*
+ *                         qisf_ns.h
+ *-------------------------------------------------------------------*
+ * Quantization tables for split by 5 VQ of ISFs for a background noise database
+ * Version whith no prediction
+ *-------------------------------------------------------------------*/
+
+#define ORDER   16            /* order of linear prediction filter */
+#define ISF_GAP 128
+
+#define SIZE_BK_NOISE1  64
+#define SIZE_BK_NOISE2  64
+#define SIZE_BK_NOISE3  64
+#define SIZE_BK_NOISE4  32
+#define SIZE_BK_NOISE5  32
+
+
+/* means of ISFs */
+ static Word16 mean_isf_noise[ORDER] = {
+
+   478,  1100,  2213,  3267,  4219,  5222,  6198,  7240,
+  8229,  9153, 10098, 11108, 12144, 13184, 14165,  3803};
+
+
+/* 28 bits */
+/*-------------------------------------------------------------------*
+ *  isf codebooks:  split-by-5 VQ                                    *
+ *                                                                   *
+ *  codebook   vector dimension    number of vectors                 *
+ *  ~~~~~~~~   ~~~~~~~~~~~~~~~~    ~~~~~~~~~~~~~~~~~                 *
+ *     1            2                  64                            *
+ *     2            3                  64                            *
+ *     3            3                  64                            *
+ *     4            4                  32                            *
+ *     5            4                  32                            *
+ *-------------------------------------------------------------------*/
+
+/*------------------------------------------------*
+ * 1st split:   isf0 to isf1
+ *------------------------------------------------*/
+
+
+ static Word16 dico1_isf_noise[SIZE_BK_NOISE1*2] = {
+
+  -269,  -673,
+  -222,  -537,
+  -233,  -430,
+  -138,  -451,
+  -212,  -331,
+  -192,  -241,
+   -87,  -231,
+  -191,  -128,
+   -70,  -106,
+  -164,    -6,
+    74,  -179,
+    27,   -33,
+  -102,    74,
+  -162,   115,
+   -94,   172,
+    -6,   130,
+  -143,   234,
+    14,   218,
+   -65,   270,
+    88,   182,
+  -124,   341,
+   -44,   381,
+    38,   335,
+   117,   274,
+  -112,   454,
+    74,   431,
+    -5,   488,
+   175,   384,
+   -83,   561,
+   122,   529,
+    21,   601,
+   229,   481,
+   231,   303,
+   226,   608,
+   300,   372,
+   210,   187,
+   306,   265,
+   328,   473,
+   382,   331,
+   371,   132,
+   139,    58,
+   365,    21,
+   250,   -82,
+   443,   218,
+   483,   110,
+   426,   415,
+   579,   222,
+   518,   333,
+   573,   448,
+   455,   529,
+   685,   329,
+   332,   580,
+   595,   593,
+   468,   645,
+   762,   517,
+   326,   709,
+   485,   793,
+   130,   684,
+   671,   737,
+   354,   876,
+    88,   806,
+   -65,   706,
+   -35,  1016,
+   266,  1123};
+
+
+/*------------------------------------------------*
+ * 2nd split:   isf2 to isf4
+ *------------------------------------------------*/
+
+ static Word16 dico2_isf_noise[SIZE_BK_NOISE2*3] = {
+
+  -824,  -884,  -949,
+  -805,  -456,  -418,
+  -442,  -438,  -541,
+  -217,  -578,  -793,
+  -168,  -444,  -582,
+  -287,  -492,  -274,
+  -552,  -297,  -300,
+  -163,  -333,  -358,
+  -370,  -232,  -232,
+  -175,  -358,  -159,
+  -381,   -21,  -357,
+  -184,  -159,  -162,
+   -53,  -191,  -280,
+    18,  -267,  -215,
+  -138,    61,  -283,
+    71,   -95,  -294,
+    13,  -156,  -546,
+     0,   -83,   -79,
+    44,    97,  -316,
+   178,   -52,  -213,
+   222,  -261,  -422,
+   237,  -118,   -44,
+   141,   145,  -132,
+   363,    81,  -287,
+   213,    65,    34,
+  -107,    94,    -5,
+    91,   -29,   126,
+  -355,    51,   -41,
+  -219,   -76,   145,
+   -63,   100,   244,
+  -719,    44,    27,
+  -572,  -124,   155,
+  -423,   133,   315,
+  -917,    71,   224,
+  -268,   318,   131,
+   -93,  -190,   420,
+   -97,   122,   491,
+   -79,   317,   355,
+   130,   100,   325,
+    86,  -293,   210,
+   133,   258,   161,
+   176,   -73,   465,
+   195,   300,   384,
+   348,    22,   221,
+   376,   183,   409,
+   377,   286,   202,
+   242,   213,   659,
+   257,   565,   248,
+   344,   408,   -76,
+   405,   440,   509,
+   612,   385,   379,
+   536,   607,   216,
+   -56,   582,   192,
+   100,   517,   567,
+  -365,   448,   445,
+   728,   347,    10,
+   505,   357,   759,
+   636,   582,   658,
+   335,   517,   852,
+   378,   809,   572,
+  -195,   878,   829,
+   529,   707,   987,
+   918,   726,   392,
+  1250,   997,  1063};
+
+/*------------------------------------------------*
+ * 3rd split:   isf5 to isf7
+ *------------------------------------------------*/
+
+ static Word16 dico3_isf_noise[SIZE_BK_NOISE3*3] = {
+
+  -805,  -838,  -774,
+  -522,  -627,  -828,
+  -477,  -486,  -603,
+  -295,  -481,  -634,
+  -366,  -384,  -393,
+  -186,  -414,  -396,
+  -237,  -394,  -106,
+  -252,  -202,  -275,
+   -61,  -177,  -442,
+   -84,  -198,  -199,
+  -179,  -125,   -31,
+   -72,   -47,  -163,
+  -298,  -220,   215,
+   -64,  -168,   251,
+  -133,   156,   -59,
+   -30,    -2,   127,
+    54,    66,   -61,
+  -233,    21,   251,
+   209,   -50,    32,
+    33,   194,   136,
+  -117,   -18,   475,
+   202,    46,   309,
+   256,   185,    53,
+    35,   200,   390,
+   200,   263,   242,
+  -216,   302,   294,
+   128,   358,     0,
+    19,   431,   287,
+   224,   447,   280,
+   367,   165,   213,
+   397,   314,   319,
+   383,   379,    75,
+   277,   325,   462,
+   394,   505,   334,
+   251,    98,  -213,
+   450,   153,   448,
+   565,   226,    76,
+   470,   383,   502,
+   635,   390,   278,
+   237,   135,   620,
+   342,   401,   649,
+   331,   551,   518,
+   130,   418,   592,
+   531,   306,   737,
+   729,   389,   580,
+   497,   557,   699,
+   296,   383,   874,
+   283,   624,   759,
+   126,   622,   476,
+   559,   595,   472,
+   382,   770,   616,
+   719,   613,   745,
+   540,   639,   928,
+   517,   826,   801,
+   684,   811,   604,
+   752,   786,   857,
+   933,   661,   350,
+   694,   450,  1061,
+   562,   911,  1051,
+   824,   813,  1104,
+   758,  1047,   882,
+  1140,   917,   889,
+  1039,  1246,  1426,
+  1483,  1666,  1876};
+
+/*------------------------------------------------*
+ * 4th split:   isf8 to isf11
+ *------------------------------------------------*/
+
+ static Word16 dico4_isf_noise[SIZE_BK_NOISE4*4] = {
+
+  -776,  -854,  -891,  -920,
+  -552,  -610,  -663,  -741,
+  -321,  -370,  -476,  -565,
+   274,  -160,  -456,   201,
+   265,    67,  -160,  -306,
+    -8,  -210,    79,   272,
+   163,   236,   307,   308,
+   578,   317,    64,   298,
+    -9,   197,   342,   620,
+   343,   232,   314,   622,
+   173,   149,   548,   527,
+   356,   370,   481,   376,
+   135,   444,   488,   556,
+   391,   471,   487,   653,
+   228,   424,   576,   835,
+   422,   372,   722,   682,
+   295,   673,   693,   635,
+   539,   596,   590,   449,
+   475,   618,   659,   818,
+   735,   517,   491,   673,
+   602,   346,   257,   877,
+   625,   635,   849,   720,
+   727,   818,   698,   595,
+   653,   481,   690,  1139,
+   814,   762,   704,   908,
+   507,   747,   898,   936,
+   848,   855,   924,   785,
+   646,  1037,   882,   795,
+   772,   845,  1024,  1151,
+  1133,   983,   818,   921,
+   940,  1068,  1252,  1302,
+  1588,  1767,  1718,  1513};
+
+/*------------------------------------------------*
+ * 5th split:   isf12 to isf15
+ *------------------------------------------------*/
+
+ static Word16 dico5_isf_noise[SIZE_BK_NOISE5*4] = {
+  -810,  -879,  -945,  -254,
+   248,   184,   671,   128,
+   288,   703,   918,    99,
+   658,   558,   662,   219,
+   552,   585,   910,   208,
+   559,   804,   759,   119,
+   606,   774,   921,  -139,
+   782,   761,   748,   208,
+   756,   708,   983,    56,
+   544,   864,  1010,   152,
+   737,   698,   987,   299,
+   771,   924,   879,   103,
+   536,   785,   961,   405,
+   667,   916,   801,   328,
+   738,   705,   773,   439,
+   823,   871,   992,   355,
+   640,  1004,  1052,   369,
+   724,   822,   949,   597,
+   415,   655,   729,   482,
+  1009,   896,   793,   363,
+   908,   803,   687,   -25,
+  1016,   838,  1011,   189,
+   947,  1112,   942,   222,
+   914,  1049,   981,   527,
+   956,   987,  1011,  -120,
+   781,  1049,  1121,    92,
+  1178,  1053,   884,    47,
+  1123,  1059,  1182,   118,
+   933,   972,  1277,   357,
+  1109,   918,  1101,   503,
+  1039,  1286,  1220,   317,
+  1351,  1207,  1010,   326};
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/qpisf_2s.tab b/media/libstagefright/codecs/amrwbenc/inc/qpisf_2s.tab
index 4d869a4..b6b4e81 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/qpisf_2s.tab
+++ b/media/libstagefright/codecs/amrwbenc/inc/qpisf_2s.tab
@@ -1,1360 +1,1360 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/*-------------------------------------------------------------------*

- *                         qpisf_2s.h

- *-------------------------------------------------------------------*

- * Quantization tables for two-stage of ISFs (split by 2 in 1st stage)

- * Version whith prediction MU = 0.25

- *-------------------------------------------------------------------*/

-

-#define ORDER   16            /* order of linear prediction filter */

-#define ISF_GAP 128           /* 50 Hz */

-#define N_SURV  4

-

-#define SIZE_BK1  256

-#define SIZE_BK2  256

-#define SIZE_BK21 64

-#define SIZE_BK22 128

-#define SIZE_BK23 128

-#define SIZE_BK24 32

-#define SIZE_BK25 32

-

-#define SIZE_BK21_36b 128

-#define SIZE_BK22_36b 128

-#define SIZE_BK23_36b 64

-

-/* means of ISFs */

-static Word16 mean_isf[ORDER] = {

-

-   738,  1326,  2336,  3578,  4596,  5662,  6711,  7730,

-  8750,  9753, 10705, 11728, 12833, 13971, 15043,  4037};

-

-/* 46 bits */

-/*-------------------------------------------------------------------*

- *  isf codebooks:  two-stage VQ with split-by-5 in 2nd stage        *

- *                                                                   *

- *  codebook   vector dimension    number of vectors                 *

- *  ~~~~~~~~   ~~~~~~~~~~~~~~~~    ~~~~~~~~~~~~~~~~~                 *

- *     1_1            9                  256                         *

- *     1_2            7                  256                         *

- *     2_1            3                  64                          *

- *     2_2            3                  128                         *

- *     2_3            3                  128                         *

- *     2_4            3                  32                          *

- *     2_5            4                  32                          *

- *-------------------------------------------------------------------*/

-

-/*------------------------------------------------*

- * 1st stage codebook; 1st split:   isf0 to isf8

- *------------------------------------------------*/

-

-static Word16 dico1_isf[SIZE_BK1*9] = {

-

-   579,  1081,  1035,   390,     3,  -263,  -198,   -82,    38,

-    18,   -68,   -12,   313,   761,   405,   249,   111,   -76,

-   740,  1263,  1292,  1006,   997,  1019,  1017,   976,   923,

-   -91,   827,   948,   648,   613,   535,   522,   490,   421,

-    41,   -44,  -281,  -472,   652,   534,   193,   135,   -90,

-    41,  -121,  -356,   -60,   663,   307,    61,   -48,  -344,

-   557,   946,  1049,   867,   846,   990,  1112,  1262,  1241,

-  -118,  -204,   328,   512,   870,   793,   610,   402,   186,

-   156,   293,    74,  -338,  -475,  -897,  -594,  -161,  -497,

-   226,   131,  -138,   307,   169,  -271,  -164,  -387,  -624,

-    62,   -32,   -61,  -252,  -541,  -828, -1027,  -523,  -662,

-   102,   -61,   141,   112,  -270,  -251,  -541,    25,  -150,

-     6,  -132,  -356,  -686,   -96,  -322,  -522,   -31,  -326,

-   -36,  -209,  -521,  -229,   307,  -132,    -5,   -99,  -384,

-    60,   -51,  -237,  -668,  -973,  -407,  -708,   -75,  -172,

-    26,  -138,  -266,   111,  -302,    43,  -278,  -356,  -359,

-   570,   822,   496,  -154,  -312,   -92,   137,   279,   371,

-  -146,   368,   409,    68,     6,    77,   167,   202,   162,

-   633,   898,   996,   756,   662,   683,   783,   909,   996,

-  -103,   294,   607,   415,   483,   462,   480,   431,   408,

-  -120,  -338,  -612,  -524,   584,   331,    92,   433,   276,

-  -178,  -293,  -154,   -41,   269,   100,    -9,   213,   160,

-   830,   736,   278,   820,  1254,   686,   712,  1039,   473,

-  -218,  -304,   463,   454,   397,   273,   202,   286,   273,

-  -232,     7,     6,  -388,  -472,  -427,  -378,  -167,  -100,

-  -294,  -183,   134,   -47,   101,   -88,   -84,  -117,    -3,

-    57,    17,  -202,  -634,  -989, -1119,  -533,   176,   -36,

-   120,   -28,    23,   111,  -319,   318,   -22,   -77,   266,

-  -271,  -464,  -434,  -658,  -640,  -385,  -385,   -99,   -69,

-  -198,  -259,  -266,   -44,   -39,  -139,  -137,   171,    66,

-     9,  -145,  -377,  -846, -1000,  -111,  -325,   342,   135,

-   -81,  -286,  -380,   192,   -57,   307,    76,   -24,  -140,

-   677,   702,   247,    56,   249,   141,  -105,  -236,   -99,

-    36,   -39,   -69,   348,   198,   -93,   322,    91,   -72,

-   503,   885,  1508,  1307,  1282,  1172,  1119,  1209,  1061,

-   416,   719,   989,  1227,  1001,  1052,   954,   741,  1044,

-  -127,  -376,  -657,   139,   623,   223,   501,   306,   220,

-  -113,  -384,  -796,   504,   438,    85,   213,   -83,  -194,

-   585,  1132,  1233,  1091,  1247,  1433,  1512,  1448,  1314,

-  -174,  -422,     7,  1155,  1089,  1182,  1003,   945,   806,

-     8,  -126,  -317,  -103,  -351,  -695,   -98,  -268,  -537,

-    33,  -103,  -290,   167,   -39,  -407,    44,  -208,  -375,

-   104,   -23,   -64,  -291,  -637,  -851, -1084,   -61,  -112,

-   -75,  -306,  -434,   218,  -148,  -354,  -680,  -133,  -216,

-  -121,  -377,  -718,   -97,  -130,  -361,  -156,  -379,  -599,

-   -56,  -254,  -586,   235,   157,  -214,    11,  -260,  -149,

-  -124,  -267,  -397,  -580,  -593,  -527,  -805,  -385,   346,

-  -193,  -440,  -708,  -351,  -141,  -255,  -499,  -147,  -185,

-   448,   660,   494,   208,   509,   461,   338,   291,   149,

-  -223,    88,   335,   159,   212,   191,   286,   308,   205,

-   -31,   469,   803,   659,   619,   658,   843,   987,  1113,

-  -171,  -242,   514,   362,   295,   524,   552,   694,   585,

-   -64,  -308,  -448,   -21,   284,   786,   446,   289,    92,

-  -218,  -390,    -7,   169,   206,   330,   352,   408,   358,

-   -36,   702,   959,   859,   861,  1115,  1269,  1357,  1305,

-  -133,  -341,   -65,   678,   417,   440,   486,   518,   780,

-    33,   -44,  -191,  -344,  -461,  -755,  -201,   217,   -31,

-  -353,  -547,   -44,   123,   -61,   -68,   -79,    29,    60,

-    73,   -57,  -406,  -766, -1243, -1203,   240,   400,   165,

-   -73,  -282,  -601,  -213,  -171,  -375,   332,    35,  -103,

-   -29,  -207,  -553,  -476,  -638,  -908,   172,   -22,  -135,

-  -192,  -239,  -164,  -103,  -111,   -47,   153,   125,   110,

-    -1,  -203,  -570, -1030, -1424,  -535,   155,     1,   147,

-  -333,  -653,  -865,  -197,  -158,   -21,   -44,    95,   108,

-   389,   588,   490,    33,  -237,  -524,  -628,  -136,  -260,

-    40,  -177,  -462,   453,   862,   380,   131,  -130,  -405,

-   842,  1678,  1841,  1549,  1474,  1256,  1082,   905,   742,

-   370,  1216,  1768,  1633,  1212,   636,    22,  -330,    71,

-   -76,  -281,  -741,  -742,   898,   619,   277,    71,  -222,

-   -32,  -265,  -556,   -25,   994,   682,   305,   126,  -165,

-    73,   738,   893,   968,   993,  1768,  2273,  1840,  1391,

-   -69,  -349,  -585,   234,  1158,   903,   626,   510,   251,

-    -1,   -99,  -272,  -210,  -603,  -351,  -540,  -811,  -383,

-   -16,  -230,  -504,   410,   149,  -205,  -343,  -651,  -639,

-   103,    -9,  -227,  -205,  -562,  -781, -1079, -1208,  -156,

-   143,    63,  -135,   -67,  -317,  -602,  -784, -1154,  -640,

-  -144,  -391,  -674,  -622,  -200,  -254,  -660,  -947,  -395,

-   -40,  -250,  -625,    27,   543,    94,  -131,  -386,  -673,

-  -123,  -371,  -757,  -451,  -564,  -614,  -415,  -711,   -35,

-  -116,  -309,  -593,  -268,   239,   -33,  -338,  -650,  -135,

-    94,   251,   554,    57,  -312,  -423,  -154,   -57,   235,

-  -268,   -71,   381,   114,   -44,   -87,   125,   173,   133,

-  1513,  1714,  1238,   534,   276,   315,   461,   459,   508,

-  -131,   -19,  1149,   670,   486,   356,   309,   369,   296,

-  -223,  -501,  -899,  -722,   -70,     6,   131,   310,   394,

-   -99,  -303,  -517,   249,    64,   -53,   135,   -11,   453,

-  -147,  -399,  -730,  -401,   817,   738,   802,   749,   575,

-  -154,  -435,  -739,   800,   593,   366,   529,   318,   326,

-  -224,    45,   -39,  -387,  -515,  -518,  -608,  -384,  -321,

-  -315,  -377,   143,  -101,  -113,  -377,  -177,  -144,   -12,

-   117,    40,  -239,  -651, -1051,  -581,  -737,  -990,  -328,

-    26,   -50,  -157,   -23,  -453,  -283,  -531,  -546,   192,

-  -252,  -501,  -743,  -589,  -627,  -499,  -328,  -118,   -72,

-  -324,  -494,  -244,  -306,  -144,  -177,  -262,  -135,   -78,

-   -36,  -234,  -519,  -961, -1290,  -314,  -479,  -371,   -45,

-   -95,  -292,  -535,    -8,  -300,   112,  -164,  -277,   198,

-   -99,  -128,   880,   836,   579,   351,    23,   -95,  -217,

-   -27,  -258,   124,  1011,   597,   425,   144,     7,   -73,

-   421,  1293,  1640,  1623,  1742,  1617,  1499,  1284,  1006,

-   -95,   752,  1680,  1569,  1618,  1436,  1200,   980,   712,

-   -69,  -300,  -683,  -435,  1132,   899,   504,   332,   109,

-   -74,  -323,  -637,   563,  1074,   608,   371,   105,   -49,

-   -78,   831,  1194,  1110,  1378,  1481,  1492,  1365,  1217,

-  -259,  -121,  1440,  1334,  1628,  1490,  1438,  1223,   933,

-   -82,  -306,  -613,  -222,  -378,  -675,  -545,  -671,  -845,

-    53,  -124,  -347,   422,    52,  -125,  -270,  -529,     9,

-    79,   -89,  -320,  -662,  -999, -1199, -1243,  -676,  -297,

-   -68,  -273,  -611,   137,  -146,  -397,  -627,  -845,  -220,

-  -112,  -346,  -797,  -826,   234,  -132,  -188,  -278,  -522,

-  -159,  -405,  -734,  -419,   293,    74,  -167,  -167,   184,

-  -153,  -437,  -833, -1080,  -336,  -472,  -561,  -340,  -253,

-  -169,  -423,  -820,  -904,  -131,   -19,  -346,  -604,    31,

-    33,   -31,   312,    62,  -148,    49,   -59,   564,   486,

-  -306,  -333,   194,   -44,    67,    72,   147,   205,   243,

-  -207,   -49,  1360,   983,   969,   991,  1014,  1110,   973,

-  -211,  -172,   883,   627,   711,   674,   705,   798,   746,

-   -88,  -325,  -763,  -974,   687,   908,   514,   382,   172,

-  -292,  -612,  -805,    63,   131,   270,   259,   352,   348,

-  -235,   -84,   955,   818,  1120,  1289,  1559,  1480,  1285,

-  -180,  -461,  -614,   657,   691,   745,   854,   783,   713,

-   -97,  -309,  -477,  -614,  -777,  -734,  -768,  -526,  -472,

-  -344,  -476,   -35,  -169,    49,   -77,  -150,  -240,  -141,

-   -52,  -268,  -639,  -919, -1278, -1113,  -342,  -333,  -151,

-   -68,  -242,  -585,   -73,  -209,  -478,  -159,  -429,   133,

-  -197,  -499, -1005, -1268,  -272,  -224,  -105,   -67,    17,

-  -363,  -618,  -414,  -116,   -62,    20,    10,   116,   108,

-  -195,  -475,  -906, -1260,  -891,  -441,  -277,  -142,   -28,

-  -226,  -519,  -950,  -700,  -275,  -266,  -116,  -105,    82,

-   404,   511,   520,   327,    17,  -194,  -333,  -536,  -586,

-  -114,  -130,   276,   237,   204,   342,   135,   -16,  -111,

-   670,  1208,  1168,   860,   742,   601,   528,   403,   309,

-   397,   621,   966,   752,   579,   398,   400,   329,   252,

-   191,   180,  -137,  -467,   272,   106,   -95,    17,  -192,

-   -80,  -290,  -626,   194,   598,   196,    21,  -281,    77,

-   510,   864,  1108,   807,   939,   902,   925,   717,   481,

-   137,   367,   534,   764,   670,   382,   296,   153,    84,

-   303,   497,   144,   -85,  -125,  -539,  -482,  -464,  -764,

-   233,   347,    68,  -147,   169,  -210,  -242,  -226,  -482,

-   307,   422,   154,  -175,  -386,  -722,  -724,  -904, -1015,

-   309,   308,   160,   -60,  -470,  -420,  -598,  -791,  -219,

-    68,   121,  -137,  -560,  -146,  -446,  -515,  -494,  -729,

-   130,    53,  -227,    46,   474,    32,  -161,  -192,  -490,

-   213,   164,   -71,  -465,  -876,  -161,  -456,  -587,   -48,

-   218,   117,    39,   177,  -194,   -88,  -226,  -418,    50,

-   210,   547,   569,   279,   121,   -44,   -50,    10,   -84,

-    58,   140,   182,    -5,   267,   117,   106,   211,   198,

-   539,   835,   913,   719,   617,   544,   591,   565,   642,

-   153,   559,   872,   460,   222,   108,   188,   180,   183,

-   158,   119,   284,  -153,  -271,   229,    87,   110,   -57,

-  -183,    82,   118,    21,    13,    40,   118,   191,   185,

-   162,   889,   654,   108,   -34,   244,   488,   561,   532,

-   163,    56,   609,   341,    50,   329,    68,   266,   218,

-   100,   206,    18,  -304,  -107,  -436,  -487,   -65,  -306,

-   -86,   154,   134,   -30,   -45,   -73,  -104,   -80,   -96,

-   245,   330,    10,  -440,  -849, -1082,    79,    40,  -265,

-   196,   372,   272,  -181,  -493,  -389,   275,    80,   -59,

-     2,   -12,  -246,  -505,  -100,  -436,    21,  -187,  -431,

-  -221,   -48,    36,  -271,  -186,  -147,  -109,    26,    71,

-   213,   140,    72,  -351,  -620,   -84,  -363,    69,    46,

-    91,   167,    -3,   -95,   -99,  -105,   -48,   114,   147,

-   259,   249,   172,   607,   406,    52,    59,  -189,  -320,

-   115,   -85,   -54,   574,   128,   226,   -59,  -253,   130,

-   -62,  1033,  1308,  1035,  1127,  1098,  1029,   961,   823,

-    39,   364,   757,   940,   728,   660,   659,   583,   770,

-  -115,  -338,  -760,  -471,   394,    37,   441,   178,     6,

-   -57,  -305,  -525,   796,   453,   188,    -4,  -114,   248,

-    71,   444,   797,   731,  1096,  1157,  1222,  1029,   811,

-   135,   359,   551,   425,   749,   815,   874,   704,   502,

-   132,   247,     0,  -206,  -449,  -750,  -258,  -514,  -633,

-   248,   249,    91,   121,  -195,  -499,   -90,  -282,  -435,

-    78,    20,  -277,  -623,  -983, -1224,  -415,  -458,  -639,

-   347,   509,   208,  -179,  -464,  -728,   -76,  -237,  -486,

-  -103,  -343,  -756,  -713,  -265,  -609,  -191,  -398,  -636,

-  -121,  -383,  -749,   567,   252,   -36,  -354,  -417,   -50,

-   204,   100,  -149,  -650, -1081,   -47,    -7,  -263,   111,

-   -46,  -180,  -267,  -324,  -562,  -394,  -692,   398,   292,

-   482,   670,   683,   624,   442,   165,   116,    36,  -149,

-   108,   247,   291,   247,   355,   122,   109,   224,   296,

-   -14,   945,   990,   801,   755,   815,   847,   913,   892,

-   292,   349,   725,   482,   388,   329,   429,   620,   667,

-   -34,   197,   213,  -127,    84,   494,   620,   575,   375,

-   126,   207,   172,   167,   362,   202,   296,   395,   455,

-    -6,   250,   539,   467,   636,   801,  1149,  1287,  1118,

-    27,   240,   369,   280,   440,   411,   634,   892,   953,

-   159,   170,   -58,  -395,  -797,  -690,    77,  -211,  -334,

-    -5,   -28,   -13,   -74,  -335,  -603,   300,    88,  -205,

-    82,   -33,  -364,  -698, -1203, -1153,   110,  -146,  -289,

-   113,     1,  -243,  -588,  -994,  -496,   414,   160,    42,

-   -56,  -247,  -440,  -693,  -996,  -479,    11,  -178,  -357,

-  -151,  -353,  -327,  -211,  -340,   141,    65,   425,   453,

-    34,  -169,  -455,  -932, -1215,   138,   499,   256,   324,

-    68,   139,   -15,  -547,  -478,    17,   306,   502,   481,

-   -32,  -134,   445,   129,  -143,  -244,  -503,  -507,  -599,

-    61,  -140,  -345,   496,   458,    -2,    20,  -227,  -514,

-   394,  1765,  1666,  1339,  1117,   806,   642,   479,   380,

-   215,   519,   920,  1053,  1090,   791,   528,   290,   155,

-   -54,  -233,  -647,  -602,   639,   294,    -2,  -167,  -442,

-   -78,  -315,  -791,  -113,   820,   403,   158,  -116,  -356,

-   529,  1851,  2003,  1228,   622,   -41,  -416,   344,   819,

-  -105,  -379,  -236,  1224,   893,   749,   568,   356,   214,

-   -17,  -199,  -144,    50,  -283,  -247,  -578,  -846, -1087,

-    69,   -11,  -381,  -206,   209,  -284,  -387,  -416,  -716,

-    39,    -5,  -145,  -374,  -682,  -909, -1074, -1169, -1066,

-   287,   226,    67,  -221,  -662,  -171,  -421,  -642,  -707,

-  -132,  -348,  -538,  -448,   -20,    -4,  -354,  -748,  -933,

-     4,   -75,  -289,  -598,   317,    52,  -208,  -297,  -559,

-   -88,  -264,  -358,  -589,  -631,  -248,  -523,  -822, -1071,

-    70,    -8,    54,  -314,  -515,    92,  -146,  -274,  -493,

-   199,    62,   391,   158,  -141,    71,  -219,  -203,  -207,

-   152,    40,   329,   162,   -29,    48,  -149,   108,   127,

-   635,  1058,   883,   492,   372,   312,   317,   274,   241,

-   267,   722,  1256,   882,   625,   248,     8,   -81,   -60,

-   -58,  -138,  -291,  -600,   -12,    -2,   -39,   147,   117,

-  -107,  -345,  -513,   459,    76,    92,  -272,   388,   262,

-   362,   516,   203,  -409,  -716,  -831,  -331,   185,   209,

-  -117,  -391,  -298,   671,   292,   538,   257,   166,   -38,

-  -102,  -319,  -194,  -283,  -573,  -262,  -579,  -219,  -444,

-  -235,    78,    11,  -168,  -101,  -229,  -263,  -321,  -123,

-    70,    50,  -170,  -599,  -996,  -588,  -263,  -516,  -455,

-   394,   363,   229,  -136,  -538,    21,  -183,  -348,  -201,

-  -124,  -368,  -640,  -879,  -847,  -209,  -409,  -494,  -515,

-  -127,  -341,  -541,  -425,  -510,   -10,  -252,  -473,  -291,

-    84,   -69,  -201,  -676,  -868,   103,  -311,  -132,  -320,

-     5,  -173,  -188,  -297,  -628,   197,   -57,     7,   -11,

-    49,  -160,    56,   558,   111,    33,  -311,  -440,  -463,

-    -1,  -246,  -307,   862,   453,   139,  -170,  -355,  -232,

-   279,   966,  1642,  1478,  1463,  1123,   795,   525,   339,

-  -197,   -38,  1702,  1331,  1252,   950,   692,   504,   426,

-  -108,  -344,  -861, -1172,   444,   354,    88,   -46,  -220,

-   -53,  -321,  -494,  1113,   744,   364,   198,   -34,   -75,

-   457,   955,  1177,  1214,  1427,  1457,  1345,   917,   539,

-   -69,   199,   897,  1140,  1343,  1183,   977,   742,   522,

-   122,    44,  -269,    27,  -155,  -562,  -307,  -590,  -773,

-   154,    42,  -160,   252,  -129,  -305,  -471,  -733,  -371,

-   135,   185,   -82,  -416,  -722,  -913,  -504,  -743,  -880,

-   149,   214,   -84,  -329,  -680,  -835,  -426,  -661,   -81,

-  -128,  -380,  -735,  -998,  -337,    17,  -182,  -467,  -697,

-   -84,  -290,  -510,  -592,    13,   440,   154,   -38,  -279,

-    70,   -61,  -246,  -727, -1047,   -80,  -381,  -535,  -704,

-   178,    -2,  -146,  -670,  -938,   482,   138,    63,    65,

-   -11,    15,   772,   443,   142,   -20,  -209,  -126,  -161,

-   -32,  -249,    95,   552,   124,    30,  -343,    82,   -86,

-   148,   751,  1515,  1105,   867,   606,   474,   448,   399,

-  -163,  -257,   899,  1097,   906,   751,   502,   390,   294,

-   -51,  -258,  -447,  -806,  -368,   763,   464,   364,   183,

-  -166,  -374,  -367,    87,    35,   399,   418,   856,   833,

-  -205,  -310,   588,   778,   785,  1065,  1118,  1245,  1157,

-  -173,  -312,   107,   345,   400,   790,   870,  1113,  1001,

-    -7,  -120,  -387,  -410,  -614,  -943,  -226,  -384,  -491,

-  -203,  -288,   -51,  -331,   -90,  -178,  -408,  -573,  -338,

-    56,   -29,  -273,  -627, -1041,  -798,  -247,  -467,   148,

-    66,    -2,  -205,  -205,  -575,  -349,   -57,  -352,   -58,

-   -45,  -225,  -471,  -924,  -497,    77,   -32,    44,  -135,

-  -277,  -491,  -497,  -502,  -424,  -202,  -137,    77,    96,

-    26,  -179,  -469, -1008, -1260,   262,   -35,  -132,  -259,

-   -66,  -232,  -447,  -533,  -789,  -191,  -100,  -267,   364};

-

-/*------------------------------------------------*

- * 1st stage codebook; 2nd split:   isf9 to isf15

- *------------------------------------------------*/

-

-static Word16 dico2_isf[SIZE_BK2*7] = {

-

-  1357,  1313,  1136,   784,   438,   181,   145,

-   636,   648,   667,   568,   442,   217,   362,

-   427,   440,   674,   524,   332,   117,  -417,

-   121,   295,   468,   465,   230,    44,  -221,

-  -147,  -240,   149,    80,   390,   278,   106,

-  -418,  -556,   552,   511,   235,   144,   -95,

-    43,   193,   274,   150,    67,    34,  -273,

-   -43,  -126,   171,   416,   282,    63,  -354,

-  -372,   -86,  -344,  -108,   -94,  -182,   -89,

-  -600,  -840,  -200,   465,   258,   -11,  -253,

-   -48,   329,    97,  -290,  -543,  -795,  -354,

-  -570,  -117,   187,    10,  -133,  -416,   -76,

-  -618,  -129,  -247,  -371,    45,   -76,   277,

- -1022, -1079,   126,   474,   254,   127,    52,

-  -281,    76,  -167,  -361,  -283,  -551,  -283,

-  -119,   -52,    -1,   134,   -32,  -204,  -415,

-  1064,   827,   637,   684,   464,   209,    12,

-   482,   416,   449,   371,   335,   294,   194,

-   719,   576,   365,   135,   113,    91,  -199,

-   298,   176,   493,   366,   194,   163,    36,

-   -35,  -236,  -259,   -36,    -4,    99,   152,

-   -98,  -306,   -27,   228,    90,   111,   -86,

-    91,    13,  -211,  -258,  -106,    86,   -64,

-    73,   -35,   -57,   -31,   162,    35,  -192,

-  -109,  -335,  -629,   -66,   -61,  -128,   322,

-  -495,  -669,  -728,   193,    31,  -220,   122,

-   324,    95,   -89,   -91,  -409,  -710,  -154,

-     0,  -234,    92,    33,  -343,  -609,  -220,

-  -343,  -408,  -476,  -655,  -153,    82,   222,

-  -490,  -745,  -255,    49,   -48,   135,  -127,

-   119,   -67,  -328,  -390,  -272,  -545,   -56,

-   -57,  -130,   -10,    -7,  -164,   -47,   -22,

-   984,  1064,   961,   568,   210,   -27,    16,

-   811,   691,   754,   514,   224,   -35,   166,

-   662,   704,   618,   386,    57,  -211,  -257,

-   510,   359,   418,   393,    91,  -144,   -18,

-  -193,   -31,   -27,   223,    89,  -143,    24,

-  -112,   -98,   471,   319,   185,     3,   175,

-   252,   146,   -47,   272,    48,  -211,  -234,

-   146,    69,   203,   364,    68,   -52,    51,

-  -259,  -478,  -697,  -349,  -758,  -501,    63,

-  -501,  -769,  -289,    79,  -311,  -497,  -106,

-   251,    53,  -235,  -469,  -895,  -884,   145,

-  -416,  -551,   140,  -133,  -523,  -775,    44,

-  -326,  -423,  -713,  -497,   -86,  -431,    99,

-  -757,  -772,  -160,   -76,   -46,   -32,   379,

-    85,   -35,  -200,  -401,  -663, -1040,  -247,

-  -180,  -330,   -92,  -376,    27,  -183,  -110,

-  1279,  1086,   781,   502,   324,   164,   157,

-   682,   466,   449,   277,   146,    28,   409,

-   635,   472,   390,   107,  -232,  -538,  -139,

-   196,   396,   332,   213,   209,   -29,   -81,

-   150,   -95,  -312,    76,   -77,  -320,   -50,

-    46,     9,    47,   175,   139,    30,   384,

-   218,   206,   -24,  -250,   -96,  -276,  -183,

-    26,   119,    38,    14,    -4,  -133,   -52,

-  -477,  -614,  -987,  -715,  -631,  -813,   200,

-  -744, -1009, -1065,  -745,  -631,  -171,    18,

-  -137,  -251,  -483,  -613,  -980, -1203,    12,

-  -605,  -767,  -562,  -686, -1088,  -515,    58,

-  -202,  -428,  -782, -1072,   -96,  -234,  -179,

-  -480,  -709, -1070,  -897,  -131,   -92,   321,

-  -145,  -193,  -512,  -729,  -572,  -765,  -210,

-  -331,  -585,  -525,  -631,  -281,  -208,  -303,

-  1165,  1104,   939,   828,   716,   426,   155,

-     6,  -109,   820,   778,   415,   113,   -27,

-   381,   339,   314,   265,   121,    -9,  -474,

-  -373,    47,   584,   442,    99,  -231,  -113,

-  -496,   -38,  -285,   262,   305,   170,     4,

-  -587,  -556,    69,    66,   471,   354,    13,

-  -138,    70,   -18,   106,    67,   167,  -302,

-  -445,  -141,   185,   191,   151,    83,  -133,

-  -257,  -521,  -720,  -198,   134,   -46,  -182,

-  -819, -1168,  -777,   512,   359,    95,  -113,

-   137,    -2,   -74,  -138,  -401,  -114,  -371,

-  -242,  -466,   204,   223,   -31,  -212,  -192,

-  -532,  -637,  -466,  -686,   256,   277,  -139,

- -1141, -1244,  -381,   -75,   -54,    14,    88,

-  -311,   115,  -143,  -499,  -343,   124,  -416,

-  -616,  -147,  -135,    43,    -4,   121,  -369,

-   835,   783,   641,   390,   355,   350,    64,

-    72,   194,   443,   467,   436,   219,   372,

-   464,   369,   192,     4,  -156,   -72,  -226,

-    57,   206,   303,   205,   188,   101,   265,

-   -40,  -205,  -488,  -184,   276,    64,   -26,

-  -217,  -433,  -297,   137,   328,   308,  -289,

-   378,    81,  -308,  -465,    57,   -37,   227,

-  -100,    24,   -36,  -151,   199,     8,   143,

-  -426,  -697, -1059,  -133,   388,   161,   321,

-  -644, -1023, -1271,    39,    66,  -123,    70,

-   372,   177,  -173,  -556,  -553,  -304,  -189,

-  -117,  -369,  -425,  -122,  -462,  -152,   -73,

-  -649,  -850, -1189,  -767,   497,   360,   222,

-  -798, -1139, -1455,  -190,   430,   234,   179,

-    42,   -94,  -405,  -692,    38,  -202,  -246,

-  -169,  -366,  -290,   -88,   -64,    32,  -292,

-  1010,   923,   938,   710,   465,   230,   342,

-   217,   300,  1054,   675,    68,  -458,  -179,

-    78,   453,   316,    18,  -237,  -496,  -243,

-   167,    21,   424,   215,   -91,  -303,  -170,

-  -290,   -81,   -70,   -67,    40,    54,   -59,

-  -353,  -427,   -90,    53,    94,     9,    54,

-   -28,   318,   283,    15,  -240,   -58,    79,

-   -75,  -121,   229,    35,    58,     6,  -133,

-  -351,  -514,  -744,  -834,  -705,  -137,   164,

- -1124, -1388, -1055,  -230,   -73,    40,    36,

-  -163,  -233,  -532,  -785, -1170,  -697,    96,

-  -788,  -959,  -246,  -430,  -624,  -165,    -8,

-  -856,  -540,  -630,  -907,  -337,   -70,    76,

-  -937, -1042,  -659,  -733,  -208,   199,   -26,

-  -523,    78,   -98,  -501,  -869,  -890,   -81,

-  -624,  -703,   -45,  -348,   -25,    87,  -186,

-  1005,   823,   546,   249,    90,   -22,   207,

-   298,   397,   381,   319,   200,    62,   303,

-   473,   379,   133,  -247,  -632,  -441,    75,

-   284,   208,   391,   115,   -25,    44,    95,

-   -72,    79,   -95,   -63,  -129,  -293,   203,

-  -164,  -349,   115,   122,    69,    -1,   378,

-   348,   170,    99,    58,  -179,  -302,   188,

-  -190,    -2,   150,    23,   -51,   -11,   216,

-  -615,  -863, -1090, -1427,  -802,   -48,    -6,

-  -961, -1276, -1548,  -727,   -58,    56,   223,

-  -124,  -255,  -561,  -988, -1277,  -148,   -82,

-  -480,  -660,  -891, -1191, -1339,  -325,    20,

-  -621,  -917, -1296, -1350,   264,   289,    50,

-  -844, -1022, -1345, -1329,  -293,    46,   278,

-  -260,  -468,  -829, -1176,  -533,  -560,   -78,

-  -215,  -484,  -822, -1233,  -791,    15,  -138,

-  1301,  1317,  1262,  1048,   716,   357,   -64,

-   578,   824,   925,   802,   630,   362,   102,

-   470,   925,   767,   514,   327,   190,  -112,

-   225,   492,   495,   437,   598,   384,   -45,

-    43,    82,   -42,   175,   519,   342,   -64,

-  -304,  -154,   159,   576,   403,   221,   327,

-   214,   244,   122,   -62,   312,    92,  -160,

-   218,   208,   310,   268,   306,   323,  -199,

-  -285,  -269,   -79,  -124,  -143,  -153,   236,

-  -205,  -384,  -426,   344,    59,  -185,  -184,

-  -272,   247,   126,  -210,  -518,  -468,    78,

-   -99,  -120,   502,   160,  -280,  -557,   304,

-  -423,   -17,  -283,  -443,   215,   212,  -140,

-  -564,  -684,  -228,   510,   361,   130,   323,

-  -428,   335,    98,   -65,    36,  -215,  -246,

-  -362,    51,   364,   -16,  -234,   150,  -165,

-   914,   883,   751,   653,   676,   464,  -153,

-   631,   545,   535,   720,   596,   360,   -81,

-   783,   712,   512,   439,   341,   251,  -391,

-   497,   417,   249,   372,   295,   173,  -193,

-   128,  -110,  -385,    93,    39,   173,  -231,

-   216,   -59,  -253,   462,   389,   154,    69,

-   455,   270,    -4,  -337,   -49,   233,  -322,

-   307,   143,    53,   218,   128,   236,  -156,

-   -37,  -186,  -240,  -411,  -110,     9,   399,

-  -140,  -365,  -628,   258,   380,   214,   277,

-   131,   454,   177,  -285,  -520,   108,  -214,

-    77,  -141,   201,  -123,  -490,  -131,    60,

-   -14,  -194,  -521,  -741,   273,   362,   -33,

-  -362,  -566,  -287,  -228,   161,   237,   317,

-  -269,   195,   -75,  -375,  -204,    11,    77,

-  -128,  -264,  -156,  -223,  -475,   265,    27,

-  1238,  1147,   916,   689,   432,   210,  -280,

-   800,   664,   879,   726,   411,   160,  -164,

-   454,   686,   536,   275,   147,    46,   111,

-   303,   486,   512,   355,   241,   181,   -69,

-    79,    92,    29,   147,   233,    52,    17,

-  -171,   289,   131,   439,   271,     3,   -10,

-   413,   241,   144,   174,   155,    -2,    14,

-    58,   217,   247,   219,   149,   175,   -18,

-   228,    -8,  -240,  -206,  -513,  -191,   202,

-   -96,  -272,  -454,    33,  -300,  -575,    46,

-   -10,  -108,  -246,  -347,  -770,  -535,     9,

-  -326,  -430,   -61,  -321,  -704,  -299,   201,

-    -1,  -280,  -603,  -419,  -185,    18,   -36,

-  -516,  -522,  -379,  -291,  -181,   -97,    27,

-  -159,  -313,  -525,  -224,  -510,  -831,  -197,

-  -292,  -459,   -59,  -310,  -562,  -143,  -351,

-  1066,   912,   631,   389,   207,    86,  -224,

-   596,   512,   596,   505,   314,   122,   -48,

-   787,   861,   441,   -93,  -303,    33,  -190,

-   257,   469,   337,    51,    15,   298,   -93,

-   295,    73,  -119,    25,    36,    23,   108,

-   -28,    -3,   -32,   114,    21,   185,   107,

-   482,   305,    15,  -279,  -319,    52,    96,

-   226,    46,   115,    72,  -136,   133,  -125,

-    18,  -207,  -559,  -590,  -503,  -482,   321,

-  -571,  -789,  -951,  -172,  -441,  -538,   113,

-   181,    14,  -310,  -641, -1001,  -202,   159,

-  -136,  -393,  -433,  -513,  -911,  -144,   -22,

-    72,  -265,  -706,  -954,  -159,    53,   332,

-  -338,  -591,  -852,  -383,  -395,    56,    44,

-    43,  -158,  -464,  -897,  -631,  -157,  -294,

-  -161,  -128,  -328,  -573,  -483,  -125,    11,

-  1017,   906,  1051,  1005,   679,   341,  -102,

-   359,   334,  1567,  1314,   723,   105,    10,

-   -65,   726,   529,   301,   220,    43,  -273,

-  -510,   436,   719,   566,   358,   179,   114,

-  -560,   298,   133,  -120,   342,   225,    14,

-  -899,  -101,   217,   617,   400,   146,   -58,

-   -41,   352,    82,  -196,    39,   121,  -167,

-  -212,    59,   447,   284,   423,   250,  -169,

-  -371,  -484,  -596,    30,   -41,   249,    22,

-  -372,  -650,  -794,   477,   445,   216,   -79,

-  -352,   275,    17,  -443,  -929,    92,    19,

-  -699,  -696,   431,   264,   -49,  -310,   182,

-  -978,  -217,  -430,  -400,   101,   261,    72,

-  -929,  -889,  -357,   -13,   463,   378,   236,

-  -826,    56,    30,  -299,  -360,  -128,   -51,

-  -878,  -299,  -111,    75,    65,    36,     3,

-   817,   368,   -25,   354,   697,   591,  -173,

-   309,   212,   222,   751,   484,   140,   -56,

-   593,   379,    70,    -8,   258,   180,   110,

-   165,   -46,   255,   297,   219,   273,   105,

-   160,   -70,  -358,  -181,   379,   330,   319,

-  -238,  -369,  -198,   740,   580,   319,  -143,

-   201,   109,  -202,  -456,   328,   276,  -141,

-   203,   170,   111,    42,   207,   360,   188,

-  -345,  -399,  -513,  -233,   650,   422,    81,

-  -635,  -961, -1220,   463,   539,   204,   209,

-   202,   -25,  -194,  -498,  -787,   193,  -143,

-  -449,  -538,   195,  -106,  -331,    68,    62,

-  -228,  -477,  -840,  -576,   317,   128,   283,

-  -671,  -937,  -807,  -114,   391,   335,   -62,

-   246,     2,  -314,  -679,  -303,   180,   -88,

-  -107,  -272,    90,  -198,   -28,   290,  -112,

-   885,  1149,  1021,   712,   496,   281,   -83,

-   269,   492,   787,   643,   347,    70,   124,

-   336,   636,   499,    92,  -229,  -179,   191,

-    26,   402,   564,   340,   149,   -11,   135,

-  -440,   561,   470,   204,   -72,  -186,   140,

-  -720,    14,   355,   229,    68,  -133,   465,

-   110,   310,   103,    12,   106,    29,   158,

-  -178,   113,   161,   142,   121,   115,    27,

-  -651,  -414,  -645,  -152,  -164,   -13,  -429,

-  -639,  -944,  -681,  -104,   -81,    52,  -189,

-  -663,  -164,  -316,  -683,  -954,  -205,   -83,

-  -609,  -669,  -172,  -517,  -694,   283,   -80,

-  -646,  -152,  -383,  -678,  -246,   -40,  -143,

-  -747,  -796,  -745,  -390,   -98,    43,   275,

-  -599,  -199,  -398,  -433,  -436,  -538,    31,

- -1107,  -568,  -376,  -265,  -126,   -21,     1,

-   847,   573,   308,   392,   305,   101,    55,

-   273,   293,   201,   267,   346,   201,   123,

-   727,   480,   226,     2,   -65,  -138,   164,

-   273,   208,   173,   292,    12,   253,   174,

-   340,   207,   180,    88,   116,    46,   475,

-  -460,  -166,   -30,    13,   110,   173,   396,

-   137,    88,    43,  -137,   -94,    34,   284,

-    96,   -14,   226,    40,    63,    70,   130,

-  -467,  -735, -1012, -1174,  -307,   305,   -67,

-  -612,  -920, -1146,  -567,    -8,    92,   -25,

-  -182,  -271,  -492,  -754,  -857,   287,   -75,

-  -494,  -787,  -689,  -683,  -709,   137,  -326,

-  -288,  -550,  -903, -1105,   334,   321,   -62,

-  -354,  -653,  -834,  -445,     1,   377,  -152,

-  -162,  -306,  -608,  -937,  -297,   247,  -192,

-  -234,  -477,  -244,  -488,  -266,   342,  -332};

-

-/*---------------------------------------------------*

- * 2nd stage codebook; 1st split:   isf2_0 to isf2_2

- *---------------------------------------------------*/

-

-

-static Word16 dico21_isf[SIZE_BK21*3] = {

-

-   329,   409,   249,

-   -33,   505,   160,

-   -29,   -14,   582,

-  -262,   127,   354,

-   145,   237,   175,

-  -152,   245,   122,

-    27,    42,   340,

-   -84,   -93,   311,

-   285,   222,  -156,

-    47,   -43,  -504,

-   234,   121,   385,

-   104,  -317,    45,

-   176,   195,     8,

-   104,   -59,   -94,

-   177,    53,   192,

-   -34,  -127,   152,

-   570,   277,   -34,

-   -67,  -329,  -639,

-  -157,  -272,   462,

-  -177,  -462,   198,

-   322,   179,   115,

-  -386,   171,    19,

-    19,   -12,   195,

-  -120,  -252,   201,

-   304,    36,  -336,

-  -128,  -221,  -380,

-   171,  -185,   296,

-  -242,  -312,    23,

-   198,    39,    16,

-    -3,  -177,  -111,

-   111,   -93,    76,

-   -92,  -223,     4,

-   177,   406,   -44,

-  -168,   380,  -149,

-    -4,   273,   331,

-  -420,   513,   277,

-    21,   247,    47,

-   -58,   131,    -2,

-    -3,   134,   180,

-  -145,    40,   175,

-   189,    74,  -145,

-   -27,   -45,  -325,

-   370,  -114,   -21,

-   -83,  -415,  -173,

-    77,    95,   -51,

-   -40,   -30,   -67,

-    71,    88,    86,

-   -35,   -98,    14,

-    69,   197,  -334,

-  -196,    79,  -231,

-  -348,  -137,   218,

-  -352,   -89,   -85,

-    47,   201,  -130,

-  -165,    37,   -15,

-   -43,     3,    86,

-  -161,  -108,    79,

-    83,    21,  -237,

-   -81,  -149,  -238,

-   150,  -186,  -251,

-  -186,  -249,  -162,

-   -19,    66,  -139,

-   -26,   -50,  -181,

-    24,    11,     0,

-  -130,  -105,   -98};

-

-

-

-/*---------------------------------------------------*

- * 2nd stage codebook; 2nd split:   isf2_3 to isf2_5

- *---------------------------------------------------*/

-

-

-static Word16 dico22_isf[SIZE_BK22*3] = {

-

-  -127,   310,    42,

-  -242,   197,     5,

-  -151,    84,   -17,

-  -214,   127,  -149,

-  -247,  -131,   159,

-  -268,  -267,   -95,

-  -217,     1,   -79,

-  -271,   -80,  -185,

-   -45,   436,   159,

-   165,   199,   391,

-   -33,    81,   187,

-   -66,   -42,   355,

-  -298,   -57,   343,

-  -108,  -537,   226,

-  -144,   -23,   193,

-   176,  -402,    87,

-    53,   296,    25,

-   -84,   253,  -104,

-   -58,   105,  -126,

-  -169,   174,  -314,

-   -48,    44,  -294,

-  -164,  -417,  -242,

-  -139,     3,  -194,

-  -155,  -207,  -211,

-   119,   322,   213,

-   333,    50,   380,

-   237,   247,    -2,

-   466,   -16,   201,

-   238,  -255,  -107,

-    67,  -440,  -149,

-   122,   -88,  -139,

-    88,  -247,   -73,

-   -41,   231,   167,

-   -62,   155,    16,

-   -65,    16,    77,

-   -68,    -2,   -63,

-  -151,  -300,   160,

-   -18,  -333,    54,

-   -56,   -94,     5,

-     2,  -190,    14,

-    92,   148,   209,

-   108,     9,   272,

-   108,    35,   110,

-   142,   -85,   145,

-    47,  -157,   279,

-     3,  -320,   246,

-    43,   -72,    68,

-    86,  -217,   135,

-    36,   140,    79,

-    56,   175,   -49,

-    26,    45,     3,

-    73,    55,  -101,

-   109,  -183,  -242,

-    -4,  -283,  -242,

-    48,   -68,   -48,

-    -6,  -153,  -122,

-   161,   196,    96,

-   232,    80,   190,

-   165,    97,    11,

-   258,   -31,    71,

-   267,   -77,   -91,

-   311,  -209,    87,

-   152,   -14,   -22,

-   150,  -149,     9,

-  -324,   557,   187,

-  -384,   307,    46,

-  -251,    27,    77,

-  -365,    77,   -52,

-  -482,   -84,   160,

-  -424,  -515,   -64,

-  -294,  -120,    -4,

-  -476,  -116,  -109,

-   -97,   318,   365,

-   106,   627,   445,

-  -190,   120,   287,

-  -146,    65,   619,

-  -427,   242,   363,

-  -361,  -371,   432,

-  -347,   102,   168,

-  -629,   195,   -14,

-   -65,   476,   -47,

-  -297,   320,  -168,

-   -55,   356,  -264,

-  -391,    82,  -286,

-   -51,   -31,  -556,

-  -178,  -399,  -586,

-  -205,   -49,  -360,

-  -343,  -238,  -337,

-   220,   457,    58,

-   561,   467,   259,

-   340,   270,  -168,

-   450,    77,  -280,

-    60,   167,  -413,

-   133,  -252,  -492,

-   216,   157,  -290,

-   282,     0,  -495,

-  -226,   293,   183,

-  -157,   135,   122,

-  -158,   -59,    39,

-  -133,  -118,   -97,

-  -332,  -309,   113,

-  -160,  -425,    -6,

-  -149,  -211,    24,

-   -80,  -277,   -90,

-   -11,   125,   338,

-   130,   -71,   465,

-     5,   -45,   184,

-   237,   -95,   253,

-  -139,  -197,   297,

-   -19,  -300,   511,

-   -63,  -152,   139,

-   250,  -289,   336,

-   124,   339,  -150,

-    34,   176,  -208,

-   171,   166,  -116,

-    94,    38,  -229,

-    75,   -65,  -339,

-   -78,  -205,  -385,

-     0,   -30,  -163,

-   -56,  -110,  -242,

-   321,   244,   194,

-   505,   238,    -1,

-   317,   116,    65,

-   309,    88,   -74,

-   452,   -51,   -50,

-   334,  -217,  -290,

-   211,    41,  -152,

-   238,   -55,  -260};

-

-

-/*---------------------------------------------------*

- * 2nd stage codebook; 3rd split:   isf2_6 to isf2_8

- *---------------------------------------------------*/

-

-

-static Word16 dico23_isf[SIZE_BK23*3] = {

-

-   -10,   151,   359,

-   136,   298,   223,

-   255,  -104,   290,

-   423,     6,   183,

-  -270,  -269,   -98,

-   -52,   -82,    13,

-   -82,  -274,   -97,

-    90,  -246,   -72,

-  -299,   -70,   421,

-   -88,   365,   430,

-   187,  -318,   381,

-   380,    37,   488,

-  -373,  -316,    79,

-  -308,  -101,     5,

-  -135,  -451,     8,

-    72,  -421,  -154,

-   180,   170,  -121,

-    62,   177,   -40,

-   326,    80,  -105,

-   248,   263,    -5,

-  -168,  -181,  -221,

-    -2,   -23,  -158,

-   -14,  -149,  -121,

-   119,   -91,  -147,

-   119,   332,  -153,

-    49,   303,    34,

-   442,   -55,   -69,

-   217,   454,    58,

-  -359,  -187,  -375,

-   -42,    50,  -274,

-    -8,  -267,  -249,

-    85,   -86,  -346,

-   -77,   -40,   345,

-    89,   134,   219,

-   156,   -80,   160,

-   108,    40,   116,

-  -158,  -206,    29,

-     5,   -32,   175,

-   -65,  -158,   146,

-    55,   -78,    73,

-  -114,  -222,   353,

-   -47,    81,   211,

-    49,  -151,   268,

-   105,     4,   302,

-  -263,  -132,   183,

-  -151,   -28,   201,

-  -177,  -307,   166,

-   101,  -221,   130,

-    74,    58,   -98,

-    32,    44,    13,

-   194,    30,  -142,

-   170,    96,     8,

-  -136,  -119,   -91,

-   -65,     8,   -55,

-     3,  -188,    12,

-    45,   -63,   -49,

-   149,   -21,   -19,

-    24,   144,    95,

-   254,   -22,    60,

-   161,   196,    96,

-  -158,   -61,    48,

-   -70,    33,    82,

-   -23,  -321,    58,

-   155,  -147,     5,

-  -364,   328,    77,

-   -21,   453,   173,

-  -108,    82,   630,

-   367,   263,   208,

-  -300,   -62,  -176,

-  -205,   143,  -158,

-  -169,  -410,  -264,

-   257,  -269,  -100,

-  -636,   289,    -2,

-  -292,   627,   173,

-  -382,  -363,   387,

-   248,   524,   447,

-  -521,  -111,  -107,

-  -395,   118,  -274,

-  -343,  -680,  -125,

-  -172,  -447,  -663,

-    75,   148,  -367,

-   -79,   263,   -94,

-   249,   148,  -286,

-   380,   271,  -162,

-  -142,    -4,  -186,

-   -57,   111,  -125,

-   -35,  -108,  -254,

-   100,    29,  -242,

-   -80,   303,  -264,

-   -78,   464,   -57,

-   248,   -22,  -494,

-   661,   662,    44,

-  -193,   -40,  -330,

-  -178,   145,  -337,

-   -90,  -199,  -400,

-   -40,   -23,  -498,

-  -192,   114,   315,

-   -41,   244,   190,

-    88,   -97,   485,

-   241,    80,   212,

-  -246,    40,    87,

-  -156,   147,   134,

-    -2,  -334,   239,

-   308,  -203,   110,

-  -459,   251,   422,

-  -218,   310,   228,

-   -86,  -346,   654,

-   184,   175,   425,

-  -481,   -63,   169,

-  -349,   117,   188,

-  -125,  -560,   310,

-   158,  -416,    94,

-    46,   171,  -192,

-   -63,   157,    14,

-   256,   -35,  -271,

-   322,   123,    53,

-  -214,     4,   -76,

-  -156,    86,   -18,

-   128,  -197,  -232,

-   265,   -90,   -98,

-  -308,   332,  -145,

-  -131,   308,    58,

-   509,    59,  -339,

-   562,   196,   -14,

-  -378,   100,   -47,

-  -234,   202,     1,

-   104,  -270,  -493,

-   319,  -210,  -325};

-

-

-/*---------------------------------------------------*

- * 2nd stage codebook; 4th split:   isf2_9 to isf2_11

- *---------------------------------------------------*/

-

-static Word16 dico24_isf[SIZE_BK24*3] = {

-

-   -79,   -89,    -4,

-  -171,    77,  -211,

-   160,  -193,    98,

-   120,  -103,   323,

-    32,   -22,  -129,

-    72,    78,  -268,

-   182,   -76,   -66,

-   309,    99,  -145,

-  -229,  -157,   -84,

-  -383,    98,   -71,

-   -90,  -352,    12,

-  -284,  -178,   178,

-   -65,  -125,  -166,

-   -87,  -175,  -351,

-    42,  -198,   -48,

-   154,  -140,  -243,

-   -77,    18,   108,

-   -39,   355,    91,

-    87,     8,   155,

-    -4,   158,   239,

-   128,    95,   -54,

-     7,   246,  -124,

-   258,    15,    89,

-   206,   216,    98,

-  -201,     9,    18,

-  -312,   233,   204,

-   -39,  -174,   155,

-  -144,    -9,   284,

-   -57,    70,   -69,

-  -157,   187,    18,

-    54,   -30,    23,

-    24,   135,    55};

-

-

-/*---------------------------------------------------*

- * 2nd stage codebook; 5th split:   isf2_12 to isf2_15

- *---------------------------------------------------*/

-

-static Word16 dico25_isf[SIZE_BK25*4] = {

-

-   169,   142,  -119,   115,

-   206,   -20,    94,   226,

-  -106,   313,   -21,    16,

-   -62,   161,    71,   255,

-   -89,   101,  -185,   125,

-    72,   -30,  -201,   344,

-  -258,    33,    -8,    81,

-  -104,  -154,    72,   296,

-   144,   -68,  -268,   -25,

-    81,   -78,   -87,   106,

-    22,   155,  -186,  -119,

-   -46,   -28,    27,    91,

-  -114,   -37,  -175,   -33,

-   -94,  -222,  -189,   122,

-  -132,  -119,  -191,  -270,

-  -172,  -173,    18,   -43,

-   279,   135,   -42,  -128,

-   187,   -86,   229,  -138,

-   159,   240,   140,    46,

-    69,    25,   227,    77,

-    21,   115,    13,     8,

-    68,  -248,   126,    81,

-  -150,   137,   207,    -9,

-  -154,  -133,   289,    67,

-   143,   -37,   -86,  -326,

-   180,   -32,    19,   -23,

-    26,   168,   116,  -233,

-   -32,   -26,   118,   -78,

-     3,    -8,   -45,  -115,

-    57,  -215,   -54,   -83,

-  -209,   112,   -22,  -167,

-   -91,  -151,   168,  -262};

-

-

-

-       /* 36 bit */

-/*-------------------------------------------------------------------*

- *  isf codebooks:  two-stage VQ with split-by-3 in 2nd stage        *

- *                1st stage is kept the same as the 46 bit quantizer *

- *                                                                   *

- *  codebook   vector dimension    number of vectors                 *

- *  ~~~~~~~~   ~~~~~~~~~~~~~~~~    ~~~~~~~~~~~~~~~~~                 *

- *     1_1            9                  256                         *

- *     1_2            7                  256                         *

- *     2_1            5                  128                         *

- *     2_2            4                  128                         *

- *     2_3            7                  64                          *

- *-------------------------------------------------------------------*/

-

-static Word16 dico21_isf_36b[SIZE_BK21_36b*5] = {

-

-   -52,   -96,   212,   315,   -73,

-    82,  -204,   363,   136,  -197,

-  -126,  -331,   183,   218,   143,

-   -49,   -41,   557,   230,    72,

-     2,   -73,   163,   377,   221,

-   133,   111,   278,   215,  -110,

-  -102,   -20,   284,   113,   273,

-    84,   319,   290,    18,    85,

-   -25,    -5,   125,   132,  -204,

-   -38,    -5,   286,    -9,  -356,

-  -140,  -256,    92,   117,  -189,

-  -144,   191,   313,    51,   -98,

-   167,   -10,    44,   247,    36,

-   381,   197,   238,    74,     6,

-    38,  -408,    29,    -3,   -85,

-    92,   266,   157,   -25,  -200,

-   161,  -121,    70,    84,  -140,

-   -16,   -86,   112,   -94,  -189,

-  -269,  -270,   351,   107,   -24,

-   -68,   -67,   492,  -103,  -155,

-   -53,  -131,    62,   122,    10,

-   135,    84,   283,   -55,  -120,

-   -12,  -219,   331,   -81,   167,

-   220,  -136,   147,  -172,   -42,

-   140,   -95,  -109,   -88,  -194,

-     0,    -2,    -4,   -33,  -381,

-   -66,  -217,   152,  -186,  -402,

-   244,   108,   156,  -140,  -395,

-   113,  -136,  -196,   110,   -24,

-   214,   118,    11,   -64,  -131,

-  -110,  -286,    -6,  -332,    16,

-    94,    97,    79,  -291,  -205,

-    -5,   -39,   -20,   252,   -96,

-    76,   174,   101,   163,    61,

-   -69,  -239,   -55,   399,     6,

-  -115,   319,   164,   275,   196,

-   -15,    36,   -47,   331,   121,

-   226,   209,   271,   325,   184,

-    13,   -80,  -218,   471,   353,

-   288,   378,    16,   -51,   251,

-   174,   116,    52,   149,  -279,

-   235,   276,    39,   120,   -48,

-     0,  -108,  -108,   241,  -339,

-   -93,   534,    45,    33,   -87,

-   194,   149,   -71,   405,   -44,

-   409,   370,    81,  -186,  -154,

-    25,  -102,  -448,   124,  -173,

-    22,   408,  -110,  -310,  -214,

-   -26,    23,   -83,   114,    14,

-  -110,   164,    52,   223,   -82,

-    37,   -25,  -263,   306,   -15,

-  -466,   415,   292,   165,   -18,

-    29,   -19,  -171,   155,   182,

-   179,   144,   -27,   231,   258,

-  -103,  -247,  -396,   238,   113,

-   375,  -154,  -109,    -4,   156,

-    98,    85,  -292,    -5,  -124,

-   116,   139,  -116,   -98,  -294,

-   -14,   -83,  -278,  -117,  -378,

-   106,    33,  -106,  -344,  -484,

-   119,    17,  -412,   138,   166,

-   384,   101,  -204,    88,  -156,

-  -121,  -284,  -300,    -1,  -166,

-   280,    33,  -152,  -313,   -81,

-   -37,    22,   229,   153,    37,

-   -60,   -83,   236,    -8,   -41,

-  -169,  -228,   126,   -20,   363,

-  -235,    17,   364,  -156,   156,

-   -25,   -30,    72,   144,   156,

-   153,   -26,   256,    97,   144,

-   -21,   -37,    48,   -65,   250,

-    63,    77,   273,  -128,   124,

-  -129,   -26,    40,     9,  -115,

-    -6,    82,    38,   -90,  -182,

-  -336,   -13,    28,   158,    91,

-   -30,   241,   137,  -170,   -17,

-   146,    14,   -11,    33,    61,

-   192,   197,    54,   -84,    85,

-    23,  -200,   -78,   -29,   140,

-   122,   237,   106,  -341,   136,

-   -57,  -142,   -85,   -16,   -74,

-   -59,   -90,    -8,  -187,   -20,

-  -211,  -267,   216,  -179,  -110,

-   -50,    -7,   220,  -267,   -70,

-   -57,   -42,   -17,   -15,    71,

-    32,    21,    63,  -137,    33,

-  -137,  -175,   104,   -68,    97,

-   -67,   -43,   133,  -301,   221,

-  -116,  -200,   -81,   -92,  -272,

-   -64,   -41,   -54,  -244,  -220,

-  -287,  -242,   -50,   -87,   -89,

-  -245,   236,   102,  -166,  -295,

-    66,    24,  -162,   -71,    95,

-    66,   136,   -90,  -220,   -36,

-   -98,  -161,  -222,  -188,    29,

-   -18,    18,   -19,  -415,     9,

-    49,    61,   100,    39,   -56,

-  -111,    82,   135,   -31,    52,

-   -90,  -153,   -93,   189,   182,

-  -214,   295,   119,   -74,   284,

-     2,   137,    37,    47,   182,

-    92,   117,   184,   -53,   373,

-   -21,   -14,   -35,   136,   391,

-   146,   129,  -164,   -28,   333,

-    92,    80,   -84,   100,  -134,

-    -8,   217,   -32,     3,   -47,

-  -151,   251,  -215,   142,    92,

-  -224,   310,  -172,  -275,    98,

-   159,   155,  -177,   112,    53,

-   205,    27,     8,  -240,   192,

-   169,   120,  -319,  -201,   106,

-    11,    36,   -86,  -237,   455,

-  -109,  -154,  -163,   174,   -55,

-   -38,    32,  -101,   -78,   -59,

-  -205,  -321,   -97,    69,    79,

-  -310,    44,    18,  -185,    34,

-  -115,   -20,  -148,   -39,   203,

-   -29,   154,   -30,  -158,   166,

-   -45,  -131,  -317,   -24,   363,

-  -165,  -205,  -112,  -222,   265,

-   -32,   -44,  -150,    54,  -193,

-    -6,   -38,  -255,  -169,  -115,

-  -266,    87,  -189,   -36,  -169,

-   -60,   -87,  -266,  -436,  -170,

-   -68,   -81,  -278,    24,    38,

-   -23,   -19,  -155,  -256,   141,

-   -61,  -226,  -565,  -175,    71,

-     9,   -29,  -237,  -515,   263};

-

-static Word16 dico22_isf_36b[SIZE_BK22_36b*4] = {

-

-  -298,    -6,    95,    31,

-  -213,   -87,  -122,   261,

-     4,   -49,   208,    14,

-  -129,  -110,    30,   118,

-  -214,   258,   110,  -235,

-   -41,   -18,  -126,   120,

-   103,    65,   127,   -37,

-   126,   -36,   -24,    25,

-  -138,   -67,  -278,  -186,

-  -164,  -194,  -201,    78,

-  -211,   -87,   -51,  -221,

-  -174,   -79,   -94,   -39,

-    23,    -6,  -157,  -240,

-    22,  -110,  -153,   -68,

-   148,    -5,    -2,  -149,

-    -1,  -135,   -39,  -179,

-    68,   360,  -117,   -15,

-   137,    47,  -278,   146,

-   136,   260,   135,    65,

-    61,   116,   -45,    97,

-   231,   379,    87,  -120,

-   338,   177,  -272,     3,

-   266,   156,    28,   -69,

-   260,    84,   -85,    86,

-  -266,   154,  -256,  -182,

-   -17,   -65,  -304,    -6,

-   -40,   175,  -151,  -180,

-   -27,    27,   -87,   -63,

-   121,   114,  -166,  -469,

-   159,   -66,  -323,  -231,

-   214,   152,  -141,  -212,

-   137,    36,  -184,   -51,

-  -282,  -237,    40,    10,

-   -48,  -235,   -37,   251,

-   -54,  -323,   136,    29,

-   -88,  -174,   213,   198,

-  -390,    99,   -63,  -375,

-   107,  -169,  -164,   424,

-    69,  -111,   141,  -167,

-    74,  -129,    65,   144,

-  -353,  -207,  -205,  -109,

-  -160,  -386,  -355,    98,

-  -176,  -493,   -20,  -143,

-  -252,  -432,    -2,   216,

-   -90,  -174,  -168,  -411,

-    13,  -284,  -229,  -160,

-   -87,  -279,    34,  -251,

-   -75,  -263,   -58,   -42,

-   420,    53,  -211,  -358,

-   384,   -35,  -374,   396,

-    68,  -228,   323,    -2,

-   167,  -307,   192,   194,

-   459,   329,    -5,  -332,

-   375,    79,    -7,   313,

-   282,  -124,   200,   -92,

-   271,  -162,   -70,   180,

-  -157,  -298,  -514,  -309,

-    58,  -163,  -546,    18,

-   124,  -364,   167,  -238,

-    83,  -411,  -117,    96,

-   140,  -112,  -388,  -624,

-   259,  -133,  -317,    41,

-   163,  -130,   -64,  -334,

-   226,  -165,  -124,  -110,

-  -466,   -61,     6,   229,

-  -153,   205,  -145,   242,

-  -159,    48,   195,   148,

-   -58,    28,    31,   279,

-  -303,   185,   279,    -4,

-   -61,   197,    59,    86,

-  -114,   123,   168,   -52,

-    35,    36,   100,   126,

-  -407,   102,   -77,   -40,

-  -338,    -1,  -342,   156,

-  -179,   105,   -34,   -97,

-  -185,    84,   -35,   108,

-  -133,   107,   -91,  -357,

-  -180,    54,  -229,    24,

-   -44,    47,    47,  -182,

-   -66,    13,    45,     4,

-  -339,   251,    64,   226,

-   -42,   101,  -350,   275,

-   -99,   398,   142,   121,

-   111,    12,  -102,   260,

-     0,   505,   260,   -94,

-   161,   285,   -96,   224,

-    -4,   206,   314,    33,

-   167,   139,    88,   204,

-  -235,   316,   -60,   -25,

-    -8,  -150,  -312,   201,

-   -36,   292,    61,  -104,

-   -40,   174,  -162,    42,

-   -21,   402,   -29,  -351,

-    21,   152,  -360,   -93,

-    57,   191,   212,  -196,

-    76,   158,   -21,   -69,

-  -328,  -185,   331,   119,

-   -53,   285,    56,   337,

-  -107,   -24,   405,    29,

-   -18,   137,   272,   277,

-  -255,    22,   173,  -191,

-   295,   322,   325,   302,

-    21,   -27,   332,  -178,

-   119,    13,   271,   129,

-  -455,  -180,   116,  -191,

-  -227,    62,  -148,   524,

-  -176,  -287,   282,  -157,

-  -243,    13,   199,   430,

-   -59,   -49,   115,  -365,

-    72,  -172,  -137,    93,

-  -138,  -126,   141,   -84,

-     5,  -124,    38,   -20,

-  -258,   311,   601,   213,

-    94,   130,   -61,   502,

-    -1,  -157,   485,   313,

-   146,   -74,   158,   345,

-   276,   135,   280,   -57,

-   490,   252,    99,    43,

-   267,   -74,   429,   105,

-   278,   -23,   119,    94,

-  -542,   488,   257,  -115,

-   -84,  -244,  -438,   478,

-  -113,  -545,   387,   101,

-   -95,  -306,   111,   498,

-    95,   166,    22,  -301,

-   420,   -15,   -58,   -78,

-   270,    29,   122,  -282,

-   160,  -240,    50,   -38};

-

-static Word16 dico23_isf_36b[SIZE_BK23_36b*7] = {

-

-    81,   -18,    68,   -27,  -122,  -280,    -4,

-    45,  -177,   209,   -30,  -136,   -74,   131,

-   -44,   101,   -75,   -88,   -48,  -137,   -54,

-  -245,   -28,    63,   -18,  -112,  -103,    58,

-   -79,    -6,   220,   -65,   114,   -35,   -50,

-   109,   -65,   143,  -114,   129,    76,   125,

-   166,    90,   -61,  -242,   186,   -74,   -43,

-   -46,   -92,    49,  -227,    24,  -155,    39,

-    67,    85,    99,   -42,    53,  -184,  -281,

-   142,  -122,     0,    21,  -142,   -15,   -17,

-   223,    92,   -21,   -48,   -82,   -14,  -167,

-    51,   -37,  -243,   -30,   -90,    18,   -56,

-    54,   105,    74,    86,    69,    13,  -101,

-   196,    72,   -89,    43,    65,    19,    39,

-   121,    34,   131,   -82,    25,   213,  -156,

-   101,  -102,  -136,   -21,    57,   214,    22,

-    36,  -124,   205,   204,    58,  -156,   -83,

-    83,  -117,   137,   137,    85,   116,    44,

-   -92,  -148,   -68,    11,  -102,  -197,  -220,

-   -76,  -185,   -58,   132,   -26,  -183,    85,

-    -7,   -31,    -2,    23,   205,  -151,    10,

-   -27,   -37,    -5,   -18,   292,   131,     1,

-   117,  -168,     9,   -93,    80,   -59,  -125,

-  -182,  -244,    98,   -24,   135,   -22,    94,

-   221,    97,   106,    42,    43,  -160,    83,

-    25,   -64,   -21,     6,    14,   -15,   154,

-   126,    15,  -140,   150,   -10,  -207,  -114,

-    79,   -63,  -211,   -70,   -28,  -217,   165,

-    46,    38,   -22,   281,   132,   -62,   109,

-   112,    54,  -112,   -93,   208,    27,   296,

-   115,    10,  -147,    41,   216,    42,  -276,

-    50,  -115,  -254,   167,   117,    -2,    61,

-    17,   144,    34,   -72,  -186,  -150,   272,

-   -29,   -66,   -89,   -95,  -149,   129,   251,

-   122,     0,   -50,  -234,   -91,    36,    26,

-  -105,  -102,   -88,  -121,  -236,    -7,   -11,

-  -204,   109,     5,  -191,   105,   -15,   163,

-   -80,    32,   -24,  -209,    41,   294,    70,

-  -106,   -94,  -204,  -118,   120,   -50,   -37,

-   -82,  -241,    46,  -131,   -29,   150,   -55,

-    33,   155,   120,   -89,    -8,     7,    62,

-   213,    82,    61,    18,  -161,   144,   152,

-    30,   131,    65,   -87,  -255,   -17,  -107,

-    -8,    85,   -64,    51,  -162,   223,   -53,

-  -134,   261,    69,   -56,   218,    72,  -111,

-     2,   155,  -113,   -87,    49,    85,   -28,

-  -163,    42,    -1,  -196,     7,    39,  -245,

-    14,  -137,   -79,    11,  -160,   202,  -293,

-   -94,    33,   208,   100,    56,   -44,   326,

-   -78,   -41,   232,    13,  -142,   227,    80,

-   -16,   -87,   201,    33,  -133,    15,  -183,

-   -58,  -192,   -47,   184,  -128,   133,    99,

-  -205,    11,  -155,    78,    52,    72,   141,

-  -246,    26,    99,   151,    59,   115,   -64,

-   -79,   -47,   -16,   -14,     6,    47,   -43,

-   -72,  -178,   -27,   162,   112,    43,  -174,

-  -175,   238,   186,    71,   -54,  -188,   -76,

-  -225,   233,    39,   -39,  -158,   122,    44,

-   -26,    43,    84,   130,   -93,   -51,    22,

-     3,    92,  -150,   136,  -182,   -57,    97,

-  -131,   179,   -78,    80,    91,  -165,    90,

-    -2,   148,    15,   130,    65,   175,   117,

-  -138,   114,  -137,   132,     3,   -10,  -186,

-   140,    -4,   -37,   254,   -62,    92,  -109};

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*-------------------------------------------------------------------*
+ *                         qpisf_2s.h
+ *-------------------------------------------------------------------*
+ * Quantization tables for two-stage of ISFs (split by 2 in 1st stage)
+ * Version whith prediction MU = 0.25
+ *-------------------------------------------------------------------*/
+
+#define ORDER   16            /* order of linear prediction filter */
+#define ISF_GAP 128           /* 50 Hz */
+#define N_SURV  4
+
+#define SIZE_BK1  256
+#define SIZE_BK2  256
+#define SIZE_BK21 64
+#define SIZE_BK22 128
+#define SIZE_BK23 128
+#define SIZE_BK24 32
+#define SIZE_BK25 32
+
+#define SIZE_BK21_36b 128
+#define SIZE_BK22_36b 128
+#define SIZE_BK23_36b 64
+
+/* means of ISFs */
+static Word16 mean_isf[ORDER] = {
+
+   738,  1326,  2336,  3578,  4596,  5662,  6711,  7730,
+  8750,  9753, 10705, 11728, 12833, 13971, 15043,  4037};
+
+/* 46 bits */
+/*-------------------------------------------------------------------*
+ *  isf codebooks:  two-stage VQ with split-by-5 in 2nd stage        *
+ *                                                                   *
+ *  codebook   vector dimension    number of vectors                 *
+ *  ~~~~~~~~   ~~~~~~~~~~~~~~~~    ~~~~~~~~~~~~~~~~~                 *
+ *     1_1            9                  256                         *
+ *     1_2            7                  256                         *
+ *     2_1            3                  64                          *
+ *     2_2            3                  128                         *
+ *     2_3            3                  128                         *
+ *     2_4            3                  32                          *
+ *     2_5            4                  32                          *
+ *-------------------------------------------------------------------*/
+
+/*------------------------------------------------*
+ * 1st stage codebook; 1st split:   isf0 to isf8
+ *------------------------------------------------*/
+
+static Word16 dico1_isf[SIZE_BK1*9] = {
+
+   579,  1081,  1035,   390,     3,  -263,  -198,   -82,    38,
+    18,   -68,   -12,   313,   761,   405,   249,   111,   -76,
+   740,  1263,  1292,  1006,   997,  1019,  1017,   976,   923,
+   -91,   827,   948,   648,   613,   535,   522,   490,   421,
+    41,   -44,  -281,  -472,   652,   534,   193,   135,   -90,
+    41,  -121,  -356,   -60,   663,   307,    61,   -48,  -344,
+   557,   946,  1049,   867,   846,   990,  1112,  1262,  1241,
+  -118,  -204,   328,   512,   870,   793,   610,   402,   186,
+   156,   293,    74,  -338,  -475,  -897,  -594,  -161,  -497,
+   226,   131,  -138,   307,   169,  -271,  -164,  -387,  -624,
+    62,   -32,   -61,  -252,  -541,  -828, -1027,  -523,  -662,
+   102,   -61,   141,   112,  -270,  -251,  -541,    25,  -150,
+     6,  -132,  -356,  -686,   -96,  -322,  -522,   -31,  -326,
+   -36,  -209,  -521,  -229,   307,  -132,    -5,   -99,  -384,
+    60,   -51,  -237,  -668,  -973,  -407,  -708,   -75,  -172,
+    26,  -138,  -266,   111,  -302,    43,  -278,  -356,  -359,
+   570,   822,   496,  -154,  -312,   -92,   137,   279,   371,
+  -146,   368,   409,    68,     6,    77,   167,   202,   162,
+   633,   898,   996,   756,   662,   683,   783,   909,   996,
+  -103,   294,   607,   415,   483,   462,   480,   431,   408,
+  -120,  -338,  -612,  -524,   584,   331,    92,   433,   276,
+  -178,  -293,  -154,   -41,   269,   100,    -9,   213,   160,
+   830,   736,   278,   820,  1254,   686,   712,  1039,   473,
+  -218,  -304,   463,   454,   397,   273,   202,   286,   273,
+  -232,     7,     6,  -388,  -472,  -427,  -378,  -167,  -100,
+  -294,  -183,   134,   -47,   101,   -88,   -84,  -117,    -3,
+    57,    17,  -202,  -634,  -989, -1119,  -533,   176,   -36,
+   120,   -28,    23,   111,  -319,   318,   -22,   -77,   266,
+  -271,  -464,  -434,  -658,  -640,  -385,  -385,   -99,   -69,
+  -198,  -259,  -266,   -44,   -39,  -139,  -137,   171,    66,
+     9,  -145,  -377,  -846, -1000,  -111,  -325,   342,   135,
+   -81,  -286,  -380,   192,   -57,   307,    76,   -24,  -140,
+   677,   702,   247,    56,   249,   141,  -105,  -236,   -99,
+    36,   -39,   -69,   348,   198,   -93,   322,    91,   -72,
+   503,   885,  1508,  1307,  1282,  1172,  1119,  1209,  1061,
+   416,   719,   989,  1227,  1001,  1052,   954,   741,  1044,
+  -127,  -376,  -657,   139,   623,   223,   501,   306,   220,
+  -113,  -384,  -796,   504,   438,    85,   213,   -83,  -194,
+   585,  1132,  1233,  1091,  1247,  1433,  1512,  1448,  1314,
+  -174,  -422,     7,  1155,  1089,  1182,  1003,   945,   806,
+     8,  -126,  -317,  -103,  -351,  -695,   -98,  -268,  -537,
+    33,  -103,  -290,   167,   -39,  -407,    44,  -208,  -375,
+   104,   -23,   -64,  -291,  -637,  -851, -1084,   -61,  -112,
+   -75,  -306,  -434,   218,  -148,  -354,  -680,  -133,  -216,
+  -121,  -377,  -718,   -97,  -130,  -361,  -156,  -379,  -599,
+   -56,  -254,  -586,   235,   157,  -214,    11,  -260,  -149,
+  -124,  -267,  -397,  -580,  -593,  -527,  -805,  -385,   346,
+  -193,  -440,  -708,  -351,  -141,  -255,  -499,  -147,  -185,
+   448,   660,   494,   208,   509,   461,   338,   291,   149,
+  -223,    88,   335,   159,   212,   191,   286,   308,   205,
+   -31,   469,   803,   659,   619,   658,   843,   987,  1113,
+  -171,  -242,   514,   362,   295,   524,   552,   694,   585,
+   -64,  -308,  -448,   -21,   284,   786,   446,   289,    92,
+  -218,  -390,    -7,   169,   206,   330,   352,   408,   358,
+   -36,   702,   959,   859,   861,  1115,  1269,  1357,  1305,
+  -133,  -341,   -65,   678,   417,   440,   486,   518,   780,
+    33,   -44,  -191,  -344,  -461,  -755,  -201,   217,   -31,
+  -353,  -547,   -44,   123,   -61,   -68,   -79,    29,    60,
+    73,   -57,  -406,  -766, -1243, -1203,   240,   400,   165,
+   -73,  -282,  -601,  -213,  -171,  -375,   332,    35,  -103,
+   -29,  -207,  -553,  -476,  -638,  -908,   172,   -22,  -135,
+  -192,  -239,  -164,  -103,  -111,   -47,   153,   125,   110,
+    -1,  -203,  -570, -1030, -1424,  -535,   155,     1,   147,
+  -333,  -653,  -865,  -197,  -158,   -21,   -44,    95,   108,
+   389,   588,   490,    33,  -237,  -524,  -628,  -136,  -260,
+    40,  -177,  -462,   453,   862,   380,   131,  -130,  -405,
+   842,  1678,  1841,  1549,  1474,  1256,  1082,   905,   742,
+   370,  1216,  1768,  1633,  1212,   636,    22,  -330,    71,
+   -76,  -281,  -741,  -742,   898,   619,   277,    71,  -222,
+   -32,  -265,  -556,   -25,   994,   682,   305,   126,  -165,
+    73,   738,   893,   968,   993,  1768,  2273,  1840,  1391,
+   -69,  -349,  -585,   234,  1158,   903,   626,   510,   251,
+    -1,   -99,  -272,  -210,  -603,  -351,  -540,  -811,  -383,
+   -16,  -230,  -504,   410,   149,  -205,  -343,  -651,  -639,
+   103,    -9,  -227,  -205,  -562,  -781, -1079, -1208,  -156,
+   143,    63,  -135,   -67,  -317,  -602,  -784, -1154,  -640,
+  -144,  -391,  -674,  -622,  -200,  -254,  -660,  -947,  -395,
+   -40,  -250,  -625,    27,   543,    94,  -131,  -386,  -673,
+  -123,  -371,  -757,  -451,  -564,  -614,  -415,  -711,   -35,
+  -116,  -309,  -593,  -268,   239,   -33,  -338,  -650,  -135,
+    94,   251,   554,    57,  -312,  -423,  -154,   -57,   235,
+  -268,   -71,   381,   114,   -44,   -87,   125,   173,   133,
+  1513,  1714,  1238,   534,   276,   315,   461,   459,   508,
+  -131,   -19,  1149,   670,   486,   356,   309,   369,   296,
+  -223,  -501,  -899,  -722,   -70,     6,   131,   310,   394,
+   -99,  -303,  -517,   249,    64,   -53,   135,   -11,   453,
+  -147,  -399,  -730,  -401,   817,   738,   802,   749,   575,
+  -154,  -435,  -739,   800,   593,   366,   529,   318,   326,
+  -224,    45,   -39,  -387,  -515,  -518,  -608,  -384,  -321,
+  -315,  -377,   143,  -101,  -113,  -377,  -177,  -144,   -12,
+   117,    40,  -239,  -651, -1051,  -581,  -737,  -990,  -328,
+    26,   -50,  -157,   -23,  -453,  -283,  -531,  -546,   192,
+  -252,  -501,  -743,  -589,  -627,  -499,  -328,  -118,   -72,
+  -324,  -494,  -244,  -306,  -144,  -177,  -262,  -135,   -78,
+   -36,  -234,  -519,  -961, -1290,  -314,  -479,  -371,   -45,
+   -95,  -292,  -535,    -8,  -300,   112,  -164,  -277,   198,
+   -99,  -128,   880,   836,   579,   351,    23,   -95,  -217,
+   -27,  -258,   124,  1011,   597,   425,   144,     7,   -73,
+   421,  1293,  1640,  1623,  1742,  1617,  1499,  1284,  1006,
+   -95,   752,  1680,  1569,  1618,  1436,  1200,   980,   712,
+   -69,  -300,  -683,  -435,  1132,   899,   504,   332,   109,
+   -74,  -323,  -637,   563,  1074,   608,   371,   105,   -49,
+   -78,   831,  1194,  1110,  1378,  1481,  1492,  1365,  1217,
+  -259,  -121,  1440,  1334,  1628,  1490,  1438,  1223,   933,
+   -82,  -306,  -613,  -222,  -378,  -675,  -545,  -671,  -845,
+    53,  -124,  -347,   422,    52,  -125,  -270,  -529,     9,
+    79,   -89,  -320,  -662,  -999, -1199, -1243,  -676,  -297,
+   -68,  -273,  -611,   137,  -146,  -397,  -627,  -845,  -220,
+  -112,  -346,  -797,  -826,   234,  -132,  -188,  -278,  -522,
+  -159,  -405,  -734,  -419,   293,    74,  -167,  -167,   184,
+  -153,  -437,  -833, -1080,  -336,  -472,  -561,  -340,  -253,
+  -169,  -423,  -820,  -904,  -131,   -19,  -346,  -604,    31,
+    33,   -31,   312,    62,  -148,    49,   -59,   564,   486,
+  -306,  -333,   194,   -44,    67,    72,   147,   205,   243,
+  -207,   -49,  1360,   983,   969,   991,  1014,  1110,   973,
+  -211,  -172,   883,   627,   711,   674,   705,   798,   746,
+   -88,  -325,  -763,  -974,   687,   908,   514,   382,   172,
+  -292,  -612,  -805,    63,   131,   270,   259,   352,   348,
+  -235,   -84,   955,   818,  1120,  1289,  1559,  1480,  1285,
+  -180,  -461,  -614,   657,   691,   745,   854,   783,   713,
+   -97,  -309,  -477,  -614,  -777,  -734,  -768,  -526,  -472,
+  -344,  -476,   -35,  -169,    49,   -77,  -150,  -240,  -141,
+   -52,  -268,  -639,  -919, -1278, -1113,  -342,  -333,  -151,
+   -68,  -242,  -585,   -73,  -209,  -478,  -159,  -429,   133,
+  -197,  -499, -1005, -1268,  -272,  -224,  -105,   -67,    17,
+  -363,  -618,  -414,  -116,   -62,    20,    10,   116,   108,
+  -195,  -475,  -906, -1260,  -891,  -441,  -277,  -142,   -28,
+  -226,  -519,  -950,  -700,  -275,  -266,  -116,  -105,    82,
+   404,   511,   520,   327,    17,  -194,  -333,  -536,  -586,
+  -114,  -130,   276,   237,   204,   342,   135,   -16,  -111,
+   670,  1208,  1168,   860,   742,   601,   528,   403,   309,
+   397,   621,   966,   752,   579,   398,   400,   329,   252,
+   191,   180,  -137,  -467,   272,   106,   -95,    17,  -192,
+   -80,  -290,  -626,   194,   598,   196,    21,  -281,    77,
+   510,   864,  1108,   807,   939,   902,   925,   717,   481,
+   137,   367,   534,   764,   670,   382,   296,   153,    84,
+   303,   497,   144,   -85,  -125,  -539,  -482,  -464,  -764,
+   233,   347,    68,  -147,   169,  -210,  -242,  -226,  -482,
+   307,   422,   154,  -175,  -386,  -722,  -724,  -904, -1015,
+   309,   308,   160,   -60,  -470,  -420,  -598,  -791,  -219,
+    68,   121,  -137,  -560,  -146,  -446,  -515,  -494,  -729,
+   130,    53,  -227,    46,   474,    32,  -161,  -192,  -490,
+   213,   164,   -71,  -465,  -876,  -161,  -456,  -587,   -48,
+   218,   117,    39,   177,  -194,   -88,  -226,  -418,    50,
+   210,   547,   569,   279,   121,   -44,   -50,    10,   -84,
+    58,   140,   182,    -5,   267,   117,   106,   211,   198,
+   539,   835,   913,   719,   617,   544,   591,   565,   642,
+   153,   559,   872,   460,   222,   108,   188,   180,   183,
+   158,   119,   284,  -153,  -271,   229,    87,   110,   -57,
+  -183,    82,   118,    21,    13,    40,   118,   191,   185,
+   162,   889,   654,   108,   -34,   244,   488,   561,   532,
+   163,    56,   609,   341,    50,   329,    68,   266,   218,
+   100,   206,    18,  -304,  -107,  -436,  -487,   -65,  -306,
+   -86,   154,   134,   -30,   -45,   -73,  -104,   -80,   -96,
+   245,   330,    10,  -440,  -849, -1082,    79,    40,  -265,
+   196,   372,   272,  -181,  -493,  -389,   275,    80,   -59,
+     2,   -12,  -246,  -505,  -100,  -436,    21,  -187,  -431,
+  -221,   -48,    36,  -271,  -186,  -147,  -109,    26,    71,
+   213,   140,    72,  -351,  -620,   -84,  -363,    69,    46,
+    91,   167,    -3,   -95,   -99,  -105,   -48,   114,   147,
+   259,   249,   172,   607,   406,    52,    59,  -189,  -320,
+   115,   -85,   -54,   574,   128,   226,   -59,  -253,   130,
+   -62,  1033,  1308,  1035,  1127,  1098,  1029,   961,   823,
+    39,   364,   757,   940,   728,   660,   659,   583,   770,
+  -115,  -338,  -760,  -471,   394,    37,   441,   178,     6,
+   -57,  -305,  -525,   796,   453,   188,    -4,  -114,   248,
+    71,   444,   797,   731,  1096,  1157,  1222,  1029,   811,
+   135,   359,   551,   425,   749,   815,   874,   704,   502,
+   132,   247,     0,  -206,  -449,  -750,  -258,  -514,  -633,
+   248,   249,    91,   121,  -195,  -499,   -90,  -282,  -435,
+    78,    20,  -277,  -623,  -983, -1224,  -415,  -458,  -639,
+   347,   509,   208,  -179,  -464,  -728,   -76,  -237,  -486,
+  -103,  -343,  -756,  -713,  -265,  -609,  -191,  -398,  -636,
+  -121,  -383,  -749,   567,   252,   -36,  -354,  -417,   -50,
+   204,   100,  -149,  -650, -1081,   -47,    -7,  -263,   111,
+   -46,  -180,  -267,  -324,  -562,  -394,  -692,   398,   292,
+   482,   670,   683,   624,   442,   165,   116,    36,  -149,
+   108,   247,   291,   247,   355,   122,   109,   224,   296,
+   -14,   945,   990,   801,   755,   815,   847,   913,   892,
+   292,   349,   725,   482,   388,   329,   429,   620,   667,
+   -34,   197,   213,  -127,    84,   494,   620,   575,   375,
+   126,   207,   172,   167,   362,   202,   296,   395,   455,
+    -6,   250,   539,   467,   636,   801,  1149,  1287,  1118,
+    27,   240,   369,   280,   440,   411,   634,   892,   953,
+   159,   170,   -58,  -395,  -797,  -690,    77,  -211,  -334,
+    -5,   -28,   -13,   -74,  -335,  -603,   300,    88,  -205,
+    82,   -33,  -364,  -698, -1203, -1153,   110,  -146,  -289,
+   113,     1,  -243,  -588,  -994,  -496,   414,   160,    42,
+   -56,  -247,  -440,  -693,  -996,  -479,    11,  -178,  -357,
+  -151,  -353,  -327,  -211,  -340,   141,    65,   425,   453,
+    34,  -169,  -455,  -932, -1215,   138,   499,   256,   324,
+    68,   139,   -15,  -547,  -478,    17,   306,   502,   481,
+   -32,  -134,   445,   129,  -143,  -244,  -503,  -507,  -599,
+    61,  -140,  -345,   496,   458,    -2,    20,  -227,  -514,
+   394,  1765,  1666,  1339,  1117,   806,   642,   479,   380,
+   215,   519,   920,  1053,  1090,   791,   528,   290,   155,
+   -54,  -233,  -647,  -602,   639,   294,    -2,  -167,  -442,
+   -78,  -315,  -791,  -113,   820,   403,   158,  -116,  -356,
+   529,  1851,  2003,  1228,   622,   -41,  -416,   344,   819,
+  -105,  -379,  -236,  1224,   893,   749,   568,   356,   214,
+   -17,  -199,  -144,    50,  -283,  -247,  -578,  -846, -1087,
+    69,   -11,  -381,  -206,   209,  -284,  -387,  -416,  -716,
+    39,    -5,  -145,  -374,  -682,  -909, -1074, -1169, -1066,
+   287,   226,    67,  -221,  -662,  -171,  -421,  -642,  -707,
+  -132,  -348,  -538,  -448,   -20,    -4,  -354,  -748,  -933,
+     4,   -75,  -289,  -598,   317,    52,  -208,  -297,  -559,
+   -88,  -264,  -358,  -589,  -631,  -248,  -523,  -822, -1071,
+    70,    -8,    54,  -314,  -515,    92,  -146,  -274,  -493,
+   199,    62,   391,   158,  -141,    71,  -219,  -203,  -207,
+   152,    40,   329,   162,   -29,    48,  -149,   108,   127,
+   635,  1058,   883,   492,   372,   312,   317,   274,   241,
+   267,   722,  1256,   882,   625,   248,     8,   -81,   -60,
+   -58,  -138,  -291,  -600,   -12,    -2,   -39,   147,   117,
+  -107,  -345,  -513,   459,    76,    92,  -272,   388,   262,
+   362,   516,   203,  -409,  -716,  -831,  -331,   185,   209,
+  -117,  -391,  -298,   671,   292,   538,   257,   166,   -38,
+  -102,  -319,  -194,  -283,  -573,  -262,  -579,  -219,  -444,
+  -235,    78,    11,  -168,  -101,  -229,  -263,  -321,  -123,
+    70,    50,  -170,  -599,  -996,  -588,  -263,  -516,  -455,
+   394,   363,   229,  -136,  -538,    21,  -183,  -348,  -201,
+  -124,  -368,  -640,  -879,  -847,  -209,  -409,  -494,  -515,
+  -127,  -341,  -541,  -425,  -510,   -10,  -252,  -473,  -291,
+    84,   -69,  -201,  -676,  -868,   103,  -311,  -132,  -320,
+     5,  -173,  -188,  -297,  -628,   197,   -57,     7,   -11,
+    49,  -160,    56,   558,   111,    33,  -311,  -440,  -463,
+    -1,  -246,  -307,   862,   453,   139,  -170,  -355,  -232,
+   279,   966,  1642,  1478,  1463,  1123,   795,   525,   339,
+  -197,   -38,  1702,  1331,  1252,   950,   692,   504,   426,
+  -108,  -344,  -861, -1172,   444,   354,    88,   -46,  -220,
+   -53,  -321,  -494,  1113,   744,   364,   198,   -34,   -75,
+   457,   955,  1177,  1214,  1427,  1457,  1345,   917,   539,
+   -69,   199,   897,  1140,  1343,  1183,   977,   742,   522,
+   122,    44,  -269,    27,  -155,  -562,  -307,  -590,  -773,
+   154,    42,  -160,   252,  -129,  -305,  -471,  -733,  -371,
+   135,   185,   -82,  -416,  -722,  -913,  -504,  -743,  -880,
+   149,   214,   -84,  -329,  -680,  -835,  -426,  -661,   -81,
+  -128,  -380,  -735,  -998,  -337,    17,  -182,  -467,  -697,
+   -84,  -290,  -510,  -592,    13,   440,   154,   -38,  -279,
+    70,   -61,  -246,  -727, -1047,   -80,  -381,  -535,  -704,
+   178,    -2,  -146,  -670,  -938,   482,   138,    63,    65,
+   -11,    15,   772,   443,   142,   -20,  -209,  -126,  -161,
+   -32,  -249,    95,   552,   124,    30,  -343,    82,   -86,
+   148,   751,  1515,  1105,   867,   606,   474,   448,   399,
+  -163,  -257,   899,  1097,   906,   751,   502,   390,   294,
+   -51,  -258,  -447,  -806,  -368,   763,   464,   364,   183,
+  -166,  -374,  -367,    87,    35,   399,   418,   856,   833,
+  -205,  -310,   588,   778,   785,  1065,  1118,  1245,  1157,
+  -173,  -312,   107,   345,   400,   790,   870,  1113,  1001,
+    -7,  -120,  -387,  -410,  -614,  -943,  -226,  -384,  -491,
+  -203,  -288,   -51,  -331,   -90,  -178,  -408,  -573,  -338,
+    56,   -29,  -273,  -627, -1041,  -798,  -247,  -467,   148,
+    66,    -2,  -205,  -205,  -575,  -349,   -57,  -352,   -58,
+   -45,  -225,  -471,  -924,  -497,    77,   -32,    44,  -135,
+  -277,  -491,  -497,  -502,  -424,  -202,  -137,    77,    96,
+    26,  -179,  -469, -1008, -1260,   262,   -35,  -132,  -259,
+   -66,  -232,  -447,  -533,  -789,  -191,  -100,  -267,   364};
+
+/*------------------------------------------------*
+ * 1st stage codebook; 2nd split:   isf9 to isf15
+ *------------------------------------------------*/
+
+static Word16 dico2_isf[SIZE_BK2*7] = {
+
+  1357,  1313,  1136,   784,   438,   181,   145,
+   636,   648,   667,   568,   442,   217,   362,
+   427,   440,   674,   524,   332,   117,  -417,
+   121,   295,   468,   465,   230,    44,  -221,
+  -147,  -240,   149,    80,   390,   278,   106,
+  -418,  -556,   552,   511,   235,   144,   -95,
+    43,   193,   274,   150,    67,    34,  -273,
+   -43,  -126,   171,   416,   282,    63,  -354,
+  -372,   -86,  -344,  -108,   -94,  -182,   -89,
+  -600,  -840,  -200,   465,   258,   -11,  -253,
+   -48,   329,    97,  -290,  -543,  -795,  -354,
+  -570,  -117,   187,    10,  -133,  -416,   -76,
+  -618,  -129,  -247,  -371,    45,   -76,   277,
+ -1022, -1079,   126,   474,   254,   127,    52,
+  -281,    76,  -167,  -361,  -283,  -551,  -283,
+  -119,   -52,    -1,   134,   -32,  -204,  -415,
+  1064,   827,   637,   684,   464,   209,    12,
+   482,   416,   449,   371,   335,   294,   194,
+   719,   576,   365,   135,   113,    91,  -199,
+   298,   176,   493,   366,   194,   163,    36,
+   -35,  -236,  -259,   -36,    -4,    99,   152,
+   -98,  -306,   -27,   228,    90,   111,   -86,
+    91,    13,  -211,  -258,  -106,    86,   -64,
+    73,   -35,   -57,   -31,   162,    35,  -192,
+  -109,  -335,  -629,   -66,   -61,  -128,   322,
+  -495,  -669,  -728,   193,    31,  -220,   122,
+   324,    95,   -89,   -91,  -409,  -710,  -154,
+     0,  -234,    92,    33,  -343,  -609,  -220,
+  -343,  -408,  -476,  -655,  -153,    82,   222,
+  -490,  -745,  -255,    49,   -48,   135,  -127,
+   119,   -67,  -328,  -390,  -272,  -545,   -56,
+   -57,  -130,   -10,    -7,  -164,   -47,   -22,
+   984,  1064,   961,   568,   210,   -27,    16,
+   811,   691,   754,   514,   224,   -35,   166,
+   662,   704,   618,   386,    57,  -211,  -257,
+   510,   359,   418,   393,    91,  -144,   -18,
+  -193,   -31,   -27,   223,    89,  -143,    24,
+  -112,   -98,   471,   319,   185,     3,   175,
+   252,   146,   -47,   272,    48,  -211,  -234,
+   146,    69,   203,   364,    68,   -52,    51,
+  -259,  -478,  -697,  -349,  -758,  -501,    63,
+  -501,  -769,  -289,    79,  -311,  -497,  -106,
+   251,    53,  -235,  -469,  -895,  -884,   145,
+  -416,  -551,   140,  -133,  -523,  -775,    44,
+  -326,  -423,  -713,  -497,   -86,  -431,    99,
+  -757,  -772,  -160,   -76,   -46,   -32,   379,
+    85,   -35,  -200,  -401,  -663, -1040,  -247,
+  -180,  -330,   -92,  -376,    27,  -183,  -110,
+  1279,  1086,   781,   502,   324,   164,   157,
+   682,   466,   449,   277,   146,    28,   409,
+   635,   472,   390,   107,  -232,  -538,  -139,
+   196,   396,   332,   213,   209,   -29,   -81,
+   150,   -95,  -312,    76,   -77,  -320,   -50,
+    46,     9,    47,   175,   139,    30,   384,
+   218,   206,   -24,  -250,   -96,  -276,  -183,
+    26,   119,    38,    14,    -4,  -133,   -52,
+  -477,  -614,  -987,  -715,  -631,  -813,   200,
+  -744, -1009, -1065,  -745,  -631,  -171,    18,
+  -137,  -251,  -483,  -613,  -980, -1203,    12,
+  -605,  -767,  -562,  -686, -1088,  -515,    58,
+  -202,  -428,  -782, -1072,   -96,  -234,  -179,
+  -480,  -709, -1070,  -897,  -131,   -92,   321,
+  -145,  -193,  -512,  -729,  -572,  -765,  -210,
+  -331,  -585,  -525,  -631,  -281,  -208,  -303,
+  1165,  1104,   939,   828,   716,   426,   155,
+     6,  -109,   820,   778,   415,   113,   -27,
+   381,   339,   314,   265,   121,    -9,  -474,
+  -373,    47,   584,   442,    99,  -231,  -113,
+  -496,   -38,  -285,   262,   305,   170,     4,
+  -587,  -556,    69,    66,   471,   354,    13,
+  -138,    70,   -18,   106,    67,   167,  -302,
+  -445,  -141,   185,   191,   151,    83,  -133,
+  -257,  -521,  -720,  -198,   134,   -46,  -182,
+  -819, -1168,  -777,   512,   359,    95,  -113,
+   137,    -2,   -74,  -138,  -401,  -114,  -371,
+  -242,  -466,   204,   223,   -31,  -212,  -192,
+  -532,  -637,  -466,  -686,   256,   277,  -139,
+ -1141, -1244,  -381,   -75,   -54,    14,    88,
+  -311,   115,  -143,  -499,  -343,   124,  -416,
+  -616,  -147,  -135,    43,    -4,   121,  -369,
+   835,   783,   641,   390,   355,   350,    64,
+    72,   194,   443,   467,   436,   219,   372,
+   464,   369,   192,     4,  -156,   -72,  -226,
+    57,   206,   303,   205,   188,   101,   265,
+   -40,  -205,  -488,  -184,   276,    64,   -26,
+  -217,  -433,  -297,   137,   328,   308,  -289,
+   378,    81,  -308,  -465,    57,   -37,   227,
+  -100,    24,   -36,  -151,   199,     8,   143,
+  -426,  -697, -1059,  -133,   388,   161,   321,
+  -644, -1023, -1271,    39,    66,  -123,    70,
+   372,   177,  -173,  -556,  -553,  -304,  -189,
+  -117,  -369,  -425,  -122,  -462,  -152,   -73,
+  -649,  -850, -1189,  -767,   497,   360,   222,
+  -798, -1139, -1455,  -190,   430,   234,   179,
+    42,   -94,  -405,  -692,    38,  -202,  -246,
+  -169,  -366,  -290,   -88,   -64,    32,  -292,
+  1010,   923,   938,   710,   465,   230,   342,
+   217,   300,  1054,   675,    68,  -458,  -179,
+    78,   453,   316,    18,  -237,  -496,  -243,
+   167,    21,   424,   215,   -91,  -303,  -170,
+  -290,   -81,   -70,   -67,    40,    54,   -59,
+  -353,  -427,   -90,    53,    94,     9,    54,
+   -28,   318,   283,    15,  -240,   -58,    79,
+   -75,  -121,   229,    35,    58,     6,  -133,
+  -351,  -514,  -744,  -834,  -705,  -137,   164,
+ -1124, -1388, -1055,  -230,   -73,    40,    36,
+  -163,  -233,  -532,  -785, -1170,  -697,    96,
+  -788,  -959,  -246,  -430,  -624,  -165,    -8,
+  -856,  -540,  -630,  -907,  -337,   -70,    76,
+  -937, -1042,  -659,  -733,  -208,   199,   -26,
+  -523,    78,   -98,  -501,  -869,  -890,   -81,
+  -624,  -703,   -45,  -348,   -25,    87,  -186,
+  1005,   823,   546,   249,    90,   -22,   207,
+   298,   397,   381,   319,   200,    62,   303,
+   473,   379,   133,  -247,  -632,  -441,    75,
+   284,   208,   391,   115,   -25,    44,    95,
+   -72,    79,   -95,   -63,  -129,  -293,   203,
+  -164,  -349,   115,   122,    69,    -1,   378,
+   348,   170,    99,    58,  -179,  -302,   188,
+  -190,    -2,   150,    23,   -51,   -11,   216,
+  -615,  -863, -1090, -1427,  -802,   -48,    -6,
+  -961, -1276, -1548,  -727,   -58,    56,   223,
+  -124,  -255,  -561,  -988, -1277,  -148,   -82,
+  -480,  -660,  -891, -1191, -1339,  -325,    20,
+  -621,  -917, -1296, -1350,   264,   289,    50,
+  -844, -1022, -1345, -1329,  -293,    46,   278,
+  -260,  -468,  -829, -1176,  -533,  -560,   -78,
+  -215,  -484,  -822, -1233,  -791,    15,  -138,
+  1301,  1317,  1262,  1048,   716,   357,   -64,
+   578,   824,   925,   802,   630,   362,   102,
+   470,   925,   767,   514,   327,   190,  -112,
+   225,   492,   495,   437,   598,   384,   -45,
+    43,    82,   -42,   175,   519,   342,   -64,
+  -304,  -154,   159,   576,   403,   221,   327,
+   214,   244,   122,   -62,   312,    92,  -160,
+   218,   208,   310,   268,   306,   323,  -199,
+  -285,  -269,   -79,  -124,  -143,  -153,   236,
+  -205,  -384,  -426,   344,    59,  -185,  -184,
+  -272,   247,   126,  -210,  -518,  -468,    78,
+   -99,  -120,   502,   160,  -280,  -557,   304,
+  -423,   -17,  -283,  -443,   215,   212,  -140,
+  -564,  -684,  -228,   510,   361,   130,   323,
+  -428,   335,    98,   -65,    36,  -215,  -246,
+  -362,    51,   364,   -16,  -234,   150,  -165,
+   914,   883,   751,   653,   676,   464,  -153,
+   631,   545,   535,   720,   596,   360,   -81,
+   783,   712,   512,   439,   341,   251,  -391,
+   497,   417,   249,   372,   295,   173,  -193,
+   128,  -110,  -385,    93,    39,   173,  -231,
+   216,   -59,  -253,   462,   389,   154,    69,
+   455,   270,    -4,  -337,   -49,   233,  -322,
+   307,   143,    53,   218,   128,   236,  -156,
+   -37,  -186,  -240,  -411,  -110,     9,   399,
+  -140,  -365,  -628,   258,   380,   214,   277,
+   131,   454,   177,  -285,  -520,   108,  -214,
+    77,  -141,   201,  -123,  -490,  -131,    60,
+   -14,  -194,  -521,  -741,   273,   362,   -33,
+  -362,  -566,  -287,  -228,   161,   237,   317,
+  -269,   195,   -75,  -375,  -204,    11,    77,
+  -128,  -264,  -156,  -223,  -475,   265,    27,
+  1238,  1147,   916,   689,   432,   210,  -280,
+   800,   664,   879,   726,   411,   160,  -164,
+   454,   686,   536,   275,   147,    46,   111,
+   303,   486,   512,   355,   241,   181,   -69,
+    79,    92,    29,   147,   233,    52,    17,
+  -171,   289,   131,   439,   271,     3,   -10,
+   413,   241,   144,   174,   155,    -2,    14,
+    58,   217,   247,   219,   149,   175,   -18,
+   228,    -8,  -240,  -206,  -513,  -191,   202,
+   -96,  -272,  -454,    33,  -300,  -575,    46,
+   -10,  -108,  -246,  -347,  -770,  -535,     9,
+  -326,  -430,   -61,  -321,  -704,  -299,   201,
+    -1,  -280,  -603,  -419,  -185,    18,   -36,
+  -516,  -522,  -379,  -291,  -181,   -97,    27,
+  -159,  -313,  -525,  -224,  -510,  -831,  -197,
+  -292,  -459,   -59,  -310,  -562,  -143,  -351,
+  1066,   912,   631,   389,   207,    86,  -224,
+   596,   512,   596,   505,   314,   122,   -48,
+   787,   861,   441,   -93,  -303,    33,  -190,
+   257,   469,   337,    51,    15,   298,   -93,
+   295,    73,  -119,    25,    36,    23,   108,
+   -28,    -3,   -32,   114,    21,   185,   107,
+   482,   305,    15,  -279,  -319,    52,    96,
+   226,    46,   115,    72,  -136,   133,  -125,
+    18,  -207,  -559,  -590,  -503,  -482,   321,
+  -571,  -789,  -951,  -172,  -441,  -538,   113,
+   181,    14,  -310,  -641, -1001,  -202,   159,
+  -136,  -393,  -433,  -513,  -911,  -144,   -22,
+    72,  -265,  -706,  -954,  -159,    53,   332,
+  -338,  -591,  -852,  -383,  -395,    56,    44,
+    43,  -158,  -464,  -897,  -631,  -157,  -294,
+  -161,  -128,  -328,  -573,  -483,  -125,    11,
+  1017,   906,  1051,  1005,   679,   341,  -102,
+   359,   334,  1567,  1314,   723,   105,    10,
+   -65,   726,   529,   301,   220,    43,  -273,
+  -510,   436,   719,   566,   358,   179,   114,
+  -560,   298,   133,  -120,   342,   225,    14,
+  -899,  -101,   217,   617,   400,   146,   -58,
+   -41,   352,    82,  -196,    39,   121,  -167,
+  -212,    59,   447,   284,   423,   250,  -169,
+  -371,  -484,  -596,    30,   -41,   249,    22,
+  -372,  -650,  -794,   477,   445,   216,   -79,
+  -352,   275,    17,  -443,  -929,    92,    19,
+  -699,  -696,   431,   264,   -49,  -310,   182,
+  -978,  -217,  -430,  -400,   101,   261,    72,
+  -929,  -889,  -357,   -13,   463,   378,   236,
+  -826,    56,    30,  -299,  -360,  -128,   -51,
+  -878,  -299,  -111,    75,    65,    36,     3,
+   817,   368,   -25,   354,   697,   591,  -173,
+   309,   212,   222,   751,   484,   140,   -56,
+   593,   379,    70,    -8,   258,   180,   110,
+   165,   -46,   255,   297,   219,   273,   105,
+   160,   -70,  -358,  -181,   379,   330,   319,
+  -238,  -369,  -198,   740,   580,   319,  -143,
+   201,   109,  -202,  -456,   328,   276,  -141,
+   203,   170,   111,    42,   207,   360,   188,
+  -345,  -399,  -513,  -233,   650,   422,    81,
+  -635,  -961, -1220,   463,   539,   204,   209,
+   202,   -25,  -194,  -498,  -787,   193,  -143,
+  -449,  -538,   195,  -106,  -331,    68,    62,
+  -228,  -477,  -840,  -576,   317,   128,   283,
+  -671,  -937,  -807,  -114,   391,   335,   -62,
+   246,     2,  -314,  -679,  -303,   180,   -88,
+  -107,  -272,    90,  -198,   -28,   290,  -112,
+   885,  1149,  1021,   712,   496,   281,   -83,
+   269,   492,   787,   643,   347,    70,   124,
+   336,   636,   499,    92,  -229,  -179,   191,
+    26,   402,   564,   340,   149,   -11,   135,
+  -440,   561,   470,   204,   -72,  -186,   140,
+  -720,    14,   355,   229,    68,  -133,   465,
+   110,   310,   103,    12,   106,    29,   158,
+  -178,   113,   161,   142,   121,   115,    27,
+  -651,  -414,  -645,  -152,  -164,   -13,  -429,
+  -639,  -944,  -681,  -104,   -81,    52,  -189,
+  -663,  -164,  -316,  -683,  -954,  -205,   -83,
+  -609,  -669,  -172,  -517,  -694,   283,   -80,
+  -646,  -152,  -383,  -678,  -246,   -40,  -143,
+  -747,  -796,  -745,  -390,   -98,    43,   275,
+  -599,  -199,  -398,  -433,  -436,  -538,    31,
+ -1107,  -568,  -376,  -265,  -126,   -21,     1,
+   847,   573,   308,   392,   305,   101,    55,
+   273,   293,   201,   267,   346,   201,   123,
+   727,   480,   226,     2,   -65,  -138,   164,
+   273,   208,   173,   292,    12,   253,   174,
+   340,   207,   180,    88,   116,    46,   475,
+  -460,  -166,   -30,    13,   110,   173,   396,
+   137,    88,    43,  -137,   -94,    34,   284,
+    96,   -14,   226,    40,    63,    70,   130,
+  -467,  -735, -1012, -1174,  -307,   305,   -67,
+  -612,  -920, -1146,  -567,    -8,    92,   -25,
+  -182,  -271,  -492,  -754,  -857,   287,   -75,
+  -494,  -787,  -689,  -683,  -709,   137,  -326,
+  -288,  -550,  -903, -1105,   334,   321,   -62,
+  -354,  -653,  -834,  -445,     1,   377,  -152,
+  -162,  -306,  -608,  -937,  -297,   247,  -192,
+  -234,  -477,  -244,  -488,  -266,   342,  -332};
+
+/*---------------------------------------------------*
+ * 2nd stage codebook; 1st split:   isf2_0 to isf2_2
+ *---------------------------------------------------*/
+
+
+static Word16 dico21_isf[SIZE_BK21*3] = {
+
+   329,   409,   249,
+   -33,   505,   160,
+   -29,   -14,   582,
+  -262,   127,   354,
+   145,   237,   175,
+  -152,   245,   122,
+    27,    42,   340,
+   -84,   -93,   311,
+   285,   222,  -156,
+    47,   -43,  -504,
+   234,   121,   385,
+   104,  -317,    45,
+   176,   195,     8,
+   104,   -59,   -94,
+   177,    53,   192,
+   -34,  -127,   152,
+   570,   277,   -34,
+   -67,  -329,  -639,
+  -157,  -272,   462,
+  -177,  -462,   198,
+   322,   179,   115,
+  -386,   171,    19,
+    19,   -12,   195,
+  -120,  -252,   201,
+   304,    36,  -336,
+  -128,  -221,  -380,
+   171,  -185,   296,
+  -242,  -312,    23,
+   198,    39,    16,
+    -3,  -177,  -111,
+   111,   -93,    76,
+   -92,  -223,     4,
+   177,   406,   -44,
+  -168,   380,  -149,
+    -4,   273,   331,
+  -420,   513,   277,
+    21,   247,    47,
+   -58,   131,    -2,
+    -3,   134,   180,
+  -145,    40,   175,
+   189,    74,  -145,
+   -27,   -45,  -325,
+   370,  -114,   -21,
+   -83,  -415,  -173,
+    77,    95,   -51,
+   -40,   -30,   -67,
+    71,    88,    86,
+   -35,   -98,    14,
+    69,   197,  -334,
+  -196,    79,  -231,
+  -348,  -137,   218,
+  -352,   -89,   -85,
+    47,   201,  -130,
+  -165,    37,   -15,
+   -43,     3,    86,
+  -161,  -108,    79,
+    83,    21,  -237,
+   -81,  -149,  -238,
+   150,  -186,  -251,
+  -186,  -249,  -162,
+   -19,    66,  -139,
+   -26,   -50,  -181,
+    24,    11,     0,
+  -130,  -105,   -98};
+
+
+
+/*---------------------------------------------------*
+ * 2nd stage codebook; 2nd split:   isf2_3 to isf2_5
+ *---------------------------------------------------*/
+
+
+static Word16 dico22_isf[SIZE_BK22*3] = {
+
+  -127,   310,    42,
+  -242,   197,     5,
+  -151,    84,   -17,
+  -214,   127,  -149,
+  -247,  -131,   159,
+  -268,  -267,   -95,
+  -217,     1,   -79,
+  -271,   -80,  -185,
+   -45,   436,   159,
+   165,   199,   391,
+   -33,    81,   187,
+   -66,   -42,   355,
+  -298,   -57,   343,
+  -108,  -537,   226,
+  -144,   -23,   193,
+   176,  -402,    87,
+    53,   296,    25,
+   -84,   253,  -104,
+   -58,   105,  -126,
+  -169,   174,  -314,
+   -48,    44,  -294,
+  -164,  -417,  -242,
+  -139,     3,  -194,
+  -155,  -207,  -211,
+   119,   322,   213,
+   333,    50,   380,
+   237,   247,    -2,
+   466,   -16,   201,
+   238,  -255,  -107,
+    67,  -440,  -149,
+   122,   -88,  -139,
+    88,  -247,   -73,
+   -41,   231,   167,
+   -62,   155,    16,
+   -65,    16,    77,
+   -68,    -2,   -63,
+  -151,  -300,   160,
+   -18,  -333,    54,
+   -56,   -94,     5,
+     2,  -190,    14,
+    92,   148,   209,
+   108,     9,   272,
+   108,    35,   110,
+   142,   -85,   145,
+    47,  -157,   279,
+     3,  -320,   246,
+    43,   -72,    68,
+    86,  -217,   135,
+    36,   140,    79,
+    56,   175,   -49,
+    26,    45,     3,
+    73,    55,  -101,
+   109,  -183,  -242,
+    -4,  -283,  -242,
+    48,   -68,   -48,
+    -6,  -153,  -122,
+   161,   196,    96,
+   232,    80,   190,
+   165,    97,    11,
+   258,   -31,    71,
+   267,   -77,   -91,
+   311,  -209,    87,
+   152,   -14,   -22,
+   150,  -149,     9,
+  -324,   557,   187,
+  -384,   307,    46,
+  -251,    27,    77,
+  -365,    77,   -52,
+  -482,   -84,   160,
+  -424,  -515,   -64,
+  -294,  -120,    -4,
+  -476,  -116,  -109,
+   -97,   318,   365,
+   106,   627,   445,
+  -190,   120,   287,
+  -146,    65,   619,
+  -427,   242,   363,
+  -361,  -371,   432,
+  -347,   102,   168,
+  -629,   195,   -14,
+   -65,   476,   -47,
+  -297,   320,  -168,
+   -55,   356,  -264,
+  -391,    82,  -286,
+   -51,   -31,  -556,
+  -178,  -399,  -586,
+  -205,   -49,  -360,
+  -343,  -238,  -337,
+   220,   457,    58,
+   561,   467,   259,
+   340,   270,  -168,
+   450,    77,  -280,
+    60,   167,  -413,
+   133,  -252,  -492,
+   216,   157,  -290,
+   282,     0,  -495,
+  -226,   293,   183,
+  -157,   135,   122,
+  -158,   -59,    39,
+  -133,  -118,   -97,
+  -332,  -309,   113,
+  -160,  -425,    -6,
+  -149,  -211,    24,
+   -80,  -277,   -90,
+   -11,   125,   338,
+   130,   -71,   465,
+     5,   -45,   184,
+   237,   -95,   253,
+  -139,  -197,   297,
+   -19,  -300,   511,
+   -63,  -152,   139,
+   250,  -289,   336,
+   124,   339,  -150,
+    34,   176,  -208,
+   171,   166,  -116,
+    94,    38,  -229,
+    75,   -65,  -339,
+   -78,  -205,  -385,
+     0,   -30,  -163,
+   -56,  -110,  -242,
+   321,   244,   194,
+   505,   238,    -1,
+   317,   116,    65,
+   309,    88,   -74,
+   452,   -51,   -50,
+   334,  -217,  -290,
+   211,    41,  -152,
+   238,   -55,  -260};
+
+
+/*---------------------------------------------------*
+ * 2nd stage codebook; 3rd split:   isf2_6 to isf2_8
+ *---------------------------------------------------*/
+
+
+static Word16 dico23_isf[SIZE_BK23*3] = {
+
+   -10,   151,   359,
+   136,   298,   223,
+   255,  -104,   290,
+   423,     6,   183,
+  -270,  -269,   -98,
+   -52,   -82,    13,
+   -82,  -274,   -97,
+    90,  -246,   -72,
+  -299,   -70,   421,
+   -88,   365,   430,
+   187,  -318,   381,
+   380,    37,   488,
+  -373,  -316,    79,
+  -308,  -101,     5,
+  -135,  -451,     8,
+    72,  -421,  -154,
+   180,   170,  -121,
+    62,   177,   -40,
+   326,    80,  -105,
+   248,   263,    -5,
+  -168,  -181,  -221,
+    -2,   -23,  -158,
+   -14,  -149,  -121,
+   119,   -91,  -147,
+   119,   332,  -153,
+    49,   303,    34,
+   442,   -55,   -69,
+   217,   454,    58,
+  -359,  -187,  -375,
+   -42,    50,  -274,
+    -8,  -267,  -249,
+    85,   -86,  -346,
+   -77,   -40,   345,
+    89,   134,   219,
+   156,   -80,   160,
+   108,    40,   116,
+  -158,  -206,    29,
+     5,   -32,   175,
+   -65,  -158,   146,
+    55,   -78,    73,
+  -114,  -222,   353,
+   -47,    81,   211,
+    49,  -151,   268,
+   105,     4,   302,
+  -263,  -132,   183,
+  -151,   -28,   201,
+  -177,  -307,   166,
+   101,  -221,   130,
+    74,    58,   -98,
+    32,    44,    13,
+   194,    30,  -142,
+   170,    96,     8,
+  -136,  -119,   -91,
+   -65,     8,   -55,
+     3,  -188,    12,
+    45,   -63,   -49,
+   149,   -21,   -19,
+    24,   144,    95,
+   254,   -22,    60,
+   161,   196,    96,
+  -158,   -61,    48,
+   -70,    33,    82,
+   -23,  -321,    58,
+   155,  -147,     5,
+  -364,   328,    77,
+   -21,   453,   173,
+  -108,    82,   630,
+   367,   263,   208,
+  -300,   -62,  -176,
+  -205,   143,  -158,
+  -169,  -410,  -264,
+   257,  -269,  -100,
+  -636,   289,    -2,
+  -292,   627,   173,
+  -382,  -363,   387,
+   248,   524,   447,
+  -521,  -111,  -107,
+  -395,   118,  -274,
+  -343,  -680,  -125,
+  -172,  -447,  -663,
+    75,   148,  -367,
+   -79,   263,   -94,
+   249,   148,  -286,
+   380,   271,  -162,
+  -142,    -4,  -186,
+   -57,   111,  -125,
+   -35,  -108,  -254,
+   100,    29,  -242,
+   -80,   303,  -264,
+   -78,   464,   -57,
+   248,   -22,  -494,
+   661,   662,    44,
+  -193,   -40,  -330,
+  -178,   145,  -337,
+   -90,  -199,  -400,
+   -40,   -23,  -498,
+  -192,   114,   315,
+   -41,   244,   190,
+    88,   -97,   485,
+   241,    80,   212,
+  -246,    40,    87,
+  -156,   147,   134,
+    -2,  -334,   239,
+   308,  -203,   110,
+  -459,   251,   422,
+  -218,   310,   228,
+   -86,  -346,   654,
+   184,   175,   425,
+  -481,   -63,   169,
+  -349,   117,   188,
+  -125,  -560,   310,
+   158,  -416,    94,
+    46,   171,  -192,
+   -63,   157,    14,
+   256,   -35,  -271,
+   322,   123,    53,
+  -214,     4,   -76,
+  -156,    86,   -18,
+   128,  -197,  -232,
+   265,   -90,   -98,
+  -308,   332,  -145,
+  -131,   308,    58,
+   509,    59,  -339,
+   562,   196,   -14,
+  -378,   100,   -47,
+  -234,   202,     1,
+   104,  -270,  -493,
+   319,  -210,  -325};
+
+
+/*---------------------------------------------------*
+ * 2nd stage codebook; 4th split:   isf2_9 to isf2_11
+ *---------------------------------------------------*/
+
+static Word16 dico24_isf[SIZE_BK24*3] = {
+
+   -79,   -89,    -4,
+  -171,    77,  -211,
+   160,  -193,    98,
+   120,  -103,   323,
+    32,   -22,  -129,
+    72,    78,  -268,
+   182,   -76,   -66,
+   309,    99,  -145,
+  -229,  -157,   -84,
+  -383,    98,   -71,
+   -90,  -352,    12,
+  -284,  -178,   178,
+   -65,  -125,  -166,
+   -87,  -175,  -351,
+    42,  -198,   -48,
+   154,  -140,  -243,
+   -77,    18,   108,
+   -39,   355,    91,
+    87,     8,   155,
+    -4,   158,   239,
+   128,    95,   -54,
+     7,   246,  -124,
+   258,    15,    89,
+   206,   216,    98,
+  -201,     9,    18,
+  -312,   233,   204,
+   -39,  -174,   155,
+  -144,    -9,   284,
+   -57,    70,   -69,
+  -157,   187,    18,
+    54,   -30,    23,
+    24,   135,    55};
+
+
+/*---------------------------------------------------*
+ * 2nd stage codebook; 5th split:   isf2_12 to isf2_15
+ *---------------------------------------------------*/
+
+static Word16 dico25_isf[SIZE_BK25*4] = {
+
+   169,   142,  -119,   115,
+   206,   -20,    94,   226,
+  -106,   313,   -21,    16,
+   -62,   161,    71,   255,
+   -89,   101,  -185,   125,
+    72,   -30,  -201,   344,
+  -258,    33,    -8,    81,
+  -104,  -154,    72,   296,
+   144,   -68,  -268,   -25,
+    81,   -78,   -87,   106,
+    22,   155,  -186,  -119,
+   -46,   -28,    27,    91,
+  -114,   -37,  -175,   -33,
+   -94,  -222,  -189,   122,
+  -132,  -119,  -191,  -270,
+  -172,  -173,    18,   -43,
+   279,   135,   -42,  -128,
+   187,   -86,   229,  -138,
+   159,   240,   140,    46,
+    69,    25,   227,    77,
+    21,   115,    13,     8,
+    68,  -248,   126,    81,
+  -150,   137,   207,    -9,
+  -154,  -133,   289,    67,
+   143,   -37,   -86,  -326,
+   180,   -32,    19,   -23,
+    26,   168,   116,  -233,
+   -32,   -26,   118,   -78,
+     3,    -8,   -45,  -115,
+    57,  -215,   -54,   -83,
+  -209,   112,   -22,  -167,
+   -91,  -151,   168,  -262};
+
+
+
+       /* 36 bit */
+/*-------------------------------------------------------------------*
+ *  isf codebooks:  two-stage VQ with split-by-3 in 2nd stage        *
+ *                1st stage is kept the same as the 46 bit quantizer *
+ *                                                                   *
+ *  codebook   vector dimension    number of vectors                 *
+ *  ~~~~~~~~   ~~~~~~~~~~~~~~~~    ~~~~~~~~~~~~~~~~~                 *
+ *     1_1            9                  256                         *
+ *     1_2            7                  256                         *
+ *     2_1            5                  128                         *
+ *     2_2            4                  128                         *
+ *     2_3            7                  64                          *
+ *-------------------------------------------------------------------*/
+
+static Word16 dico21_isf_36b[SIZE_BK21_36b*5] = {
+
+   -52,   -96,   212,   315,   -73,
+    82,  -204,   363,   136,  -197,
+  -126,  -331,   183,   218,   143,
+   -49,   -41,   557,   230,    72,
+     2,   -73,   163,   377,   221,
+   133,   111,   278,   215,  -110,
+  -102,   -20,   284,   113,   273,
+    84,   319,   290,    18,    85,
+   -25,    -5,   125,   132,  -204,
+   -38,    -5,   286,    -9,  -356,
+  -140,  -256,    92,   117,  -189,
+  -144,   191,   313,    51,   -98,
+   167,   -10,    44,   247,    36,
+   381,   197,   238,    74,     6,
+    38,  -408,    29,    -3,   -85,
+    92,   266,   157,   -25,  -200,
+   161,  -121,    70,    84,  -140,
+   -16,   -86,   112,   -94,  -189,
+  -269,  -270,   351,   107,   -24,
+   -68,   -67,   492,  -103,  -155,
+   -53,  -131,    62,   122,    10,
+   135,    84,   283,   -55,  -120,
+   -12,  -219,   331,   -81,   167,
+   220,  -136,   147,  -172,   -42,
+   140,   -95,  -109,   -88,  -194,
+     0,    -2,    -4,   -33,  -381,
+   -66,  -217,   152,  -186,  -402,
+   244,   108,   156,  -140,  -395,
+   113,  -136,  -196,   110,   -24,
+   214,   118,    11,   -64,  -131,
+  -110,  -286,    -6,  -332,    16,
+    94,    97,    79,  -291,  -205,
+    -5,   -39,   -20,   252,   -96,
+    76,   174,   101,   163,    61,
+   -69,  -239,   -55,   399,     6,
+  -115,   319,   164,   275,   196,
+   -15,    36,   -47,   331,   121,
+   226,   209,   271,   325,   184,
+    13,   -80,  -218,   471,   353,
+   288,   378,    16,   -51,   251,
+   174,   116,    52,   149,  -279,
+   235,   276,    39,   120,   -48,
+     0,  -108,  -108,   241,  -339,
+   -93,   534,    45,    33,   -87,
+   194,   149,   -71,   405,   -44,
+   409,   370,    81,  -186,  -154,
+    25,  -102,  -448,   124,  -173,
+    22,   408,  -110,  -310,  -214,
+   -26,    23,   -83,   114,    14,
+  -110,   164,    52,   223,   -82,
+    37,   -25,  -263,   306,   -15,
+  -466,   415,   292,   165,   -18,
+    29,   -19,  -171,   155,   182,
+   179,   144,   -27,   231,   258,
+  -103,  -247,  -396,   238,   113,
+   375,  -154,  -109,    -4,   156,
+    98,    85,  -292,    -5,  -124,
+   116,   139,  -116,   -98,  -294,
+   -14,   -83,  -278,  -117,  -378,
+   106,    33,  -106,  -344,  -484,
+   119,    17,  -412,   138,   166,
+   384,   101,  -204,    88,  -156,
+  -121,  -284,  -300,    -1,  -166,
+   280,    33,  -152,  -313,   -81,
+   -37,    22,   229,   153,    37,
+   -60,   -83,   236,    -8,   -41,
+  -169,  -228,   126,   -20,   363,
+  -235,    17,   364,  -156,   156,
+   -25,   -30,    72,   144,   156,
+   153,   -26,   256,    97,   144,
+   -21,   -37,    48,   -65,   250,
+    63,    77,   273,  -128,   124,
+  -129,   -26,    40,     9,  -115,
+    -6,    82,    38,   -90,  -182,
+  -336,   -13,    28,   158,    91,
+   -30,   241,   137,  -170,   -17,
+   146,    14,   -11,    33,    61,
+   192,   197,    54,   -84,    85,
+    23,  -200,   -78,   -29,   140,
+   122,   237,   106,  -341,   136,
+   -57,  -142,   -85,   -16,   -74,
+   -59,   -90,    -8,  -187,   -20,
+  -211,  -267,   216,  -179,  -110,
+   -50,    -7,   220,  -267,   -70,
+   -57,   -42,   -17,   -15,    71,
+    32,    21,    63,  -137,    33,
+  -137,  -175,   104,   -68,    97,
+   -67,   -43,   133,  -301,   221,
+  -116,  -200,   -81,   -92,  -272,
+   -64,   -41,   -54,  -244,  -220,
+  -287,  -242,   -50,   -87,   -89,
+  -245,   236,   102,  -166,  -295,
+    66,    24,  -162,   -71,    95,
+    66,   136,   -90,  -220,   -36,
+   -98,  -161,  -222,  -188,    29,
+   -18,    18,   -19,  -415,     9,
+    49,    61,   100,    39,   -56,
+  -111,    82,   135,   -31,    52,
+   -90,  -153,   -93,   189,   182,
+  -214,   295,   119,   -74,   284,
+     2,   137,    37,    47,   182,
+    92,   117,   184,   -53,   373,
+   -21,   -14,   -35,   136,   391,
+   146,   129,  -164,   -28,   333,
+    92,    80,   -84,   100,  -134,
+    -8,   217,   -32,     3,   -47,
+  -151,   251,  -215,   142,    92,
+  -224,   310,  -172,  -275,    98,
+   159,   155,  -177,   112,    53,
+   205,    27,     8,  -240,   192,
+   169,   120,  -319,  -201,   106,
+    11,    36,   -86,  -237,   455,
+  -109,  -154,  -163,   174,   -55,
+   -38,    32,  -101,   -78,   -59,
+  -205,  -321,   -97,    69,    79,
+  -310,    44,    18,  -185,    34,
+  -115,   -20,  -148,   -39,   203,
+   -29,   154,   -30,  -158,   166,
+   -45,  -131,  -317,   -24,   363,
+  -165,  -205,  -112,  -222,   265,
+   -32,   -44,  -150,    54,  -193,
+    -6,   -38,  -255,  -169,  -115,
+  -266,    87,  -189,   -36,  -169,
+   -60,   -87,  -266,  -436,  -170,
+   -68,   -81,  -278,    24,    38,
+   -23,   -19,  -155,  -256,   141,
+   -61,  -226,  -565,  -175,    71,
+     9,   -29,  -237,  -515,   263};
+
+static Word16 dico22_isf_36b[SIZE_BK22_36b*4] = {
+
+  -298,    -6,    95,    31,
+  -213,   -87,  -122,   261,
+     4,   -49,   208,    14,
+  -129,  -110,    30,   118,
+  -214,   258,   110,  -235,
+   -41,   -18,  -126,   120,
+   103,    65,   127,   -37,
+   126,   -36,   -24,    25,
+  -138,   -67,  -278,  -186,
+  -164,  -194,  -201,    78,
+  -211,   -87,   -51,  -221,
+  -174,   -79,   -94,   -39,
+    23,    -6,  -157,  -240,
+    22,  -110,  -153,   -68,
+   148,    -5,    -2,  -149,
+    -1,  -135,   -39,  -179,
+    68,   360,  -117,   -15,
+   137,    47,  -278,   146,
+   136,   260,   135,    65,
+    61,   116,   -45,    97,
+   231,   379,    87,  -120,
+   338,   177,  -272,     3,
+   266,   156,    28,   -69,
+   260,    84,   -85,    86,
+  -266,   154,  -256,  -182,
+   -17,   -65,  -304,    -6,
+   -40,   175,  -151,  -180,
+   -27,    27,   -87,   -63,
+   121,   114,  -166,  -469,
+   159,   -66,  -323,  -231,
+   214,   152,  -141,  -212,
+   137,    36,  -184,   -51,
+  -282,  -237,    40,    10,
+   -48,  -235,   -37,   251,
+   -54,  -323,   136,    29,
+   -88,  -174,   213,   198,
+  -390,    99,   -63,  -375,
+   107,  -169,  -164,   424,
+    69,  -111,   141,  -167,
+    74,  -129,    65,   144,
+  -353,  -207,  -205,  -109,
+  -160,  -386,  -355,    98,
+  -176,  -493,   -20,  -143,
+  -252,  -432,    -2,   216,
+   -90,  -174,  -168,  -411,
+    13,  -284,  -229,  -160,
+   -87,  -279,    34,  -251,
+   -75,  -263,   -58,   -42,
+   420,    53,  -211,  -358,
+   384,   -35,  -374,   396,
+    68,  -228,   323,    -2,
+   167,  -307,   192,   194,
+   459,   329,    -5,  -332,
+   375,    79,    -7,   313,
+   282,  -124,   200,   -92,
+   271,  -162,   -70,   180,
+  -157,  -298,  -514,  -309,
+    58,  -163,  -546,    18,
+   124,  -364,   167,  -238,
+    83,  -411,  -117,    96,
+   140,  -112,  -388,  -624,
+   259,  -133,  -317,    41,
+   163,  -130,   -64,  -334,
+   226,  -165,  -124,  -110,
+  -466,   -61,     6,   229,
+  -153,   205,  -145,   242,
+  -159,    48,   195,   148,
+   -58,    28,    31,   279,
+  -303,   185,   279,    -4,
+   -61,   197,    59,    86,
+  -114,   123,   168,   -52,
+    35,    36,   100,   126,
+  -407,   102,   -77,   -40,
+  -338,    -1,  -342,   156,
+  -179,   105,   -34,   -97,
+  -185,    84,   -35,   108,
+  -133,   107,   -91,  -357,
+  -180,    54,  -229,    24,
+   -44,    47,    47,  -182,
+   -66,    13,    45,     4,
+  -339,   251,    64,   226,
+   -42,   101,  -350,   275,
+   -99,   398,   142,   121,
+   111,    12,  -102,   260,
+     0,   505,   260,   -94,
+   161,   285,   -96,   224,
+    -4,   206,   314,    33,
+   167,   139,    88,   204,
+  -235,   316,   -60,   -25,
+    -8,  -150,  -312,   201,
+   -36,   292,    61,  -104,
+   -40,   174,  -162,    42,
+   -21,   402,   -29,  -351,
+    21,   152,  -360,   -93,
+    57,   191,   212,  -196,
+    76,   158,   -21,   -69,
+  -328,  -185,   331,   119,
+   -53,   285,    56,   337,
+  -107,   -24,   405,    29,
+   -18,   137,   272,   277,
+  -255,    22,   173,  -191,
+   295,   322,   325,   302,
+    21,   -27,   332,  -178,
+   119,    13,   271,   129,
+  -455,  -180,   116,  -191,
+  -227,    62,  -148,   524,
+  -176,  -287,   282,  -157,
+  -243,    13,   199,   430,
+   -59,   -49,   115,  -365,
+    72,  -172,  -137,    93,
+  -138,  -126,   141,   -84,
+     5,  -124,    38,   -20,
+  -258,   311,   601,   213,
+    94,   130,   -61,   502,
+    -1,  -157,   485,   313,
+   146,   -74,   158,   345,
+   276,   135,   280,   -57,
+   490,   252,    99,    43,
+   267,   -74,   429,   105,
+   278,   -23,   119,    94,
+  -542,   488,   257,  -115,
+   -84,  -244,  -438,   478,
+  -113,  -545,   387,   101,
+   -95,  -306,   111,   498,
+    95,   166,    22,  -301,
+   420,   -15,   -58,   -78,
+   270,    29,   122,  -282,
+   160,  -240,    50,   -38};
+
+static Word16 dico23_isf_36b[SIZE_BK23_36b*7] = {
+
+    81,   -18,    68,   -27,  -122,  -280,    -4,
+    45,  -177,   209,   -30,  -136,   -74,   131,
+   -44,   101,   -75,   -88,   -48,  -137,   -54,
+  -245,   -28,    63,   -18,  -112,  -103,    58,
+   -79,    -6,   220,   -65,   114,   -35,   -50,
+   109,   -65,   143,  -114,   129,    76,   125,
+   166,    90,   -61,  -242,   186,   -74,   -43,
+   -46,   -92,    49,  -227,    24,  -155,    39,
+    67,    85,    99,   -42,    53,  -184,  -281,
+   142,  -122,     0,    21,  -142,   -15,   -17,
+   223,    92,   -21,   -48,   -82,   -14,  -167,
+    51,   -37,  -243,   -30,   -90,    18,   -56,
+    54,   105,    74,    86,    69,    13,  -101,
+   196,    72,   -89,    43,    65,    19,    39,
+   121,    34,   131,   -82,    25,   213,  -156,
+   101,  -102,  -136,   -21,    57,   214,    22,
+    36,  -124,   205,   204,    58,  -156,   -83,
+    83,  -117,   137,   137,    85,   116,    44,
+   -92,  -148,   -68,    11,  -102,  -197,  -220,
+   -76,  -185,   -58,   132,   -26,  -183,    85,
+    -7,   -31,    -2,    23,   205,  -151,    10,
+   -27,   -37,    -5,   -18,   292,   131,     1,
+   117,  -168,     9,   -93,    80,   -59,  -125,
+  -182,  -244,    98,   -24,   135,   -22,    94,
+   221,    97,   106,    42,    43,  -160,    83,
+    25,   -64,   -21,     6,    14,   -15,   154,
+   126,    15,  -140,   150,   -10,  -207,  -114,
+    79,   -63,  -211,   -70,   -28,  -217,   165,
+    46,    38,   -22,   281,   132,   -62,   109,
+   112,    54,  -112,   -93,   208,    27,   296,
+   115,    10,  -147,    41,   216,    42,  -276,
+    50,  -115,  -254,   167,   117,    -2,    61,
+    17,   144,    34,   -72,  -186,  -150,   272,
+   -29,   -66,   -89,   -95,  -149,   129,   251,
+   122,     0,   -50,  -234,   -91,    36,    26,
+  -105,  -102,   -88,  -121,  -236,    -7,   -11,
+  -204,   109,     5,  -191,   105,   -15,   163,
+   -80,    32,   -24,  -209,    41,   294,    70,
+  -106,   -94,  -204,  -118,   120,   -50,   -37,
+   -82,  -241,    46,  -131,   -29,   150,   -55,
+    33,   155,   120,   -89,    -8,     7,    62,
+   213,    82,    61,    18,  -161,   144,   152,
+    30,   131,    65,   -87,  -255,   -17,  -107,
+    -8,    85,   -64,    51,  -162,   223,   -53,
+  -134,   261,    69,   -56,   218,    72,  -111,
+     2,   155,  -113,   -87,    49,    85,   -28,
+  -163,    42,    -1,  -196,     7,    39,  -245,
+    14,  -137,   -79,    11,  -160,   202,  -293,
+   -94,    33,   208,   100,    56,   -44,   326,
+   -78,   -41,   232,    13,  -142,   227,    80,
+   -16,   -87,   201,    33,  -133,    15,  -183,
+   -58,  -192,   -47,   184,  -128,   133,    99,
+  -205,    11,  -155,    78,    52,    72,   141,
+  -246,    26,    99,   151,    59,   115,   -64,
+   -79,   -47,   -16,   -14,     6,    47,   -43,
+   -72,  -178,   -27,   162,   112,    43,  -174,
+  -175,   238,   186,    71,   -54,  -188,   -76,
+  -225,   233,    39,   -39,  -158,   122,    44,
+   -26,    43,    84,   130,   -93,   -51,    22,
+     3,    92,  -150,   136,  -182,   -57,    97,
+  -131,   179,   -78,    80,    91,  -165,    90,
+    -2,   148,    15,   130,    65,   175,   117,
+  -138,   114,  -137,   132,     3,   -10,  -186,
+   140,    -4,   -37,   254,   -62,    92,  -109};
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/stream.h b/media/libstagefright/codecs/amrwbenc/inc/stream.h
index edbc13a..3e5336a 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/stream.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/stream.h
@@ -1,47 +1,47 @@
-

-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/***********************************************************************

-File:		stream.h

-

-Contains:       VOME API Buffer Operator Implement Header

-

-************************************************************************/

-#ifndef __STREAM_H__

-#define __STREAM_H__

-

-#include "voMem.h"

-#define Frame_Maxsize  1024 * 2  //Work Buffer 10K 

-#define Frame_MaxByte  640        //AMR_WB Encoder one frame 320 samples = 640 Bytes

-#define MIN(a,b)	 ((a) < (b)? (a) : (b))

-

-typedef struct{

-	unsigned char *set_ptr;

-	unsigned char *frame_ptr;

-	unsigned char *frame_ptr_bk;

-	int  set_len;

-	int  framebuffer_len; 

-	int  frame_storelen;

-	int  used_len;

-}FrameStream;

-

-void voAWB_UpdateFrameBuffer(FrameStream *stream, VO_MEM_OPERATOR *pMemOP);

-void voAWB_InitFrameBuffer(FrameStream *stream);

-void voAWB_FlushFrameBuffer(FrameStream *stream);

-#endif //__STREAM_H__

-

+
+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/***********************************************************************
+File:		stream.h
+
+Contains:       VOME API Buffer Operator Implement Header
+
+************************************************************************/
+#ifndef __STREAM_H__
+#define __STREAM_H__
+
+#include "voMem.h"
+#define Frame_Maxsize  1024 * 2  //Work Buffer 10K 
+#define Frame_MaxByte  640        //AMR_WB Encoder one frame 320 samples = 640 Bytes
+#define MIN(a,b)	 ((a) < (b)? (a) : (b))
+
+typedef struct{
+	unsigned char *set_ptr;
+	unsigned char *frame_ptr;
+	unsigned char *frame_ptr_bk;
+	int  set_len;
+	int  framebuffer_len; 
+	int  frame_storelen;
+	int  used_len;
+}FrameStream;
+
+void voAWB_UpdateFrameBuffer(FrameStream *stream, VO_MEM_OPERATOR *pMemOP);
+void voAWB_InitFrameBuffer(FrameStream *stream);
+void voAWB_FlushFrameBuffer(FrameStream *stream);
+#endif //__STREAM_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/typedef.h b/media/libstagefright/codecs/amrwbenc/inc/typedef.h
index aa8c098..533e68b 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/typedef.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/typedef.h
@@ -1,65 +1,65 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*

-*      File             : typedef.c

-*      Purpose          : Basic types.

-*

-************************************************************************/

-

-#ifndef __TYPEDEF_H__

-#define __TYPEDEF_H__

-

-#undef ORIGINAL_TYPEDEF_H /* define to get "original" ETSI version

-                             of typedef.h                           */

-

-#ifdef ORIGINAL_TYPEDEF_H

-/*

- * this is the original code from the ETSI file typedef.h

- */

-   

-#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(_MSC_VER) || defined(__ZTC__)

-typedef signed char Word8;

-typedef short Word16;

-typedef long Word32;

-typedef int Flag;

-

-#elif defined(__sun)

-typedef signed char Word8;

-typedef short Word16;

-typedef long Word32;

-typedef int Flag;

-

-#elif defined(__unix__) || defined(__unix)

-typedef signed char Word8;

-typedef short Word16;

-typedef int Word32;

-typedef int Flag;

-

-#endif

-#else /* not original typedef.h */

-

-/*

- * use (improved) type definition file typdefs.h and add a "Flag" type

- */

-#include "typedefs.h"

-typedef int Flag;

-

-#endif

-

-#endif  //__TYPEDEF_H__

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*
+*      File             : typedef.c
+*      Purpose          : Basic types.
+*
+************************************************************************/
+
+#ifndef __TYPEDEF_H__
+#define __TYPEDEF_H__
+
+#undef ORIGINAL_TYPEDEF_H /* define to get "original" ETSI version
+                             of typedef.h                           */
+
+#ifdef ORIGINAL_TYPEDEF_H
+/*
+ * this is the original code from the ETSI file typedef.h
+ */
+   
+#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(_MSC_VER) || defined(__ZTC__)
+typedef signed char Word8;
+typedef short Word16;
+typedef long Word32;
+typedef int Flag;
+
+#elif defined(__sun)
+typedef signed char Word8;
+typedef short Word16;
+typedef long Word32;
+typedef int Flag;
+
+#elif defined(__unix__) || defined(__unix)
+typedef signed char Word8;
+typedef short Word16;
+typedef int Word32;
+typedef int Flag;
+
+#endif
+#else /* not original typedef.h */
+
+/*
+ * use (improved) type definition file typdefs.h and add a "Flag" type
+ */
+#include "typedefs.h"
+typedef int Flag;
+
+#endif
+
+#endif  //__TYPEDEF_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/typedefs.h b/media/libstagefright/codecs/amrwbenc/inc/typedefs.h
index 28b657e..f30d255 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/typedefs.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/typedefs.h
@@ -1,211 +1,211 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/*

-*

-*      File             : typedefs.h

-*      Description      : Definition of platform independent data

-*                         types and constants

-*

-*

-*      The following platform independent data types and corresponding

-*      preprocessor (#define) constants are defined:

-*

-*        defined type  meaning           corresponding constants

-*        ----------------------------------------------------------

-*        Char          character         (none)

-*        Bool          boolean           true, false

-*        Word8         8-bit signed      minWord8,   maxWord8

-*        UWord8        8-bit unsigned    minUWord8,  maxUWord8

-*        Word16        16-bit signed     minWord16,  maxWord16

-*        UWord16       16-bit unsigned   minUWord16, maxUWord16

-*        Word32        32-bit signed     minWord32,  maxWord32

-*        UWord32       32-bit unsigned   minUWord32, maxUWord32

-*        Float         floating point    minFloat,   maxFloat

-*

-*

-*      The following compile switches are #defined:

-*

-*        PLATFORM      string indicating platform progam is compiled on

-*                      possible values: "OSF", "PC", "SUN"

-*

-*        OSF           only defined if the current platform is an Alpha

-*        PC            only defined if the current platform is a PC

-*        SUN           only defined if the current platform is a Sun

-*        

-*        LSBFIRST      is defined if the byte order on this platform is

-*                      "least significant byte first" -> defined on DEC Alpha

-*                      and PC, undefined on Sun

-*

-********************************************************************************

-*/

-

-#ifndef __TYPEDEFS_H__

-#define __TYPEDEFS_H__

-

-/*

-********************************************************************************

-*                         INCLUDE FILES

-********************************************************************************

-*/

-#include <float.h>

-#include <limits.h>

-

-

-

-/*

-********************************************************************************

-*                         DEFINITION OF CONSTANTS 

-********************************************************************************

-*/

-/*

- ********* define char type

- */

-typedef char Char;

-

-/*

- ********* define 8 bit signed/unsigned types & constants

- */

-#if SCHAR_MAX == 127

-typedef signed char Word8;

-#define minWord8  SCHAR_MIN

-#define maxWord8  SCHAR_MAX

-

-typedef unsigned char UWord8;

-#define minUWord8 0

-#define maxUWord8 UCHAR_MAX

-#else

-#error cannot find 8-bit type

-#endif

-

-

-/*

- ********* define 16 bit signed/unsigned types & constants

- */

-#if INT_MAX == 32767

-typedef int Word16;

-#define minWord16     INT_MIN

-#define maxWord16     INT_MAX

-typedef unsigned int UWord16;

-#define minUWord16    0

-#define maxUWord16    UINT_MAX

-#elif SHRT_MAX == 32767

-typedef short Word16;

-#define minWord16     SHRT_MIN

-#define maxWord16     SHRT_MAX

-typedef unsigned short UWord16;

-#define minUWord16    0

-#define maxUWord16    USHRT_MAX

-#else

-#error cannot find 16-bit type

-#endif

-

-

-/*

- ********* define 32 bit signed/unsigned types & constants

- */

-#if INT_MAX == 2147483647

-typedef int Word32;

-#define minWord32     INT_MIN

-#define maxWord32     INT_MAX

-typedef unsigned int UWord32;

-#define minUWord32    0

-#define maxUWord32    UINT_MAX

-#elif LONG_MAX == 2147483647

-typedef long Word32;

-#define minWord32     LONG_MIN

-#define maxWord32     LONG_MAX

-typedef unsigned long UWord32;

-#define minUWord32    0

-#define maxUWord32    ULONG_MAX

-#else

-#error cannot find 32-bit type

-#endif

-

-/*

- ********* define floating point type & constants

- */

-/* use "#if 0" below if Float should be double;

-   use "#if 1" below if Float should be float

- */

-#if 0

-typedef float Float;

-#define maxFloat      FLT_MAX

-#define minFloat      FLT_MIN

-#else

-typedef double Float;

-#define maxFloat      DBL_MAX

-#define minFloat      DBL_MIN

-#endif

-

-/*

- ********* define complex type

- */

-typedef struct {

-  Float r;  /* real      part */

-  Float i;  /* imaginary part */

-} CPX;

-

-/*

- ********* define boolean type

- */

-typedef int Bool;

-#define false 0

-#define true 1

-

-/* ******Avoid function multiple definition****** */

-#define     Autocorr         voAWB_Autocorr

-#define     Convolve         voAWB_Convolve

-#define     cor_h_x          voAWB_cor_h_x

-#define     dtx_enc_init     voAWB_dtx_enc_init

-#define     dtx_enc_reset    voAWB_dtx_enc_reset

-#define     dtx_enc_exit     voAWB_dtx_enc_exit

-#define     dtx_enc          voAWB_dtx_enc

-#define     dtx_buffer       voAWB_dtx_buffer

-#define     tx_dtx_handler   voAWB_tx_dtx_handler

-#define     G_pitch          voAWB_G_pitch

-#define     Isp_Az           voAWB_Isp_Az

-#define     Lag_window       voAWB_Lag_window

-#define     Log2_norm        voAWB_Log2_norm

-#define     Log2             voAWB_Log2

-#define     Pow2             voAWB_Pow2

-#define     L_Comp           voAWB_L_Comp

-#define     Mpy_32           voAWB_Mpy_32

-#define     Mpy_32_16        voAWB_Mpy_32_16

-#define     Div_32           voAWB_Div_32

-#define     Pit_shrp         voAWB_Pit_shrp

-#define     Qisf_ns          voAWB_Qisf_ns

-#define     Disf_ns          voAWB_Disf_ns

-#define     Residu           voAWB_Residu

-#define     Syn_filt         voAWB_Syn_filt

-#define     Set_zero         voAWB_Set_zero

-#define     Copy             voAWB_Copy

-#define     voice_factor     voAWB_voice_factor

-#define     Syn_filt_32      voAWB_Syn_filt_32

-#define     Isf_isp          voAWB_Isf_isp

-#define     Levinson         voAWB_Levinson

-#define     median5          voAWB_median5           

-#define     Pred_lt4         voAWB_Pred_lt4

-#define     Reorder_isf      voAWB_Reorder_isf

-#define     Dpisf_2s_36b     voAWB_Dpisf_2s_36b

-#define     Dpisf_2s_46b     voAWB_Dpisf_2s_46b

-#define     Dot_product12    voAWB_Dot_product12

-#define     mem_malloc       voAWB_mem_malloc

-#define     mem_free         voAWB_mem_free

-/******************************************************/

-

-#endif  //#define __TYPEDEFS_H__

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/*
+*
+*      File             : typedefs.h
+*      Description      : Definition of platform independent data
+*                         types and constants
+*
+*
+*      The following platform independent data types and corresponding
+*      preprocessor (#define) constants are defined:
+*
+*        defined type  meaning           corresponding constants
+*        ----------------------------------------------------------
+*        Char          character         (none)
+*        Bool          boolean           true, false
+*        Word8         8-bit signed      minWord8,   maxWord8
+*        UWord8        8-bit unsigned    minUWord8,  maxUWord8
+*        Word16        16-bit signed     minWord16,  maxWord16
+*        UWord16       16-bit unsigned   minUWord16, maxUWord16
+*        Word32        32-bit signed     minWord32,  maxWord32
+*        UWord32       32-bit unsigned   minUWord32, maxUWord32
+*        Float         floating point    minFloat,   maxFloat
+*
+*
+*      The following compile switches are #defined:
+*
+*        PLATFORM      string indicating platform progam is compiled on
+*                      possible values: "OSF", "PC", "SUN"
+*
+*        OSF           only defined if the current platform is an Alpha
+*        PC            only defined if the current platform is a PC
+*        SUN           only defined if the current platform is a Sun
+*        
+*        LSBFIRST      is defined if the byte order on this platform is
+*                      "least significant byte first" -> defined on DEC Alpha
+*                      and PC, undefined on Sun
+*
+********************************************************************************
+*/
+
+#ifndef __TYPEDEFS_H__
+#define __TYPEDEFS_H__
+
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include <float.h>
+#include <limits.h>
+
+
+
+/*
+********************************************************************************
+*                         DEFINITION OF CONSTANTS 
+********************************************************************************
+*/
+/*
+ ********* define char type
+ */
+typedef char Char;
+
+/*
+ ********* define 8 bit signed/unsigned types & constants
+ */
+#if SCHAR_MAX == 127
+typedef signed char Word8;
+#define minWord8  SCHAR_MIN
+#define maxWord8  SCHAR_MAX
+
+typedef unsigned char UWord8;
+#define minUWord8 0
+#define maxUWord8 UCHAR_MAX
+#else
+#error cannot find 8-bit type
+#endif
+
+
+/*
+ ********* define 16 bit signed/unsigned types & constants
+ */
+#if INT_MAX == 32767
+typedef int Word16;
+#define minWord16     INT_MIN
+#define maxWord16     INT_MAX
+typedef unsigned int UWord16;
+#define minUWord16    0
+#define maxUWord16    UINT_MAX
+#elif SHRT_MAX == 32767
+typedef short Word16;
+#define minWord16     SHRT_MIN
+#define maxWord16     SHRT_MAX
+typedef unsigned short UWord16;
+#define minUWord16    0
+#define maxUWord16    USHRT_MAX
+#else
+#error cannot find 16-bit type
+#endif
+
+
+/*
+ ********* define 32 bit signed/unsigned types & constants
+ */
+#if INT_MAX == 2147483647
+typedef int Word32;
+#define minWord32     INT_MIN
+#define maxWord32     INT_MAX
+typedef unsigned int UWord32;
+#define minUWord32    0
+#define maxUWord32    UINT_MAX
+#elif LONG_MAX == 2147483647
+typedef long Word32;
+#define minWord32     LONG_MIN
+#define maxWord32     LONG_MAX
+typedef unsigned long UWord32;
+#define minUWord32    0
+#define maxUWord32    ULONG_MAX
+#else
+#error cannot find 32-bit type
+#endif
+
+/*
+ ********* define floating point type & constants
+ */
+/* use "#if 0" below if Float should be double;
+   use "#if 1" below if Float should be float
+ */
+#if 0
+typedef float Float;
+#define maxFloat      FLT_MAX
+#define minFloat      FLT_MIN
+#else
+typedef double Float;
+#define maxFloat      DBL_MAX
+#define minFloat      DBL_MIN
+#endif
+
+/*
+ ********* define complex type
+ */
+typedef struct {
+  Float r;  /* real      part */
+  Float i;  /* imaginary part */
+} CPX;
+
+/*
+ ********* define boolean type
+ */
+typedef int Bool;
+#define false 0
+#define true 1
+
+/* ******Avoid function multiple definition****** */
+#define     Autocorr         voAWB_Autocorr
+#define     Convolve         voAWB_Convolve
+#define     cor_h_x          voAWB_cor_h_x
+#define     dtx_enc_init     voAWB_dtx_enc_init
+#define     dtx_enc_reset    voAWB_dtx_enc_reset
+#define     dtx_enc_exit     voAWB_dtx_enc_exit
+#define     dtx_enc          voAWB_dtx_enc
+#define     dtx_buffer       voAWB_dtx_buffer
+#define     tx_dtx_handler   voAWB_tx_dtx_handler
+#define     G_pitch          voAWB_G_pitch
+#define     Isp_Az           voAWB_Isp_Az
+#define     Lag_window       voAWB_Lag_window
+#define     Log2_norm        voAWB_Log2_norm
+#define     Log2             voAWB_Log2
+#define     Pow2             voAWB_Pow2
+#define     L_Comp           voAWB_L_Comp
+#define     Mpy_32           voAWB_Mpy_32
+#define     Mpy_32_16        voAWB_Mpy_32_16
+#define     Div_32           voAWB_Div_32
+#define     Pit_shrp         voAWB_Pit_shrp
+#define     Qisf_ns          voAWB_Qisf_ns
+#define     Disf_ns          voAWB_Disf_ns
+#define     Residu           voAWB_Residu
+#define     Syn_filt         voAWB_Syn_filt
+#define     Set_zero         voAWB_Set_zero
+#define     Copy             voAWB_Copy
+#define     voice_factor     voAWB_voice_factor
+#define     Syn_filt_32      voAWB_Syn_filt_32
+#define     Isf_isp          voAWB_Isf_isp
+#define     Levinson         voAWB_Levinson
+#define     median5          voAWB_median5           
+#define     Pred_lt4         voAWB_Pred_lt4
+#define     Reorder_isf      voAWB_Reorder_isf
+#define     Dpisf_2s_36b     voAWB_Dpisf_2s_36b
+#define     Dpisf_2s_46b     voAWB_Dpisf_2s_46b
+#define     Dot_product12    voAWB_Dot_product12
+#define     mem_malloc       voAWB_mem_malloc
+#define     mem_free         voAWB_mem_free
+/******************************************************/
+
+#endif  //#define __TYPEDEFS_H__
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/wb_vad.h b/media/libstagefright/codecs/amrwbenc/inc/wb_vad.h
index b733afe..6822f48 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/wb_vad.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/wb_vad.h
@@ -1,78 +1,78 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/*-------------------------------------------------------------------*

- *                         WB_VAD.H                                  *

- *-------------------------------------------------------------------*

- * Functions and static memory for Voice Activity Detection.         *

- *-------------------------------------------------------------------*/

-

-#ifndef __WB_VAD_H__

-#define __WB_VAD_H__

-

-/******************************************************************************

- *                         INCLUDE FILES

- ******************************************************************************/

-#include "typedef.h"

-#include "wb_vad_c.h"

-#include "voMem.h"

-

-/******************************************************************************

- *                         DEFINITION OF DATA TYPES

- ******************************************************************************/

-

-typedef struct

-{

-	Word16 bckr_est[COMPLEN];              /* background noise estimate                */

-	Word16 ave_level[COMPLEN];             /* averaged input components for stationary */

-	/* estimation                               */

-	Word16 old_level[COMPLEN];             /* input levels of the previous frame       */

-	Word16 sub_level[COMPLEN];             /* input levels calculated at the end of a frame (lookahead)  */

-	Word16 a_data5[F_5TH_CNT][2];          /* memory for the filter bank               */

-	Word16 a_data3[F_3TH_CNT];             /* memory for the filter bank               */

-

-	Word16 burst_count;                    /* counts length of a speech burst          */

-	Word16 hang_count;                     /* hangover counter                         */

-	Word16 stat_count;                     /* stationary counter                       */

-

-	/* Note that each of the following two variables holds 15 flags. Each flag reserves 1 bit of the

-	 * variable. The newest flag is in the bit 15 (assuming that LSB is bit 1 and MSB is bit 16). */

-	Word16 vadreg;                         /* flags for intermediate VAD decisions     */

-	Word16 tone_flag;                      /* tone detection flags                     */

-

-	Word16 sp_est_cnt;                     /* counter for speech level estimation      */

-	Word16 sp_max;                         /* maximum level                            */

-	Word16 sp_max_cnt;                     /* counts frames that contains speech       */

-	Word16 speech_level;                   /* estimated speech level                   */

-	Word32 prev_pow_sum;                   /* power of previous frame                  */

-

-} VadVars;

-

-/********************************************************************************

- *

- * DECLARATION OF PROTOTYPES

- ********************************************************************************/

-

-Word16 wb_vad_init(VadVars ** st, VO_MEM_OPERATOR *pMemOP);

-Word16 wb_vad_reset(VadVars * st);

-void wb_vad_exit(VadVars ** st, VO_MEM_OPERATOR *pMemOP);

-void wb_vad_tone_detection(VadVars * st, Word16 p_gain);

-Word16 wb_vad(VadVars * st, Word16 in_buf[]);

-

-#endif  //__WB_VAD_H__

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*-------------------------------------------------------------------*
+ *                         WB_VAD.H                                  *
+ *-------------------------------------------------------------------*
+ * Functions and static memory for Voice Activity Detection.         *
+ *-------------------------------------------------------------------*/
+
+#ifndef __WB_VAD_H__
+#define __WB_VAD_H__
+
+/******************************************************************************
+ *                         INCLUDE FILES
+ ******************************************************************************/
+#include "typedef.h"
+#include "wb_vad_c.h"
+#include "voMem.h"
+
+/******************************************************************************
+ *                         DEFINITION OF DATA TYPES
+ ******************************************************************************/
+
+typedef struct
+{
+	Word16 bckr_est[COMPLEN];              /* background noise estimate                */
+	Word16 ave_level[COMPLEN];             /* averaged input components for stationary */
+	/* estimation                               */
+	Word16 old_level[COMPLEN];             /* input levels of the previous frame       */
+	Word16 sub_level[COMPLEN];             /* input levels calculated at the end of a frame (lookahead)  */
+	Word16 a_data5[F_5TH_CNT][2];          /* memory for the filter bank               */
+	Word16 a_data3[F_3TH_CNT];             /* memory for the filter bank               */
+
+	Word16 burst_count;                    /* counts length of a speech burst          */
+	Word16 hang_count;                     /* hangover counter                         */
+	Word16 stat_count;                     /* stationary counter                       */
+
+	/* Note that each of the following two variables holds 15 flags. Each flag reserves 1 bit of the
+	 * variable. The newest flag is in the bit 15 (assuming that LSB is bit 1 and MSB is bit 16). */
+	Word16 vadreg;                         /* flags for intermediate VAD decisions     */
+	Word16 tone_flag;                      /* tone detection flags                     */
+
+	Word16 sp_est_cnt;                     /* counter for speech level estimation      */
+	Word16 sp_max;                         /* maximum level                            */
+	Word16 sp_max_cnt;                     /* counts frames that contains speech       */
+	Word16 speech_level;                   /* estimated speech level                   */
+	Word32 prev_pow_sum;                   /* power of previous frame                  */
+
+} VadVars;
+
+/********************************************************************************
+ *
+ * DECLARATION OF PROTOTYPES
+ ********************************************************************************/
+
+Word16 wb_vad_init(VadVars ** st, VO_MEM_OPERATOR *pMemOP);
+Word16 wb_vad_reset(VadVars * st);
+void wb_vad_exit(VadVars ** st, VO_MEM_OPERATOR *pMemOP);
+void wb_vad_tone_detection(VadVars * st, Word16 p_gain);
+Word16 wb_vad(VadVars * st, Word16 in_buf[]);
+
+#endif  //__WB_VAD_H__
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/inc/wb_vad_c.h b/media/libstagefright/codecs/amrwbenc/inc/wb_vad_c.h
index 39ef506..04fd318 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/wb_vad_c.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/wb_vad_c.h
@@ -1,109 +1,109 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/*-------------------------------------------------------------------*

- *                         WB_VAD_C.H				     *

- *-------------------------------------------------------------------*

- * Constants for Voice Activity Detection.			     *

- *-------------------------------------------------------------------*/

-

-#ifndef __WB_VAD_C_H__

-#define __WB_VAD_C_H__

-

-#define FRAME_LEN 256                      /* Length (samples) of the input frame          */

-#define COMPLEN 12                         /* Number of sub-bands used by VAD              */

-

-#define UNIRSHFT 7                         /* = log2(MAX_16/UNITY), UNITY = 256      */

-#define SCALE 128                          /* (UNITY*UNITY)/512 */

-

-#define TONE_THR (Word16)(0.65*MAX_16)     /* Threshold for tone detection   */

-

-/* constants for speech level estimation */

-#define SP_EST_COUNT 80

-#define SP_ACTIVITY_COUNT 25

-#define ALPHA_SP_UP (Word16)((1.0 - 0.85)*MAX_16)

-#define ALPHA_SP_DOWN (Word16)((1.0 - 0.85)*MAX_16)

-

-#define NOM_LEVEL 2050                     /* about -26 dBov Q15 */

-#define SPEECH_LEVEL_INIT NOM_LEVEL        /* initial speech level */

-#define MIN_SPEECH_LEVEL1  (Word16)(NOM_LEVEL * 0.063)  /* NOM_LEVEL -24 dB */

-#define MIN_SPEECH_LEVEL2  (Word16)(NOM_LEVEL * 0.2)    /* NOM_LEVEL -14 dB */

-#define MIN_SPEECH_SNR 4096                /* 0 dB, lowest SNR estimation, Q12 */

-

-/* Time constants for background spectrum update */

-#define ALPHA_UP1   (Word16)((1.0 - 0.95)*MAX_16)       /* Normal update, upwards:   */

-#define ALPHA_DOWN1 (Word16)((1.0 - 0.936)*MAX_16)      /* Normal update, downwards  */

-#define ALPHA_UP2   (Word16)((1.0 - 0.985)*MAX_16)      /* Forced update, upwards    */

-#define ALPHA_DOWN2 (Word16)((1.0 - 0.943)*MAX_16)      /* Forced update, downwards  */

-#define ALPHA3      (Word16)((1.0 - 0.95)*MAX_16)       /* Update downwards          */

-#define ALPHA4      (Word16)((1.0 - 0.9)*MAX_16)        /* For stationary estimation */

-#define ALPHA5      (Word16)((1.0 - 0.5)*MAX_16)        /* For stationary estimation */

-

-/* Constants for VAD threshold */

-#define THR_MIN  (Word16)(1.6*SCALE)       /* Minimum threshold               */

-#define THR_HIGH (Word16)(6*SCALE)         /* Highest threshold               */

-#define THR_LOW (Word16)(1.7*SCALE)        /* Lowest threshold               */

-#define NO_P1 31744                        /* ilog2(1), Noise level for highest threshold */

-#define NO_P2 19786                        /* ilog2(0.1*MAX_16), Noise level for lowest threshold */

-#define NO_SLOPE (Word16)(MAX_16*(float)(THR_LOW-THR_HIGH)/(float)(NO_P2-NO_P1))

-

-#define SP_CH_MIN (Word16)(-0.75*SCALE)

-#define SP_CH_MAX (Word16)(0.75*SCALE)

-#define SP_P1 22527                        /* ilog2(NOM_LEVEL/4) */

-#define SP_P2 17832                        /* ilog2(NOM_LEVEL*4) */

-#define SP_SLOPE (Word16)(MAX_16*(float)(SP_CH_MAX-SP_CH_MIN)/(float)(SP_P2-SP_P1))

-

-/* Constants for hangover length */

-#define HANG_HIGH  12                      /* longest hangover               */

-#define HANG_LOW  2                        /* shortest hangover               */

-#define HANG_P1 THR_LOW                    /* threshold for longest hangover */

-#define HANG_P2 (Word16)(4*SCALE)          /* threshold for shortest hangover */

-#define HANG_SLOPE (Word16)(MAX_16*(float)(HANG_LOW-HANG_HIGH)/(float)(HANG_P2-HANG_P1))

-

-/* Constants for burst length */

-#define BURST_HIGH 8                       /* longest burst length         */

-#define BURST_LOW 3                        /* shortest burst length        */

-#define BURST_P1 THR_HIGH                  /* threshold for longest burst */

-#define BURST_P2 THR_LOW                   /* threshold for shortest burst */

-#define BURST_SLOPE (Word16)(MAX_16*(float)(BURST_LOW-BURST_HIGH)/(float)(BURST_P2-BURST_P1))

-

-/* Parameters for background spectrum recovery function */

-#define STAT_COUNT 20                      /* threshold of stationary detection counter         */

-

-#define STAT_THR_LEVEL 184                 /* Threshold level for stationarity detection        */

-#define STAT_THR 1000                      /* Threshold for stationarity detection              */

-

-/* Limits for background noise estimate */

-#define NOISE_MIN 40                       /* minimum */

-#define NOISE_MAX 20000                    /* maximum */

-#define NOISE_INIT 150                     /* initial */

-

-/* Thresholds for signal power (now calculated on 2 frames) */

-#define VAD_POW_LOW (Word32)30000L         /* If input power is lower than this, VAD is set to 0 */

-#define POW_TONE_THR (Word32)686080L       /* If input power is lower,tone detection flag is ignored */

-

-/* Constants for the filter bank */

-#define COEFF3   13363                     /* coefficient for the 3rd order filter     */

-#define COEFF5_1 21955                     /* 1st coefficient the for 5th order filter */

-#define COEFF5_2 6390                      /* 2nd coefficient the for 5th order filter */

-#define F_5TH_CNT 5                        /* number of 5th order filters */

-#define F_3TH_CNT 6                        /* number of 3th order filters */

-

-#endif   //__WB_VAD_C_H__

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/*-------------------------------------------------------------------*
+ *                         WB_VAD_C.H				     *
+ *-------------------------------------------------------------------*
+ * Constants for Voice Activity Detection.			     *
+ *-------------------------------------------------------------------*/
+
+#ifndef __WB_VAD_C_H__
+#define __WB_VAD_C_H__
+
+#define FRAME_LEN 256                      /* Length (samples) of the input frame          */
+#define COMPLEN 12                         /* Number of sub-bands used by VAD              */
+
+#define UNIRSHFT 7                         /* = log2(MAX_16/UNITY), UNITY = 256      */
+#define SCALE 128                          /* (UNITY*UNITY)/512 */
+
+#define TONE_THR (Word16)(0.65*MAX_16)     /* Threshold for tone detection   */
+
+/* constants for speech level estimation */
+#define SP_EST_COUNT 80
+#define SP_ACTIVITY_COUNT 25
+#define ALPHA_SP_UP (Word16)((1.0 - 0.85)*MAX_16)
+#define ALPHA_SP_DOWN (Word16)((1.0 - 0.85)*MAX_16)
+
+#define NOM_LEVEL 2050                     /* about -26 dBov Q15 */
+#define SPEECH_LEVEL_INIT NOM_LEVEL        /* initial speech level */
+#define MIN_SPEECH_LEVEL1  (Word16)(NOM_LEVEL * 0.063)  /* NOM_LEVEL -24 dB */
+#define MIN_SPEECH_LEVEL2  (Word16)(NOM_LEVEL * 0.2)    /* NOM_LEVEL -14 dB */
+#define MIN_SPEECH_SNR 4096                /* 0 dB, lowest SNR estimation, Q12 */
+
+/* Time constants for background spectrum update */
+#define ALPHA_UP1   (Word16)((1.0 - 0.95)*MAX_16)       /* Normal update, upwards:   */
+#define ALPHA_DOWN1 (Word16)((1.0 - 0.936)*MAX_16)      /* Normal update, downwards  */
+#define ALPHA_UP2   (Word16)((1.0 - 0.985)*MAX_16)      /* Forced update, upwards    */
+#define ALPHA_DOWN2 (Word16)((1.0 - 0.943)*MAX_16)      /* Forced update, downwards  */
+#define ALPHA3      (Word16)((1.0 - 0.95)*MAX_16)       /* Update downwards          */
+#define ALPHA4      (Word16)((1.0 - 0.9)*MAX_16)        /* For stationary estimation */
+#define ALPHA5      (Word16)((1.0 - 0.5)*MAX_16)        /* For stationary estimation */
+
+/* Constants for VAD threshold */
+#define THR_MIN  (Word16)(1.6*SCALE)       /* Minimum threshold               */
+#define THR_HIGH (Word16)(6*SCALE)         /* Highest threshold               */
+#define THR_LOW (Word16)(1.7*SCALE)        /* Lowest threshold               */
+#define NO_P1 31744                        /* ilog2(1), Noise level for highest threshold */
+#define NO_P2 19786                        /* ilog2(0.1*MAX_16), Noise level for lowest threshold */
+#define NO_SLOPE (Word16)(MAX_16*(float)(THR_LOW-THR_HIGH)/(float)(NO_P2-NO_P1))
+
+#define SP_CH_MIN (Word16)(-0.75*SCALE)
+#define SP_CH_MAX (Word16)(0.75*SCALE)
+#define SP_P1 22527                        /* ilog2(NOM_LEVEL/4) */
+#define SP_P2 17832                        /* ilog2(NOM_LEVEL*4) */
+#define SP_SLOPE (Word16)(MAX_16*(float)(SP_CH_MAX-SP_CH_MIN)/(float)(SP_P2-SP_P1))
+
+/* Constants for hangover length */
+#define HANG_HIGH  12                      /* longest hangover               */
+#define HANG_LOW  2                        /* shortest hangover               */
+#define HANG_P1 THR_LOW                    /* threshold for longest hangover */
+#define HANG_P2 (Word16)(4*SCALE)          /* threshold for shortest hangover */
+#define HANG_SLOPE (Word16)(MAX_16*(float)(HANG_LOW-HANG_HIGH)/(float)(HANG_P2-HANG_P1))
+
+/* Constants for burst length */
+#define BURST_HIGH 8                       /* longest burst length         */
+#define BURST_LOW 3                        /* shortest burst length        */
+#define BURST_P1 THR_HIGH                  /* threshold for longest burst */
+#define BURST_P2 THR_LOW                   /* threshold for shortest burst */
+#define BURST_SLOPE (Word16)(MAX_16*(float)(BURST_LOW-BURST_HIGH)/(float)(BURST_P2-BURST_P1))
+
+/* Parameters for background spectrum recovery function */
+#define STAT_COUNT 20                      /* threshold of stationary detection counter         */
+
+#define STAT_THR_LEVEL 184                 /* Threshold level for stationarity detection        */
+#define STAT_THR 1000                      /* Threshold for stationarity detection              */
+
+/* Limits for background noise estimate */
+#define NOISE_MIN 40                       /* minimum */
+#define NOISE_MAX 20000                    /* maximum */
+#define NOISE_INIT 150                     /* initial */
+
+/* Thresholds for signal power (now calculated on 2 frames) */
+#define VAD_POW_LOW (Word32)30000L         /* If input power is lower than this, VAD is set to 0 */
+#define POW_TONE_THR (Word32)686080L       /* If input power is lower,tone detection flag is ignored */
+
+/* Constants for the filter bank */
+#define COEFF3   13363                     /* coefficient for the 3rd order filter     */
+#define COEFF5_1 21955                     /* 1st coefficient the for 5th order filter */
+#define COEFF5_2 6390                      /* 2nd coefficient the for 5th order filter */
+#define F_5TH_CNT 5                        /* number of 5th order filters */
+#define F_3TH_CNT 6                        /* number of 3th order filters */
+
+#endif   //__WB_VAD_C_H__
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Deemph_32_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Deemph_32_opt.s
index 0eb5e9f..c1c74e6 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Deemph_32_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Deemph_32_opt.s
@@ -1,104 +1,104 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-

-@void Deemph_32(

-@     Word16 x_hi[],                        /* (i)     : input signal (bit31..16) */

-@     Word16 x_lo[],                        /* (i)     : input signal (bit15..4)  */

-@     Word16 y[],                           /* (o)     : output signal (x16)      */

-@     Word16 mu,                            /* (i) Q15 : deemphasis factor        */

-@     Word16 L,                             /* (i)     : vector size              */

-@     Word16 * mem                          /* (i/o)   : memory (y[-1])           */

-@     )

-

-@x_hi     RN      R0

-@x_lo     RN      R1

-@y[]      RN      R2

-@*mem     RN      R3

-

-           .section  .text

-           .global   Deemph_32_asm

-	   

-Deemph_32_asm:

-

-           STMFD   	r13!, {r4 - r12, r14} 

-	   MOV          r4, #2                   @i=0

-	   LDRSH        r6, [r0], #2             @load x_hi[0]

-	   LDRSH        r7, [r1], #2             @load x_lo[0]

-	   LDR          r5, =22282               @r5---mu

-	   MOV          r11, #0x8000

-

-           @y[0]

-	   MOV          r10, r6, LSL #16         @L_tmp = x_hi[0]<<16

-	   MOV          r8,  r5, ASR #1          @fac = mu >> 1

-	   LDR          r5,  [r3]

-	   ADD          r12, r10, r7, LSL #4     @L_tmp += x_lo[0] << 4

-	   MOV          r10, r12, LSL #3         @L_tmp <<= 3

-	   MUL          r9, r5, r8

-	   LDRSH        r6, [r0], #2             @load x_hi[1] 

-	   QDADD        r10, r10, r9

-	   LDRSH        r7, [r1], #2             @load x_lo[1]  

-	   MOV          r12, r10, LSL #1         @L_tmp = L_mac(L_tmp, *mem, fac)

-	   QADD         r10, r12, r11

-	   MOV          r14, r10, ASR #16        @y[0] = round(L_tmp)

-

-

-	   MOV          r10, r6, LSL #16

-	   ADD          r12, r10, r7, LSL #4

-           STRH         r14, [r2], #2            @update y[0]

-	   MOV          r10, r12, LSL #3

-	   MUL          r9, r14, r8

-	   QDADD        r10, r10, r9

-	   MOV          r12, r10, LSL #1

-	   QADD         r10, r12, r11

-	   MOV          r14, r10, ASR #16        @y[1] = round(L_tmp)

-

-LOOP:

-           LDRSH        r6, [r0], #2             @load x_hi[]

-	   LDRSH        r7, [r1], #2

-	   STRH         r14, [r2], #2

-	   MOV          r10, r6, LSL #16

-	   ADD          r12, r10, r7, LSL #4

-	   MUL          r9, r14, r8

-	   MOV          r10, r12, LSL #3

-	   QDADD        r10, r10, r9

-           LDRSH        r6, [r0], #2             @load x_hi[]

-	   MOV          r12, r10, LSL #1

-	   QADD         r10, r12, r11

-	   LDRSH        r7, [r1], #2

-	   MOV          r14, r10, ASR #16

-

-	   MOV          r10, r6, LSL #16

-	   ADD          r12, r10, r7, LSL #4

-	   STRH         r14, [r2], #2

-	   MUL          r9, r14, r8

-	   MOV          r10, r12, LSL #3

-	   QDADD        r10, r10, r9

-           ADD          r4, r4, #2

-	   MOV          r12, r10, LSL #1

-	   QADD         r10, r12, r11

-           CMP          r4, #64

-	   MOV          r14, r10, ASR #16

-

-           BLT          LOOP

-           STR          r14, [r3]

-           STRH         r14, [r2]	   

-

-           LDMFD   	r13!, {r4 - r12, r15} 

-

-	   @ENDP

-	   .END

-

-

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@void Deemph_32(
+@     Word16 x_hi[],                        /* (i)     : input signal (bit31..16) */
+@     Word16 x_lo[],                        /* (i)     : input signal (bit15..4)  */
+@     Word16 y[],                           /* (o)     : output signal (x16)      */
+@     Word16 mu,                            /* (i) Q15 : deemphasis factor        */
+@     Word16 L,                             /* (i)     : vector size              */
+@     Word16 * mem                          /* (i/o)   : memory (y[-1])           */
+@     )
+
+@x_hi     RN      R0
+@x_lo     RN      R1
+@y[]      RN      R2
+@*mem     RN      R3
+
+           .section  .text
+           .global   Deemph_32_asm
+	   
+Deemph_32_asm:
+
+           STMFD   	r13!, {r4 - r12, r14} 
+	   MOV          r4, #2                   @i=0
+	   LDRSH        r6, [r0], #2             @load x_hi[0]
+	   LDRSH        r7, [r1], #2             @load x_lo[0]
+	   LDR          r5, =22282               @r5---mu
+	   MOV          r11, #0x8000
+
+           @y[0]
+	   MOV          r10, r6, LSL #16         @L_tmp = x_hi[0]<<16
+	   MOV          r8,  r5, ASR #1          @fac = mu >> 1
+	   LDR          r5,  [r3]
+	   ADD          r12, r10, r7, LSL #4     @L_tmp += x_lo[0] << 4
+	   MOV          r10, r12, LSL #3         @L_tmp <<= 3
+	   MUL          r9, r5, r8
+	   LDRSH        r6, [r0], #2             @load x_hi[1] 
+	   QDADD        r10, r10, r9
+	   LDRSH        r7, [r1], #2             @load x_lo[1]  
+	   MOV          r12, r10, LSL #1         @L_tmp = L_mac(L_tmp, *mem, fac)
+	   QADD         r10, r12, r11
+	   MOV          r14, r10, ASR #16        @y[0] = round(L_tmp)
+
+
+	   MOV          r10, r6, LSL #16
+	   ADD          r12, r10, r7, LSL #4
+           STRH         r14, [r2], #2            @update y[0]
+	   MOV          r10, r12, LSL #3
+	   MUL          r9, r14, r8
+	   QDADD        r10, r10, r9
+	   MOV          r12, r10, LSL #1
+	   QADD         r10, r12, r11
+	   MOV          r14, r10, ASR #16        @y[1] = round(L_tmp)
+
+LOOP:
+           LDRSH        r6, [r0], #2             @load x_hi[]
+	   LDRSH        r7, [r1], #2
+	   STRH         r14, [r2], #2
+	   MOV          r10, r6, LSL #16
+	   ADD          r12, r10, r7, LSL #4
+	   MUL          r9, r14, r8
+	   MOV          r10, r12, LSL #3
+	   QDADD        r10, r10, r9
+           LDRSH        r6, [r0], #2             @load x_hi[]
+	   MOV          r12, r10, LSL #1
+	   QADD         r10, r12, r11
+	   LDRSH        r7, [r1], #2
+	   MOV          r14, r10, ASR #16
+
+	   MOV          r10, r6, LSL #16
+	   ADD          r12, r10, r7, LSL #4
+	   STRH         r14, [r2], #2
+	   MUL          r9, r14, r8
+	   MOV          r10, r12, LSL #3
+	   QDADD        r10, r10, r9
+           ADD          r4, r4, #2
+	   MOV          r12, r10, LSL #1
+	   QADD         r10, r12, r11
+           CMP          r4, #64
+	   MOV          r14, r10, ASR #16
+
+           BLT          LOOP
+           STR          r14, [r3]
+           STRH         r14, [r2]	   
+
+           LDMFD   	r13!, {r4 - r12, r15} 
+
+	   @ENDP
+	   .END
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Dot_p_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Dot_p_opt.s
index 0383269..02bdcab 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Dot_p_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Dot_p_opt.s
@@ -1,80 +1,80 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-@

-@Word32 Dot_product12(                      /* (o) Q31: normalized result (1 < val <= -1) */

-@       Word16 x[],                           /* (i) 12bits: x vector                       */

-@       Word16 y[],                           /* (i) 12bits: y vector                       */

-@       Word16 lg,                            /* (i)    : vector length                     */

-@       Word16 * exp                          /* (o)    : exponent of result (0..+30)       */

-@)

-@****************************************************************

-@  x[]   ---  r0

-@  y[]   ---  r1

-@  lg    ---  r2

-@  *exp  ---  r3

-

-          .section  .text

- 	  .global   Dot_product12_asm

-

-Dot_product12_asm:

-

-          STMFD   	    r13!, {r4 - r12, r14} 

-          MOV               r4, #0                                 @ L_sum = 0

-          MOV               r5, #0                                 @ i = 0

-

-LOOP:

-          LDR           r6, [r0], #4

-          LDR           r7, [r1], #4

-          LDR           r8, [r0], #4

-          SMLABB        r4, r6, r7, r4

-          LDR           r9, [r1], #4

-	  SMLATT        r4, r6, r7, r4 

-

-	  LDR           r6, [r0], #4

-	  SMLABB        r4, r8, r9, r4

-

-	  LDR           r7, [r1], #4

-	  SMLATT        r4, r8, r9, r4	  

-	  LDR           r8, [r0], #4

-

-	  SMLABB        r4, r6, r7, r4

-	  LDR           r9, [r1], #4

-	  SMLATT        r4, r6, r7, r4

-	  ADD           r5, r5, #8

-	  SMLABB        r4, r8, r9, r4

-	  CMP           r5, r2

-	  SMLATT        r4, r8, r9, r4

-	  BLT           LOOP

-              

-          MOV           r12, r4, LSL #1

-          ADD           r12, r12, #1                         @ L_sum = (L_sum << 1)  + 1

-	  MOV           r4, r12

-

-          CMP           r12, #0

-	  RSBLT         r4, r12, #0

-          CLZ           r10, r4

-          SUB           r10, r10, #1                         @ sft = norm_l(L_sum)

-          MOV           r0, r12, LSL r10                     @ L_sum = L_sum << sft

-          RSB           r11, r10, #30                        @ *exp = 30 - sft

-          STRH          r11, [r3]                     

-

-Dot_product12_end:

-		     

-          LDMFD   	    r13!, {r4 - r12, r15} 

-          @ENDFUNC

-          .END

- 

-

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@Word32 Dot_product12(                      /* (o) Q31: normalized result (1 < val <= -1) */
+@       Word16 x[],                           /* (i) 12bits: x vector                       */
+@       Word16 y[],                           /* (i) 12bits: y vector                       */
+@       Word16 lg,                            /* (i)    : vector length                     */
+@       Word16 * exp                          /* (o)    : exponent of result (0..+30)       */
+@)
+@****************************************************************
+@  x[]   ---  r0
+@  y[]   ---  r1
+@  lg    ---  r2
+@  *exp  ---  r3
+
+          .section  .text
+ 	  .global   Dot_product12_asm
+
+Dot_product12_asm:
+
+          STMFD   	    r13!, {r4 - r12, r14} 
+          MOV               r4, #0                                 @ L_sum = 0
+          MOV               r5, #0                                 @ i = 0
+
+LOOP:
+          LDR           r6, [r0], #4
+          LDR           r7, [r1], #4
+          LDR           r8, [r0], #4
+          SMLABB        r4, r6, r7, r4
+          LDR           r9, [r1], #4
+	  SMLATT        r4, r6, r7, r4 
+
+	  LDR           r6, [r0], #4
+	  SMLABB        r4, r8, r9, r4
+
+	  LDR           r7, [r1], #4
+	  SMLATT        r4, r8, r9, r4	  
+	  LDR           r8, [r0], #4
+
+	  SMLABB        r4, r6, r7, r4
+	  LDR           r9, [r1], #4
+	  SMLATT        r4, r6, r7, r4
+	  ADD           r5, r5, #8
+	  SMLABB        r4, r8, r9, r4
+	  CMP           r5, r2
+	  SMLATT        r4, r8, r9, r4
+	  BLT           LOOP
+              
+          MOV           r12, r4, LSL #1
+          ADD           r12, r12, #1                         @ L_sum = (L_sum << 1)  + 1
+	  MOV           r4, r12
+
+          CMP           r12, #0
+	  RSBLT         r4, r12, #0
+          CLZ           r10, r4
+          SUB           r10, r10, #1                         @ sft = norm_l(L_sum)
+          MOV           r0, r12, LSL r10                     @ L_sum = L_sum << sft
+          RSB           r11, r10, #30                        @ *exp = 30 - sft
+          STRH          r11, [r3]                     
+
+Dot_product12_end:
+		     
+          LDMFD   	    r13!, {r4 - r12, r15} 
+          @ENDFUNC
+          .END
+ 
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s
index e6ebd73..1ce2a85 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s
@@ -1,185 +1,185 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-

-@**********************************************************************/

-@void Filt_6k_7k(

-@     Word16 signal[],                      /* input:  signal                  */

-@     Word16 lg,                            /* input:  length of input         */

-@     Word16 mem[]                          /* in/out: memory (size=30)        */

-@)

-@******************************************************************

-@ r0    ---  signal[]

-@ r1    ---  lg

-@ r2    ---  mem[] 

-

-          .section  .text

-          .global  Filt_6k_7k_asm

-          .extern  voAWB_Copy

-          .extern  fir_6k_7k

-

-Filt_6k_7k_asm:

-

-          STMFD   		r13!, {r4 - r12, r14} 

-          SUB    		r13, r13, #240              @ x[L_SUBFR16k + (L_FIR - 1)]

-          MOV     		r8, r0                      @ copy signal[] address

-          MOV     		r4, r1                      @ copy lg address

-          MOV     		r5, r2                      @ copy mem[] address

-

-          MOV     		r1, r13

-          MOV     		r0, r2

-          MOV     		r2, #30                     @ L_FIR - 1

-          BL      		voAWB_Copy                   @ memcpy(x, mem, (L_FIR - 1)<<1)

-

-          LDR     		r10, Lable1                 @ get fir_7k address     

-

-          MOV           	r14, #0  

-          MOV                   r3, r8                      @ change myMemCopy to Copy, due to Copy will change r3 content

-          ADD     	    	r6, r13, #60                @ get x[L_FIR - 1] address

-          MOV           	r7, r3                      @ get signal[i]

-LOOP1:

-          LDRSH         	r8,  [r7], #2

-          LDRSH         	r9,  [r7], #2

-          MOV           	r8, r8, ASR #2

-          MOV           	r9, r9, ASR #2

-          LDRSH         	r11, [r7], #2

-          LDRSH         	r12, [r7], #2

-          MOV           	r11, r11, ASR #2

-          MOV           	r12, r12, ASR #2

-          STRH          	r8, [r6], #2

-          STRH          	r9, [r6], #2

-          STRH          	r11, [r6], #2

-          STRH          	r12, [r6], #2

-          LDRSH         	r8,  [r7], #2

-          LDRSH         	r9,  [r7], #2

-          MOV           	r8, r8, ASR #2

-          MOV           	r9, r9, ASR #2

-          LDRSH         	r11, [r7], #2

-          LDRSH         	r12, [r7], #2

-          MOV           	r11, r11, ASR #2

-          MOV           	r12, r12, ASR #2

-          STRH          	r8, [r6], #2

-          STRH          	r9, [r6], #2

-          STRH          	r11, [r6], #2

-          STRH          	r12, [r6], #2

-          ADD           	r14, r14, #8

-          CMP           	r14, #80

-          BLT           	LOOP1          

-

-

-          STR     		r5, [sp, #-4]               @ PUSH  r5 to stack

-

-          @ not use registers: r4, r10, r12, r14, r5

-          MOV     		r4, r13 

-          MOV     		r5, #0                      @ i = 0              

-LOOP2:

-          LDR           	r0, [r10]

-

-          LDRSH  	        r1, [r4]                   @ load x[i]

-          LDRSH   	        r2, [r4, #60]              @ load x[i + 30]

-          LDRSH                 r6, [r4, #2]               @ load x[i + 1]

-          LDRSH                 r7, [r4, #58]              @ load x[i + 29]

-          ADD                   r1, r1, r2                 @ x[i] + x[i + 30]

-          ADD                   r6, r6, r7                 @ x[i + 1] + x[i + 29]

-          LDRSH                 r8, [r4, #4]               @ load x[i + 2]

-          LDRSH                 r9, [r4, #56]              @ load x[i + 28]

-

-          SMULBB                r14, r1, r0                @ (x[i] + x[i + 30]) * fir_7k[0]

-          ADD                   r8, r8, r9                 @ x[i + 2] + x[i + 28]

-          SMLABT                r14, r6, r0, r14           @ (x[i + 1] + x[i + 29]) * fir_7k[1]

-

-          LDR                   r0, [r10, #4]

-          LDRSH                 r1, [r4, #6]               @ load x[i+3]

-          LDRSH                 r2, [r4, #54]              @ load x[i+27]

-          LDRSH                 r6, [r4, #8]               @ load x[i+4]

-          LDRSH                 r7, [r4, #52]              @ load x[i+26]

-          ADD                   r1, r1, r2                 @ x[i+3] + x[i+27]

-          ADD                   r6, r6, r7                 @ x[i+4] + x[i+26]

-          SMLABB                r14, r8, r0, r14           @ (x[i + 2] + x[i + 28]) * fir_7k[2]

-          LDRSH                 r8, [r4, #10]              @ load x[i+5]

-          LDRSH                 r9, [r4, #50]              @ load x[i+25]

-          SMLABT                r14, r1, r0, r14           @ (x[i+3] + x[i+27]) * fir_7k[3]

-          ADD                   r8, r8, r9                 @ x[i+5] + x[i+25] 

- 

-          LDR                   r0, [r10, #8]

-          LDRSH                 r1, [r4, #12]              @ x[i+6]

-          LDRSH                 r2, [r4, #48]              @ x[i+24]

-          SMLABB                r14, r6, r0, r14           @ (x[i+4] + x[i+26]) * fir_7k[4]

-          LDRSH                 r6, [r4, #14]              @ x[i+7] 

-          LDRSH                 r7, [r4, #46]              @ x[i+23]

-          SMLABT                r14, r8, r0, r14           @ (x[i+5] + x[i+25]) * fir_7k[5]

-          LDR                   r0, [r10, #12]

-          ADD                   r1, r1, r2                 @ (x[i+6] + x[i+24])

-          ADD                   r6, r6, r7                 @ (x[i+7] + x[i+23])

-          SMLABB                r14, r1, r0, r14           @ (x[i+6] + x[i+24]) * fir_7k[6]

-          LDRSH                 r8, [r4, #16]              @ x[i+8]

-          LDRSH                 r9, [r4, #44]              @ x[i+22] 

-          SMLABT                r14, r6, r0, r14           @ (x[i+7] + x[i+23]) * fir_7k[7]  

-          LDR                   r0, [r10, #16]

-          LDRSH                 r1, [r4, #18]              @ x[i+9]

-          LDRSH                 r2, [r4, #42]              @ x[i+21]

-          LDRSH                 r6, [r4, #20]              @ x[i+10]

-          LDRSH                 r7, [r4, #40]              @ x[i+20]

-          ADD                   r8, r8, r9                 @ (x[i+8] + x[i+22])

-          ADD                   r1, r1, r2                 @ (x[i+9] + x[i+21])

-          ADD                   r6, r6, r7                 @ (x[i+10] + x[i+20])

-          SMLABB                r14, r8, r0, r14           @ (x[i+8] + x[i+22]) * fir_7k[8]

-          LDRSH                 r8, [r4, #22]              @ x[i+11]

-          LDRSH                 r9, [r4, #38]              @ x[i+19]

-          SMLABT                r14, r1, r0, r14           @ (x[i+9] + x[i+21]) * fir_7k[9]

-          LDR                   r0, [r10, #20]

-          LDRSH                 r1, [r4, #24]              @ x[i+12]

-          LDRSH                 r2, [r4, #36]              @ x[i+18]

-          SMLABB                r14, r6, r0, r14           @ (x[i+10] + x[i+20]) * fir_7k[10]

-          LDRSH                 r6, [r4, #26]              @ x[i+13]

-          ADD                   r8, r8, r9                 @ (x[i+11] + x[i+19])  

-          LDRSH                 r7, [r4, #34]              @ x[i+17]

-          SMLABT                r14, r8, r0, r14           @ (x[i+11] + x[i+19]) * fir_7k[11]

-          LDR                   r0, [r10, #24]

-          ADD                   r1, r1, r2                 @ x[i+12] + x[i+18]

-          LDRSH                 r8, [r4, #28]              @ x[i+14]

-          SMLABB                r14, r1, r0, r14           @ (x[i+12] + x[i+18]) * fir_7k[12]

-          ADD                   r6, r6, r7                 @ (x[i+13] + x[i+17])

-          LDRSH                 r9, [r4, #32]              @ x[i+16] 

-          SMLABT                r14, r6, r0, r14           @ (x[i+13] + x[i+17]) * fir_7k[13]

-          LDR                   r0, [r10, #28]         

-          ADD                   r8, r8, r9                 @ (x[i+14] + x[i+16])

-          LDRSH                 r1, [r4, #30]              @ x[i+15]

-          SMLABB                r14, r8, r0, r14           @ (x[i+14] + x[i+16]) * fir_7k[14]

-          SMLABT                r14, r1, r0, r14           @ x[i+15] * fir_7k[15]                              

-

-          ADD     		r5, r5, #1

-          ADD     		r14, r14, #0x4000

-          ADD     		r4, r4, #2                

-          MOV     		r1, r14, ASR #15

-          CMP     		r5, #80

-          STRH    		r1, [r3], #2               @signal[i] = (L_tmp + 0x4000) >> 15

-          BLT     		LOOP2      

-           

-          LDR     		r1, [sp, #-4]               @mem address

-          ADD     		r0, r13, #160               @x + lg

-          MOV     		r2, #30

-          BL      		voAWB_Copy

-                    

-Filt_6k_7k_end:

-          ADD     		r13, r13, #240  

-          LDMFD   		r13!, {r4 - r12, r15} 

- 

-Lable1:

-          .word   		fir_6k_7k

-          @ENDFUNC

-          .END

-

-

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+
+@**********************************************************************/
+@void Filt_6k_7k(
+@     Word16 signal[],                      /* input:  signal                  */
+@     Word16 lg,                            /* input:  length of input         */
+@     Word16 mem[]                          /* in/out: memory (size=30)        */
+@)
+@******************************************************************
+@ r0    ---  signal[]
+@ r1    ---  lg
+@ r2    ---  mem[] 
+
+          .section  .text
+          .global  Filt_6k_7k_asm
+          .extern  voAWB_Copy
+          .extern  fir_6k_7k
+
+Filt_6k_7k_asm:
+
+          STMFD   		r13!, {r4 - r12, r14} 
+          SUB    		r13, r13, #240              @ x[L_SUBFR16k + (L_FIR - 1)]
+          MOV     		r8, r0                      @ copy signal[] address
+          MOV     		r4, r1                      @ copy lg address
+          MOV     		r5, r2                      @ copy mem[] address
+
+          MOV     		r1, r13
+          MOV     		r0, r2
+          MOV     		r2, #30                     @ L_FIR - 1
+          BL      		voAWB_Copy                   @ memcpy(x, mem, (L_FIR - 1)<<1)
+
+          LDR     		r10, Lable1                 @ get fir_7k address     
+
+          MOV           	r14, #0  
+          MOV                   r3, r8                      @ change myMemCopy to Copy, due to Copy will change r3 content
+          ADD     	    	r6, r13, #60                @ get x[L_FIR - 1] address
+          MOV           	r7, r3                      @ get signal[i]
+LOOP1:
+          LDRSH         	r8,  [r7], #2
+          LDRSH         	r9,  [r7], #2
+          MOV           	r8, r8, ASR #2
+          MOV           	r9, r9, ASR #2
+          LDRSH         	r11, [r7], #2
+          LDRSH         	r12, [r7], #2
+          MOV           	r11, r11, ASR #2
+          MOV           	r12, r12, ASR #2
+          STRH          	r8, [r6], #2
+          STRH          	r9, [r6], #2
+          STRH          	r11, [r6], #2
+          STRH          	r12, [r6], #2
+          LDRSH         	r8,  [r7], #2
+          LDRSH         	r9,  [r7], #2
+          MOV           	r8, r8, ASR #2
+          MOV           	r9, r9, ASR #2
+          LDRSH         	r11, [r7], #2
+          LDRSH         	r12, [r7], #2
+          MOV           	r11, r11, ASR #2
+          MOV           	r12, r12, ASR #2
+          STRH          	r8, [r6], #2
+          STRH          	r9, [r6], #2
+          STRH          	r11, [r6], #2
+          STRH          	r12, [r6], #2
+          ADD           	r14, r14, #8
+          CMP           	r14, #80
+          BLT           	LOOP1          
+
+
+          STR     		r5, [sp, #-4]               @ PUSH  r5 to stack
+
+          @ not use registers: r4, r10, r12, r14, r5
+          MOV     		r4, r13 
+          MOV     		r5, #0                      @ i = 0              
+LOOP2:
+          LDR           	r0, [r10]
+
+          LDRSH  	        r1, [r4]                   @ load x[i]
+          LDRSH   	        r2, [r4, #60]              @ load x[i + 30]
+          LDRSH                 r6, [r4, #2]               @ load x[i + 1]
+          LDRSH                 r7, [r4, #58]              @ load x[i + 29]
+          ADD                   r1, r1, r2                 @ x[i] + x[i + 30]
+          ADD                   r6, r6, r7                 @ x[i + 1] + x[i + 29]
+          LDRSH                 r8, [r4, #4]               @ load x[i + 2]
+          LDRSH                 r9, [r4, #56]              @ load x[i + 28]
+
+          SMULBB                r14, r1, r0                @ (x[i] + x[i + 30]) * fir_7k[0]
+          ADD                   r8, r8, r9                 @ x[i + 2] + x[i + 28]
+          SMLABT                r14, r6, r0, r14           @ (x[i + 1] + x[i + 29]) * fir_7k[1]
+
+          LDR                   r0, [r10, #4]
+          LDRSH                 r1, [r4, #6]               @ load x[i+3]
+          LDRSH                 r2, [r4, #54]              @ load x[i+27]
+          LDRSH                 r6, [r4, #8]               @ load x[i+4]
+          LDRSH                 r7, [r4, #52]              @ load x[i+26]
+          ADD                   r1, r1, r2                 @ x[i+3] + x[i+27]
+          ADD                   r6, r6, r7                 @ x[i+4] + x[i+26]
+          SMLABB                r14, r8, r0, r14           @ (x[i + 2] + x[i + 28]) * fir_7k[2]
+          LDRSH                 r8, [r4, #10]              @ load x[i+5]
+          LDRSH                 r9, [r4, #50]              @ load x[i+25]
+          SMLABT                r14, r1, r0, r14           @ (x[i+3] + x[i+27]) * fir_7k[3]
+          ADD                   r8, r8, r9                 @ x[i+5] + x[i+25] 
+ 
+          LDR                   r0, [r10, #8]
+          LDRSH                 r1, [r4, #12]              @ x[i+6]
+          LDRSH                 r2, [r4, #48]              @ x[i+24]
+          SMLABB                r14, r6, r0, r14           @ (x[i+4] + x[i+26]) * fir_7k[4]
+          LDRSH                 r6, [r4, #14]              @ x[i+7] 
+          LDRSH                 r7, [r4, #46]              @ x[i+23]
+          SMLABT                r14, r8, r0, r14           @ (x[i+5] + x[i+25]) * fir_7k[5]
+          LDR                   r0, [r10, #12]
+          ADD                   r1, r1, r2                 @ (x[i+6] + x[i+24])
+          ADD                   r6, r6, r7                 @ (x[i+7] + x[i+23])
+          SMLABB                r14, r1, r0, r14           @ (x[i+6] + x[i+24]) * fir_7k[6]
+          LDRSH                 r8, [r4, #16]              @ x[i+8]
+          LDRSH                 r9, [r4, #44]              @ x[i+22] 
+          SMLABT                r14, r6, r0, r14           @ (x[i+7] + x[i+23]) * fir_7k[7]  
+          LDR                   r0, [r10, #16]
+          LDRSH                 r1, [r4, #18]              @ x[i+9]
+          LDRSH                 r2, [r4, #42]              @ x[i+21]
+          LDRSH                 r6, [r4, #20]              @ x[i+10]
+          LDRSH                 r7, [r4, #40]              @ x[i+20]
+          ADD                   r8, r8, r9                 @ (x[i+8] + x[i+22])
+          ADD                   r1, r1, r2                 @ (x[i+9] + x[i+21])
+          ADD                   r6, r6, r7                 @ (x[i+10] + x[i+20])
+          SMLABB                r14, r8, r0, r14           @ (x[i+8] + x[i+22]) * fir_7k[8]
+          LDRSH                 r8, [r4, #22]              @ x[i+11]
+          LDRSH                 r9, [r4, #38]              @ x[i+19]
+          SMLABT                r14, r1, r0, r14           @ (x[i+9] + x[i+21]) * fir_7k[9]
+          LDR                   r0, [r10, #20]
+          LDRSH                 r1, [r4, #24]              @ x[i+12]
+          LDRSH                 r2, [r4, #36]              @ x[i+18]
+          SMLABB                r14, r6, r0, r14           @ (x[i+10] + x[i+20]) * fir_7k[10]
+          LDRSH                 r6, [r4, #26]              @ x[i+13]
+          ADD                   r8, r8, r9                 @ (x[i+11] + x[i+19])  
+          LDRSH                 r7, [r4, #34]              @ x[i+17]
+          SMLABT                r14, r8, r0, r14           @ (x[i+11] + x[i+19]) * fir_7k[11]
+          LDR                   r0, [r10, #24]
+          ADD                   r1, r1, r2                 @ x[i+12] + x[i+18]
+          LDRSH                 r8, [r4, #28]              @ x[i+14]
+          SMLABB                r14, r1, r0, r14           @ (x[i+12] + x[i+18]) * fir_7k[12]
+          ADD                   r6, r6, r7                 @ (x[i+13] + x[i+17])
+          LDRSH                 r9, [r4, #32]              @ x[i+16] 
+          SMLABT                r14, r6, r0, r14           @ (x[i+13] + x[i+17]) * fir_7k[13]
+          LDR                   r0, [r10, #28]         
+          ADD                   r8, r8, r9                 @ (x[i+14] + x[i+16])
+          LDRSH                 r1, [r4, #30]              @ x[i+15]
+          SMLABB                r14, r8, r0, r14           @ (x[i+14] + x[i+16]) * fir_7k[14]
+          SMLABT                r14, r1, r0, r14           @ x[i+15] * fir_7k[15]                              
+
+          ADD     		r5, r5, #1
+          ADD     		r14, r14, #0x4000
+          ADD     		r4, r4, #2                
+          MOV     		r1, r14, ASR #15
+          CMP     		r5, #80
+          STRH    		r1, [r3], #2               @signal[i] = (L_tmp + 0x4000) >> 15
+          BLT     		LOOP2      
+           
+          LDR     		r1, [sp, #-4]               @mem address
+          ADD     		r0, r13, #160               @x + lg
+          MOV     		r2, #30
+          BL      		voAWB_Copy
+                    
+Filt_6k_7k_end:
+          ADD     		r13, r13, #240  
+          LDMFD   		r13!, {r4 - r12, r15} 
+ 
+Lable1:
+          .word   		fir_6k_7k
+          @ENDFUNC
+          .END
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Syn_filt_32_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Syn_filt_32_opt.s
index 6416634..70464e4 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Syn_filt_32_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Syn_filt_32_opt.s
@@ -1,226 +1,226 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-@

-@void Syn_filt_32(

-@     Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients */

-@     Word16 m,                             /* (i)     : order of LP filter             */

-@     Word16 exc[],                         /* (i) Qnew: excitation (exc[i] >> Qnew)    */

-@     Word16 Qnew,                          /* (i)     : exc scaling = 0(min) to 8(max) */

-@     Word16 sig_hi[],                      /* (o) /16 : synthesis high                 */

-@     Word16 sig_lo[],                      /* (o) /16 : synthesis low                  */

-@     Word16 lg                             /* (i)     : size of filtering              */

-@)

-@***************************************************************

-@

-@ a[]      --- r0

-@ m        --- r1

-@ exc[]    --- r2

-@ Qnew     --- r3

-@ sig_hi[] --- r4

-@ sig_lo[] --- r5

-@ lg       --- r6

-

-          .section  .text

-          .global  Syn_filt_32_asm

-

-Syn_filt_32_asm:

-

-          STMFD   	r13!, {r4 - r12, r14} 

-          LDR           r4,  [r13, #40]                  @ get sig_hi[] address

-          LDR           r5,  [r13, #44]                  @ get sig_lo[] address

-

-          LDRSH         r6,  [r0]                        @ load Aq[0]

-          ADD           r7,  r3, #4                      @ 4 + Q_new

-          MOV           r3, r6, ASR r7                   @ a0 = Aq[0] >> (4 + Q_new)

-

-          LDR           r14, =0xffff

-          LDRSH         r6, [r0, #2]                     @ load Aq[1]

-          LDRSH         r7, [r0, #4]                     @ load Aq[2]

-          LDRSH         r8, [r0, #6]                     @ load Aq[3]

-          LDRSH         r9, [r0, #8]                     @ load Aq[4]

-          AND           r6, r6, r14

-          AND           r8, r8, r14

-          ORR           r10, r6, r7, LSL #16             @ Aq[2] -- Aq[1]

-          ORR           r11, r8, r9, LSL #16             @ Aq[4] -- Aq[3]

-          STR           r10, [r13, #-4]                  

-          STR           r11, [r13, #-8]

-

-          LDRSH         r6, [r0, #10]                    @ load Aq[5]

-          LDRSH         r7, [r0, #12]                    @ load Aq[6]

-          LDRSH         r8, [r0, #14]                    @ load Aq[7]

-          LDRSH         r9, [r0, #16]                    @ load Aq[8]

-          AND           r6, r6, r14

-          AND           r8, r8, r14

-          ORR           r10, r6, r7, LSL #16             @ Aq[6] -- Aq[5]

-          ORR           r11, r8, r9, LSL #16             @ Aq[8] -- Aq[7]

-          STR           r10, [r13, #-12]

-          STR           r11, [r13, #-16]

-

-          LDRSH         r6, [r0, #18]                    @ load Aq[9]

-          LDRSH         r7, [r0, #20]                    @ load Aq[10]

-          LDRSH         r8, [r0, #22]                    @ load Aq[11]

-          LDRSH         r9, [r0, #24]                    @ load Aq[12]

-          AND           r6, r6, r14 

-          AND           r8, r8, r14

-          ORR           r10, r6, r7, LSL #16             @ Aq[10] -- Aq[9]

-          ORR           r11, r8, r9, LSL #16             @ Aq[12] -- Aq[11]

-          STR           r10, [r13, #-20]

-          STR           r11, [r13, #-24]  

-

-          LDRSH         r6, [r0, #26]                    @ load Aq[13]

-          LDRSH         r7, [r0, #28]                    @ load Aq[14]

-          LDRSH         r8, [r0, #30]                    @ load Aq[15]

-          LDRSH         r9, [r0, #32]                    @ load Aq[16]

-          AND           r6, r6, r14

-          AND           r8, r8, r14

-          ORR           r10, r6, r7, LSL #16             @ Aq[14] -- Aq[13]

-          ORR           r11, r8, r9, LSL #16             @ Aq[16] -- Aq[15]

-          STR           r10, [r13, #-28]

-          STR           r11, [r13, #-32]

-          

-          MOV           r8, #0                           @ i = 0

-              

-LOOP:            

-          LDRSH         r6, [r5, #-2]                    @ load sig_lo[i-1]

-          LDRSH         r7, [r5, #-4]                    @ load sig_lo[i-2]

-

-          LDR           r11, [r13, #-4]                  @ Aq[2] -- Aq[1]        

-          LDRSH         r9, [r5, #-6]                    @ load sig_lo[i-3]

-          LDRSH         r10, [r5, #-8]                   @ load sig_lo[i-4]

-

-          SMULBB        r12, r6, r11                     @ sig_lo[i-1] * Aq[1]

-

-          LDRSH         r6, [r5, #-10]                   @ load sig_lo[i-5]

-          SMLABT        r12, r7, r11, r12                @ sig_lo[i-2] * Aq[2]

-          LDR           r11, [r13, #-8]                  @ Aq[4] -- Aq[3]

-          LDRSH         r7, [r5, #-12]                   @ load sig_lo[i-6]

-          SMLABB        r12, r9, r11, r12                @ sig_lo[i-3] * Aq[3]

-          LDRSH         r9, [r5, #-14]                   @ load sig_lo[i-7]

-          SMLABT        r12, r10, r11, r12               @ sig_lo[i-4] * Aq[4]

-          LDR           r11, [r13, #-12]                 @ Aq[6] -- Aq[5]

-          LDRSH         r10, [r5, #-16]                  @ load sig_lo[i-8]

-          SMLABB        r12, r6, r11, r12                @ sig_lo[i-5] * Aq[5]

-          LDRSH         r6,  [r5, #-18]                  @ load sig_lo[i-9]

-          SMLABT        r12, r7, r11, r12                @ sig_lo[i-6] * Aq[6]

-          LDR           r11, [r13, #-16]                 @ Aq[8] -- Aq[7]

-          LDRSH         r7,  [r5, #-20]                  @ load sig_lo[i-10]

-          SMLABB        r12, r9, r11, r12                @ sig_lo[i-7] * Aq[7]

-          LDRSH         r9, [r5, #-22]                   @ load sig_lo[i-11]

-          SMLABT        r12, r10, r11, r12               @ sig_lo[i-8] * Aq[8]

-          LDR           r11, [r13, #-20]                 @ Aq[10] -- Aq[9]

-          LDRSH         r10,[r5, #-24]                   @ load sig_lo[i-12]

-          SMLABB        r12, r6, r11, r12                @ sig_lo[i-9] * Aq[9]

-          LDRSH         r6, [r5, #-26]                   @ load sig_lo[i-13]

-          SMLABT        r12, r7, r11, r12                @ sig_lo[i-10] * Aq[10]

-          LDR           r11, [r13, #-24]                 @ Aq[12] -- Aq[11]

-          LDRSH         r7, [r5, #-28]                   @ load sig_lo[i-14]

-          SMLABB        r12, r9, r11, r12                @ sig_lo[i-11] * Aq[11]

-          LDRSH         r9, [r5, #-30]                   @ load sig_lo[i-15]

-          SMLABT        r12, r10, r11, r12               @ sig_lo[i-12] * Aq[12]

-

-          LDR           r11, [r13, #-28]                 @ Aq[14] -- Aq[13]

-          LDRSH         r10, [r5, #-32]                  @ load sig_lo[i-16]

-          SMLABB        r12, r6, r11, r12                @ sig_lo[i-13] * Aq[13]

-          SMLABT        r12, r7, r11, r12                @ sig_lo[i-14] * Aq[14]

- 

-          LDR           r11, [r13, #-32]                 @ Aq[16] -- Aq[15]

-          LDRSH         r6, [r2],#2                      @ load exc[i] 

-          SMLABB        r12, r9, r11, r12                @ sig_lo[i-15] * Aq[15]

-          SMLABT        r12, r10, r11, r12               @ sig_lo[i-16] * Aq[16]

-          MUL           r7, r6, r3                       @ exc[i] * a0 

-          RSB           r14, r12, #0                     @ L_tmp

-          MOV           r14, r14, ASR #11                @ L_tmp >>= 11

-          ADD           r14, r14, r7, LSL #1             @ L_tmp += (exc[i] * a0) << 1

-

-

-          LDRSH         r6, [r4, #-2]                    @ load sig_hi[i-1]

-          LDRSH         r7, [r4, #-4]                    @ load sig_hi[i-2]

-

-          LDR           r11, [r13, #-4]                  @ Aq[2] -- Aq[1]        

-          LDRSH         r9, [r4, #-6]                    @ load sig_hi[i-3]

-          LDRSH         r10, [r4, #-8]                   @ load sig_hi[i-4]

-          SMULBB        r12, r6, r11                     @ sig_hi[i-1] * Aq[1]

-          LDRSH         r6, [r4, #-10]                   @ load sig_hi[i-5]

-	  SMLABT        r12, r7, r11, r12                @ sig_hi[i-2] * Aq[2]

-

-          LDR           r11, [r13, #-8]                  @ Aq[4] -- Aq[3]

-          LDRSH         r7, [r4, #-12]                   @ load sig_hi[i-6]

-

-          SMLABB        r12, r9, r11, r12                @ sig_hi[i-3] * Aq[3]

-	  LDRSH         r9, [r4, #-14]                   @ load sig_hi[i-7]

-

-	  SMLABT        r12, r10, r11, r12               @ sig_hi[i-4] * Aq[4]

-

-          LDR           r11, [r13, #-12]                 @ Aq[6] -- Aq[5]

-          LDRSH         r10, [r4, #-16]                  @ load sig_hi[i-8]

-

-	  SMLABB        r12, r6, r11, r12                @ sig_hi[i-5] * Aq[5]

-

-	  LDRSH         r6,  [r4, #-18]                  @ load sig_hi[i-9]

-	  SMLABT        r12, r7, r11, r12                @ sig_hi[i-6] * Aq[6]

-

-          LDR           r11, [r13, #-16]                 @ Aq[8] -- Aq[7]

-          LDRSH         r7,  [r4, #-20]                  @ load sig_hi[i-10]

-

-	  SMLABB        r12, r9, r11, r12                @ sig_hi[i-7] * Aq[7]

-

-	  LDRSH         r9, [r4, #-22]                   @ load sig_hi[i-11]

-

-	  SMLABT        r12, r10, r11, r12               @ sig_hi[i-8] * Aq[8]

-

-          LDR           r11, [r13, #-20]                 @ Aq[10] -- Aq[9]

-          LDRSH         r10,[r4, #-24]                   @ load sig_hi[i-12]

-

-	  SMLABB        r12, r6, r11, r12                @ sig_hi[i-9] * Aq[9]

-          LDRSH         r6, [r4, #-26]                   @ load sig_hi[i-13]

-          SMLABT        r12, r7, r11, r12                @ sig_hi[i-10] * Aq[10]

-

-          LDR           r11, [r13, #-24]                 @ Aq[12] -- Aq[11]

-          LDRSH         r7, [r4, #-28]                   @ load sig_hi[i-14]

-          SMLABB        r12, r9, r11, r12                @ sig_hi[i-11] * Aq[11]

-          LDRSH         r9, [r4, #-30]                   @ load sig_hi[i-15]

-          SMLABT        r12, r10, r11, r12               @ sig_hi[i-12] * Aq[12]

-

-          LDR           r11, [r13, #-28]                 @ Aq[14] -- Aq[13]

-          LDRSH         r10, [r4, #-32]                  @ load sig_hi[i-16]

-          SMLABB        r12, r6, r11, r12                @ sig_hi[i-13] * Aq[13]

-          SMLABT        r12, r7, r11, r12                @ sig_hi[i-14] * Aq[14]

- 

-          LDR           r11, [r13, #-32]                 @ Aq[16] -- Aq[15]

-          SMLABB        r12, r9, r11, r12                @ sig_hi[i-15] * Aq[15]

-          SMLABT        r12, r10, r11, r12               @ sig_hi[i-16] * Aq[16]       

-          ADD           r6, r12, r12                     @ r12 << 1

-          SUB           r14, r14, r6                     

-          MOV           r14, r14, LSL #3                 @ L_tmp <<=3

-  

-          MOV           r7, r14, ASR #16                 @ L_tmp >> 16

-

-          MOV           r14, r14, ASR #4                 @ L_tmp >>=4

-          STRH          r7, [r4], #2                         @ sig_hi[i] = L_tmp >> 16

-          SUB           r9, r14, r7, LSL #12             @ sig_lo[i] = L_tmp - (sig_hi[i] << 12)

-

-          ADD           r8, r8, #1

-          STRH          r9, [r5], #2   

-          CMP           r8, #64

-          BLT           LOOP                            

-         

-Syn_filt_32_end:

-		     

-          LDMFD   	    r13!, {r4 - r12, r15} 

-          @ENDFUNC

-          .END

- 

-

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@void Syn_filt_32(
+@     Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients */
+@     Word16 m,                             /* (i)     : order of LP filter             */
+@     Word16 exc[],                         /* (i) Qnew: excitation (exc[i] >> Qnew)    */
+@     Word16 Qnew,                          /* (i)     : exc scaling = 0(min) to 8(max) */
+@     Word16 sig_hi[],                      /* (o) /16 : synthesis high                 */
+@     Word16 sig_lo[],                      /* (o) /16 : synthesis low                  */
+@     Word16 lg                             /* (i)     : size of filtering              */
+@)
+@***************************************************************
+@
+@ a[]      --- r0
+@ m        --- r1
+@ exc[]    --- r2
+@ Qnew     --- r3
+@ sig_hi[] --- r4
+@ sig_lo[] --- r5
+@ lg       --- r6
+
+          .section  .text
+          .global  Syn_filt_32_asm
+
+Syn_filt_32_asm:
+
+          STMFD   	r13!, {r4 - r12, r14} 
+          LDR           r4,  [r13, #40]                  @ get sig_hi[] address
+          LDR           r5,  [r13, #44]                  @ get sig_lo[] address
+
+          LDRSH         r6,  [r0]                        @ load Aq[0]
+          ADD           r7,  r3, #4                      @ 4 + Q_new
+          MOV           r3, r6, ASR r7                   @ a0 = Aq[0] >> (4 + Q_new)
+
+          LDR           r14, =0xffff
+          LDRSH         r6, [r0, #2]                     @ load Aq[1]
+          LDRSH         r7, [r0, #4]                     @ load Aq[2]
+          LDRSH         r8, [r0, #6]                     @ load Aq[3]
+          LDRSH         r9, [r0, #8]                     @ load Aq[4]
+          AND           r6, r6, r14
+          AND           r8, r8, r14
+          ORR           r10, r6, r7, LSL #16             @ Aq[2] -- Aq[1]
+          ORR           r11, r8, r9, LSL #16             @ Aq[4] -- Aq[3]
+          STR           r10, [r13, #-4]                  
+          STR           r11, [r13, #-8]
+
+          LDRSH         r6, [r0, #10]                    @ load Aq[5]
+          LDRSH         r7, [r0, #12]                    @ load Aq[6]
+          LDRSH         r8, [r0, #14]                    @ load Aq[7]
+          LDRSH         r9, [r0, #16]                    @ load Aq[8]
+          AND           r6, r6, r14
+          AND           r8, r8, r14
+          ORR           r10, r6, r7, LSL #16             @ Aq[6] -- Aq[5]
+          ORR           r11, r8, r9, LSL #16             @ Aq[8] -- Aq[7]
+          STR           r10, [r13, #-12]
+          STR           r11, [r13, #-16]
+
+          LDRSH         r6, [r0, #18]                    @ load Aq[9]
+          LDRSH         r7, [r0, #20]                    @ load Aq[10]
+          LDRSH         r8, [r0, #22]                    @ load Aq[11]
+          LDRSH         r9, [r0, #24]                    @ load Aq[12]
+          AND           r6, r6, r14 
+          AND           r8, r8, r14
+          ORR           r10, r6, r7, LSL #16             @ Aq[10] -- Aq[9]
+          ORR           r11, r8, r9, LSL #16             @ Aq[12] -- Aq[11]
+          STR           r10, [r13, #-20]
+          STR           r11, [r13, #-24]  
+
+          LDRSH         r6, [r0, #26]                    @ load Aq[13]
+          LDRSH         r7, [r0, #28]                    @ load Aq[14]
+          LDRSH         r8, [r0, #30]                    @ load Aq[15]
+          LDRSH         r9, [r0, #32]                    @ load Aq[16]
+          AND           r6, r6, r14
+          AND           r8, r8, r14
+          ORR           r10, r6, r7, LSL #16             @ Aq[14] -- Aq[13]
+          ORR           r11, r8, r9, LSL #16             @ Aq[16] -- Aq[15]
+          STR           r10, [r13, #-28]
+          STR           r11, [r13, #-32]
+          
+          MOV           r8, #0                           @ i = 0
+              
+LOOP:            
+          LDRSH         r6, [r5, #-2]                    @ load sig_lo[i-1]
+          LDRSH         r7, [r5, #-4]                    @ load sig_lo[i-2]
+
+          LDR           r11, [r13, #-4]                  @ Aq[2] -- Aq[1]        
+          LDRSH         r9, [r5, #-6]                    @ load sig_lo[i-3]
+          LDRSH         r10, [r5, #-8]                   @ load sig_lo[i-4]
+
+          SMULBB        r12, r6, r11                     @ sig_lo[i-1] * Aq[1]
+
+          LDRSH         r6, [r5, #-10]                   @ load sig_lo[i-5]
+          SMLABT        r12, r7, r11, r12                @ sig_lo[i-2] * Aq[2]
+          LDR           r11, [r13, #-8]                  @ Aq[4] -- Aq[3]
+          LDRSH         r7, [r5, #-12]                   @ load sig_lo[i-6]
+          SMLABB        r12, r9, r11, r12                @ sig_lo[i-3] * Aq[3]
+          LDRSH         r9, [r5, #-14]                   @ load sig_lo[i-7]
+          SMLABT        r12, r10, r11, r12               @ sig_lo[i-4] * Aq[4]
+          LDR           r11, [r13, #-12]                 @ Aq[6] -- Aq[5]
+          LDRSH         r10, [r5, #-16]                  @ load sig_lo[i-8]
+          SMLABB        r12, r6, r11, r12                @ sig_lo[i-5] * Aq[5]
+          LDRSH         r6,  [r5, #-18]                  @ load sig_lo[i-9]
+          SMLABT        r12, r7, r11, r12                @ sig_lo[i-6] * Aq[6]
+          LDR           r11, [r13, #-16]                 @ Aq[8] -- Aq[7]
+          LDRSH         r7,  [r5, #-20]                  @ load sig_lo[i-10]
+          SMLABB        r12, r9, r11, r12                @ sig_lo[i-7] * Aq[7]
+          LDRSH         r9, [r5, #-22]                   @ load sig_lo[i-11]
+          SMLABT        r12, r10, r11, r12               @ sig_lo[i-8] * Aq[8]
+          LDR           r11, [r13, #-20]                 @ Aq[10] -- Aq[9]
+          LDRSH         r10,[r5, #-24]                   @ load sig_lo[i-12]
+          SMLABB        r12, r6, r11, r12                @ sig_lo[i-9] * Aq[9]
+          LDRSH         r6, [r5, #-26]                   @ load sig_lo[i-13]
+          SMLABT        r12, r7, r11, r12                @ sig_lo[i-10] * Aq[10]
+          LDR           r11, [r13, #-24]                 @ Aq[12] -- Aq[11]
+          LDRSH         r7, [r5, #-28]                   @ load sig_lo[i-14]
+          SMLABB        r12, r9, r11, r12                @ sig_lo[i-11] * Aq[11]
+          LDRSH         r9, [r5, #-30]                   @ load sig_lo[i-15]
+          SMLABT        r12, r10, r11, r12               @ sig_lo[i-12] * Aq[12]
+
+          LDR           r11, [r13, #-28]                 @ Aq[14] -- Aq[13]
+          LDRSH         r10, [r5, #-32]                  @ load sig_lo[i-16]
+          SMLABB        r12, r6, r11, r12                @ sig_lo[i-13] * Aq[13]
+          SMLABT        r12, r7, r11, r12                @ sig_lo[i-14] * Aq[14]
+ 
+          LDR           r11, [r13, #-32]                 @ Aq[16] -- Aq[15]
+          LDRSH         r6, [r2],#2                      @ load exc[i] 
+          SMLABB        r12, r9, r11, r12                @ sig_lo[i-15] * Aq[15]
+          SMLABT        r12, r10, r11, r12               @ sig_lo[i-16] * Aq[16]
+          MUL           r7, r6, r3                       @ exc[i] * a0 
+          RSB           r14, r12, #0                     @ L_tmp
+          MOV           r14, r14, ASR #11                @ L_tmp >>= 11
+          ADD           r14, r14, r7, LSL #1             @ L_tmp += (exc[i] * a0) << 1
+
+
+          LDRSH         r6, [r4, #-2]                    @ load sig_hi[i-1]
+          LDRSH         r7, [r4, #-4]                    @ load sig_hi[i-2]
+
+          LDR           r11, [r13, #-4]                  @ Aq[2] -- Aq[1]        
+          LDRSH         r9, [r4, #-6]                    @ load sig_hi[i-3]
+          LDRSH         r10, [r4, #-8]                   @ load sig_hi[i-4]
+          SMULBB        r12, r6, r11                     @ sig_hi[i-1] * Aq[1]
+          LDRSH         r6, [r4, #-10]                   @ load sig_hi[i-5]
+	  SMLABT        r12, r7, r11, r12                @ sig_hi[i-2] * Aq[2]
+
+          LDR           r11, [r13, #-8]                  @ Aq[4] -- Aq[3]
+          LDRSH         r7, [r4, #-12]                   @ load sig_hi[i-6]
+
+          SMLABB        r12, r9, r11, r12                @ sig_hi[i-3] * Aq[3]
+	  LDRSH         r9, [r4, #-14]                   @ load sig_hi[i-7]
+
+	  SMLABT        r12, r10, r11, r12               @ sig_hi[i-4] * Aq[4]
+
+          LDR           r11, [r13, #-12]                 @ Aq[6] -- Aq[5]
+          LDRSH         r10, [r4, #-16]                  @ load sig_hi[i-8]
+
+	  SMLABB        r12, r6, r11, r12                @ sig_hi[i-5] * Aq[5]
+
+	  LDRSH         r6,  [r4, #-18]                  @ load sig_hi[i-9]
+	  SMLABT        r12, r7, r11, r12                @ sig_hi[i-6] * Aq[6]
+
+          LDR           r11, [r13, #-16]                 @ Aq[8] -- Aq[7]
+          LDRSH         r7,  [r4, #-20]                  @ load sig_hi[i-10]
+
+	  SMLABB        r12, r9, r11, r12                @ sig_hi[i-7] * Aq[7]
+
+	  LDRSH         r9, [r4, #-22]                   @ load sig_hi[i-11]
+
+	  SMLABT        r12, r10, r11, r12               @ sig_hi[i-8] * Aq[8]
+
+          LDR           r11, [r13, #-20]                 @ Aq[10] -- Aq[9]
+          LDRSH         r10,[r4, #-24]                   @ load sig_hi[i-12]
+
+	  SMLABB        r12, r6, r11, r12                @ sig_hi[i-9] * Aq[9]
+          LDRSH         r6, [r4, #-26]                   @ load sig_hi[i-13]
+          SMLABT        r12, r7, r11, r12                @ sig_hi[i-10] * Aq[10]
+
+          LDR           r11, [r13, #-24]                 @ Aq[12] -- Aq[11]
+          LDRSH         r7, [r4, #-28]                   @ load sig_hi[i-14]
+          SMLABB        r12, r9, r11, r12                @ sig_hi[i-11] * Aq[11]
+          LDRSH         r9, [r4, #-30]                   @ load sig_hi[i-15]
+          SMLABT        r12, r10, r11, r12               @ sig_hi[i-12] * Aq[12]
+
+          LDR           r11, [r13, #-28]                 @ Aq[14] -- Aq[13]
+          LDRSH         r10, [r4, #-32]                  @ load sig_hi[i-16]
+          SMLABB        r12, r6, r11, r12                @ sig_hi[i-13] * Aq[13]
+          SMLABT        r12, r7, r11, r12                @ sig_hi[i-14] * Aq[14]
+ 
+          LDR           r11, [r13, #-32]                 @ Aq[16] -- Aq[15]
+          SMLABB        r12, r9, r11, r12                @ sig_hi[i-15] * Aq[15]
+          SMLABT        r12, r10, r11, r12               @ sig_hi[i-16] * Aq[16]       
+          ADD           r6, r12, r12                     @ r12 << 1
+          SUB           r14, r14, r6                     
+          MOV           r14, r14, LSL #3                 @ L_tmp <<=3
+  
+          MOV           r7, r14, ASR #16                 @ L_tmp >> 16
+
+          MOV           r14, r14, ASR #4                 @ L_tmp >>=4
+          STRH          r7, [r4], #2                         @ sig_hi[i] = L_tmp >> 16
+          SUB           r9, r14, r7, LSL #12             @ sig_lo[i] = L_tmp - (sig_hi[i] << 12)
+
+          ADD           r8, r8, #1
+          STRH          r9, [r5], #2   
+          CMP           r8, #64
+          BLT           LOOP                            
+         
+Syn_filt_32_end:
+		     
+          LDMFD   	    r13!, {r4 - r12, r15} 
+          @ENDFUNC
+          .END
+ 
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/cor_h_vec_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/cor_h_vec_opt.s
index 441b984..8f32733 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/cor_h_vec_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/cor_h_vec_opt.s
@@ -1,151 +1,151 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-@static void cor_h_vec_012(

-@		Word16 h[],                           /* (i) scaled impulse response                 */

-@		Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */

-@		Word16 track,                         /* (i) track to use                            */

-@		Word16 sign[],                        /* (i) sign vector                             */

-@		Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */

-@		Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */

-@		Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */

-@)

-@r0 ---- h[]

-@r1 ---- vec[]

-@r2 ---- track

-@r3 ---- sign[]

-@r4 ---- rrixix[][NB_POS]

-@r5 ---- cor_1[]

-@r6 ---- cor_2[]

-

-

-          .section  .text

-	  .global  cor_h_vec_012_asm

-

-cor_h_vec_012_asm:

-

-         STMFD         r13!, {r4 - r12, r14}

-	 LDR           r4, [r13, #40]                    @load rrixix[][NB_POS]

-	 ADD           r7, r4, r2, LSL #5                @r7 --- p0 = rrixix[track]

-         MOV           r4, #0                            @i=0

-

-	 @r0 --- h[], r1 --- vec[],  r2 --- pos

-	 @r3 --- sign[], r4 --- i, r7 --- p0

-LOOPi:

-         MOV           r5, #0                            @L_sum1 = 0

-         MOV           r6, #0                            @L_sum2 = 0

-         ADD           r9, r1, r2, LSL #1                @p2 = &vec[pos]

-         MOV           r10, r0                           @p1 = h

-         RSB           r11, r2, #62                      @j=62-pos

-

-LOOPj1:

-	 LDRSH         r12, [r10], #2  

-	 LDRSH         r8,  [r9], #2

-	 LDRSH         r14, [r9]

-	 SUBS          r11, r11, #1

-         MLA           r5, r12, r8, r5

-         MLA           r6, r12, r14, r6	 

-	 BGE           LOOPj1

-

-	 LDRSH         r12, [r10], #2                     @*p1++

-	 MOV           r6, r6, LSL #2                     @L_sum2 = (L_sum2 << 2)

-         MLA           r5, r12, r14, r5

-         MOV           r14, #0x8000

-         MOV           r5, r5, LSL #2                     @L_sum1 = (L_sum1 << 2)

-         ADD           r10, r6, r14         

-         ADD           r9, r5, r14

-         MOV           r5, r9, ASR #16

-         MOV           r6, r10, ASR #16

-         ADD           r9, r3, r2, LSL #1                 @address of sign[pos]

-         ADD           r8, r7, #32

-         LDRSH         r10, [r9], #2                 	  @sign[pos]

-	 LDRSH         r11, [r9]                          @sign[pos + 1]

-	 MUL           r12, r5, r10

-	 MUL           r14, r6, r11

-	 MOV           r5, r12, ASR #15

-	 MOV           r6, r14, ASR #15

-	 LDR           r9,  [r13, #44]                   

-	 LDR           r12, [r13, #48]

-         LDRSH         r10, [r7], #2                      @*p0++

-	 LDRSH         r11, [r8]                          @*p3++

-         ADD           r9, r9, r4, LSL #1

-	 ADD           r12, r12, r4, LSL #1

-	 ADD           r5, r5, r10

-	 ADD           r6, r6, r11

-	 STRH          r5, [r9]

-	 STRH          r6, [r12]

-

-         ADD           r2, r2, #4

- 

-         MOV           r5, #0                            @L_sum1 = 0

-	 MOV           r6, #0                            @L_sum2 = 0

-	 ADD           r9, r1, r2, LSL #1                @p2 = &vec[pos]

-	 MOV           r10, r0                           @p1 = h

-	 RSB           r11, r2, #62                      @j=62-pos

-	 ADD           r4, r4, #1                        @i++

-

-LOOPj2:

-	 LDRSH         r12, [r10], #2  

-	 LDRSH         r8,  [r9], #2

-	 LDRSH         r14, [r9]

-	 SUBS          r11, r11, #1

-         MLA           r5, r12, r8, r5

-         MLA           r6, r12, r14, r6	 

-	 BGE           LOOPj2

-

-	 LDRSH         r12, [r10], #2                     @*p1++

-	 MOV           r6, r6, LSL #2                     @L_sum2 = (L_sum2 << 2)

-         MLA           r5, r12, r14, r5

-         MOV           r14, #0x8000

-         MOV           r5, r5, LSL #2                     @L_sum1 = (L_sum1 << 2)

-         ADD           r10, r6, r14        

-         ADD           r9, r5, r14

-

-         MOV           r5, r9, ASR #16

-         MOV           r6, r10, ASR #16

-         ADD           r9, r3, r2, LSL #1                 @address of sign[pos]

-         ADD           r8, r7, #32

-         LDRSH         r10, [r9], #2                 	  @sign[pos]

-	 LDRSH         r11, [r9]                          @sign[pos + 1]

-	 MUL           r12, r5, r10

-	 MUL           r14, r6, r11

-	 MOV           r5, r12, ASR #15

-	 MOV           r6, r14, ASR #15

-	 LDR           r9,  [r13, #44]                   

-	 LDR           r12, [r13, #48]

-         LDRSH         r10, [r7], #2                      @*p0++

-	 LDRSH         r11, [r8]                          @*p3++

-         ADD           r9, r9, r4, LSL #1

-	 ADD           r12, r12, r4, LSL #1

-	 ADD           r5, r5, r10

-	 ADD           r6, r6, r11

-	 STRH          r5, [r9]

-	 STRH          r6, [r12]

-	 ADD           r4, r4, #1                         @i+1

-	 ADD           r2, r2, #4                         @pos += STEP

-	 CMP           r4, #16

-	 

-	 BLT           LOOPi

-         

-the_end:

-         LDMFD         r13!, {r4 - r12, r15}

-      

-         @ENDFUNC

-         .END	 

-        

-	

-	  

-

-

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@static void cor_h_vec_012(
+@		Word16 h[],                           /* (i) scaled impulse response                 */
+@		Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */
+@		Word16 track,                         /* (i) track to use                            */
+@		Word16 sign[],                        /* (i) sign vector                             */
+@		Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */
+@		Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */
+@		Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */
+@)
+@r0 ---- h[]
+@r1 ---- vec[]
+@r2 ---- track
+@r3 ---- sign[]
+@r4 ---- rrixix[][NB_POS]
+@r5 ---- cor_1[]
+@r6 ---- cor_2[]
+
+
+          .section  .text
+	  .global  cor_h_vec_012_asm
+
+cor_h_vec_012_asm:
+
+         STMFD         r13!, {r4 - r12, r14}
+	 LDR           r4, [r13, #40]                    @load rrixix[][NB_POS]
+	 ADD           r7, r4, r2, LSL #5                @r7 --- p0 = rrixix[track]
+         MOV           r4, #0                            @i=0
+
+	 @r0 --- h[], r1 --- vec[],  r2 --- pos
+	 @r3 --- sign[], r4 --- i, r7 --- p0
+LOOPi:
+         MOV           r5, #0                            @L_sum1 = 0
+         MOV           r6, #0                            @L_sum2 = 0
+         ADD           r9, r1, r2, LSL #1                @p2 = &vec[pos]
+         MOV           r10, r0                           @p1 = h
+         RSB           r11, r2, #62                      @j=62-pos
+
+LOOPj1:
+	 LDRSH         r12, [r10], #2  
+	 LDRSH         r8,  [r9], #2
+	 LDRSH         r14, [r9]
+	 SUBS          r11, r11, #1
+         MLA           r5, r12, r8, r5
+         MLA           r6, r12, r14, r6	 
+	 BGE           LOOPj1
+
+	 LDRSH         r12, [r10], #2                     @*p1++
+	 MOV           r6, r6, LSL #2                     @L_sum2 = (L_sum2 << 2)
+         MLA           r5, r12, r14, r5
+         MOV           r14, #0x8000
+         MOV           r5, r5, LSL #2                     @L_sum1 = (L_sum1 << 2)
+         ADD           r10, r6, r14         
+         ADD           r9, r5, r14
+         MOV           r5, r9, ASR #16
+         MOV           r6, r10, ASR #16
+         ADD           r9, r3, r2, LSL #1                 @address of sign[pos]
+         ADD           r8, r7, #32
+         LDRSH         r10, [r9], #2                 	  @sign[pos]
+	 LDRSH         r11, [r9]                          @sign[pos + 1]
+	 MUL           r12, r5, r10
+	 MUL           r14, r6, r11
+	 MOV           r5, r12, ASR #15
+	 MOV           r6, r14, ASR #15
+	 LDR           r9,  [r13, #44]                   
+	 LDR           r12, [r13, #48]
+         LDRSH         r10, [r7], #2                      @*p0++
+	 LDRSH         r11, [r8]                          @*p3++
+         ADD           r9, r9, r4, LSL #1
+	 ADD           r12, r12, r4, LSL #1
+	 ADD           r5, r5, r10
+	 ADD           r6, r6, r11
+	 STRH          r5, [r9]
+	 STRH          r6, [r12]
+
+         ADD           r2, r2, #4
+ 
+         MOV           r5, #0                            @L_sum1 = 0
+	 MOV           r6, #0                            @L_sum2 = 0
+	 ADD           r9, r1, r2, LSL #1                @p2 = &vec[pos]
+	 MOV           r10, r0                           @p1 = h
+	 RSB           r11, r2, #62                      @j=62-pos
+	 ADD           r4, r4, #1                        @i++
+
+LOOPj2:
+	 LDRSH         r12, [r10], #2  
+	 LDRSH         r8,  [r9], #2
+	 LDRSH         r14, [r9]
+	 SUBS          r11, r11, #1
+         MLA           r5, r12, r8, r5
+         MLA           r6, r12, r14, r6	 
+	 BGE           LOOPj2
+
+	 LDRSH         r12, [r10], #2                     @*p1++
+	 MOV           r6, r6, LSL #2                     @L_sum2 = (L_sum2 << 2)
+         MLA           r5, r12, r14, r5
+         MOV           r14, #0x8000
+         MOV           r5, r5, LSL #2                     @L_sum1 = (L_sum1 << 2)
+         ADD           r10, r6, r14        
+         ADD           r9, r5, r14
+
+         MOV           r5, r9, ASR #16
+         MOV           r6, r10, ASR #16
+         ADD           r9, r3, r2, LSL #1                 @address of sign[pos]
+         ADD           r8, r7, #32
+         LDRSH         r10, [r9], #2                 	  @sign[pos]
+	 LDRSH         r11, [r9]                          @sign[pos + 1]
+	 MUL           r12, r5, r10
+	 MUL           r14, r6, r11
+	 MOV           r5, r12, ASR #15
+	 MOV           r6, r14, ASR #15
+	 LDR           r9,  [r13, #44]                   
+	 LDR           r12, [r13, #48]
+         LDRSH         r10, [r7], #2                      @*p0++
+	 LDRSH         r11, [r8]                          @*p3++
+         ADD           r9, r9, r4, LSL #1
+	 ADD           r12, r12, r4, LSL #1
+	 ADD           r5, r5, r10
+	 ADD           r6, r6, r11
+	 STRH          r5, [r9]
+	 STRH          r6, [r12]
+	 ADD           r4, r4, #1                         @i+1
+	 ADD           r2, r2, #4                         @pos += STEP
+	 CMP           r4, #16
+	 
+	 BLT           LOOPi
+         
+the_end:
+         LDMFD         r13!, {r4 - r12, r15}
+      
+         @ENDFUNC
+         .END	 
+        
+	
+	  
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s
index d5dd8f0..d7b4509 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s
@@ -1,460 +1,460 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-@

-@void Pred_lt4(

-@		  Word16 exc[],                         /* in/out: excitation buffer */

-@		  Word16 T0,                            /* input : integer pitch lag */

-@		  Word16 frac,                          /* input : fraction of lag   */

-@		  Word16 L_subfr                        /* input : subframe size     */

-@	      )

-

-@******************************

-@       ARM Register

-@******************************

-@ r0  ---  exc[]

-@ r1  ---  T0

-@ r2  ---  frac

-@ r3  ---  L_subfr

-

-         .section  .text

-	 .global   pred_lt4_asm

-	 .extern   inter4_2

-

-pred_lt4_asm:

-

-         STMFD     r13!, {r4 - r12, r14} 

-         RSB       r4, r1, #0                         @-T0

-         RSB       r2, r2, #0                         @frac = -frac

-         ADD       r5, r0, r4, LSL #1                 @x = exc - T0

-         CMP       r2, #0

-         ADDLT     r2, r2, #4                         @frac += UP_SAMP

-         SUBLT     r5, r5, #2                         @x--

-         SUB       r5, r5, #30                        @x -= 15

-         RSB       r4, r2, #3                         @k = 3 - frac

-         LDR       r6, Table

-	 MOV       r8, r4, LSL #6                    

-         @MOV       r7, #0                             @j = 0

-         ADD       r8, r6, r8                         @ptr2 = &(inter4_2[k][0])

-

-	 MOV       r1, r5

-	 MOV       r5, #0x8000

-	 MOV       r14, #21

-@ used register

-         @r0 --- exc[]  r1 --- x  r7 --- j  r8 --- ptr2  r5 --- 0x8000

-THREE_LOOP:

-

-         @MOV       r1, r5                             @ptr1 = x

-	 MOV       r2, r8                             @ptr = ptr2

-         LDR       r3, [r2], #4                       @h[0], h[1]

-	 LDRSH     r4, [r1], #2                       @x[0]

-	 LDRSH     r6, [r1], #2                       @x[1]

-	 LDRSH     r9, [r1], #2                       @x[2]

-

-	 SMULBB    r10, r4, r3                        @x[0] * h[0]                  

-	 SMULBB    r11, r6, r3                        @x[1] * h[0]

-	 SMULBB    r12, r9, r3                        @x[2] * h[0]

-

-         LDRSH     r4, [r1], #2                       @x[3]

-	 SMLABT    r10, r6, r3, r10                   @x[1] * h[1]

-         SMLABT    r11, r9, r3, r11                   @x[2] * h[1]

-	 SMLABT    r12, r4, r3, r12                   @x[3] * h[1]

-

-	 LDR       r3, [r2], #4                       @h[2], h[3]

-	 LDRSH     r6, [r1], #2                       @x[4]

-	 SMLABB    r10, r9, r3, r10                   @x[2] * h[2]

-         SMLABB    r11, r4, r3, r11                   @x[3] * h[2]

-         SMLABB    r12, r6, r3, r12                   @x[4] * h[2]

-

-         LDRSH     r9, [r1], #2                       @x[5]

-         SMLABT    r10, r4, r3, r10                   @x[3] * h[3]

-         SMLABT    r11, r6, r3, r11                   @x[4] * h[3]

-         SMLABT    r12, r9, r3, r12                   @x[5] * h[3]

-

-         LDR       r3, [r2], #4                       @h[4], h[5]

-         LDRSH     r4, [r1], #2                       @x[6]

-         SMLABB    r10, r6, r3, r10                   @x[4] * h[4]

-         SMLABB    r11, r9, r3, r11                   @x[5] * h[4]

-         SMLABB    r12, r4, r3, r12                   @x[6] * h[4]

-

-	 LDRSH     r6, [r1], #2                       @x[7]

-	 SMLABT    r10, r9, r3, r10                   @x[5] * h[5]

-	 SMLABT    r11, r4, r3, r11                   @x[6] * h[5]

-	 SMLABT    r12, r6, r3, r12                   @x[7] * h[5]

-

-         LDR       r3, [r2], #4                       @h[6], h[7]

-	 LDRSH     r9, [r1], #2                       @x[8]

-	 SMLABB    r10, r4, r3, r10                   @x[6] * h[6]

-	 SMLABB    r11, r6, r3, r11                   @x[7] * h[6]

-	 SMLABB    r12, r9, r3, r12                   @x[8] * h[6]

-

-	 LDRSH     r4, [r1], #2                       @x[9]

-	 SMLABT    r10, r6, r3, r10                   @x[7] * h[7]

-	 SMLABT    r11, r9, r3, r11                   @x[8] * h[7]

-	 SMLABT    r12, r4, r3, r12                   @x[9] * h[7]

-

-	 LDR       r3, [r2], #4                       @h[8], h[9]

-	 LDRSH     r6, [r1], #2                       @x[10]

-	 SMLABB    r10, r9, r3, r10                   @x[8] * h[8]

-	 SMLABB    r11, r4, r3, r11                   @x[9] * h[8]

-	 SMLABB    r12, r6, r3, r12                   @x[10] * h[8]

-

-	 LDRSH     r9, [r1], #2                       @x[11]

-	 SMLABT    r10, r4, r3, r10                   @x[9] * h[9]

-	 SMLABT    r11, r6, r3, r11                   @x[10] * h[9]

-	 SMLABT    r12, r9, r3, r12                   @x[11] * h[9]

-

-         LDR       r3, [r2], #4                       @h[10], h[11]

-	 LDRSH     r4, [r1], #2                       @x[12]

-         SMLABB    r10, r6, r3, r10                   @x[10] * h[10]

-	 SMLABB    r11, r9, r3, r11                   @x[11] * h[10]

-	 SMLABB    r12, r4, r3, r12                   @x[12] * h[10]

-

-	 LDRSH     r6, [r1], #2                       @x[13]

-	 SMLABT    r10, r9, r3, r10                   @x[11] * h[11]

-	 SMLABT    r11, r4, r3, r11                   @x[12] * h[11]

-	 SMLABT    r12, r6, r3, r12                   @x[13] * h[11]

-

-	 LDR       r3, [r2], #4                       @h[12], h[13]

-	 LDRSH     r9, [r1], #2                       @x[14]

-	 SMLABB    r10, r4, r3, r10                   @x[12] * h[12]

-	 SMLABB    r11, r6, r3, r11                   @x[13] * h[12]

-	 SMLABB    r12, r9, r3, r12                   @x[14] * h[12]

-

-	 LDRSH     r4, [r1], #2                       @x[15]

-	 SMLABT    r10, r6, r3, r10                   @x[13] * h[13]

-	 SMLABT    r11, r9, r3, r11                   @x[14] * h[13]

-	 SMLABT    r12, r4, r3, r12                   @x[15] * h[13]

-

-	 LDR       r3, [r2], #4                       @h[14], h[15]

-	 LDRSH     r6, [r1], #2                       @x[16]

-	 SMLABB    r10, r9, r3, r10                   @x[14] * h[14]

-	 SMLABB    r11, r4, r3, r11                   @x[15] * h[14]

-	 SMLABB    r12, r6, r3, r12                   @x[16] * h[14]

-

-	 LDRSH     r9, [r1], #2                       @x[17]

-         SMLABT    r10, r4, r3, r10                   @x[15] * h[15]

-	 SMLABT    r11, r6, r3, r11                   @x[16] * h[15]

-	 SMLABT    r12, r9, r3, r12                   @x[17] * h[15]

-

-	 LDR       r3, [r2], #4                       @h[16], h[17]

-	 LDRSH     r4, [r1], #2                       @x[18]

-	 SMLABB    r10, r6, r3, r10                   @x[16] * h[16]

-	 SMLABB    r11, r9, r3, r11                   @x[17] * h[16]

-	 SMLABB    r12, r4, r3, r12                   @x[18] * h[16]

-

-         LDRSH     r6, [r1], #2                       @x[19]

-	 SMLABT    r10, r9, r3, r10                   @x[17] * h[17]

-	 SMLABT    r11, r4, r3, r11                   @x[18] * h[17]

-	 SMLABT    r12, r6, r3, r12                   @x[19] * h[17]

-

-	 LDR       r3, [r2], #4                       @h[18], h[19]

-         LDRSH     r9, [r1], #2                       @x[20]

-	 SMLABB    r10, r4, r3, r10                   @x[18] * h[18]

-	 SMLABB    r11, r6, r3, r11                   @x[19] * h[18]

-	 SMLABB    r12, r9, r3, r12                   @x[20] * h[18]

-

-	 LDRSH     r4, [r1], #2                       @x[21]

-	 SMLABT    r10, r6, r3, r10                   @x[19] * h[19]

-	 SMLABT    r11, r9, r3, r11                   @x[20] * h[19]

-	 SMLABT    r12, r4, r3, r12                   @x[21] * h[19]

-

-	 LDR       r3, [r2], #4                       @h[20], h[21]

-	 LDRSH     r6, [r1], #2                       @x[22]

-	 SMLABB    r10, r9, r3, r10                   @x[20] * h[20]

-	 SMLABB    r11, r4, r3, r11                   @x[21] * h[20]

-	 SMLABB    r12, r6, r3, r12                   @x[22] * h[20]

-

-	 LDRSH     r9, [r1], #2                       @x[23]

-	 SMLABT    r10, r4, r3, r10                   @x[21] * h[21]

-	 SMLABT    r11, r6, r3, r11                   @x[22] * h[21]

-	 SMLABT    r12, r9, r3, r12                   @x[23] * h[21]

-

-	 LDR       r3, [r2], #4                       @h[22], h[23]

-	 LDRSH     r4, [r1], #2                       @x[24]

-	 SMLABB    r10, r6, r3, r10                   @x[22] * h[22]

-	 SMLABB    r11, r9, r3, r11                   @x[23] * h[22]

-	 SMLABB    r12, r4, r3, r12                   @x[24] * h[22]

-

-         LDRSH     r6, [r1], #2                       @x[25]

-	 SMLABT    r10, r9, r3, r10                   @x[23] * h[23]

-	 SMLABT    r11, r4, r3, r11                   @x[24] * h[23]

-	 SMLABT    r12, r6, r3, r12                   @x[25] * h[23]

-

-	 LDR       r3, [r2], #4                       @h[24], h[25]

-         LDRSH     r9, [r1], #2                       @x[26]

-	 SMLABB    r10, r4, r3, r10                   @x[24] * h[24]

-	 SMLABB    r11, r6, r3, r11                   @x[25] * h[24]

-	 SMLABB    r12, r9, r3, r12                   @x[26] * h[24]

-

-	 LDRSH     r4, [r1], #2                       @x[27]

-	 SMLABT    r10, r6, r3, r10                   @x[25] * h[25]

-	 SMLABT    r11, r9, r3, r11                   @x[26] * h[25]

-	 SMLABT    r12, r4, r3, r12                   @x[27] * h[25]

-

-	 LDR       r3, [r2], #4                       @h[26], h[27]

-	 LDRSH     r6, [r1], #2                       @x[28]

-	 SMLABB    r10, r9, r3, r10                   @x[26] * h[26]

-	 SMLABB    r11, r4, r3, r11                   @x[27] * h[26]

-	 SMLABB    r12, r6, r3, r12                   @x[28] * h[26]

-

-	 LDRSH     r9, [r1], #2                       @x[29]

-	 SMLABT    r10, r4, r3, r10                   @x[27] * h[27]

-	 SMLABT    r11, r6, r3, r11                   @x[28] * h[27]

-	 SMLABT    r12, r9, r3, r12                   @x[29] * h[27]

-

-	 LDR       r3, [r2], #4                       @h[28], h[29]

-	 LDRSH     r4, [r1], #2                       @x[30]

-	 SMLABB    r10, r6, r3, r10                   @x[28] * h[28]

-	 SMLABB    r11, r9, r3, r11                   @x[29] * h[28]

-	 SMLABB    r12, r4, r3, r12                   @x[30] * h[28]

-

-         LDRSH     r6, [r1], #2                       @x[31]

-	 SMLABT    r10, r9, r3, r10                   @x[29] * h[29]

-	 SMLABT    r11, r4, r3, r11                   @x[30] * h[29]

-	 SMLABT    r12, r6, r3, r12                   @x[31] * h[29]

-

-	 LDR       r3, [r2], #4                       @h[30], h[31]

-         LDRSH     r9, [r1], #2                       @x[32]

-	 SMLABB    r10, r4, r3, r10                   @x[30] * h[30]

-	 SMLABB    r11, r6, r3, r11                   @x[31] * h[30]

-	 SMLABB    r12, r9, r3, r12                   @x[32] * h[30]

-

-	 LDRSH     r4, [r1], #-60                     @x[33]

-	 SMLABT    r10, r6, r3, r10                   @x[31] * h[31]

-	 SMLABT    r11, r9, r3, r11                   @x[32] * h[31]

-	 SMLABT    r12, r4, r3, r12                   @x[33] * h[31]

-

-	 @SSAT      r10, #32, r10, LSL #2

-	 @SSAT      r11, #32, r11, LSL #2

-	 @SSAT      r12, #32, r12, LSL #2

-

-	 MOV       r10, r10, LSL #1

-	 MOV       r11, r11, LSL #1

-	 MOV       r12, r12, LSL #1

-

-	 QADD      r10, r10, r10

-	 QADD      r11, r11, r11

-	 QADD      r12, r12, r12

-

-	 QADD      r10, r10, r5

-	 QADD      r11, r11, r5

-	 QADD      r12, r12, r5

-

-	 SUBS      r14, r14, #1

-

-	 MOV       r10, r10, ASR #16

-	 MOV       r11, r11, ASR #16

-	 MOV       r12, r12, ASR #16

-

-	 STRH      r10, [r0], #2

-	 STRH      r11, [r0], #2

-	 STRH      r12, [r0], #2

-	 BNE       THREE_LOOP

-

-	 MOV       r2, r8                             @ptr = ptr2

-

-Last2LOOP:

-

-         LDR       r3, [r2], #4                       @h[0], h[1]

-	 LDRSH     r4, [r1], #2                       @x[0]

-	 LDRSH     r6, [r1], #2                       @x[1]

-	 LDRSH     r9, [r1], #2                       @x[2]

-

-	 SMULBB    r10, r4, r3                        @x[0] * h[0]

-	 SMULBB    r11, r6, r3                        @x[1] * h[0]

-

-	 SMLABT    r10, r6, r3, r10                   @x[1] * h[1]

-	 SMLABT    r11, r9, r3, r11                   @x[2] * h[1]

-

-	 LDR       r3, [r2], #4                       @h[2], h[3]

-	 LDRSH     r4, [r1], #2                       @x[3]

-         LDRSH     r6, [r1], #2                       @x[4]

-

-	 SMLABB    r10, r9, r3, r10                   @x[2] * h[2]

-         SMLABB    r11, r4, r3, r11                   @x[3] * h[2]

-      

-	 SMLABT    r10, r4, r3, r10                   @x[3] * h[3]

-	 SMLABT    r11, r6, r3, r11                   @x[4] * h[3]

-

-	 LDR       r3, [r2], #4                       @h[4], h[5]

-	 LDRSH     r9, [r1], #2                       @x[5]

-	 LDRSH     r4, [r1], #2                       @x[6]

-

-	 SMLABB    r10, r6, r3, r10                   @x[4] * h[4]

-	 SMLABB    r11, r9, r3, r11                   @x[5] * h[4]

-

-	 SMLABT    r10, r9, r3, r10                   @x[5] * h[5]

-	 SMLABT    r11, r4, r3, r11                   @x[6] * h[5]

-

-	 LDR       r3, [r2], #4                       @h[6], h[7]

-	 LDRSH     r6, [r1], #2                       @x[7]

-	 LDRSH     r9, [r1], #2                       @x[8]

-

-	 SMLABB    r10, r4, r3, r10                   @x[6] * h[6]

-	 SMLABB    r11, r6, r3, r11                   @x[7] * h[6]

-

-	 SMLABT    r10, r6, r3, r10                   @x[7] * h[7]

-	 SMLABT    r11, r9, r3, r11                   @x[8] * h[7]

-

-	 LDR       r3, [r2], #4                       @h[8], h[9]

-	 LDRSH     r4, [r1], #2                       @x[9]

-	 LDRSH     r6, [r1], #2                       @x[10]

-

-	 SMLABB    r10, r9, r3, r10                   @x[8] * h[8]

-	 SMLABB    r11, r4, r3, r11                   @x[9] * h[8]

-

-	 SMLABT    r10, r4, r3, r10                   @x[9] * h[9]

-	 SMLABT    r11, r6, r3, r11                   @x[10] * h[9]

-

-	 LDR       r3, [r2], #4                       @h[10], h[11]

-	 LDRSH     r9, [r1], #2                       @x[11]

-	 LDRSH     r4, [r1], #2                       @x[12]

-

-	 SMLABB    r10, r6, r3, r10                   @x[10] * h[10]

-	 SMLABB    r11, r9, r3, r11                   @x[11] * h[10]

-

-	 SMLABT    r10, r9, r3, r10                   @x[11] * h[11]

-	 SMLABT    r11, r4, r3, r11                   @x[12] * h[11]

-

-	 LDR       r3, [r2], #4                       @h[12], h[13]

-	 LDRSH     r6, [r1], #2                       @x[13]

-	 LDRSH     r9, [r1], #2                       @x[14]

-

-	 SMLABB    r10, r4, r3, r10                   @x[12] * h[12]

-	 SMLABB    r11, r6, r3, r11                   @x[13] * h[12]

-

-	 SMLABT    r10, r6, r3, r10                   @x[13] * h[13]

-	 SMLABT    r11, r9, r3, r11                   @x[14] * h[13]

-

-	 LDR       r3, [r2], #4                       @h[14], h[15]

-	 LDRSH     r4, [r1], #2                       @x[15]

-	 LDRSH     r6, [r1], #2                       @x[16]

-

-	 SMLABB    r10, r9, r3, r10                   @x[14] * h[14]

-	 SMLABB    r11, r4, r3, r11                   @x[15] * h[14]

-

-	 SMLABT    r10, r4, r3, r10                   @x[15] * h[15]

-	 SMLABT    r11, r6, r3, r11                   @x[16] * h[15]

-

-	 LDR       r3, [r2], #4                       @h[16], h[17]

-	 LDRSH     r9, [r1], #2                       @x[17]

-	 LDRSH     r4, [r1], #2                       @x[18]

-

-	 SMLABB    r10, r6, r3, r10                   @x[16] * h[16]

-	 SMLABB    r11, r9, r3, r11                   @x[17] * h[16]

-

-	 SMLABT    r10, r9, r3, r10                   @x[17] * h[17]

-	 SMLABT    r11, r4, r3, r11                   @x[18] * h[17]

-

-	 LDR       r3, [r2], #4                       @h[18], h[19]

-	 LDRSH     r6, [r1], #2                       @x[19]

-	 LDRSH     r9, [r1], #2                       @x[20]

-

-	 SMLABB    r10, r4, r3, r10                   @x[18] * h[18]

-	 SMLABB    r11, r6, r3, r11                   @x[19] * h[18]

-

-	 SMLABT    r10, r6, r3, r10                   @x[19] * h[19]

-	 SMLABT    r11, r9, r3, r11                   @x[20] * h[19]

-

-	 LDR       r3, [r2], #4                       @h[20], h[21]

-	 LDRSH     r4, [r1], #2                       @x[21]

-	 LDRSH     r6, [r1], #2                       @x[22]

-

-	 SMLABB    r10, r9, r3, r10                   @x[20] * h[20]

-	 SMLABB    r11, r4, r3, r11                   @x[21] * h[20]

-

-	 SMLABT    r10, r4, r3, r10                   @x[21] * h[21]

-	 SMLABT    r11, r6, r3, r11                   @x[22] * h[21]

-

-	 LDR       r3, [r2], #4                       @h[22], h[23]

-	 LDRSH     r9, [r1], #2                       @x[23]

-	 LDRSH     r4, [r1], #2                       @x[24]

-

-	 SMLABB    r10, r6, r3, r10                   @x[22] * h[22]

-	 SMLABB    r11, r9, r3, r11                   @x[23] * h[22]

-

-	 SMLABT    r10, r9, r3, r10                   @x[23] * h[23]

-	 SMLABT    r11, r4, r3, r11                   @x[24] * h[23]

-

-	 LDR       r3, [r2], #4                       @h[24], h[25]

-	 LDRSH     r6, [r1], #2                       @x[25]

-	 LDRSH     r9, [r1], #2                       @x[26]

-

-	 SMLABB    r10, r4, r3, r10                   @x[24] * h[24]

-	 SMLABB    r11, r6, r3, r11                   @x[25] * h[24]

-

-	 SMLABT    r10, r6, r3, r10                   @x[25] * h[25]

-	 SMLABT    r11, r9, r3, r11                   @x[26] * h[25]

-

-	 LDR       r3, [r2], #4                       @h[26], h[27]

-	 LDRSH     r4, [r1], #2                       @x[27]

-	 LDRSH     r6, [r1], #2                       @x[28]

-

-	 SMLABB    r10, r9, r3, r10                   @x[26] * h[26]

-	 SMLABB    r11, r4, r3, r11                   @x[27] * h[26]

-

-	 SMLABT    r10, r4, r3, r10                   @x[27] * h[27]

-	 SMLABT    r11, r6, r3, r11                   @x[28] * h[27]

-

-	 LDR       r3, [r2], #4                       @h[28], h[29]

-	 LDRSH     r9, [r1], #2                       @x[29]

-	 LDRSH     r4, [r1], #2                       @x[30]

-

-	 SMLABB    r10, r6, r3, r10                   @x[28] * h[28]

-	 SMLABB    r11, r9, r3, r11                   @x[29] * h[28]

-

-	 SMLABT    r10, r9, r3, r10                   @x[29] * h[29]

-	 SMLABT    r11, r4, r3, r11                   @x[30] * h[29]

-

-	 LDR       r3, [r2], #4                       @h[30], h[31]

-	 LDRSH     r6, [r1], #2                       @x[31]

-	 LDRSH     r9, [r1], #2                       @x[32]

-

-	 SMLABB    r10, r4, r3, r10                   @x[30] * h[30]

-	 SMLABB    r11, r6, r3, r11                   @x[31] * h[30]

-

-	 SMLABT    r10, r6, r3, r10                   @x[31] * h[31]

-	 SMLABT    r11, r9, r3, r11                   @x[32] * h[31]

-

-	 @SSAT      r10, #32, r10, LSL #2

-	 @SSAT      r11, #32, r11, LSL #2

-	 MOV       r10, r10, LSL #1

-	 MOV       r11, r11, LSL #1

-

-	 QADD      r10, r10, r10

-	 QADD      r11, r11, r11 

-

-	 QADD      r10, r10, r5

-	 QADD      r11, r11, r5

-

-	 MOV       r10, r10, ASR #16

-	 MOV       r11, r11, ASR #16

-

-	 STRH      r10, [r0], #2

-	 STRH      r11, [r0], #2

-

-

-pred_lt4_end:

-         LDMFD     r13!, {r4 - r12, r15}

-

-Table:

-         .word       inter4_2

-	 @ENDFUNC

-	 .END

-

-

-

-

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@void Pred_lt4(
+@		  Word16 exc[],                         /* in/out: excitation buffer */
+@		  Word16 T0,                            /* input : integer pitch lag */
+@		  Word16 frac,                          /* input : fraction of lag   */
+@		  Word16 L_subfr                        /* input : subframe size     */
+@	      )
+
+@******************************
+@       ARM Register
+@******************************
+@ r0  ---  exc[]
+@ r1  ---  T0
+@ r2  ---  frac
+@ r3  ---  L_subfr
+
+         .section  .text
+	 .global   pred_lt4_asm
+	 .extern   inter4_2
+
+pred_lt4_asm:
+
+         STMFD     r13!, {r4 - r12, r14} 
+         RSB       r4, r1, #0                         @-T0
+         RSB       r2, r2, #0                         @frac = -frac
+         ADD       r5, r0, r4, LSL #1                 @x = exc - T0
+         CMP       r2, #0
+         ADDLT     r2, r2, #4                         @frac += UP_SAMP
+         SUBLT     r5, r5, #2                         @x--
+         SUB       r5, r5, #30                        @x -= 15
+         RSB       r4, r2, #3                         @k = 3 - frac
+         LDR       r6, Table
+	 MOV       r8, r4, LSL #6                    
+         @MOV       r7, #0                             @j = 0
+         ADD       r8, r6, r8                         @ptr2 = &(inter4_2[k][0])
+
+	 MOV       r1, r5
+	 MOV       r5, #0x8000
+	 MOV       r14, #21
+@ used register
+         @r0 --- exc[]  r1 --- x  r7 --- j  r8 --- ptr2  r5 --- 0x8000
+THREE_LOOP:
+
+         @MOV       r1, r5                             @ptr1 = x
+	 MOV       r2, r8                             @ptr = ptr2
+         LDR       r3, [r2], #4                       @h[0], h[1]
+	 LDRSH     r4, [r1], #2                       @x[0]
+	 LDRSH     r6, [r1], #2                       @x[1]
+	 LDRSH     r9, [r1], #2                       @x[2]
+
+	 SMULBB    r10, r4, r3                        @x[0] * h[0]                  
+	 SMULBB    r11, r6, r3                        @x[1] * h[0]
+	 SMULBB    r12, r9, r3                        @x[2] * h[0]
+
+         LDRSH     r4, [r1], #2                       @x[3]
+	 SMLABT    r10, r6, r3, r10                   @x[1] * h[1]
+         SMLABT    r11, r9, r3, r11                   @x[2] * h[1]
+	 SMLABT    r12, r4, r3, r12                   @x[3] * h[1]
+
+	 LDR       r3, [r2], #4                       @h[2], h[3]
+	 LDRSH     r6, [r1], #2                       @x[4]
+	 SMLABB    r10, r9, r3, r10                   @x[2] * h[2]
+         SMLABB    r11, r4, r3, r11                   @x[3] * h[2]
+         SMLABB    r12, r6, r3, r12                   @x[4] * h[2]
+
+         LDRSH     r9, [r1], #2                       @x[5]
+         SMLABT    r10, r4, r3, r10                   @x[3] * h[3]
+         SMLABT    r11, r6, r3, r11                   @x[4] * h[3]
+         SMLABT    r12, r9, r3, r12                   @x[5] * h[3]
+
+         LDR       r3, [r2], #4                       @h[4], h[5]
+         LDRSH     r4, [r1], #2                       @x[6]
+         SMLABB    r10, r6, r3, r10                   @x[4] * h[4]
+         SMLABB    r11, r9, r3, r11                   @x[5] * h[4]
+         SMLABB    r12, r4, r3, r12                   @x[6] * h[4]
+
+	 LDRSH     r6, [r1], #2                       @x[7]
+	 SMLABT    r10, r9, r3, r10                   @x[5] * h[5]
+	 SMLABT    r11, r4, r3, r11                   @x[6] * h[5]
+	 SMLABT    r12, r6, r3, r12                   @x[7] * h[5]
+
+         LDR       r3, [r2], #4                       @h[6], h[7]
+	 LDRSH     r9, [r1], #2                       @x[8]
+	 SMLABB    r10, r4, r3, r10                   @x[6] * h[6]
+	 SMLABB    r11, r6, r3, r11                   @x[7] * h[6]
+	 SMLABB    r12, r9, r3, r12                   @x[8] * h[6]
+
+	 LDRSH     r4, [r1], #2                       @x[9]
+	 SMLABT    r10, r6, r3, r10                   @x[7] * h[7]
+	 SMLABT    r11, r9, r3, r11                   @x[8] * h[7]
+	 SMLABT    r12, r4, r3, r12                   @x[9] * h[7]
+
+	 LDR       r3, [r2], #4                       @h[8], h[9]
+	 LDRSH     r6, [r1], #2                       @x[10]
+	 SMLABB    r10, r9, r3, r10                   @x[8] * h[8]
+	 SMLABB    r11, r4, r3, r11                   @x[9] * h[8]
+	 SMLABB    r12, r6, r3, r12                   @x[10] * h[8]
+
+	 LDRSH     r9, [r1], #2                       @x[11]
+	 SMLABT    r10, r4, r3, r10                   @x[9] * h[9]
+	 SMLABT    r11, r6, r3, r11                   @x[10] * h[9]
+	 SMLABT    r12, r9, r3, r12                   @x[11] * h[9]
+
+         LDR       r3, [r2], #4                       @h[10], h[11]
+	 LDRSH     r4, [r1], #2                       @x[12]
+         SMLABB    r10, r6, r3, r10                   @x[10] * h[10]
+	 SMLABB    r11, r9, r3, r11                   @x[11] * h[10]
+	 SMLABB    r12, r4, r3, r12                   @x[12] * h[10]
+
+	 LDRSH     r6, [r1], #2                       @x[13]
+	 SMLABT    r10, r9, r3, r10                   @x[11] * h[11]
+	 SMLABT    r11, r4, r3, r11                   @x[12] * h[11]
+	 SMLABT    r12, r6, r3, r12                   @x[13] * h[11]
+
+	 LDR       r3, [r2], #4                       @h[12], h[13]
+	 LDRSH     r9, [r1], #2                       @x[14]
+	 SMLABB    r10, r4, r3, r10                   @x[12] * h[12]
+	 SMLABB    r11, r6, r3, r11                   @x[13] * h[12]
+	 SMLABB    r12, r9, r3, r12                   @x[14] * h[12]
+
+	 LDRSH     r4, [r1], #2                       @x[15]
+	 SMLABT    r10, r6, r3, r10                   @x[13] * h[13]
+	 SMLABT    r11, r9, r3, r11                   @x[14] * h[13]
+	 SMLABT    r12, r4, r3, r12                   @x[15] * h[13]
+
+	 LDR       r3, [r2], #4                       @h[14], h[15]
+	 LDRSH     r6, [r1], #2                       @x[16]
+	 SMLABB    r10, r9, r3, r10                   @x[14] * h[14]
+	 SMLABB    r11, r4, r3, r11                   @x[15] * h[14]
+	 SMLABB    r12, r6, r3, r12                   @x[16] * h[14]
+
+	 LDRSH     r9, [r1], #2                       @x[17]
+         SMLABT    r10, r4, r3, r10                   @x[15] * h[15]
+	 SMLABT    r11, r6, r3, r11                   @x[16] * h[15]
+	 SMLABT    r12, r9, r3, r12                   @x[17] * h[15]
+
+	 LDR       r3, [r2], #4                       @h[16], h[17]
+	 LDRSH     r4, [r1], #2                       @x[18]
+	 SMLABB    r10, r6, r3, r10                   @x[16] * h[16]
+	 SMLABB    r11, r9, r3, r11                   @x[17] * h[16]
+	 SMLABB    r12, r4, r3, r12                   @x[18] * h[16]
+
+         LDRSH     r6, [r1], #2                       @x[19]
+	 SMLABT    r10, r9, r3, r10                   @x[17] * h[17]
+	 SMLABT    r11, r4, r3, r11                   @x[18] * h[17]
+	 SMLABT    r12, r6, r3, r12                   @x[19] * h[17]
+
+	 LDR       r3, [r2], #4                       @h[18], h[19]
+         LDRSH     r9, [r1], #2                       @x[20]
+	 SMLABB    r10, r4, r3, r10                   @x[18] * h[18]
+	 SMLABB    r11, r6, r3, r11                   @x[19] * h[18]
+	 SMLABB    r12, r9, r3, r12                   @x[20] * h[18]
+
+	 LDRSH     r4, [r1], #2                       @x[21]
+	 SMLABT    r10, r6, r3, r10                   @x[19] * h[19]
+	 SMLABT    r11, r9, r3, r11                   @x[20] * h[19]
+	 SMLABT    r12, r4, r3, r12                   @x[21] * h[19]
+
+	 LDR       r3, [r2], #4                       @h[20], h[21]
+	 LDRSH     r6, [r1], #2                       @x[22]
+	 SMLABB    r10, r9, r3, r10                   @x[20] * h[20]
+	 SMLABB    r11, r4, r3, r11                   @x[21] * h[20]
+	 SMLABB    r12, r6, r3, r12                   @x[22] * h[20]
+
+	 LDRSH     r9, [r1], #2                       @x[23]
+	 SMLABT    r10, r4, r3, r10                   @x[21] * h[21]
+	 SMLABT    r11, r6, r3, r11                   @x[22] * h[21]
+	 SMLABT    r12, r9, r3, r12                   @x[23] * h[21]
+
+	 LDR       r3, [r2], #4                       @h[22], h[23]
+	 LDRSH     r4, [r1], #2                       @x[24]
+	 SMLABB    r10, r6, r3, r10                   @x[22] * h[22]
+	 SMLABB    r11, r9, r3, r11                   @x[23] * h[22]
+	 SMLABB    r12, r4, r3, r12                   @x[24] * h[22]
+
+         LDRSH     r6, [r1], #2                       @x[25]
+	 SMLABT    r10, r9, r3, r10                   @x[23] * h[23]
+	 SMLABT    r11, r4, r3, r11                   @x[24] * h[23]
+	 SMLABT    r12, r6, r3, r12                   @x[25] * h[23]
+
+	 LDR       r3, [r2], #4                       @h[24], h[25]
+         LDRSH     r9, [r1], #2                       @x[26]
+	 SMLABB    r10, r4, r3, r10                   @x[24] * h[24]
+	 SMLABB    r11, r6, r3, r11                   @x[25] * h[24]
+	 SMLABB    r12, r9, r3, r12                   @x[26] * h[24]
+
+	 LDRSH     r4, [r1], #2                       @x[27]
+	 SMLABT    r10, r6, r3, r10                   @x[25] * h[25]
+	 SMLABT    r11, r9, r3, r11                   @x[26] * h[25]
+	 SMLABT    r12, r4, r3, r12                   @x[27] * h[25]
+
+	 LDR       r3, [r2], #4                       @h[26], h[27]
+	 LDRSH     r6, [r1], #2                       @x[28]
+	 SMLABB    r10, r9, r3, r10                   @x[26] * h[26]
+	 SMLABB    r11, r4, r3, r11                   @x[27] * h[26]
+	 SMLABB    r12, r6, r3, r12                   @x[28] * h[26]
+
+	 LDRSH     r9, [r1], #2                       @x[29]
+	 SMLABT    r10, r4, r3, r10                   @x[27] * h[27]
+	 SMLABT    r11, r6, r3, r11                   @x[28] * h[27]
+	 SMLABT    r12, r9, r3, r12                   @x[29] * h[27]
+
+	 LDR       r3, [r2], #4                       @h[28], h[29]
+	 LDRSH     r4, [r1], #2                       @x[30]
+	 SMLABB    r10, r6, r3, r10                   @x[28] * h[28]
+	 SMLABB    r11, r9, r3, r11                   @x[29] * h[28]
+	 SMLABB    r12, r4, r3, r12                   @x[30] * h[28]
+
+         LDRSH     r6, [r1], #2                       @x[31]
+	 SMLABT    r10, r9, r3, r10                   @x[29] * h[29]
+	 SMLABT    r11, r4, r3, r11                   @x[30] * h[29]
+	 SMLABT    r12, r6, r3, r12                   @x[31] * h[29]
+
+	 LDR       r3, [r2], #4                       @h[30], h[31]
+         LDRSH     r9, [r1], #2                       @x[32]
+	 SMLABB    r10, r4, r3, r10                   @x[30] * h[30]
+	 SMLABB    r11, r6, r3, r11                   @x[31] * h[30]
+	 SMLABB    r12, r9, r3, r12                   @x[32] * h[30]
+
+	 LDRSH     r4, [r1], #-60                     @x[33]
+	 SMLABT    r10, r6, r3, r10                   @x[31] * h[31]
+	 SMLABT    r11, r9, r3, r11                   @x[32] * h[31]
+	 SMLABT    r12, r4, r3, r12                   @x[33] * h[31]
+
+	 @SSAT      r10, #32, r10, LSL #2
+	 @SSAT      r11, #32, r11, LSL #2
+	 @SSAT      r12, #32, r12, LSL #2
+
+	 MOV       r10, r10, LSL #1
+	 MOV       r11, r11, LSL #1
+	 MOV       r12, r12, LSL #1
+
+	 QADD      r10, r10, r10
+	 QADD      r11, r11, r11
+	 QADD      r12, r12, r12
+
+	 QADD      r10, r10, r5
+	 QADD      r11, r11, r5
+	 QADD      r12, r12, r5
+
+	 SUBS      r14, r14, #1
+
+	 MOV       r10, r10, ASR #16
+	 MOV       r11, r11, ASR #16
+	 MOV       r12, r12, ASR #16
+
+	 STRH      r10, [r0], #2
+	 STRH      r11, [r0], #2
+	 STRH      r12, [r0], #2
+	 BNE       THREE_LOOP
+
+	 MOV       r2, r8                             @ptr = ptr2
+
+Last2LOOP:
+
+         LDR       r3, [r2], #4                       @h[0], h[1]
+	 LDRSH     r4, [r1], #2                       @x[0]
+	 LDRSH     r6, [r1], #2                       @x[1]
+	 LDRSH     r9, [r1], #2                       @x[2]
+
+	 SMULBB    r10, r4, r3                        @x[0] * h[0]
+	 SMULBB    r11, r6, r3                        @x[1] * h[0]
+
+	 SMLABT    r10, r6, r3, r10                   @x[1] * h[1]
+	 SMLABT    r11, r9, r3, r11                   @x[2] * h[1]
+
+	 LDR       r3, [r2], #4                       @h[2], h[3]
+	 LDRSH     r4, [r1], #2                       @x[3]
+         LDRSH     r6, [r1], #2                       @x[4]
+
+	 SMLABB    r10, r9, r3, r10                   @x[2] * h[2]
+         SMLABB    r11, r4, r3, r11                   @x[3] * h[2]
+      
+	 SMLABT    r10, r4, r3, r10                   @x[3] * h[3]
+	 SMLABT    r11, r6, r3, r11                   @x[4] * h[3]
+
+	 LDR       r3, [r2], #4                       @h[4], h[5]
+	 LDRSH     r9, [r1], #2                       @x[5]
+	 LDRSH     r4, [r1], #2                       @x[6]
+
+	 SMLABB    r10, r6, r3, r10                   @x[4] * h[4]
+	 SMLABB    r11, r9, r3, r11                   @x[5] * h[4]
+
+	 SMLABT    r10, r9, r3, r10                   @x[5] * h[5]
+	 SMLABT    r11, r4, r3, r11                   @x[6] * h[5]
+
+	 LDR       r3, [r2], #4                       @h[6], h[7]
+	 LDRSH     r6, [r1], #2                       @x[7]
+	 LDRSH     r9, [r1], #2                       @x[8]
+
+	 SMLABB    r10, r4, r3, r10                   @x[6] * h[6]
+	 SMLABB    r11, r6, r3, r11                   @x[7] * h[6]
+
+	 SMLABT    r10, r6, r3, r10                   @x[7] * h[7]
+	 SMLABT    r11, r9, r3, r11                   @x[8] * h[7]
+
+	 LDR       r3, [r2], #4                       @h[8], h[9]
+	 LDRSH     r4, [r1], #2                       @x[9]
+	 LDRSH     r6, [r1], #2                       @x[10]
+
+	 SMLABB    r10, r9, r3, r10                   @x[8] * h[8]
+	 SMLABB    r11, r4, r3, r11                   @x[9] * h[8]
+
+	 SMLABT    r10, r4, r3, r10                   @x[9] * h[9]
+	 SMLABT    r11, r6, r3, r11                   @x[10] * h[9]
+
+	 LDR       r3, [r2], #4                       @h[10], h[11]
+	 LDRSH     r9, [r1], #2                       @x[11]
+	 LDRSH     r4, [r1], #2                       @x[12]
+
+	 SMLABB    r10, r6, r3, r10                   @x[10] * h[10]
+	 SMLABB    r11, r9, r3, r11                   @x[11] * h[10]
+
+	 SMLABT    r10, r9, r3, r10                   @x[11] * h[11]
+	 SMLABT    r11, r4, r3, r11                   @x[12] * h[11]
+
+	 LDR       r3, [r2], #4                       @h[12], h[13]
+	 LDRSH     r6, [r1], #2                       @x[13]
+	 LDRSH     r9, [r1], #2                       @x[14]
+
+	 SMLABB    r10, r4, r3, r10                   @x[12] * h[12]
+	 SMLABB    r11, r6, r3, r11                   @x[13] * h[12]
+
+	 SMLABT    r10, r6, r3, r10                   @x[13] * h[13]
+	 SMLABT    r11, r9, r3, r11                   @x[14] * h[13]
+
+	 LDR       r3, [r2], #4                       @h[14], h[15]
+	 LDRSH     r4, [r1], #2                       @x[15]
+	 LDRSH     r6, [r1], #2                       @x[16]
+
+	 SMLABB    r10, r9, r3, r10                   @x[14] * h[14]
+	 SMLABB    r11, r4, r3, r11                   @x[15] * h[14]
+
+	 SMLABT    r10, r4, r3, r10                   @x[15] * h[15]
+	 SMLABT    r11, r6, r3, r11                   @x[16] * h[15]
+
+	 LDR       r3, [r2], #4                       @h[16], h[17]
+	 LDRSH     r9, [r1], #2                       @x[17]
+	 LDRSH     r4, [r1], #2                       @x[18]
+
+	 SMLABB    r10, r6, r3, r10                   @x[16] * h[16]
+	 SMLABB    r11, r9, r3, r11                   @x[17] * h[16]
+
+	 SMLABT    r10, r9, r3, r10                   @x[17] * h[17]
+	 SMLABT    r11, r4, r3, r11                   @x[18] * h[17]
+
+	 LDR       r3, [r2], #4                       @h[18], h[19]
+	 LDRSH     r6, [r1], #2                       @x[19]
+	 LDRSH     r9, [r1], #2                       @x[20]
+
+	 SMLABB    r10, r4, r3, r10                   @x[18] * h[18]
+	 SMLABB    r11, r6, r3, r11                   @x[19] * h[18]
+
+	 SMLABT    r10, r6, r3, r10                   @x[19] * h[19]
+	 SMLABT    r11, r9, r3, r11                   @x[20] * h[19]
+
+	 LDR       r3, [r2], #4                       @h[20], h[21]
+	 LDRSH     r4, [r1], #2                       @x[21]
+	 LDRSH     r6, [r1], #2                       @x[22]
+
+	 SMLABB    r10, r9, r3, r10                   @x[20] * h[20]
+	 SMLABB    r11, r4, r3, r11                   @x[21] * h[20]
+
+	 SMLABT    r10, r4, r3, r10                   @x[21] * h[21]
+	 SMLABT    r11, r6, r3, r11                   @x[22] * h[21]
+
+	 LDR       r3, [r2], #4                       @h[22], h[23]
+	 LDRSH     r9, [r1], #2                       @x[23]
+	 LDRSH     r4, [r1], #2                       @x[24]
+
+	 SMLABB    r10, r6, r3, r10                   @x[22] * h[22]
+	 SMLABB    r11, r9, r3, r11                   @x[23] * h[22]
+
+	 SMLABT    r10, r9, r3, r10                   @x[23] * h[23]
+	 SMLABT    r11, r4, r3, r11                   @x[24] * h[23]
+
+	 LDR       r3, [r2], #4                       @h[24], h[25]
+	 LDRSH     r6, [r1], #2                       @x[25]
+	 LDRSH     r9, [r1], #2                       @x[26]
+
+	 SMLABB    r10, r4, r3, r10                   @x[24] * h[24]
+	 SMLABB    r11, r6, r3, r11                   @x[25] * h[24]
+
+	 SMLABT    r10, r6, r3, r10                   @x[25] * h[25]
+	 SMLABT    r11, r9, r3, r11                   @x[26] * h[25]
+
+	 LDR       r3, [r2], #4                       @h[26], h[27]
+	 LDRSH     r4, [r1], #2                       @x[27]
+	 LDRSH     r6, [r1], #2                       @x[28]
+
+	 SMLABB    r10, r9, r3, r10                   @x[26] * h[26]
+	 SMLABB    r11, r4, r3, r11                   @x[27] * h[26]
+
+	 SMLABT    r10, r4, r3, r10                   @x[27] * h[27]
+	 SMLABT    r11, r6, r3, r11                   @x[28] * h[27]
+
+	 LDR       r3, [r2], #4                       @h[28], h[29]
+	 LDRSH     r9, [r1], #2                       @x[29]
+	 LDRSH     r4, [r1], #2                       @x[30]
+
+	 SMLABB    r10, r6, r3, r10                   @x[28] * h[28]
+	 SMLABB    r11, r9, r3, r11                   @x[29] * h[28]
+
+	 SMLABT    r10, r9, r3, r10                   @x[29] * h[29]
+	 SMLABT    r11, r4, r3, r11                   @x[30] * h[29]
+
+	 LDR       r3, [r2], #4                       @h[30], h[31]
+	 LDRSH     r6, [r1], #2                       @x[31]
+	 LDRSH     r9, [r1], #2                       @x[32]
+
+	 SMLABB    r10, r4, r3, r10                   @x[30] * h[30]
+	 SMLABB    r11, r6, r3, r11                   @x[31] * h[30]
+
+	 SMLABT    r10, r6, r3, r10                   @x[31] * h[31]
+	 SMLABT    r11, r9, r3, r11                   @x[32] * h[31]
+
+	 @SSAT      r10, #32, r10, LSL #2
+	 @SSAT      r11, #32, r11, LSL #2
+	 MOV       r10, r10, LSL #1
+	 MOV       r11, r11, LSL #1
+
+	 QADD      r10, r10, r10
+	 QADD      r11, r11, r11 
+
+	 QADD      r10, r10, r5
+	 QADD      r11, r11, r5
+
+	 MOV       r10, r10, ASR #16
+	 MOV       r11, r11, ASR #16
+
+	 STRH      r10, [r0], #2
+	 STRH      r11, [r0], #2
+
+
+pred_lt4_end:
+         LDMFD     r13!, {r4 - r12, r15}
+
+Table:
+         .word       inter4_2
+	 @ENDFUNC
+	 .END
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/residu_asm_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/residu_asm_opt.s
index 060d9c7..86b3bd6 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/residu_asm_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/residu_asm_opt.s
@@ -1,228 +1,228 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-@

-@void Residu(

-@	    Word16 a[],                           /* (i) Q12 : prediction coefficients */

-@	    Word16 x[],                           /* (i)     : speech (values x[-m..-1] are needed */

-@	    Word16 y[],                           /* (o) x2  : residual signal       */

-@	    Word16 lg                             /* (i)     : size of filtering     */

-@	   )

-@a[] --- r0

-@x[] --- r1

-@y[] --- r2

-@lg  --- r3

-

-        .section  .text

-	.global   Residu_opt

-

-Residu_opt:

-

-        STMFD   r13!, {r4 - r12, r14}

-

-        LDRH    r5, [r0], #2

-        LDRH    r6, [r0], #2

-        ORR     r5, r6, r5, LSL #16                  @r5 --- a0, a1	

-

-        LDRH    r6, [r0], #2

-	LDRH    r7, [r0], #2

-	ORR     r6, r7, r6, LSL #16                  @r6 --- a2, a3

-	

-        LDRH    r7, [r0], #2

-	LDRH    r8, [r0], #2

-	ORR     r7, r8, r7, LSL #16                  @r7 --- a4, a5

-

-	LDRH    r8, [r0], #2

-	LDRH    r9, [r0], #2

-	ORR     r8, r9, r8, LSL #16                  @r8 --- a6, a7

-

-	LDRH    r9, [r0], #2

-	LDRH    r10, [r0], #2

-	ORR     r9, r10, r9, LSL #16                 @r9 --- a8, a9

-

-	LDRH    r10, [r0], #2

-	LDRH    r11, [r0], #2

-	ORR     r10, r11, r10, LSL #16               @r10 --- a10, a11

-

-        LDRH    r11, [r0], #2

-	LDRH    r12, [r0], #2

-	ORR     r11, r12, r11, LSL #16               @r11 --- a12, a13

-	

-	LDRH    r12, [r0], #2

-	LDRH    r4, [r0], #2

-	ORR     r12, r4, r12, LSL #16                @r12 --- a14, a15

-	

-

-	STMFD   r13!, {r8 - r12}                     @store r8-r12 

-	LDRH    r4, [r0], #2                         @load a16

-        MOV     r14, r3, ASR #2                      @one loop get 4 outputs

-	ADD     r1, r1, #4

-	MOV     r0, r2

-	ORR     r14, r4, r14, LSL #16                @r14 --- loopnum, a16

-

-residu_loop:

-

-        LDR     r10, [r1], #-4                       @r10  --- x[3], x[2]

-	LDR     r2,  [r1], #-4                       @r2   --- x[1], x[0]

-

-	SMULTB  r3, r5, r2                           @i1(0)  --- r3 = x[0] * a0

-        SMULTT  r4, r5, r2                           @i2(0)  --- r4 = x[1] * a0	

-	SMULTB  r11, r5, r10                         @i3(0)  --- r11 = x[2] * a0

-	SMULTT  r12, r5, r10                         @i4(0)  --- r12 = x[3] * a0

-

-        SMLABB  r4, r5, r2, r4                       @i2(1)  --- r4 += x[0] * a1

-        SMLABT  r11, r5, r2, r11                     @i3(1)  --- r11 += x[1] * a0

-        SMLABB  r12, r5, r10, r12                    @i4(1)  --- r12 += x[2] * a1

-

-	SMLATB  r11, r6, r2, r11                     @i3(2)  --- r11 += x[0] * a2

-	SMLATT  r12, r6, r2, r12                     @i4(2)  --- r12 += x[1] * a2

-	SMLABB  r12, r6, r2, r12                     @i4(3)  --- r12 += x[0] * a3                 

-	

-	LDR     r2, [r1], #-4                        @r2 ---- x[-1], x[-2]

-

-	SMLABT  r3, r5, r2, r3                       @i1(1) --- r3 += x[-1] * a1

-	SMLATT  r4, r6, r2, r4                       @i2(2) --- r4 += x[-1] * a2

-	SMLABT  r11, r6, r2, r11                     @i3(3) --- r11 += x[-1] * a3

-	SMLATT  r12, r7, r2, r12                     @i4(4) --- r12 += x[-1] * a4

-        SMLATB  r3, r6, r2, r3                       @i1(2) --- r3 += x[-2] * a2	

-

-	SMLABB	r4, r6, r2, r4				@ i2	(3)

-	SMLATB  r11,r7, r2, r11				@ i3	(4)

-	SMLABB	r12,r7, r2, r12				@ i4	(5)

-	

-	LDR	r2,[r1],#-4

-	SMLABT	r3, r6, r2, r3				@ i1	(3)

-	SMLATT	r4, r7, r2, r4				@ i2	(4)

-	SMLABT	r11,r7, r2, r11				@ i3	(5)

-	SMLATT	r12,r8, r2, r12				@ i4	(6)

-	SMLATB	r3, r7, r2, r3				@ i1	(4)

-	SMLABB	r4, r7, r2, r4				@ i2	(5)

-	SMLATB	r11,r8, r2, r11				@ i3	(6)

-	SMLABB	r12,r8, r2, r12				@ i4	(7)

-		

-	LDR	r2,[r1],#-4

-	SMLABT	r3, r7, r2, r3				@ i1	(5)

-	SMLATT	r4, r8, r2, r4				@ i2	(6)

-	SMLABT	r11,r8, r2, r11				@ i3	(7)

-	SMLATT	r12,r9, r2, r12				@ i4	(8)

-	SMLATB	r3, r8, r2, r3				@ i1	(6)

-	SMLABB	r4, r8, r2, r4				@ i2	(7)

-	SMLATB	r11,r9, r2, r11				@ i3	(8)

-	SMLABB	r12,r9, r2, r12				@ i4	(9)

-	LDR	r10, [r13, #8]				@ [ a10 | a11]

-	

-	LDR	r2,[r1],#-4

-	SMLABT	r3, r8, r2, r3				@ i1	(7)

-	SMLATT	r4, r9, r2, r4				@ i2	(8)

-	SMLABT	r11,r9, r2, r11				@ i3	(9)

-	SMLATT	r12,r10, r2, r12			@ i4	(10)

-	SMLATB	r3, r9, r2, r3				@ i1	(8)

-	SMLABB	r4, r9, r2, r4				@ i2	(9)

-	SMLATB	r11,r10, r2, r11			@ i3	(10)

-	SMLABB	r12,r10, r2, r12			@ i4	(11)

-	LDR	r8, [r13, #12]				@ [ a12 | a13 ]

-		

-	LDR	r2,[r1],#-4

-	SMLABT	r3, r9, r2, r3				@ i1	(9)

-	SMLATT	r4, r10, r2, r4				@ i2	(10)

-	SMLABT	r11,r10, r2, r11			@ i3	(11)

-	SMLATT	r12,r8, r2, r12				@ i4	(12)

-	SMLATB	r3, r10, r2, r3				@ i1	(10)

-	SMLABB	r4, r10, r2, r4				@ i2	(11)

-	SMLATB	r11,r8, r2, r11				@ i3	(12)

-	SMLABB	r12,r8, r2, r12				@ i4	(13)

-	LDR	r9, [r13, #16]				@ [ a14 | a15 ]

-	

-	LDR	r2,[r1],#-4

-	SMLABT	r3, r10, r2, r3				@ i1	(11)

-	SMLATT	r4, r8, r2, r4				@ i2	(12)

-	SMLABT	r11,r8, r2, r11				@ i3	(13)

-	SMLATT	r12,r9, r2, r12				@ i4	(14)

-	SMLATB	r3, r8, r2, r3				@ i1	(12)

-	SMLABB	r4, r8, r2, r4				@ i2	(13)

-	SMLATB	r11,r9, r2, r11				@ i3	(14)

-	SMLABB	r12,r9, r2, r12				@ i4	(15)

-	

-

-	LDR	r2,[r1],#-4

-	SMLABT	r3, r8, r2, r3				@ i1	(13)

-	SMLATT	r4, r9, r2, r4				@ i2	(14)

-	SMLABT	r11,r9, r2, r11				@ i3	(15)

-	SMLABT	r12,r14, r2, r12			@ i4	(16)

-	SMLATB	r3, r9, r2, r3				@ i1	(14)

-	SMLABB	r4, r9, r2, r4				@ i2	(15)

-	SMLABB	r11,r14, r2, r11			@ i3	(16)

-	LDR		r8, [r13]					@ [ a6 | a7 ]

-			

-        LDR     r2,[r1],#44         		@ Change

-	SMLABT	r3, r9, r2, r3

-	SMLABB	r3, r14, r2, r3

-	SMLABT	r4, r14, r2, r4

-	LDR		r9, [r13, #4]				@ [ a8 | a9 ]

-	

-

-	QADD	r3,r3,r3					

-	QADD	r4,r4,r4					

-	QADD	r11,r11,r11					

-	QADD	r12,r12,r12					

-		

-	QADD	r3,r3,r3					

-	QADD	r4,r4,r4					

-	QADD	r11,r11,r11					

-	QADD	r12,r12,r12					

-	

-	QADD	r3,r3,r3					

-	QADD	r4,r4,r4					

-	QADD	r11,r11,r11					

-	QADD	r12,r12,r12					

-	

-	QADD	r3,r3,r3					

-	QADD	r4,r4,r4					

-	QADD	r11,r11,r11					

-	QADD	r12,r12,r12					

-	

-	MOV	r2,#32768	

-	

-	QDADD	r3,r2,r3					

-	QDADD	r4,r2,r4					

-	QDADD	r11,r2,r11					

-	QDADD	r12,r2,r12					

-		

-	

-	MOV	r3,r3,asr #16

-	MOV	r4,r4,asr #16

-	MOV	r11,r11,asr #16

-	MOV	r12,r12,asr #16

-	

-	STRH	r3,[r0],#2

-	STRH	r4,[r0],#2

-	STRH	r11,[r0],#2

-	STRH	r12,[r0],#2

-	

-	MOV	r2,r14,asr #16

-	SUB	r14, r14, #0x10000

-	SUBS	r2,r2,#1

-	BNE	residu_loop	

-end:

-	LDMFD	r13!, {r8 -r12}	

-	LDMFD	r13!, {r4 -r12,pc}

-

-        @ENDFUNC

-        .END	 

-        

-	

-	  

-

-

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@void Residu(
+@	    Word16 a[],                           /* (i) Q12 : prediction coefficients */
+@	    Word16 x[],                           /* (i)     : speech (values x[-m..-1] are needed */
+@	    Word16 y[],                           /* (o) x2  : residual signal       */
+@	    Word16 lg                             /* (i)     : size of filtering     */
+@	   )
+@a[] --- r0
+@x[] --- r1
+@y[] --- r2
+@lg  --- r3
+
+        .section  .text
+	.global   Residu_opt
+
+Residu_opt:
+
+        STMFD   r13!, {r4 - r12, r14}
+
+        LDRH    r5, [r0], #2
+        LDRH    r6, [r0], #2
+        ORR     r5, r6, r5, LSL #16                  @r5 --- a0, a1	
+
+        LDRH    r6, [r0], #2
+	LDRH    r7, [r0], #2
+	ORR     r6, r7, r6, LSL #16                  @r6 --- a2, a3
+	
+        LDRH    r7, [r0], #2
+	LDRH    r8, [r0], #2
+	ORR     r7, r8, r7, LSL #16                  @r7 --- a4, a5
+
+	LDRH    r8, [r0], #2
+	LDRH    r9, [r0], #2
+	ORR     r8, r9, r8, LSL #16                  @r8 --- a6, a7
+
+	LDRH    r9, [r0], #2
+	LDRH    r10, [r0], #2
+	ORR     r9, r10, r9, LSL #16                 @r9 --- a8, a9
+
+	LDRH    r10, [r0], #2
+	LDRH    r11, [r0], #2
+	ORR     r10, r11, r10, LSL #16               @r10 --- a10, a11
+
+        LDRH    r11, [r0], #2
+	LDRH    r12, [r0], #2
+	ORR     r11, r12, r11, LSL #16               @r11 --- a12, a13
+	
+	LDRH    r12, [r0], #2
+	LDRH    r4, [r0], #2
+	ORR     r12, r4, r12, LSL #16                @r12 --- a14, a15
+	
+
+	STMFD   r13!, {r8 - r12}                     @store r8-r12 
+	LDRH    r4, [r0], #2                         @load a16
+        MOV     r14, r3, ASR #2                      @one loop get 4 outputs
+	ADD     r1, r1, #4
+	MOV     r0, r2
+	ORR     r14, r4, r14, LSL #16                @r14 --- loopnum, a16
+
+residu_loop:
+
+        LDR     r10, [r1], #-4                       @r10  --- x[3], x[2]
+	LDR     r2,  [r1], #-4                       @r2   --- x[1], x[0]
+
+	SMULTB  r3, r5, r2                           @i1(0)  --- r3 = x[0] * a0
+        SMULTT  r4, r5, r2                           @i2(0)  --- r4 = x[1] * a0	
+	SMULTB  r11, r5, r10                         @i3(0)  --- r11 = x[2] * a0
+	SMULTT  r12, r5, r10                         @i4(0)  --- r12 = x[3] * a0
+
+        SMLABB  r4, r5, r2, r4                       @i2(1)  --- r4 += x[0] * a1
+        SMLABT  r11, r5, r2, r11                     @i3(1)  --- r11 += x[1] * a0
+        SMLABB  r12, r5, r10, r12                    @i4(1)  --- r12 += x[2] * a1
+
+	SMLATB  r11, r6, r2, r11                     @i3(2)  --- r11 += x[0] * a2
+	SMLATT  r12, r6, r2, r12                     @i4(2)  --- r12 += x[1] * a2
+	SMLABB  r12, r6, r2, r12                     @i4(3)  --- r12 += x[0] * a3                 
+	
+	LDR     r2, [r1], #-4                        @r2 ---- x[-1], x[-2]
+
+	SMLABT  r3, r5, r2, r3                       @i1(1) --- r3 += x[-1] * a1
+	SMLATT  r4, r6, r2, r4                       @i2(2) --- r4 += x[-1] * a2
+	SMLABT  r11, r6, r2, r11                     @i3(3) --- r11 += x[-1] * a3
+	SMLATT  r12, r7, r2, r12                     @i4(4) --- r12 += x[-1] * a4
+        SMLATB  r3, r6, r2, r3                       @i1(2) --- r3 += x[-2] * a2	
+
+	SMLABB	r4, r6, r2, r4				@ i2	(3)
+	SMLATB  r11,r7, r2, r11				@ i3	(4)
+	SMLABB	r12,r7, r2, r12				@ i4	(5)
+	
+	LDR	r2,[r1],#-4
+	SMLABT	r3, r6, r2, r3				@ i1	(3)
+	SMLATT	r4, r7, r2, r4				@ i2	(4)
+	SMLABT	r11,r7, r2, r11				@ i3	(5)
+	SMLATT	r12,r8, r2, r12				@ i4	(6)
+	SMLATB	r3, r7, r2, r3				@ i1	(4)
+	SMLABB	r4, r7, r2, r4				@ i2	(5)
+	SMLATB	r11,r8, r2, r11				@ i3	(6)
+	SMLABB	r12,r8, r2, r12				@ i4	(7)
+		
+	LDR	r2,[r1],#-4
+	SMLABT	r3, r7, r2, r3				@ i1	(5)
+	SMLATT	r4, r8, r2, r4				@ i2	(6)
+	SMLABT	r11,r8, r2, r11				@ i3	(7)
+	SMLATT	r12,r9, r2, r12				@ i4	(8)
+	SMLATB	r3, r8, r2, r3				@ i1	(6)
+	SMLABB	r4, r8, r2, r4				@ i2	(7)
+	SMLATB	r11,r9, r2, r11				@ i3	(8)
+	SMLABB	r12,r9, r2, r12				@ i4	(9)
+	LDR	r10, [r13, #8]				@ [ a10 | a11]
+	
+	LDR	r2,[r1],#-4
+	SMLABT	r3, r8, r2, r3				@ i1	(7)
+	SMLATT	r4, r9, r2, r4				@ i2	(8)
+	SMLABT	r11,r9, r2, r11				@ i3	(9)
+	SMLATT	r12,r10, r2, r12			@ i4	(10)
+	SMLATB	r3, r9, r2, r3				@ i1	(8)
+	SMLABB	r4, r9, r2, r4				@ i2	(9)
+	SMLATB	r11,r10, r2, r11			@ i3	(10)
+	SMLABB	r12,r10, r2, r12			@ i4	(11)
+	LDR	r8, [r13, #12]				@ [ a12 | a13 ]
+		
+	LDR	r2,[r1],#-4
+	SMLABT	r3, r9, r2, r3				@ i1	(9)
+	SMLATT	r4, r10, r2, r4				@ i2	(10)
+	SMLABT	r11,r10, r2, r11			@ i3	(11)
+	SMLATT	r12,r8, r2, r12				@ i4	(12)
+	SMLATB	r3, r10, r2, r3				@ i1	(10)
+	SMLABB	r4, r10, r2, r4				@ i2	(11)
+	SMLATB	r11,r8, r2, r11				@ i3	(12)
+	SMLABB	r12,r8, r2, r12				@ i4	(13)
+	LDR	r9, [r13, #16]				@ [ a14 | a15 ]
+	
+	LDR	r2,[r1],#-4
+	SMLABT	r3, r10, r2, r3				@ i1	(11)
+	SMLATT	r4, r8, r2, r4				@ i2	(12)
+	SMLABT	r11,r8, r2, r11				@ i3	(13)
+	SMLATT	r12,r9, r2, r12				@ i4	(14)
+	SMLATB	r3, r8, r2, r3				@ i1	(12)
+	SMLABB	r4, r8, r2, r4				@ i2	(13)
+	SMLATB	r11,r9, r2, r11				@ i3	(14)
+	SMLABB	r12,r9, r2, r12				@ i4	(15)
+	
+
+	LDR	r2,[r1],#-4
+	SMLABT	r3, r8, r2, r3				@ i1	(13)
+	SMLATT	r4, r9, r2, r4				@ i2	(14)
+	SMLABT	r11,r9, r2, r11				@ i3	(15)
+	SMLABT	r12,r14, r2, r12			@ i4	(16)
+	SMLATB	r3, r9, r2, r3				@ i1	(14)
+	SMLABB	r4, r9, r2, r4				@ i2	(15)
+	SMLABB	r11,r14, r2, r11			@ i3	(16)
+	LDR		r8, [r13]					@ [ a6 | a7 ]
+			
+        LDR     r2,[r1],#44         		@ Change
+	SMLABT	r3, r9, r2, r3
+	SMLABB	r3, r14, r2, r3
+	SMLABT	r4, r14, r2, r4
+	LDR		r9, [r13, #4]				@ [ a8 | a9 ]
+	
+
+	QADD	r3,r3,r3					
+	QADD	r4,r4,r4					
+	QADD	r11,r11,r11					
+	QADD	r12,r12,r12					
+		
+	QADD	r3,r3,r3					
+	QADD	r4,r4,r4					
+	QADD	r11,r11,r11					
+	QADD	r12,r12,r12					
+	
+	QADD	r3,r3,r3					
+	QADD	r4,r4,r4					
+	QADD	r11,r11,r11					
+	QADD	r12,r12,r12					
+	
+	QADD	r3,r3,r3					
+	QADD	r4,r4,r4					
+	QADD	r11,r11,r11					
+	QADD	r12,r12,r12					
+	
+	MOV	r2,#32768	
+	
+	QDADD	r3,r2,r3					
+	QDADD	r4,r2,r4					
+	QDADD	r11,r2,r11					
+	QDADD	r12,r2,r12					
+		
+	
+	MOV	r3,r3,asr #16
+	MOV	r4,r4,asr #16
+	MOV	r11,r11,asr #16
+	MOV	r12,r12,asr #16
+	
+	STRH	r3,[r0],#2
+	STRH	r4,[r0],#2
+	STRH	r11,[r0],#2
+	STRH	r12,[r0],#2
+	
+	MOV	r2,r14,asr #16
+	SUB	r14, r14, #0x10000
+	SUBS	r2,r2,#1
+	BNE	residu_loop	
+end:
+	LDMFD	r13!, {r8 -r12}	
+	LDMFD	r13!, {r4 -r12,pc}
+
+        @ENDFUNC
+        .END	 
+        
+	
+	  
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/scale_sig_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/scale_sig_opt.s
index aa9f464..f83e688 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/scale_sig_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/scale_sig_opt.s
@@ -1,75 +1,75 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-@

-@void Scale_sig(

-@	       Word16 x[],                           /* (i/o) : signal to scale               */

-@	       Word16 lg,                            /* (i)   : size of x[]                   */

-@	       Word16 exp                            /* (i)   : exponent: x = round(x << exp) */

-@	       )

-@

-@r0 --- x[]

-@r1 --- lg

-@r2 --- exp

-

-          .section  .text

-	  .global   Scale_sig_opt

-

-Scale_sig_opt:

-

-         STMFD         r13!, {r4 - r12, r14}

-	 SUB           r3, r1, #1                  @i = lg - 1

-         CMP           r2, #0                      @Compare exp and 0

-	 RSB           r7, r2, #0                  @exp = -exp

-	 ADD           r10, r2, #16                @16 + exp

-         ADD           r4, r0, r3, LSL #1          @x[i] address

-	 MOV           r8, #0x7fffffff

-	 MOV           r9, #0x8000

-	 BLE           LOOP2

-	 

-LOOP1:

-

-         LDRSH          r5, [r4]                    @load x[i]

-         MOV           r12, r5, LSL r10

-	 TEQ           r5, r12, ASR r10

-	 EORNE         r12, r8, r5, ASR #31

-	 SUBS          r3, r3, #1

-	 QADD          r11, r12, r9

-	 MOV           r12, r11, ASR #16

-	 STRH          r12, [r4], #-2

-	 BGE           LOOP1

-         BL            The_end

-

-LOOP2:

-

-         LDRSH          r5, [r4]                   @load x[i]

-	 MOV           r6, r5, LSL #16            @L_tmp = x[i] << 16

-	 MOV           r5, r6, ASR r7             @L_tmp >>= exp

-	 QADD          r11, r5, r9

-	 MOV           r12, r11, ASR #16

-	 SUBS          r3, r3, #1

-	 STRH          r12, [r4], #-2

-	 BGE           LOOP2

-

-The_end:

-         LDMFD         r13!, {r4 - r12, r15}

-     

-         @ENDFUNC

-         .END	 

-        

-	

-	  

-

-

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@void Scale_sig(
+@	       Word16 x[],                           /* (i/o) : signal to scale               */
+@	       Word16 lg,                            /* (i)   : size of x[]                   */
+@	       Word16 exp                            /* (i)   : exponent: x = round(x << exp) */
+@	       )
+@
+@r0 --- x[]
+@r1 --- lg
+@r2 --- exp
+
+          .section  .text
+	  .global   Scale_sig_opt
+
+Scale_sig_opt:
+
+         STMFD         r13!, {r4 - r12, r14}
+	 SUB           r3, r1, #1                  @i = lg - 1
+         CMP           r2, #0                      @Compare exp and 0
+	 RSB           r7, r2, #0                  @exp = -exp
+	 ADD           r10, r2, #16                @16 + exp
+         ADD           r4, r0, r3, LSL #1          @x[i] address
+	 MOV           r8, #0x7fffffff
+	 MOV           r9, #0x8000
+	 BLE           LOOP2
+	 
+LOOP1:
+
+         LDRSH          r5, [r4]                    @load x[i]
+         MOV           r12, r5, LSL r10
+	 TEQ           r5, r12, ASR r10
+	 EORNE         r12, r8, r5, ASR #31
+	 SUBS          r3, r3, #1
+	 QADD          r11, r12, r9
+	 MOV           r12, r11, ASR #16
+	 STRH          r12, [r4], #-2
+	 BGE           LOOP1
+         BL            The_end
+
+LOOP2:
+
+         LDRSH          r5, [r4]                   @load x[i]
+	 MOV           r6, r5, LSL #16            @L_tmp = x[i] << 16
+	 MOV           r5, r6, ASR r7             @L_tmp >>= exp
+	 QADD          r11, r5, r9
+	 MOV           r12, r11, ASR #16
+	 SUBS          r3, r3, #1
+	 STRH          r12, [r4], #-2
+	 BGE           LOOP2
+
+The_end:
+         LDMFD         r13!, {r4 - r12, r15}
+     
+         @ENDFUNC
+         .END	 
+        
+	
+	  
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/syn_filt_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/syn_filt_opt.s
index e05e9e0..f4700cd 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/syn_filt_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/syn_filt_opt.s
@@ -1,238 +1,238 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-@**********************************************************************/

-@void Syn_filt(

-@     Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients           */

-@     Word16 x[],                           /* (i)     : input signal                             */

-@     Word16 y[],                           /* (o)     : output signal                            */

-@     Word16 mem[],                         /* (i/o)   : memory associated with this filtering.   */

-@)

-@***********************************************************************

-@ a[]    ---   r0

-@ x[]    ---   r1

-@ y[]    ---   r2

-@ mem[]  ---   r3

-@ m ---  16  lg --- 80  update --- 1

-

-          .section  .text

-	  .global   Syn_filt_asm

-          .extern   voAWB_Copy

-

-Syn_filt_asm:

-

-          STMFD   	r13!, {r4 - r12, r14} 

-          SUB           r13, r13, #700                   @ y_buf[L_FRAME16k + M16k]

-   

-          MOV           r4, r3                           @ copy mem[] address

-          MOV           r5, r13                          @ copy yy = y_buf address

-

-          @ for(i = 0@ i < m@ i++)

-          @{

-          @    *yy++ = mem[i]@

-          @} 

-

-          LDRH          r6,  [r4], #2          

-          LDRH          r7,  [r4], #2

-          LDRH          r8,  [r4], #2

-          LDRH          r9,  [r4], #2

-          LDRH          r10, [r4], #2

-          LDRH          r11, [r4], #2

-          LDRH          r12, [r4], #2

-          LDRH          r14, [r4], #2

-

-          STRH          r6,  [r5], #2

-          STRH          r7,  [r5], #2

-          STRH          r8,  [r5], #2

-          STRH          r9,  [r5], #2

-          STRH          r10, [r5], #2

-          STRH          r11, [r5], #2

-          STRH          r12, [r5], #2

-          STRH          r14, [r5], #2

-

-          LDRH          r6,  [r4], #2          

-          LDRH          r7,  [r4], #2

-          LDRH          r8,  [r4], #2

-          LDRH          r9,  [r4], #2

-          LDRH          r10, [r4], #2

-          LDRH          r11, [r4], #2

-          LDRH          r12, [r4], #2

-          LDRH          r14, [r4], #2

-

-          STRH          r6,  [r5], #2

-          STRH          r7,  [r5], #2

-          STRH          r8,  [r5], #2

-          STRH          r9,  [r5], #2

-          STRH          r10, [r5], #2

-          STRH          r11, [r5], #2

-          STRH          r12, [r5], #2

-          STRH          r14, [r5], #2

-

-          LDRSH         r5, [r0]                         @ load a[0]

-          MOV           r8, #0                           @ i = 0

-          MOV           r5, r5, ASR #1                   @ a0 = a[0] >> 1

-          @MOV           r4, r13

-          @ load all a[]

-

-          LDR           r14, =0xffff

-          LDRSH         r6, [r0, #2]                     @ load a[1]

-          LDRSH         r7, [r0, #4]                     @ load a[2]

-          LDRSH         r9, [r0, #6]                     @ load a[3]

-          LDRSH         r11,[r0, #8]                     @ load a[4]

-          AND           r6, r6, r14

-          AND           r9, r9, r14          

-          ORR           r10, r6, r7, LSL #16             @ -a[2] -- -a[1]

-          ORR           r12, r9, r11, LSL #16            @ -a[4] -- -a[3]

-          STR           r10, [r13, #-4]

-          STR           r12, [r13, #-8]

-          

-          LDRSH         r6, [r0, #10]                    @ load a[5]

-          LDRSH         r7, [r0, #12]                    @ load a[6]

-          LDRSH         r9, [r0, #14]                    @ load a[7]

-          LDRSH         r11,[r0, #16]                    @ load a[8]

-          AND           r6, r6, r14

-          AND           r9, r9, r14          

-          ORR           r10, r6, r7, LSL #16             @ -a[6] -- -a[5]

-          ORR           r12, r9, r11, LSL #16            @ -a[8] -- -a[7]

-          STR           r10, [r13, #-12]

-          STR           r12, [r13, #-16]          

-           

-          LDRSH         r6, [r0, #18]                    @ load a[9]

-          LDRSH         r7, [r0, #20]                    @ load a[10]

-          LDRSH         r9, [r0, #22]                    @ load a[11]

-          LDRSH         r11,[r0, #24]                    @ load a[12]

-          AND           r6, r6, r14

-          AND           r9, r9, r14          

-          ORR           r10, r6, r7, LSL #16             @ -a[10] -- -a[9]

-          ORR           r12, r9, r11, LSL #16            @ -a[12] -- -a[11]

-          STR           r10, [r13, #-20]

-          STR           r12, [r13, #-24]    

-

-          LDRSH         r6, [r0, #26]                    @ load a[13]

-          LDRSH         r7, [r0, #28]                    @ load a[14]

-          LDRSH         r9, [r0, #30]                    @ load a[15]

-          LDRSH         r11,[r0, #32]                    @ load a[16]

-          AND           r6, r6, r14

-          AND           r9, r9, r14          

-          ORR           r10, r6, r7, LSL #16             @ -a[14] -- -a[13]

-          ORR           r12, r9, r11, LSL #16            @ -a[16] -- -a[15]

-          STR           r10, [r13, #-28]

-          STR           r12, [r13, #-32]                

-                     

-          ADD           r4, r13, #32

-LOOP:

-          LDRSH         r6,  [r1], #2                    @ load x[i]

-          ADD           r10, r4, r8, LSL #1              @ temp_p = yy + i

-

-          MUL           r0, r5, r6                      @ L_tmp = x[i] * a0

-          @ for(j = 1@ j <= m, j+=8)

-          LDR           r7,  [r13, #-4]                  @ -a[2]  -a[1]

-          LDRSH         r9,  [r10, #-2]                  @ *(temp_p - 1)

-          LDRSH         r12, [r10, #-4]                  @ *(temp_p - 2)

-

-

-          SMULBB        r14, r9, r7                      @ -a[1] * (*(temp_p -1))

-

-          LDRSH         r6,  [r10, #-6]                  @ *(temp_p - 3)

-

-          SMLABT        r14, r12, r7, r14                @ -a[2] * (*(temp_p - 2))

-

-          LDR           r7,  [r13, #-8]                  @ -a[4] -a[3]

-          LDRSH         r11, [r10, #-8]                  @ *(temp_p - 4)

-

-          SMLABB        r14, r6, r7, r14                 @ -a[3] * (*(temp_p -3))

-

-          LDRSH         r9,  [r10, #-10]                 @ *(temp_p - 5)

-   

-          SMLABT        r14, r11, r7, r14                @ -a[4] * (*(temp_p -4))        

-

-          LDR           r7,  [r13, #-12]                 @ -a[6]  -a[5]

-          LDRSH         r12, [r10, #-12]                 @ *(temp_p - 6)

-

-          SMLABB        r14, r9, r7, r14                 @ -a[5] * (*(temp_p -5))

-

-          LDRSH         r6,  [r10, #-14]                 @ *(temp_p - 7)

-

-          SMLABT        r14, r12, r7, r14                @ -a[6] * (*(temp_p - 6))

-

-          LDR           r7,  [r13, #-16]                 @ -a[8] -a[7]

-          LDRSH         r11, [r10, #-16]                 @ *(temp_p - 8)

-         

-          SMLABB        r14, r6, r7, r14                 @ -a[7] * (*(temp_p -7))

-

-          LDRSH         r9,  [r10, #-18]                 @ *(temp_p - 9)

-

-          SMLABT        r14, r11, r7, r14                @ -a[8] * (*(temp_p -8))          

- 

-          LDR           r7,  [r13, #-20]                 @ -a[10]  -a[9]

-          LDRSH         r12, [r10, #-20]                 @ *(temp_p - 10)

-

-          SMLABB        r14, r9, r7, r14                 @ -a[9] * (*(temp_p -9))

-

-          LDRSH         r6,  [r10, #-22]                 @ *(temp_p - 11)

-

-          SMLABT        r14, r12, r7, r14                @ -a[10] * (*(temp_p - 10))

-

-          LDR           r7,  [r13, #-24]                 @ -a[12] -a[11]

-          LDRSH         r11, [r10, #-24]                 @ *(temp_p - 12)

-

-          SMLABB        r14, r6, r7, r14                 @ -a[11] * (*(temp_p -11))

-

-          LDRSH         r9,  [r10, #-26]                 @ *(temp_p - 13)

-

-          SMLABT        r14, r11, r7, r14                @ -a[12] * (*(temp_p -12))           

-

-          LDR           r7,  [r13, #-28]                 @ -a[14] -a[13]

-          LDRSH         r12, [r10, #-28]                 @ *(temp_p - 14)

- 

-          SMLABB        r14, r9, r7, r14                 @ -a[13] * (*(temp_p -13))

-

-          LDRSH         r6,  [r10, #-30]                 @ *(temp_p - 15)

-

-          SMLABT        r14, r12, r7, r14                @ -a[14] * (*(temp_p - 14))

-

-          LDR           r7,  [r13, #-32]                 @ -a[16] -a[15]

-          LDRSH         r11, [r10, #-32]                 @ *(temp_p - 16)

-

-          SMLABB        r14, r6, r7, r14                 @ -a[15] * (*(temp_p -15))

-

-          SMLABT        r14, r11, r7, r14                @ -a[16] * (*(temp_p -16))

-

-          RSB           r14, r14, r0

-                                  

-          MOV           r7, r14, LSL #4                  @ L_tmp <<=4

-          ADD           r8, r8, #1

-          ADD           r14, r7, #0x8000                 

-          MOV           r7, r14, ASR #16                 @ (L_tmp + 0x8000) >> 16

-          CMP           r8, #80

-          STRH          r7, [r10]                        @ yy[i]

-          STRH          r7, [r2], #2                     @ y[i]

-          BLT           LOOP

- 

-          @ update mem[]

-          ADD           r5, r13, #160                    @ yy[64] address

-          MOV           r1, r3

-          MOV           r0, r5

-          MOV           r2, #16

-          BL            voAWB_Copy          

-

-Syn_filt_asm_end:

- 

-          ADD           r13, r13, #700		     

-          LDMFD   	r13!, {r4 - r12, r15} 

-          @ENDFUNC

-          .END

- 

-

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@**********************************************************************/
+@void Syn_filt(
+@     Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients           */
+@     Word16 x[],                           /* (i)     : input signal                             */
+@     Word16 y[],                           /* (o)     : output signal                            */
+@     Word16 mem[],                         /* (i/o)   : memory associated with this filtering.   */
+@)
+@***********************************************************************
+@ a[]    ---   r0
+@ x[]    ---   r1
+@ y[]    ---   r2
+@ mem[]  ---   r3
+@ m ---  16  lg --- 80  update --- 1
+
+          .section  .text
+	  .global   Syn_filt_asm
+          .extern   voAWB_Copy
+
+Syn_filt_asm:
+
+          STMFD   	r13!, {r4 - r12, r14} 
+          SUB           r13, r13, #700                   @ y_buf[L_FRAME16k + M16k]
+   
+          MOV           r4, r3                           @ copy mem[] address
+          MOV           r5, r13                          @ copy yy = y_buf address
+
+          @ for(i = 0@ i < m@ i++)
+          @{
+          @    *yy++ = mem[i]@
+          @} 
+
+          LDRH          r6,  [r4], #2          
+          LDRH          r7,  [r4], #2
+          LDRH          r8,  [r4], #2
+          LDRH          r9,  [r4], #2
+          LDRH          r10, [r4], #2
+          LDRH          r11, [r4], #2
+          LDRH          r12, [r4], #2
+          LDRH          r14, [r4], #2
+
+          STRH          r6,  [r5], #2
+          STRH          r7,  [r5], #2
+          STRH          r8,  [r5], #2
+          STRH          r9,  [r5], #2
+          STRH          r10, [r5], #2
+          STRH          r11, [r5], #2
+          STRH          r12, [r5], #2
+          STRH          r14, [r5], #2
+
+          LDRH          r6,  [r4], #2          
+          LDRH          r7,  [r4], #2
+          LDRH          r8,  [r4], #2
+          LDRH          r9,  [r4], #2
+          LDRH          r10, [r4], #2
+          LDRH          r11, [r4], #2
+          LDRH          r12, [r4], #2
+          LDRH          r14, [r4], #2
+
+          STRH          r6,  [r5], #2
+          STRH          r7,  [r5], #2
+          STRH          r8,  [r5], #2
+          STRH          r9,  [r5], #2
+          STRH          r10, [r5], #2
+          STRH          r11, [r5], #2
+          STRH          r12, [r5], #2
+          STRH          r14, [r5], #2
+
+          LDRSH         r5, [r0]                         @ load a[0]
+          MOV           r8, #0                           @ i = 0
+          MOV           r5, r5, ASR #1                   @ a0 = a[0] >> 1
+          @MOV           r4, r13
+          @ load all a[]
+
+          LDR           r14, =0xffff
+          LDRSH         r6, [r0, #2]                     @ load a[1]
+          LDRSH         r7, [r0, #4]                     @ load a[2]
+          LDRSH         r9, [r0, #6]                     @ load a[3]
+          LDRSH         r11,[r0, #8]                     @ load a[4]
+          AND           r6, r6, r14
+          AND           r9, r9, r14          
+          ORR           r10, r6, r7, LSL #16             @ -a[2] -- -a[1]
+          ORR           r12, r9, r11, LSL #16            @ -a[4] -- -a[3]
+          STR           r10, [r13, #-4]
+          STR           r12, [r13, #-8]
+          
+          LDRSH         r6, [r0, #10]                    @ load a[5]
+          LDRSH         r7, [r0, #12]                    @ load a[6]
+          LDRSH         r9, [r0, #14]                    @ load a[7]
+          LDRSH         r11,[r0, #16]                    @ load a[8]
+          AND           r6, r6, r14
+          AND           r9, r9, r14          
+          ORR           r10, r6, r7, LSL #16             @ -a[6] -- -a[5]
+          ORR           r12, r9, r11, LSL #16            @ -a[8] -- -a[7]
+          STR           r10, [r13, #-12]
+          STR           r12, [r13, #-16]          
+           
+          LDRSH         r6, [r0, #18]                    @ load a[9]
+          LDRSH         r7, [r0, #20]                    @ load a[10]
+          LDRSH         r9, [r0, #22]                    @ load a[11]
+          LDRSH         r11,[r0, #24]                    @ load a[12]
+          AND           r6, r6, r14
+          AND           r9, r9, r14          
+          ORR           r10, r6, r7, LSL #16             @ -a[10] -- -a[9]
+          ORR           r12, r9, r11, LSL #16            @ -a[12] -- -a[11]
+          STR           r10, [r13, #-20]
+          STR           r12, [r13, #-24]    
+
+          LDRSH         r6, [r0, #26]                    @ load a[13]
+          LDRSH         r7, [r0, #28]                    @ load a[14]
+          LDRSH         r9, [r0, #30]                    @ load a[15]
+          LDRSH         r11,[r0, #32]                    @ load a[16]
+          AND           r6, r6, r14
+          AND           r9, r9, r14          
+          ORR           r10, r6, r7, LSL #16             @ -a[14] -- -a[13]
+          ORR           r12, r9, r11, LSL #16            @ -a[16] -- -a[15]
+          STR           r10, [r13, #-28]
+          STR           r12, [r13, #-32]                
+                     
+          ADD           r4, r13, #32
+LOOP:
+          LDRSH         r6,  [r1], #2                    @ load x[i]
+          ADD           r10, r4, r8, LSL #1              @ temp_p = yy + i
+
+          MUL           r0, r5, r6                      @ L_tmp = x[i] * a0
+          @ for(j = 1@ j <= m, j+=8)
+          LDR           r7,  [r13, #-4]                  @ -a[2]  -a[1]
+          LDRSH         r9,  [r10, #-2]                  @ *(temp_p - 1)
+          LDRSH         r12, [r10, #-4]                  @ *(temp_p - 2)
+
+
+          SMULBB        r14, r9, r7                      @ -a[1] * (*(temp_p -1))
+
+          LDRSH         r6,  [r10, #-6]                  @ *(temp_p - 3)
+
+          SMLABT        r14, r12, r7, r14                @ -a[2] * (*(temp_p - 2))
+
+          LDR           r7,  [r13, #-8]                  @ -a[4] -a[3]
+          LDRSH         r11, [r10, #-8]                  @ *(temp_p - 4)
+
+          SMLABB        r14, r6, r7, r14                 @ -a[3] * (*(temp_p -3))
+
+          LDRSH         r9,  [r10, #-10]                 @ *(temp_p - 5)
+   
+          SMLABT        r14, r11, r7, r14                @ -a[4] * (*(temp_p -4))        
+
+          LDR           r7,  [r13, #-12]                 @ -a[6]  -a[5]
+          LDRSH         r12, [r10, #-12]                 @ *(temp_p - 6)
+
+          SMLABB        r14, r9, r7, r14                 @ -a[5] * (*(temp_p -5))
+
+          LDRSH         r6,  [r10, #-14]                 @ *(temp_p - 7)
+
+          SMLABT        r14, r12, r7, r14                @ -a[6] * (*(temp_p - 6))
+
+          LDR           r7,  [r13, #-16]                 @ -a[8] -a[7]
+          LDRSH         r11, [r10, #-16]                 @ *(temp_p - 8)
+         
+          SMLABB        r14, r6, r7, r14                 @ -a[7] * (*(temp_p -7))
+
+          LDRSH         r9,  [r10, #-18]                 @ *(temp_p - 9)
+
+          SMLABT        r14, r11, r7, r14                @ -a[8] * (*(temp_p -8))          
+ 
+          LDR           r7,  [r13, #-20]                 @ -a[10]  -a[9]
+          LDRSH         r12, [r10, #-20]                 @ *(temp_p - 10)
+
+          SMLABB        r14, r9, r7, r14                 @ -a[9] * (*(temp_p -9))
+
+          LDRSH         r6,  [r10, #-22]                 @ *(temp_p - 11)
+
+          SMLABT        r14, r12, r7, r14                @ -a[10] * (*(temp_p - 10))
+
+          LDR           r7,  [r13, #-24]                 @ -a[12] -a[11]
+          LDRSH         r11, [r10, #-24]                 @ *(temp_p - 12)
+
+          SMLABB        r14, r6, r7, r14                 @ -a[11] * (*(temp_p -11))
+
+          LDRSH         r9,  [r10, #-26]                 @ *(temp_p - 13)
+
+          SMLABT        r14, r11, r7, r14                @ -a[12] * (*(temp_p -12))           
+
+          LDR           r7,  [r13, #-28]                 @ -a[14] -a[13]
+          LDRSH         r12, [r10, #-28]                 @ *(temp_p - 14)
+ 
+          SMLABB        r14, r9, r7, r14                 @ -a[13] * (*(temp_p -13))
+
+          LDRSH         r6,  [r10, #-30]                 @ *(temp_p - 15)
+
+          SMLABT        r14, r12, r7, r14                @ -a[14] * (*(temp_p - 14))
+
+          LDR           r7,  [r13, #-32]                 @ -a[16] -a[15]
+          LDRSH         r11, [r10, #-32]                 @ *(temp_p - 16)
+
+          SMLABB        r14, r6, r7, r14                 @ -a[15] * (*(temp_p -15))
+
+          SMLABT        r14, r11, r7, r14                @ -a[16] * (*(temp_p -16))
+
+          RSB           r14, r14, r0
+                                  
+          MOV           r7, r14, LSL #4                  @ L_tmp <<=4
+          ADD           r8, r8, #1
+          ADD           r14, r7, #0x8000                 
+          MOV           r7, r14, ASR #16                 @ (L_tmp + 0x8000) >> 16
+          CMP           r8, #80
+          STRH          r7, [r10]                        @ yy[i]
+          STRH          r7, [r2], #2                     @ y[i]
+          BLT           LOOP
+ 
+          @ update mem[]
+          ADD           r5, r13, #160                    @ yy[64] address
+          MOV           r1, r3
+          MOV           r0, r5
+          MOV           r2, #16
+          BL            voAWB_Copy          
+
+Syn_filt_asm_end:
+ 
+          ADD           r13, r13, #700		     
+          LDMFD   	r13!, {r4 - r12, r15} 
+          @ENDFUNC
+          .END
+ 
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Deemph_32_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Deemph_32_neon.s
index acb60c3..2afc146 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Deemph_32_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Deemph_32_neon.s
@@ -1,102 +1,102 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-@

-@void Deemph_32(

-@     Word16 x_hi[],                        /* (i)     : input signal (bit31..16) */

-@     Word16 x_lo[],                        /* (i)     : input signal (bit15..4)  */

-@     Word16 y[],                           /* (o)     : output signal (x16)      */

-@     Word16 mu,                            /* (i) Q15 : deemphasis factor        */

-@     Word16 L,                             /* (i)     : vector size              */

-@     Word16 * mem                          /* (i/o)   : memory (y[-1])           */

-@     )

-

-@x_hi     RN      R0

-@x_lo     RN      R1

-@y[]      RN      R2

-@*mem     RN      R3

-

-           .section  .text

-           .global   Deemph_32_asm

-	   

-Deemph_32_asm:

-

-           STMFD   	r13!, {r4 - r12, r14} 

-	   MOV          r4, #2                   @i=0

-	   LDRSH        r6, [r0], #2             @load x_hi[0]

-	   LDRSH        r7, [r1], #2             @load x_lo[0]

-	   LDR          r5, =22282               @r5---mu

-	   MOV          r11, #0x8000

-

-           @y[0]

-	   MOV          r10, r6, LSL #16         @L_tmp = x_hi[0]<<16

-	   MOV          r8,  r5, ASR #1          @fac = mu >> 1

-	   LDR          r5,  [r3]

-	   ADD          r12, r10, r7, LSL #4     @L_tmp += x_lo[0] << 4

-	   MOV          r10, r12, LSL #3         @L_tmp <<= 3

-	   MUL          r9, r5, r8

-	   LDRSH        r6, [r0], #2             @load x_hi[1] 

-	   QDADD        r10, r10, r9

-	   LDRSH        r7, [r1], #2             @load x_lo[1]  

-	   MOV          r12, r10, LSL #1         @L_tmp = L_mac(L_tmp, *mem, fac)

-	   QADD         r10, r12, r11

-	   MOV          r14, r10, ASR #16        @y[0] = round(L_tmp)

-

-

-	   MOV          r10, r6, LSL #16

-	   ADD          r12, r10, r7, LSL #4

-           STRH         r14, [r2], #2            @update y[0]

-	   MOV          r10, r12, LSL #3

-	   MUL          r9, r14, r8

-	   QDADD        r10, r10, r9

-	   MOV          r12, r10, LSL #1

-	   QADD         r10, r12, r11

-	   MOV          r14, r10, ASR #16        @y[1] = round(L_tmp)

-

-LOOP:

-           LDRSH        r6, [r0], #2             @load x_hi[]

-	   LDRSH        r7, [r1], #2

-	   STRH         r14, [r2], #2

-	   MOV          r10, r6, LSL #16

-	   ADD          r12, r10, r7, LSL #4

-	   MUL          r9, r14, r8

-	   MOV          r10, r12, LSL #3

-	   QDADD        r10, r10, r9

-           LDRSH        r6, [r0], #2             @load x_hi[]

-	   MOV          r12, r10, LSL #1

-	   QADD         r10, r12, r11

-	   LDRSH        r7, [r1], #2

-	   MOV          r14, r10, ASR #16

-

-	   MOV          r10, r6, LSL #16

-	   ADD          r12, r10, r7, LSL #4

-	   STRH         r14, [r2], #2

-	   MUL          r9, r14, r8

-	   MOV          r10, r12, LSL #3

-	   QDADD        r10, r10, r9

-           ADD          r4, r4, #2

-	   MOV          r12, r10, LSL #1

-	   QADD         r10, r12, r11

-           CMP          r4, #64

-	   MOV          r14, r10, ASR #16

-

-           BLT          LOOP

-           STR          r14, [r3]

-           STRH         r14, [r2]	   

-

-           LDMFD   	r13!, {r4 - r12, r15} 

-

-	   .END

-

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@void Deemph_32(
+@     Word16 x_hi[],                        /* (i)     : input signal (bit31..16) */
+@     Word16 x_lo[],                        /* (i)     : input signal (bit15..4)  */
+@     Word16 y[],                           /* (o)     : output signal (x16)      */
+@     Word16 mu,                            /* (i) Q15 : deemphasis factor        */
+@     Word16 L,                             /* (i)     : vector size              */
+@     Word16 * mem                          /* (i/o)   : memory (y[-1])           */
+@     )
+
+@x_hi     RN      R0
+@x_lo     RN      R1
+@y[]      RN      R2
+@*mem     RN      R3
+
+           .section  .text
+           .global   Deemph_32_asm
+	   
+Deemph_32_asm:
+
+           STMFD   	r13!, {r4 - r12, r14} 
+	   MOV          r4, #2                   @i=0
+	   LDRSH        r6, [r0], #2             @load x_hi[0]
+	   LDRSH        r7, [r1], #2             @load x_lo[0]
+	   LDR          r5, =22282               @r5---mu
+	   MOV          r11, #0x8000
+
+           @y[0]
+	   MOV          r10, r6, LSL #16         @L_tmp = x_hi[0]<<16
+	   MOV          r8,  r5, ASR #1          @fac = mu >> 1
+	   LDR          r5,  [r3]
+	   ADD          r12, r10, r7, LSL #4     @L_tmp += x_lo[0] << 4
+	   MOV          r10, r12, LSL #3         @L_tmp <<= 3
+	   MUL          r9, r5, r8
+	   LDRSH        r6, [r0], #2             @load x_hi[1] 
+	   QDADD        r10, r10, r9
+	   LDRSH        r7, [r1], #2             @load x_lo[1]  
+	   MOV          r12, r10, LSL #1         @L_tmp = L_mac(L_tmp, *mem, fac)
+	   QADD         r10, r12, r11
+	   MOV          r14, r10, ASR #16        @y[0] = round(L_tmp)
+
+
+	   MOV          r10, r6, LSL #16
+	   ADD          r12, r10, r7, LSL #4
+           STRH         r14, [r2], #2            @update y[0]
+	   MOV          r10, r12, LSL #3
+	   MUL          r9, r14, r8
+	   QDADD        r10, r10, r9
+	   MOV          r12, r10, LSL #1
+	   QADD         r10, r12, r11
+	   MOV          r14, r10, ASR #16        @y[1] = round(L_tmp)
+
+LOOP:
+           LDRSH        r6, [r0], #2             @load x_hi[]
+	   LDRSH        r7, [r1], #2
+	   STRH         r14, [r2], #2
+	   MOV          r10, r6, LSL #16
+	   ADD          r12, r10, r7, LSL #4
+	   MUL          r9, r14, r8
+	   MOV          r10, r12, LSL #3
+	   QDADD        r10, r10, r9
+           LDRSH        r6, [r0], #2             @load x_hi[]
+	   MOV          r12, r10, LSL #1
+	   QADD         r10, r12, r11
+	   LDRSH        r7, [r1], #2
+	   MOV          r14, r10, ASR #16
+
+	   MOV          r10, r6, LSL #16
+	   ADD          r12, r10, r7, LSL #4
+	   STRH         r14, [r2], #2
+	   MUL          r9, r14, r8
+	   MOV          r10, r12, LSL #3
+	   QDADD        r10, r10, r9
+           ADD          r4, r4, #2
+	   MOV          r12, r10, LSL #1
+	   QADD         r10, r12, r11
+           CMP          r4, #64
+	   MOV          r14, r10, ASR #16
+
+           BLT          LOOP
+           STR          r14, [r3]
+           STRH         r14, [r2]	   
+
+           LDMFD   	r13!, {r4 - r12, r15} 
+
+	   .END
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Dot_p_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Dot_p_neon.s
index 07ca344..678f1d0 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Dot_p_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Dot_p_neon.s
@@ -1,127 +1,127 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-@

-@**********************************************************************/

-@Word32 Dot_product12(                      /* (o) Q31: normalized result (1 < val <= -1) */

-@       Word16 x[],                           /* (i) 12bits: x vector                       */

-@       Word16 y[],                           /* (i) 12bits: y vector                       */

-@       Word16 lg,                            /* (i)    : vector length                     */

-@       Word16 * exp                          /* (o)    : exponent of result (0..+30)       */

-@)

-@************************************************************************

-@  x[]   ---  r0

-@  y[]   ---  r1

-@  lg    ---  r2

-@  *exp  ---  r3

-

-          .section   .text

-          .global    Dot_product12_asm

-

-Dot_product12_asm:

-

-          STMFD   	    r13!, {r4 - r12, r14}

-	  CMP               r0, r1

-	  BEQ               LOOP_EQ

-

-          VLD1.S16          {Q0, Q1}, [r0]!               @load 16 Word16 x[]

-          VLD1.S16          {Q2, Q3}, [r0]!               @load 16 Word16 x[]

-          VLD1.S16          {Q4, Q5}, [r0]!               @load 16 Word16 x[]

-          VLD1.S16          {Q6, Q7}, [r0]!               @load 16 Word16 x[]

-	  VLD1.S16          {Q8, Q9}, [r1]!               @load 16 Word16 y[]

-	  VLD1.S16          {Q10, Q11}, [r1]!             @load 16 Word16 y[]

-	  VLD1.S16          {Q12, Q13}, [r1]!             @load 16 Word16 y[]

-

-          VMULL.S16         Q15, D16, D0

-          VMLAL.S16         Q15, D17, D1               

-          VMLAL.S16         Q15, D18, D2

-          VMLAL.S16         Q15, D19, D3

-	  VLD1.S16          {Q0, Q1}, [r1]!               @load 16 Word16 y[]   

-          VMLAL.S16         Q15, D20, D4       

-          VMLAL.S16         Q15, D21, D5

-          VMLAL.S16         Q15, D22, D6

-          VMLAL.S16         Q15, D23, D7                                       

-          VMLAL.S16         Q15, D24, D8

-          VMLAL.S16         Q15, D25, D9

-          VMLAL.S16         Q15, D26, D10

-          VMLAL.S16         Q15, D27, D11

-          VMLAL.S16         Q15, D0, D12

-          VMLAL.S16         Q15, D1, D13

-          VMLAL.S16         Q15, D2, D14

-          VMLAL.S16         Q15, D3, D15

-

-          CMP               r2, #64

-          BEQ               Lable1

-          VLD1.S16          {Q0, Q1}, [r0]!               @load 16 Word16 x[]  

-	  VLD1.S16          {Q2, Q3}, [r1]! 

-          VMLAL.S16         Q15, D4, D0             

-          VMLAL.S16         Q15, D5, D1

-          VMLAL.S16         Q15, D6, D2

-          VMLAL.S16         Q15, D7, D3

-	  BL                Lable1

-

-LOOP_EQ:

-          VLD1.S16          {Q0, Q1}, [r0]!

-	  VLD1.S16          {Q2, Q3}, [r0]!

-	  VLD1.S16          {Q4, Q5}, [r0]!

-	  VLD1.S16          {Q6, Q7}, [r0]!

-	  VMULL.S16         Q15, D0, D0

-	  VMLAL.S16         Q15, D1, D1

-	  VMLAL.S16         Q15, D2, D2

-	  VMLAL.S16         Q15, D3, D3

-	  VMLAL.S16         Q15, D4, D4

-	  VMLAL.S16         Q15, D5, D5

-	  VMLAL.S16         Q15, D6, D6

-	  VMLAL.S16         Q15, D7, D7

-	  VMLAL.S16         Q15, D8, D8

-	  VMLAL.S16         Q15, D9, D9

-	  VMLAL.S16         Q15, D10, D10

-	  VMLAL.S16         Q15, D11, D11

-	  VMLAL.S16         Q15, D12, D12

-	  VMLAL.S16         Q15, D13, D13

-	  VMLAL.S16         Q15, D14, D14

-	  VMLAL.S16         Q15, D15, D15

-

-	  CMP               r2, #64

-	  BEQ               Lable1

-	  VLD1.S16          {Q0, Q1}, [r0]!

-	  VMLAL.S16         Q15, D0, D0

-	  VMLAL.S16         Q15, D1, D1

-	  VMLAL.S16         Q15, D2, D2

-	  VMLAL.S16         Q15, D3, D3

-

-Lable1: 

-

-          VQADD.S32         D30, D30, D31

-          VPADD.S32         D30, D30, D30

-          VMOV.S32          r12, D30[0]        

-

-	  ADD               r12, r12, r12

-          ADD               r12, r12, #1                         @ L_sum = (L_sum << 1)  + 1

-	  MOV               r4, r12

-	  CMP               r12, #0

-	  RSBLT             r4, r12, #0

-          CLZ               r10, r4

-          SUB               r10, r10, #1                         @ sft = norm_l(L_sum)

-          MOV               r0, r12, LSL r10                     @ L_sum = L_sum << sft

-          RSB               r11, r10, #30                        @ *exp = 30 - sft

-          STRH              r11, [r3]                     

-

-Dot_product12_end:

-		     

-          LDMFD   	    r13!, {r4 - r12, r15} 

-

-          .END

-

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@**********************************************************************/
+@Word32 Dot_product12(                      /* (o) Q31: normalized result (1 < val <= -1) */
+@       Word16 x[],                           /* (i) 12bits: x vector                       */
+@       Word16 y[],                           /* (i) 12bits: y vector                       */
+@       Word16 lg,                            /* (i)    : vector length                     */
+@       Word16 * exp                          /* (o)    : exponent of result (0..+30)       */
+@)
+@************************************************************************
+@  x[]   ---  r0
+@  y[]   ---  r1
+@  lg    ---  r2
+@  *exp  ---  r3
+
+          .section   .text
+          .global    Dot_product12_asm
+
+Dot_product12_asm:
+
+          STMFD   	    r13!, {r4 - r12, r14}
+	  CMP               r0, r1
+	  BEQ               LOOP_EQ
+
+          VLD1.S16          {Q0, Q1}, [r0]!               @load 16 Word16 x[]
+          VLD1.S16          {Q2, Q3}, [r0]!               @load 16 Word16 x[]
+          VLD1.S16          {Q4, Q5}, [r0]!               @load 16 Word16 x[]
+          VLD1.S16          {Q6, Q7}, [r0]!               @load 16 Word16 x[]
+	  VLD1.S16          {Q8, Q9}, [r1]!               @load 16 Word16 y[]
+	  VLD1.S16          {Q10, Q11}, [r1]!             @load 16 Word16 y[]
+	  VLD1.S16          {Q12, Q13}, [r1]!             @load 16 Word16 y[]
+
+          VMULL.S16         Q15, D16, D0
+          VMLAL.S16         Q15, D17, D1               
+          VMLAL.S16         Q15, D18, D2
+          VMLAL.S16         Q15, D19, D3
+	  VLD1.S16          {Q0, Q1}, [r1]!               @load 16 Word16 y[]   
+          VMLAL.S16         Q15, D20, D4       
+          VMLAL.S16         Q15, D21, D5
+          VMLAL.S16         Q15, D22, D6
+          VMLAL.S16         Q15, D23, D7                                       
+          VMLAL.S16         Q15, D24, D8
+          VMLAL.S16         Q15, D25, D9
+          VMLAL.S16         Q15, D26, D10
+          VMLAL.S16         Q15, D27, D11
+          VMLAL.S16         Q15, D0, D12
+          VMLAL.S16         Q15, D1, D13
+          VMLAL.S16         Q15, D2, D14
+          VMLAL.S16         Q15, D3, D15
+
+          CMP               r2, #64
+          BEQ               Lable1
+          VLD1.S16          {Q0, Q1}, [r0]!               @load 16 Word16 x[]  
+	  VLD1.S16          {Q2, Q3}, [r1]! 
+          VMLAL.S16         Q15, D4, D0             
+          VMLAL.S16         Q15, D5, D1
+          VMLAL.S16         Q15, D6, D2
+          VMLAL.S16         Q15, D7, D3
+	  BL                Lable1
+
+LOOP_EQ:
+          VLD1.S16          {Q0, Q1}, [r0]!
+	  VLD1.S16          {Q2, Q3}, [r0]!
+	  VLD1.S16          {Q4, Q5}, [r0]!
+	  VLD1.S16          {Q6, Q7}, [r0]!
+	  VMULL.S16         Q15, D0, D0
+	  VMLAL.S16         Q15, D1, D1
+	  VMLAL.S16         Q15, D2, D2
+	  VMLAL.S16         Q15, D3, D3
+	  VMLAL.S16         Q15, D4, D4
+	  VMLAL.S16         Q15, D5, D5
+	  VMLAL.S16         Q15, D6, D6
+	  VMLAL.S16         Q15, D7, D7
+	  VMLAL.S16         Q15, D8, D8
+	  VMLAL.S16         Q15, D9, D9
+	  VMLAL.S16         Q15, D10, D10
+	  VMLAL.S16         Q15, D11, D11
+	  VMLAL.S16         Q15, D12, D12
+	  VMLAL.S16         Q15, D13, D13
+	  VMLAL.S16         Q15, D14, D14
+	  VMLAL.S16         Q15, D15, D15
+
+	  CMP               r2, #64
+	  BEQ               Lable1
+	  VLD1.S16          {Q0, Q1}, [r0]!
+	  VMLAL.S16         Q15, D0, D0
+	  VMLAL.S16         Q15, D1, D1
+	  VMLAL.S16         Q15, D2, D2
+	  VMLAL.S16         Q15, D3, D3
+
+Lable1: 
+
+          VQADD.S32         D30, D30, D31
+          VPADD.S32         D30, D30, D30
+          VMOV.S32          r12, D30[0]        
+
+	  ADD               r12, r12, r12
+          ADD               r12, r12, #1                         @ L_sum = (L_sum << 1)  + 1
+	  MOV               r4, r12
+	  CMP               r12, #0
+	  RSBLT             r4, r12, #0
+          CLZ               r10, r4
+          SUB               r10, r10, #1                         @ sft = norm_l(L_sum)
+          MOV               r0, r12, LSL r10                     @ L_sum = L_sum << sft
+          RSB               r11, r10, #30                        @ *exp = 30 - sft
+          STRH              r11, [r3]                     
+
+Dot_product12_end:
+		     
+          LDMFD   	    r13!, {r4 - r12, r15} 
+
+          .END
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s
index 1880024..5389a1c 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s
@@ -1,228 +1,228 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-@                             

-@**********************************************************************/

-@void Filt_6k_7k(

-@     Word16 signal[],                      /* input:  signal                  */

-@     Word16 lg,                            /* input:  length of input         */

-@     Word16 mem[]                          /* in/out: memory (size=30)        */

-@)

-@***********************************************************************

-@ r0    ---  signal[]

-@ r1    ---  lg

-@ r2    ---  mem[] 

-

-          .section  .text

-          .global   Filt_6k_7k_asm

-          .extern   fir_6k_7k

-

-Filt_6k_7k_asm:

-

-          STMFD   		r13!, {r0 - r12, r14} 

-          SUB    		r13, r13, #240              @ x[L_SUBFR16k + (L_FIR - 1)]

-          MOV     		r8, r0                      @ copy signal[] address

-          MOV     		r5, r2                      @ copy mem[] address

-

-          MOV     		r0, r2

-          MOV     		r1, r13

-

-	  VLD1.S16              {D0, D1, D2, D3}, [r0]!

-	  VLD1.S16              {D4, D5, D6, D7}, [r0]!

-

-	  VST1.S16              {D0, D1, D2, D3}, [r1]!

-	  VST1.S16              {D4, D5, D6}, [r1]!

-	  VST1.S16              D7[0], [r1]!

-	  VST1.S16              D7[1], [r1]!

-

-

-

-          LDR     		r10, Lable1                 @ get fir_7k address     

-          MOV                   r3, r8                      @ change myMemCopy to Copy, due to Copy will change r3 content

-          ADD     	    	r6, r13, #60                @ get x[L_FIR - 1] address

-          MOV           	r7, r3                      @ get signal[i]

-          @for (i = lg - 1@ i >= 0@ i--)

-          @{

-          @     x[i + L_FIR - 1] = signal[i] >> 2@

-          @}

-	  VLD1.S16              {Q0, Q1}, [r7]!		    @ signal[0]  ~ signal[15]

-	  VLD1.S16              {Q2, Q3}, [r7]!             @ signal[16] ~ signal[31]

-          VLD1.S16              {Q4, Q5}, [r7]!             @ signal[32] ~ signal[47]

-	  VLD1.S16              {Q6, Q7}, [r7]!             @ signal[48] ~ signal[63]

-	  VLD1.S16              {Q8, Q9}, [r7]!             @ signal[64] ~ signal[79]

-	  VSHR.S16              Q10, Q0, #2

-          VSHR.S16              Q11, Q1, #2

-          VSHR.S16              Q12, Q2, #2

-	  VSHR.S16              Q13, Q3, #2

-	  VST1.S16              {Q10, Q11}, [r6]!

-	  VSHR.S16              Q0,  Q4, #2

-	  VSHR.S16              Q1,  Q5, #2

-	  VSHR.S16              Q10, Q6, #2

-	  VSHR.S16              Q11, Q7, #2

-	  VSHR.S16              Q2,  Q8, #2

-	  VSHR.S16              Q3,  Q9, #2

-	  VST1.S16              {Q12, Q13}, [r6]!

-	  VST1.S16              {Q0, Q1}, [r6]!

-	  VST1.S16              {Q10, Q11}, [r6]!

-	  VST1.S16              {Q2, Q3}, [r6]!

-

-	  MOV                   r12, r5

-          @STR     		r5, [sp, #-4]               @ PUSH  r5 to stack

-          @ not use registers: r4, r10, r12, r14, r5

-          MOV     		r4, r13 

-          MOV     		r5, #0                      @ i = 0    

-         

-          @ r4 --- x[i], r10 ---- fir_6k_7k

-          VLD1.S16              {Q0, Q1}, [r10]!           @fir_6k_7k[0]  ~ fir_6k_7k[15]

-	  VLD1.S16              {Q2, Q3}, [r10]!           @fir_6k_7k[16] ~ fir_6k_7k[31]

-          VMOV.S16              D7[3], r5                        @set fir_6k_7K = 0

-

-	  VLD1.S16              {Q4, Q5}, [r4]!            @x[0]  ~ x[15]

-	  VLD1.S16              {Q6, Q7}, [r4]!            @x[16] ~ X[31]

-	  VLD1.S16              {Q8}, [r4]! 

-          VMOV.S16              Q15, #0	  

-          

-LOOP_6K7K:

-

-          VMULL.S16             Q9,D8,D0[0]                 

-          VMULL.S16             Q10,D9,D1[0] 

-          VMULL.S16             Q11,D9,D0[0]                 

-          VMULL.S16             Q12,D10,D1[0]

-          VEXT.8                Q4,Q4,Q5,#2

-          VMLAL.S16             Q9,D10,D2[0]

-          VMLAL.S16             Q10,D11,D3[0]

-          VMLAL.S16             Q11,D11,D2[0]

-          VMLAL.S16             Q12,D12,D3[0]    

-          VEXT.8                Q5,Q5,Q6,#2

-          VMLAL.S16             Q9,D12,D4[0]

-          VMLAL.S16             Q10,D13,D5[0]

-          VMLAL.S16             Q11,D13,D4[0]

-          VMLAL.S16             Q12,D14,D5[0]

-          VEXT.8                Q6,Q6,Q7,#2

-          VMLAL.S16             Q9,D14,D6[0]

-          VMLAL.S16             Q10,D15,D7[0]

-          VMLAL.S16             Q11,D15,D6[0]

-	  VMLAL.S16             Q12,D16,D7[0]

-	  VEXT.8  		Q7,Q7,Q8,#2 

-

-	  VMLAL.S16 		Q9,D8,D0[1]                

-	  VMLAL.S16     	Q10,D9,D1[1]

-	  VEXT.8 		Q8,Q8,Q15,#2 

-	  VMLAL.S16 		Q11,D9,D0[1]                

-	  VMLAL.S16 		Q12,D10,D1[1]

-	  VEXT.8  		Q4,Q4,Q5,#2

-	  VMLAL.S16 		Q9,D10,D2[1]

-	  VMLAL.S16 		Q10,D11,D3[1]

-	  VMLAL.S16 		Q11,D11,D2[1]

-	  VMLAL.S16 		Q12,D12,D3[1]    

-	  VEXT.8  		Q5,Q5,Q6,#2

-	  VMLAL.S16 		Q9,D12,D4[1]

-	  VMLAL.S16 		Q10,D13,D5[1]

-	  VMLAL.S16 		Q11,D13,D4[1]

-	  VMLAL.S16 		Q12,D14,D5[1]

-	  VEXT.8  		Q6,Q6,Q7,#2

-	  VMLAL.S16 		Q9,D14,D6[1]

-	  VMLAL.S16 		Q10,D15,D7[1]

-	  VMLAL.S16 		Q11,D15,D6[1]

-	  VMLAL.S16 		Q12,D16,D7[1]

-	  VEXT.8  		Q7,Q7,Q8,#2 

-

-	  VMLAL.S16 		Q9,D8,D0[2]           

-	  VMLAL.S16 		Q10,D9,D1[2]

-	  VEXT.8 		Q8,Q8,Q15,#2 

-	  VMLAL.S16 		Q11,D9,D0[2]           

-	  VMLAL.S16 		Q12,D10,D1[2]

-	  VEXT.8  		Q4,Q4,Q5,#2

-	  VMLAL.S16 		Q9,D10,D2[2]

-	  VMLAL.S16 		Q10,D11,D3[2]

-	  VMLAL.S16 		Q11,D11,D2[2]

-	  VMLAL.S16 		Q12,D12,D3[2]    

-	  VEXT.8  		Q5,Q5,Q6,#2

-	  VMLAL.S16 		Q9,D12,D4[2]

-	  VMLAL.S16 		Q10,D13,D5[2]

-	  VMLAL.S16 		Q11,D13,D4[2]

-	  VMLAL.S16 		Q12,D14,D5[2]

-	  VEXT.8  		Q6,Q6,Q7,#2

-	  VMLAL.S16 		Q9,D14,D6[2]

-	  VMLAL.S16 		Q10,D15,D7[2]

-	  VMLAL.S16 		Q11,D15,D6[2]

-	  VMLAL.S16 		Q12,D16,D7[2]

-	  VEXT.8  		Q7,Q7,Q8,#2 

-

-	  VMLAL.S16 		Q9,D8,D0[3]              

-	  VMLAL.S16 		Q10,D9,D1[3]

-	  VEXT.8 		Q8,Q8,Q15,#2 

-	  VMLAL.S16 		Q11,D9,D0[3]              

-	  VMLAL.S16 		Q12,D10,D1[3]

-	  VEXT.8  		Q4,Q4,Q5,#2

-	  VMLAL.S16 		Q9,D10,D2[3]

-	  VMLAL.S16 		Q10,D11,D3[3]

-	  VMLAL.S16 		Q11,D11,D2[3]

-	  VMLAL.S16 		Q12,D12,D3[3]    

-	  VEXT.8  		Q5,Q5,Q6,#2

-	  VMLAL.S16 		Q9,D12,D4[3]

-	  VMLAL.S16 		Q10,D13,D5[3]

-	  VMLAL.S16 		Q11,D13,D4[3]

-	  VMLAL.S16 		Q12,D14,D5[3]

-	  VEXT.8  		Q6,Q6,Q7,#2

-	  VMLAL.S16 		Q9,D14,D6[3]

-	  VMLAL.S16 		Q10,D15,D7[3]

-	  VMLAL.S16 		Q11,D15,D6[3]

-	  VMLAL.S16 		Q12,D16,D7[3]

-	  VEXT.8 		Q7,Q7,Q8,#2     

-

-	  VMOV.S16  		D8,D9

-	  VEXT.8 		Q8,Q8,Q15,#2 

-	  VMOV.S16  		D9,D10

-	  VADD.S32  		Q9,Q9,Q10

-	  VMOV.S16  		D10,D11

-	  VMOV.S16  		D11,D12

-	  VADD.S32  		Q11,Q11,Q12

-	  VMOV.S16  		D12,D13

-	  VQRSHRN.S32 		D28,Q9,#15

-	  VMOV.S16  		D13,D14

-	  VMOV.S16  		D14,D15

-	  VQRSHRN.S32 		D29,Q11,#15

-	  VMOV.S16  		D15,D16

-

-	  VLD1.S16  		{Q8},[r4]!

-	  ADD                   r5, r5, #8

-	  CMP   		r5, #80

-	  VST1.S16  		{D28,D29},[r3]!

-	  BLT     		LOOP_6K7K

-

-          ADD     		r0, r13, #160               @x + lg

-	  MOV                   r1, r12

-	  @LDR     		r1, [sp, #-4]               @mem address

-

-	  VLD1.S16              {D0, D1, D2, D3}, [r0]!

-	  VLD1.S16              {D4, D5, D6, D7}, [r0]!

-

-	  VST1.S16              {D0, D1, D2, D3}, [r1]!

-	  VST1.S16              {D4, D5, D6}, [r1]!

-	  VST1.S16              D7[0], [r1]!

-	  VST1.S16              D7[1], [r1]!

-                    

-Filt_6k_7k_end:

-

-          ADD     		r13, r13, #240  

-          LDMFD   		r13!, {r0 - r12, r15} 

- 

-Lable1:

-          .word   		fir_6k_7k

-          @ENDFUNC

-          .END

-

-

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@                             
+@**********************************************************************/
+@void Filt_6k_7k(
+@     Word16 signal[],                      /* input:  signal                  */
+@     Word16 lg,                            /* input:  length of input         */
+@     Word16 mem[]                          /* in/out: memory (size=30)        */
+@)
+@***********************************************************************
+@ r0    ---  signal[]
+@ r1    ---  lg
+@ r2    ---  mem[] 
+
+          .section  .text
+          .global   Filt_6k_7k_asm
+          .extern   fir_6k_7k
+
+Filt_6k_7k_asm:
+
+          STMFD   		r13!, {r0 - r12, r14} 
+          SUB    		r13, r13, #240              @ x[L_SUBFR16k + (L_FIR - 1)]
+          MOV     		r8, r0                      @ copy signal[] address
+          MOV     		r5, r2                      @ copy mem[] address
+
+          MOV     		r0, r2
+          MOV     		r1, r13
+
+	  VLD1.S16              {D0, D1, D2, D3}, [r0]!
+	  VLD1.S16              {D4, D5, D6, D7}, [r0]!
+
+	  VST1.S16              {D0, D1, D2, D3}, [r1]!
+	  VST1.S16              {D4, D5, D6}, [r1]!
+	  VST1.S16              D7[0], [r1]!
+	  VST1.S16              D7[1], [r1]!
+
+
+
+          LDR     		r10, Lable1                 @ get fir_7k address     
+          MOV                   r3, r8                      @ change myMemCopy to Copy, due to Copy will change r3 content
+          ADD     	    	r6, r13, #60                @ get x[L_FIR - 1] address
+          MOV           	r7, r3                      @ get signal[i]
+          @for (i = lg - 1@ i >= 0@ i--)
+          @{
+          @     x[i + L_FIR - 1] = signal[i] >> 2@
+          @}
+	  VLD1.S16              {Q0, Q1}, [r7]!		    @ signal[0]  ~ signal[15]
+	  VLD1.S16              {Q2, Q3}, [r7]!             @ signal[16] ~ signal[31]
+          VLD1.S16              {Q4, Q5}, [r7]!             @ signal[32] ~ signal[47]
+	  VLD1.S16              {Q6, Q7}, [r7]!             @ signal[48] ~ signal[63]
+	  VLD1.S16              {Q8, Q9}, [r7]!             @ signal[64] ~ signal[79]
+	  VSHR.S16              Q10, Q0, #2
+          VSHR.S16              Q11, Q1, #2
+          VSHR.S16              Q12, Q2, #2
+	  VSHR.S16              Q13, Q3, #2
+	  VST1.S16              {Q10, Q11}, [r6]!
+	  VSHR.S16              Q0,  Q4, #2
+	  VSHR.S16              Q1,  Q5, #2
+	  VSHR.S16              Q10, Q6, #2
+	  VSHR.S16              Q11, Q7, #2
+	  VSHR.S16              Q2,  Q8, #2
+	  VSHR.S16              Q3,  Q9, #2
+	  VST1.S16              {Q12, Q13}, [r6]!
+	  VST1.S16              {Q0, Q1}, [r6]!
+	  VST1.S16              {Q10, Q11}, [r6]!
+	  VST1.S16              {Q2, Q3}, [r6]!
+
+	  MOV                   r12, r5
+          @STR     		r5, [sp, #-4]               @ PUSH  r5 to stack
+          @ not use registers: r4, r10, r12, r14, r5
+          MOV     		r4, r13 
+          MOV     		r5, #0                      @ i = 0    
+         
+          @ r4 --- x[i], r10 ---- fir_6k_7k
+          VLD1.S16              {Q0, Q1}, [r10]!           @fir_6k_7k[0]  ~ fir_6k_7k[15]
+	  VLD1.S16              {Q2, Q3}, [r10]!           @fir_6k_7k[16] ~ fir_6k_7k[31]
+          VMOV.S16              D7[3], r5                        @set fir_6k_7K = 0
+
+	  VLD1.S16              {Q4, Q5}, [r4]!            @x[0]  ~ x[15]
+	  VLD1.S16              {Q6, Q7}, [r4]!            @x[16] ~ X[31]
+	  VLD1.S16              {Q8}, [r4]! 
+          VMOV.S16              Q15, #0	  
+          
+LOOP_6K7K:
+
+          VMULL.S16             Q9,D8,D0[0]                 
+          VMULL.S16             Q10,D9,D1[0] 
+          VMULL.S16             Q11,D9,D0[0]                 
+          VMULL.S16             Q12,D10,D1[0]
+          VEXT.8                Q4,Q4,Q5,#2
+          VMLAL.S16             Q9,D10,D2[0]
+          VMLAL.S16             Q10,D11,D3[0]
+          VMLAL.S16             Q11,D11,D2[0]
+          VMLAL.S16             Q12,D12,D3[0]    
+          VEXT.8                Q5,Q5,Q6,#2
+          VMLAL.S16             Q9,D12,D4[0]
+          VMLAL.S16             Q10,D13,D5[0]
+          VMLAL.S16             Q11,D13,D4[0]
+          VMLAL.S16             Q12,D14,D5[0]
+          VEXT.8                Q6,Q6,Q7,#2
+          VMLAL.S16             Q9,D14,D6[0]
+          VMLAL.S16             Q10,D15,D7[0]
+          VMLAL.S16             Q11,D15,D6[0]
+	  VMLAL.S16             Q12,D16,D7[0]
+	  VEXT.8  		Q7,Q7,Q8,#2 
+
+	  VMLAL.S16 		Q9,D8,D0[1]                
+	  VMLAL.S16     	Q10,D9,D1[1]
+	  VEXT.8 		Q8,Q8,Q15,#2 
+	  VMLAL.S16 		Q11,D9,D0[1]                
+	  VMLAL.S16 		Q12,D10,D1[1]
+	  VEXT.8  		Q4,Q4,Q5,#2
+	  VMLAL.S16 		Q9,D10,D2[1]
+	  VMLAL.S16 		Q10,D11,D3[1]
+	  VMLAL.S16 		Q11,D11,D2[1]
+	  VMLAL.S16 		Q12,D12,D3[1]    
+	  VEXT.8  		Q5,Q5,Q6,#2
+	  VMLAL.S16 		Q9,D12,D4[1]
+	  VMLAL.S16 		Q10,D13,D5[1]
+	  VMLAL.S16 		Q11,D13,D4[1]
+	  VMLAL.S16 		Q12,D14,D5[1]
+	  VEXT.8  		Q6,Q6,Q7,#2
+	  VMLAL.S16 		Q9,D14,D6[1]
+	  VMLAL.S16 		Q10,D15,D7[1]
+	  VMLAL.S16 		Q11,D15,D6[1]
+	  VMLAL.S16 		Q12,D16,D7[1]
+	  VEXT.8  		Q7,Q7,Q8,#2 
+
+	  VMLAL.S16 		Q9,D8,D0[2]           
+	  VMLAL.S16 		Q10,D9,D1[2]
+	  VEXT.8 		Q8,Q8,Q15,#2 
+	  VMLAL.S16 		Q11,D9,D0[2]           
+	  VMLAL.S16 		Q12,D10,D1[2]
+	  VEXT.8  		Q4,Q4,Q5,#2
+	  VMLAL.S16 		Q9,D10,D2[2]
+	  VMLAL.S16 		Q10,D11,D3[2]
+	  VMLAL.S16 		Q11,D11,D2[2]
+	  VMLAL.S16 		Q12,D12,D3[2]    
+	  VEXT.8  		Q5,Q5,Q6,#2
+	  VMLAL.S16 		Q9,D12,D4[2]
+	  VMLAL.S16 		Q10,D13,D5[2]
+	  VMLAL.S16 		Q11,D13,D4[2]
+	  VMLAL.S16 		Q12,D14,D5[2]
+	  VEXT.8  		Q6,Q6,Q7,#2
+	  VMLAL.S16 		Q9,D14,D6[2]
+	  VMLAL.S16 		Q10,D15,D7[2]
+	  VMLAL.S16 		Q11,D15,D6[2]
+	  VMLAL.S16 		Q12,D16,D7[2]
+	  VEXT.8  		Q7,Q7,Q8,#2 
+
+	  VMLAL.S16 		Q9,D8,D0[3]              
+	  VMLAL.S16 		Q10,D9,D1[3]
+	  VEXT.8 		Q8,Q8,Q15,#2 
+	  VMLAL.S16 		Q11,D9,D0[3]              
+	  VMLAL.S16 		Q12,D10,D1[3]
+	  VEXT.8  		Q4,Q4,Q5,#2
+	  VMLAL.S16 		Q9,D10,D2[3]
+	  VMLAL.S16 		Q10,D11,D3[3]
+	  VMLAL.S16 		Q11,D11,D2[3]
+	  VMLAL.S16 		Q12,D12,D3[3]    
+	  VEXT.8  		Q5,Q5,Q6,#2
+	  VMLAL.S16 		Q9,D12,D4[3]
+	  VMLAL.S16 		Q10,D13,D5[3]
+	  VMLAL.S16 		Q11,D13,D4[3]
+	  VMLAL.S16 		Q12,D14,D5[3]
+	  VEXT.8  		Q6,Q6,Q7,#2
+	  VMLAL.S16 		Q9,D14,D6[3]
+	  VMLAL.S16 		Q10,D15,D7[3]
+	  VMLAL.S16 		Q11,D15,D6[3]
+	  VMLAL.S16 		Q12,D16,D7[3]
+	  VEXT.8 		Q7,Q7,Q8,#2     
+
+	  VMOV.S16  		D8,D9
+	  VEXT.8 		Q8,Q8,Q15,#2 
+	  VMOV.S16  		D9,D10
+	  VADD.S32  		Q9,Q9,Q10
+	  VMOV.S16  		D10,D11
+	  VMOV.S16  		D11,D12
+	  VADD.S32  		Q11,Q11,Q12
+	  VMOV.S16  		D12,D13
+	  VQRSHRN.S32 		D28,Q9,#15
+	  VMOV.S16  		D13,D14
+	  VMOV.S16  		D14,D15
+	  VQRSHRN.S32 		D29,Q11,#15
+	  VMOV.S16  		D15,D16
+
+	  VLD1.S16  		{Q8},[r4]!
+	  ADD                   r5, r5, #8
+	  CMP   		r5, #80
+	  VST1.S16  		{D28,D29},[r3]!
+	  BLT     		LOOP_6K7K
+
+          ADD     		r0, r13, #160               @x + lg
+	  MOV                   r1, r12
+	  @LDR     		r1, [sp, #-4]               @mem address
+
+	  VLD1.S16              {D0, D1, D2, D3}, [r0]!
+	  VLD1.S16              {D4, D5, D6, D7}, [r0]!
+
+	  VST1.S16              {D0, D1, D2, D3}, [r1]!
+	  VST1.S16              {D4, D5, D6}, [r1]!
+	  VST1.S16              D7[0], [r1]!
+	  VST1.S16              D7[1], [r1]!
+                    
+Filt_6k_7k_end:
+
+          ADD     		r13, r13, #240  
+          LDMFD   		r13!, {r0 - r12, r15} 
+ 
+Lable1:
+          .word   		fir_6k_7k
+          @ENDFUNC
+          .END
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Syn_filt_32_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Syn_filt_32_neon.s
index cb1764f..1e65efa 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Syn_filt_32_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Syn_filt_32_neon.s
@@ -1,133 +1,133 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-@

-@**********************************************************************/

-@void Syn_filt_32(

-@     Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients */

-@     Word16 m,                             /* (i)     : order of LP filter             */

-@     Word16 exc[],                         /* (i) Qnew: excitation (exc[i] >> Qnew)    */

-@     Word16 Qnew,                          /* (i)     : exc scaling = 0(min) to 8(max) */

-@     Word16 sig_hi[],                      /* (o) /16 : synthesis high                 */

-@     Word16 sig_lo[],                      /* (o) /16 : synthesis low                  */

-@     Word16 lg                             /* (i)     : size of filtering              */

-@)

-@***********************************************************************

-@ a[]      --- r0

-@ m        --- r1

-@ exc[]    --- r2

-@ Qnew     --- r3

-@ sig_hi[] --- r4

-@ sig_lo[] --- r5

-@ lg       --- r6

-

-          .section  .text 

-          .global   Syn_filt_32_asm

-

-Syn_filt_32_asm:

-

-          STMFD   	r13!, {r4 - r12, r14} 

-          LDR           r4,  [r13, #40]                  @ get sig_hi[] address

-          LDR           r5,  [r13, #44]                  @ get sig_lo[] address

-

-          LDRSH         r6,  [r0], #2                    @ load Aq[0]

-          ADD           r7,  r3, #4                      @ 4 + Q_new

-          MOV           r3, r6, ASR r7                   @ a0 = Aq[0] >> (4 + Q_new)

-

-	  SUB           r10, r4, #32                     @ sig_hi[-16] address

-	  SUB           r11, r5, #32                     @ sig_lo[-16] address

-

-	  VLD1.S16      {D0, D1, D2, D3}, [r0]!          @a[1] ~ a[16] 

-  

-          MOV           r8, #0                           @ i = 0

-

-	  VLD1.S16      {D4, D5, D6, D7}, [r10]!         @ sig_hi[-16] ~ sig_hi[-1]

-          VREV64.16     D0, D0

-          VREV64.16     D1, D1

-	  VLD1.S16      {D8, D9, D10, D11}, [r11]!       @ sig_lo[-16] ~ sig_lo[-1]

-          VREV64.16     D2, D2

-          VREV64.16     D3, D3	

-          VDUP.S32      Q15, r8

-              

-SYN_LOOP:

-

-          LDRSH         r6, [r2], #2                     @exc[i]

-	  @L_tmp = L_msu(L_tmp, sig_lo[i - j], a[j])@

-	  VMULL.S16     Q10, D8, D3

-	  VEXT.8        D8, D8, D9, #2

-	  VMLAL.S16     Q10, D9, D2

-	  VMLAL.S16     Q10, D10, D1

-	  VMLAL.S16     Q10, D11, D0

-

-	  VEXT.8        D9, D9, D10, #2

-	  VEXT.8        D10, D10, D11, #2

-	  

-	  VPADD.S32     D28, D20, D21

-          MUL           r12, r6, r3                      @exc[i] * a0

-	  VPADD.S32     D29, D28, D28

-	  VDUP.S32      Q10, D29[0]                      @result1

-          

-	  VMULL.S16     Q11, D4, D3

-	  VMLAL.S16     Q11, D5, D2

-          VSUB.S32      Q10, Q15, Q10

-	  @L_tmp = L_msu(L_tmp, sig_hi[i - j], a[j])@

-

-	  VMLAL.S16     Q11, D6, D1

-	  VEXT.8        D4, D4, D5, #2

-	  VMLAL.S16     Q11, D7, D0

-

-

-	  VEXT.8        D5, D5, D6, #2

-	  VEXT.8        D6, D6, D7, #2

-

-	  VPADD.S32     D28, D22, D23

-          VPADD.S32     D29, D28, D28

-          MOV           r14, r12, LSL #1                 @exc[i] * a0 << 1

-          VDUP.S32      Q11, D29[0]                      @result2

-

-

-

-	  VSHR.S32      Q10, Q10, #11                    @result1 >>= 11

-	  VSHL.S32      Q11, Q11, #1                     @result2 <<= 1

-	  VDUP.S32      Q12, r14                         

-	  VADD.S32      Q12, Q12, Q10                    @L_tmp = L_tmp - (result1 >>= 11) - (result2 <<= 1)

-	  VSUB.S32      Q12, Q12, Q11

-

-	  VSHL.S32      Q12, Q12, #3                     @L_tmp <<= 3

-

-

-	  VSHRN.S32     D20, Q12, #16                    @sig_hi[i] = L_tmp >> 16@

-	  VMOV.S16      r10, D20[0]

-	  VSHR.S32      Q12, Q12, #4                     @L_tmp >>= 4

-	  VEXT.8        D7, D7, D20, #2

-	  STRH          r10, [r4], #2                    @store sig_hi[i]

-          VMOV.S32      r11, D24[0]                      @r11 --- L_tmp >>= 4

-	  ADD           r8, r8, #1

-	  SUB           r12, r11, r10, LSL #12

-	  @MOV           r11, r12, ASR #16                @sig_lo[i]

-	  VDUP.S16      D21, r12

-	  VEXT.8        D11, D11, D21, #2

-	  STRH          r12, [r5], #2                    @stroe sig_lo[i]

-

-          CMP           r8, #64

-          BLT           SYN_LOOP                          

-         

-Syn_filt_32_end:

-		     

-          LDMFD   	    r13!, {r4 - r12, r15} 

-          @ENDFUNC

-          .END

- 

-

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@**********************************************************************/
+@void Syn_filt_32(
+@     Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients */
+@     Word16 m,                             /* (i)     : order of LP filter             */
+@     Word16 exc[],                         /* (i) Qnew: excitation (exc[i] >> Qnew)    */
+@     Word16 Qnew,                          /* (i)     : exc scaling = 0(min) to 8(max) */
+@     Word16 sig_hi[],                      /* (o) /16 : synthesis high                 */
+@     Word16 sig_lo[],                      /* (o) /16 : synthesis low                  */
+@     Word16 lg                             /* (i)     : size of filtering              */
+@)
+@***********************************************************************
+@ a[]      --- r0
+@ m        --- r1
+@ exc[]    --- r2
+@ Qnew     --- r3
+@ sig_hi[] --- r4
+@ sig_lo[] --- r5
+@ lg       --- r6
+
+          .section  .text 
+          .global   Syn_filt_32_asm
+
+Syn_filt_32_asm:
+
+          STMFD   	r13!, {r4 - r12, r14} 
+          LDR           r4,  [r13, #40]                  @ get sig_hi[] address
+          LDR           r5,  [r13, #44]                  @ get sig_lo[] address
+
+          LDRSH         r6,  [r0], #2                    @ load Aq[0]
+          ADD           r7,  r3, #4                      @ 4 + Q_new
+          MOV           r3, r6, ASR r7                   @ a0 = Aq[0] >> (4 + Q_new)
+
+	  SUB           r10, r4, #32                     @ sig_hi[-16] address
+	  SUB           r11, r5, #32                     @ sig_lo[-16] address
+
+	  VLD1.S16      {D0, D1, D2, D3}, [r0]!          @a[1] ~ a[16] 
+  
+          MOV           r8, #0                           @ i = 0
+
+	  VLD1.S16      {D4, D5, D6, D7}, [r10]!         @ sig_hi[-16] ~ sig_hi[-1]
+          VREV64.16     D0, D0
+          VREV64.16     D1, D1
+	  VLD1.S16      {D8, D9, D10, D11}, [r11]!       @ sig_lo[-16] ~ sig_lo[-1]
+          VREV64.16     D2, D2
+          VREV64.16     D3, D3	
+          VDUP.S32      Q15, r8
+              
+SYN_LOOP:
+
+          LDRSH         r6, [r2], #2                     @exc[i]
+	  @L_tmp = L_msu(L_tmp, sig_lo[i - j], a[j])@
+	  VMULL.S16     Q10, D8, D3
+	  VEXT.8        D8, D8, D9, #2
+	  VMLAL.S16     Q10, D9, D2
+	  VMLAL.S16     Q10, D10, D1
+	  VMLAL.S16     Q10, D11, D0
+
+	  VEXT.8        D9, D9, D10, #2
+	  VEXT.8        D10, D10, D11, #2
+	  
+	  VPADD.S32     D28, D20, D21
+          MUL           r12, r6, r3                      @exc[i] * a0
+	  VPADD.S32     D29, D28, D28
+	  VDUP.S32      Q10, D29[0]                      @result1
+          
+	  VMULL.S16     Q11, D4, D3
+	  VMLAL.S16     Q11, D5, D2
+          VSUB.S32      Q10, Q15, Q10
+	  @L_tmp = L_msu(L_tmp, sig_hi[i - j], a[j])@
+
+	  VMLAL.S16     Q11, D6, D1
+	  VEXT.8        D4, D4, D5, #2
+	  VMLAL.S16     Q11, D7, D0
+
+
+	  VEXT.8        D5, D5, D6, #2
+	  VEXT.8        D6, D6, D7, #2
+
+	  VPADD.S32     D28, D22, D23
+          VPADD.S32     D29, D28, D28
+          MOV           r14, r12, LSL #1                 @exc[i] * a0 << 1
+          VDUP.S32      Q11, D29[0]                      @result2
+
+
+
+	  VSHR.S32      Q10, Q10, #11                    @result1 >>= 11
+	  VSHL.S32      Q11, Q11, #1                     @result2 <<= 1
+	  VDUP.S32      Q12, r14                         
+	  VADD.S32      Q12, Q12, Q10                    @L_tmp = L_tmp - (result1 >>= 11) - (result2 <<= 1)
+	  VSUB.S32      Q12, Q12, Q11
+
+	  VSHL.S32      Q12, Q12, #3                     @L_tmp <<= 3
+
+
+	  VSHRN.S32     D20, Q12, #16                    @sig_hi[i] = L_tmp >> 16@
+	  VMOV.S16      r10, D20[0]
+	  VSHR.S32      Q12, Q12, #4                     @L_tmp >>= 4
+	  VEXT.8        D7, D7, D20, #2
+	  STRH          r10, [r4], #2                    @store sig_hi[i]
+          VMOV.S32      r11, D24[0]                      @r11 --- L_tmp >>= 4
+	  ADD           r8, r8, #1
+	  SUB           r12, r11, r10, LSL #12
+	  @MOV           r11, r12, ASR #16                @sig_lo[i]
+	  VDUP.S16      D21, r12
+	  VEXT.8        D11, D11, D21, #2
+	  STRH          r12, [r5], #2                    @stroe sig_lo[i]
+
+          CMP           r8, #64
+          BLT           SYN_LOOP                          
+         
+Syn_filt_32_end:
+		     
+          LDMFD   	    r13!, {r4 - r12, r15} 
+          @ENDFUNC
+          .END
+ 
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/cor_h_vec_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/cor_h_vec_neon.s
index 2e339db..c314a88 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/cor_h_vec_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/cor_h_vec_neon.s
@@ -1,151 +1,151 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-@

-@static void cor_h_vec_012(

-@		Word16 h[],                           /* (i) scaled impulse response                 */

-@		Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */

-@		Word16 track,                         /* (i) track to use                            */

-@		Word16 sign[],                        /* (i) sign vector                             */

-@		Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */

-@		Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */

-@		Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */

-@)

-@r0 ---- h[]

-@r1 ---- vec[]

-@r2 ---- track

-@r3 ---- sign[]

-@r4 ---- rrixix[][NB_POS]

-@r5 ---- cor_1[]

-@r6 ---- cor_2[]

-

-              .section .text 

-	      .global  cor_h_vec_012_asm

-

-cor_h_vec_012_asm:

-

-             STMFD         r13!, {r4 - r12, r14}

-	     LDR           r4, [r13, #40]                    @load rrixix[][NB_POS]

-	     ADD           r7, r4, r2, LSL #5                @r7 --- p0 = rrixix[track]

-             MOV           r4, #0                            @i=0

-

-	     @r0 --- h[], r1 --- vec[],  r2 --- pos

-	     @r3 --- sign[], r4 --- i, r7 --- p0

-

-LOOPi:

-             MOV           r5, #0                            @L_sum1 = 0

-	     MOV           r6, #0                            @L_sum2 = 0

-	     ADD           r9, r1, r2, LSL #1                @p2 = &vec[pos]

-	     MOV           r10, r0                           @p1 = h

-	     RSB           r11, r2, #62                      @j=62-pos

-

-LOOPj1:

-	     LDRSH         r12, [r10], #2  

-	     LDRSH         r8,  [r9], #2

-	     LDRSH         r14, [r9]

-	     SUBS          r11, r11, #1

-             MLA           r5, r12, r8, r5

-             MLA           r6, r12, r14, r6	 

-	     BGE           LOOPj1

-

-	     LDRSH         r12, [r10], #2                     @*p1++

-	     MOV           r6, r6, LSL #2                     @L_sum2 = (L_sum2 << 2)

-             MLA           r5, r12, r14, r5

-             MOV           r14, #0x8000

-             MOV           r5, r5, LSL #2                     @L_sum1 = (L_sum1 << 2)

-             ADD           r10, r6, r14         

-             ADD           r9, r5, r14

-             MOV           r5, r9, ASR #16

-             MOV           r6, r10, ASR #16

-             ADD           r9, r3, r2, LSL #1                 @address of sign[pos]

-             ADD           r8, r7, #32

-             LDRSH         r10, [r9], #2                 	  @sign[pos]

-	     LDRSH         r11, [r9]                          @sign[pos + 1]

-	     MUL           r12, r5, r10

-	     MUL           r14, r6, r11

-	     MOV           r5, r12, ASR #15

-	     MOV           r6, r14, ASR #15

-	     LDR           r9,  [r13, #44]                   

-	     LDR           r12, [r13, #48]

-             LDRSH         r10, [r7], #2                      @*p0++

-	     LDRSH         r11, [r8]                          @*p3++

-             ADD           r9, r9, r4, LSL #1

-	     ADD           r12, r12, r4, LSL #1

-	     ADD           r5, r5, r10

-	     ADD           r6, r6, r11

-	     STRH          r5, [r9]

-	     STRH          r6, [r12]

-

-             ADD           r2, r2, #4

- 

-             MOV           r5, #0                            @L_sum1 = 0

-	     MOV           r6, #0                            @L_sum2 = 0

-	     ADD           r9, r1, r2, LSL #1                @p2 = &vec[pos]

-	     MOV           r10, r0                           @p1 = h

-	     RSB           r11, r2, #62                      @j=62-pos

-	     ADD           r4, r4, #1                        @i++

-

-LOOPj2:

-	     LDRSH         r12, [r10], #2  

-	     LDRSH         r8,  [r9], #2

-	     LDRSH         r14, [r9]

-	     SUBS          r11, r11, #1

-             MLA           r5, r12, r8, r5

-             MLA           r6, r12, r14, r6	 

-	     BGE           LOOPj2

-

-	     LDRSH         r12, [r10], #2                     @*p1++

-	     MOV           r6, r6, LSL #2                     @L_sum2 = (L_sum2 << 2)

-             MLA           r5, r12, r14, r5

-             MOV           r14, #0x8000

-             MOV           r5, r5, LSL #2                     @L_sum1 = (L_sum1 << 2)

-             ADD           r10, r6, r14        

-             ADD           r9, r5, r14

-

-             MOV           r5, r9, ASR #16

-             MOV           r6, r10, ASR #16

-             ADD           r9, r3, r2, LSL #1                 @address of sign[pos]

-             ADD           r8, r7, #32

-             LDRSH         r10, [r9], #2                 	  @sign[pos]

-	     LDRSH         r11, [r9]                          @sign[pos + 1]

-	     MUL           r12, r5, r10

-	     MUL           r14, r6, r11

-	     MOV           r5, r12, ASR #15

-	     MOV           r6, r14, ASR #15

-	     LDR           r9,  [r13, #44]                   

-	     LDR           r12, [r13, #48]

-             LDRSH         r10, [r7], #2                      @*p0++

-	     LDRSH         r11, [r8]                          @*p3++

-             ADD           r9, r9, r4, LSL #1

-	     ADD           r12, r12, r4, LSL #1

-	     ADD           r5, r5, r10

-	     ADD           r6, r6, r11

-	     STRH          r5, [r9]

-	     STRH          r6, [r12]

-	     ADD           r4, r4, #1                         @i+1

-	     ADD           r2, r2, #4                         @pos += STEP

-	     CMP           r4, #16

-	     

-	     BLT           LOOPi

-         

-the_end:

-             LDMFD         r13!, {r4 - r12, r15}

-             

-	     .END	 

-        

-	

-	  

-

-

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@static void cor_h_vec_012(
+@		Word16 h[],                           /* (i) scaled impulse response                 */
+@		Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */
+@		Word16 track,                         /* (i) track to use                            */
+@		Word16 sign[],                        /* (i) sign vector                             */
+@		Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */
+@		Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */
+@		Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */
+@)
+@r0 ---- h[]
+@r1 ---- vec[]
+@r2 ---- track
+@r3 ---- sign[]
+@r4 ---- rrixix[][NB_POS]
+@r5 ---- cor_1[]
+@r6 ---- cor_2[]
+
+              .section .text 
+	      .global  cor_h_vec_012_asm
+
+cor_h_vec_012_asm:
+
+             STMFD         r13!, {r4 - r12, r14}
+	     LDR           r4, [r13, #40]                    @load rrixix[][NB_POS]
+	     ADD           r7, r4, r2, LSL #5                @r7 --- p0 = rrixix[track]
+             MOV           r4, #0                            @i=0
+
+	     @r0 --- h[], r1 --- vec[],  r2 --- pos
+	     @r3 --- sign[], r4 --- i, r7 --- p0
+
+LOOPi:
+             MOV           r5, #0                            @L_sum1 = 0
+	     MOV           r6, #0                            @L_sum2 = 0
+	     ADD           r9, r1, r2, LSL #1                @p2 = &vec[pos]
+	     MOV           r10, r0                           @p1 = h
+	     RSB           r11, r2, #62                      @j=62-pos
+
+LOOPj1:
+	     LDRSH         r12, [r10], #2  
+	     LDRSH         r8,  [r9], #2
+	     LDRSH         r14, [r9]
+	     SUBS          r11, r11, #1
+             MLA           r5, r12, r8, r5
+             MLA           r6, r12, r14, r6	 
+	     BGE           LOOPj1
+
+	     LDRSH         r12, [r10], #2                     @*p1++
+	     MOV           r6, r6, LSL #2                     @L_sum2 = (L_sum2 << 2)
+             MLA           r5, r12, r14, r5
+             MOV           r14, #0x8000
+             MOV           r5, r5, LSL #2                     @L_sum1 = (L_sum1 << 2)
+             ADD           r10, r6, r14         
+             ADD           r9, r5, r14
+             MOV           r5, r9, ASR #16
+             MOV           r6, r10, ASR #16
+             ADD           r9, r3, r2, LSL #1                 @address of sign[pos]
+             ADD           r8, r7, #32
+             LDRSH         r10, [r9], #2                 	  @sign[pos]
+	     LDRSH         r11, [r9]                          @sign[pos + 1]
+	     MUL           r12, r5, r10
+	     MUL           r14, r6, r11
+	     MOV           r5, r12, ASR #15
+	     MOV           r6, r14, ASR #15
+	     LDR           r9,  [r13, #44]                   
+	     LDR           r12, [r13, #48]
+             LDRSH         r10, [r7], #2                      @*p0++
+	     LDRSH         r11, [r8]                          @*p3++
+             ADD           r9, r9, r4, LSL #1
+	     ADD           r12, r12, r4, LSL #1
+	     ADD           r5, r5, r10
+	     ADD           r6, r6, r11
+	     STRH          r5, [r9]
+	     STRH          r6, [r12]
+
+             ADD           r2, r2, #4
+ 
+             MOV           r5, #0                            @L_sum1 = 0
+	     MOV           r6, #0                            @L_sum2 = 0
+	     ADD           r9, r1, r2, LSL #1                @p2 = &vec[pos]
+	     MOV           r10, r0                           @p1 = h
+	     RSB           r11, r2, #62                      @j=62-pos
+	     ADD           r4, r4, #1                        @i++
+
+LOOPj2:
+	     LDRSH         r12, [r10], #2  
+	     LDRSH         r8,  [r9], #2
+	     LDRSH         r14, [r9]
+	     SUBS          r11, r11, #1
+             MLA           r5, r12, r8, r5
+             MLA           r6, r12, r14, r6	 
+	     BGE           LOOPj2
+
+	     LDRSH         r12, [r10], #2                     @*p1++
+	     MOV           r6, r6, LSL #2                     @L_sum2 = (L_sum2 << 2)
+             MLA           r5, r12, r14, r5
+             MOV           r14, #0x8000
+             MOV           r5, r5, LSL #2                     @L_sum1 = (L_sum1 << 2)
+             ADD           r10, r6, r14        
+             ADD           r9, r5, r14
+
+             MOV           r5, r9, ASR #16
+             MOV           r6, r10, ASR #16
+             ADD           r9, r3, r2, LSL #1                 @address of sign[pos]
+             ADD           r8, r7, #32
+             LDRSH         r10, [r9], #2                 	  @sign[pos]
+	     LDRSH         r11, [r9]                          @sign[pos + 1]
+	     MUL           r12, r5, r10
+	     MUL           r14, r6, r11
+	     MOV           r5, r12, ASR #15
+	     MOV           r6, r14, ASR #15
+	     LDR           r9,  [r13, #44]                   
+	     LDR           r12, [r13, #48]
+             LDRSH         r10, [r7], #2                      @*p0++
+	     LDRSH         r11, [r8]                          @*p3++
+             ADD           r9, r9, r4, LSL #1
+	     ADD           r12, r12, r4, LSL #1
+	     ADD           r5, r5, r10
+	     ADD           r6, r6, r11
+	     STRH          r5, [r9]
+	     STRH          r6, [r12]
+	     ADD           r4, r4, #1                         @i+1
+	     ADD           r2, r2, #4                         @pos += STEP
+	     CMP           r4, #16
+	     
+	     BLT           LOOPi
+         
+the_end:
+             LDMFD         r13!, {r4 - r12, r15}
+             
+	     .END	 
+        
+	
+	  
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s
index 3b8853f..dffb750 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s
@@ -1,100 +1,100 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-@

-@void Pred_lt4(

-@     Word16 exc[],                         /* in/out: excitation buffer */

-@     Word16 T0,                            /* input : integer pitch lag */

-@     Word16 frac,                          /* input : fraction of lag   */

-@     Word16 L_subfr                        /* input : subframe size     */

-@)

-@***********************************************************************

-@ r0    ---  exc[]

-@ r1    ---  T0

-@ r2    ---  frac

-@ r3    ---  L_subfr

- 

-          .section  .text 

-          .global   pred_lt4_asm

-          .extern   inter4_2

-

-pred_lt4_asm:

-

-          STMFD   	r13!, {r4 - r12, r14} 

-          SUB           r4, r0, r1, LSL #1                        @ x = exc - T0

-          RSB           r2, r2, #0                                @ frac = - frac

-          SUB           r4, r4, #30                               @ x -= L_INTERPOL2 - 1

-          CMP           r2, #0

-          ADDLT         r2, r2, #4                                @ frac += UP_SAMP

-          SUBLT         r4, r4, #2                                @ x--

-

-          LDR           r11, Lable1

-          RSB           r2, r2, #3                                @ k = UP_SAMP - 1 - frac

-          MOV           r8, #0                                    @ j = 0

-	  ADD           r11, r11, r2, LSL #6                      @ get inter4_2[k][]

-

-	  VLD1.S16      {Q0, Q1}, [r11]!

-	  VLD1.S16      {Q2, Q3}, [r11]!

-          

-	  MOV           r6, #0x8000 

-

-          VLD1.S16      {Q4, Q5}, [r4]!                           @load 16 x[]

-          VLD1.S16      {Q6, Q7}, [r4]!                           @load 16 x[]

-

-LOOP:

-          VQDMULL.S16   Q15, D8, D0

-          VQDMLAL.S16   Q15, D9, D1

-          VQDMLAL.S16   Q15, D10, D2

-          VQDMLAL.S16   Q15, D11, D3

-        

-          VQDMLAL.S16   Q15, D12, D4

-          VQDMLAL.S16   Q15, D13, D5

-          VQDMLAL.S16   Q15, D14, D6

-          VQDMLAL.S16   Q15, D15, D7

-

-          LDRSH         r12, [r4], #2                

-          

-          VEXT.S16      D8, D8, D9, #1

-          VEXT.S16      D9, D9, D10, #1

-          VEXT.S16      D10, D10, D11, #1

-          VEXT.S16      D11, D11, D12, #1

-          VDUP.S16      D24, r12

-          VEXT.S16      D12, D12, D13, #1

-          VEXT.S16      D13, D13, D14, #1

-     

-          VQADD.S32     D30, D30, D31

-	  MOV           r11, #0x8000          

-          VPADD.S32     D30, D30, D30

-          ADD           r8, r8, #1

-          VMOV.S32      r12, D30[0]

-          VEXT.S16      D14, D14, D15, #1          

-

-          QADD          r1, r12, r12                              @ L_sum = (L_sum << 2)

-          VEXT.S16      D15, D15, D24, #1

-          QADD          r5, r1, r6                         

-          MOV           r1, r5, ASR #16

-          CMP           r8, r3

-          STRH          r1, [r0], #2                              @ exc[j] = (L_sum + 0x8000) >> 16

-          BLT           LOOP

-                    

-pred_lt4_end:

-		     

-          LDMFD   	r13!, {r4 - r12, r15} 

- 

-Lable1:

-          .word   	inter4_2

-          @ENDFUNC

-          .END

-

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@void Pred_lt4(
+@     Word16 exc[],                         /* in/out: excitation buffer */
+@     Word16 T0,                            /* input : integer pitch lag */
+@     Word16 frac,                          /* input : fraction of lag   */
+@     Word16 L_subfr                        /* input : subframe size     */
+@)
+@***********************************************************************
+@ r0    ---  exc[]
+@ r1    ---  T0
+@ r2    ---  frac
+@ r3    ---  L_subfr
+ 
+          .section  .text 
+          .global   pred_lt4_asm
+          .extern   inter4_2
+
+pred_lt4_asm:
+
+          STMFD   	r13!, {r4 - r12, r14} 
+          SUB           r4, r0, r1, LSL #1                        @ x = exc - T0
+          RSB           r2, r2, #0                                @ frac = - frac
+          SUB           r4, r4, #30                               @ x -= L_INTERPOL2 - 1
+          CMP           r2, #0
+          ADDLT         r2, r2, #4                                @ frac += UP_SAMP
+          SUBLT         r4, r4, #2                                @ x--
+
+          LDR           r11, Lable1
+          RSB           r2, r2, #3                                @ k = UP_SAMP - 1 - frac
+          MOV           r8, #0                                    @ j = 0
+	  ADD           r11, r11, r2, LSL #6                      @ get inter4_2[k][]
+
+	  VLD1.S16      {Q0, Q1}, [r11]!
+	  VLD1.S16      {Q2, Q3}, [r11]!
+          
+	  MOV           r6, #0x8000 
+
+          VLD1.S16      {Q4, Q5}, [r4]!                           @load 16 x[]
+          VLD1.S16      {Q6, Q7}, [r4]!                           @load 16 x[]
+
+LOOP:
+          VQDMULL.S16   Q15, D8, D0
+          VQDMLAL.S16   Q15, D9, D1
+          VQDMLAL.S16   Q15, D10, D2
+          VQDMLAL.S16   Q15, D11, D3
+        
+          VQDMLAL.S16   Q15, D12, D4
+          VQDMLAL.S16   Q15, D13, D5
+          VQDMLAL.S16   Q15, D14, D6
+          VQDMLAL.S16   Q15, D15, D7
+
+          LDRSH         r12, [r4], #2                
+          
+          VEXT.S16      D8, D8, D9, #1
+          VEXT.S16      D9, D9, D10, #1
+          VEXT.S16      D10, D10, D11, #1
+          VEXT.S16      D11, D11, D12, #1
+          VDUP.S16      D24, r12
+          VEXT.S16      D12, D12, D13, #1
+          VEXT.S16      D13, D13, D14, #1
+     
+          VQADD.S32     D30, D30, D31
+	  MOV           r11, #0x8000          
+          VPADD.S32     D30, D30, D30
+          ADD           r8, r8, #1
+          VMOV.S32      r12, D30[0]
+          VEXT.S16      D14, D14, D15, #1          
+
+          QADD          r1, r12, r12                              @ L_sum = (L_sum << 2)
+          VEXT.S16      D15, D15, D24, #1
+          QADD          r5, r1, r6                         
+          MOV           r1, r5, ASR #16
+          CMP           r8, r3
+          STRH          r1, [r0], #2                              @ exc[j] = (L_sum + 0x8000) >> 16
+          BLT           LOOP
+                    
+pred_lt4_end:
+		     
+          LDMFD   	r13!, {r4 - r12, r15} 
+ 
+Lable1:
+          .word   	inter4_2
+          @ENDFUNC
+          .END
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/scale_sig_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/scale_sig_neon.s
index 14957d8..bbd354d 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/scale_sig_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/scale_sig_neon.s
@@ -1,138 +1,138 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-@                   

-@**********************************************************************/

-@void Scale_sig(

-@               Word16 x[],                           /* (i/o) : signal to scale               */

-@               Word16 lg,                            /* (i)   : size of x[]                   */

-@               Word16 exp                            /* (i)   : exponent: x = round(x << exp) */

-@)

-@***********************************************************************

-@  x[]   ---  r0

-@  lg    ---  r1

-@  exp   ---  r2

-

-          .section  .text 

-          .global   Scale_sig_opt

-

-Scale_sig_opt:

-

-          STMFD   	r13!, {r4 - r12, r14} 

-          MOV           r4, #4

-          VMOV.S32      Q15, #0x8000       

-          VDUP.S32      Q14, r2  

-          MOV           r5, r0                          @ copy x[] address    

-          CMP           r1, #64

-          MOVEQ         r4, #1

-          BEQ           LOOP

-	  CMP           r1, #128

-	  MOVEQ         r4, #2

-	  BEQ           LOOP

-          CMP           r1, #256

-          BEQ           LOOP

-	  CMP           r1, #80

-	  MOVEQ         r4, #1

-	  BEQ           LOOP1

-

-LOOP1:

-          VLD1.S16      {Q0, Q1}, [r5]!                 @load 16 Word16 x[]     

-          VSHLL.S16     Q10, D0, #16

-          VSHLL.S16     Q11, D1, #16

-          VSHLL.S16     Q12, D2, #16

-          VSHLL.S16     Q13, D3, #16

-          VSHL.S32      Q10, Q10, Q14

-          VSHL.S32      Q11, Q11, Q14

-          VSHL.S32      Q12, Q12, Q14

-          VSHL.S32      Q13, Q13, Q14

-          VADDHN.S32    D16, Q10, Q15

-          VADDHN.S32    D17, Q11, Q15

-          VADDHN.S32    D18, Q12, Q15

-          VADDHN.S32    D19, Q13, Q15

-          VST1.S16      {Q8, Q9}, [r0]!                 @store 16 Word16 x[]

-

-LOOP:                

-          VLD1.S16      {Q0, Q1}, [r5]!                 @load 16 Word16 x[]

-          VLD1.S16      {Q2, Q3}, [r5]!                 @load 16 Word16 x[]

-          VLD1.S16      {Q4, Q5}, [r5]!                 @load 16 Word16 x[]

-          VLD1.S16      {Q6, Q7}, [r5]!                 @load 16 Word16 x[]

-

-          VSHLL.S16     Q8, D0, #16

-          VSHLL.S16     Q9, D1, #16

-          VSHLL.S16     Q10, D2, #16

-          VSHLL.S16     Q11, D3, #16     

-          VSHL.S32      Q8, Q8, Q14

-          VSHL.S32      Q9, Q9, Q14

-          VSHL.S32      Q10, Q10, Q14

-          VSHL.S32      Q11, Q11, Q14

-          VADDHN.S32    D16, Q8, Q15

-          VADDHN.S32    D17, Q9, Q15

-          VADDHN.S32    D18, Q10, Q15

-          VADDHN.S32    D19, Q11, Q15

-          VST1.S16      {Q8, Q9}, [r0]!                 @store 16 Word16 x[]

-

-   

-          VSHLL.S16     Q12, D4, #16

-          VSHLL.S16     Q13, D5, #16

-          VSHLL.S16     Q10, D6, #16

-          VSHLL.S16     Q11, D7, #16

-          VSHL.S32      Q12, Q12, Q14

-          VSHL.S32      Q13, Q13, Q14

-          VSHL.S32      Q10, Q10, Q14

-          VSHL.S32      Q11, Q11, Q14

-          VADDHN.S32    D16, Q12, Q15

-          VADDHN.S32    D17, Q13, Q15

-          VADDHN.S32    D18, Q10, Q15

-          VADDHN.S32    D19, Q11, Q15

-          VST1.S16      {Q8, Q9}, [r0]!                 @store 16 Word16 x[]

-

-          VSHLL.S16     Q10, D8, #16

-          VSHLL.S16     Q11, D9, #16

-          VSHLL.S16     Q12, D10, #16

-          VSHLL.S16     Q13, D11, #16

-          VSHL.S32      Q10, Q10, Q14

-          VSHL.S32      Q11, Q11, Q14

-          VSHL.S32      Q12, Q12, Q14

-          VSHL.S32      Q13, Q13, Q14

-          VADDHN.S32    D16, Q10, Q15

-          VADDHN.S32    D17, Q11, Q15

-          VADDHN.S32    D18, Q12, Q15

-          VADDHN.S32    D19, Q13, Q15

-          VST1.S16      {Q8, Q9}, [r0]!                 @store 16 Word16 x[]

-

-          VSHLL.S16     Q10, D12, #16   

-          VSHLL.S16     Q11, D13, #16

-          VSHLL.S16     Q12, D14, #16

-          VSHLL.S16     Q13, D15, #16

-          VSHL.S32      Q10, Q10, Q14

-          VSHL.S32      Q11, Q11, Q14

-          VSHL.S32      Q12, Q12, Q14

-          VSHL.S32      Q13, Q13, Q14

-          VADDHN.S32    D16, Q10, Q15

-          VADDHN.S32    D17, Q11, Q15

-          VADDHN.S32    D18, Q12, Q15

-          VADDHN.S32    D19, Q13, Q15 

-          VST1.S16      {Q8, Q9}, [r0]!                 @store 16 Word16 x[]  

-          SUBS          r4, r4, #1

-          BGT           LOOP     

-                

-                          

-Scale_sig_asm_end:

-

-          LDMFD   	r13!, {r4 - r12, r15} 

-          @ENDFUNC

-          .END

- 

-

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@                   
+@**********************************************************************/
+@void Scale_sig(
+@               Word16 x[],                           /* (i/o) : signal to scale               */
+@               Word16 lg,                            /* (i)   : size of x[]                   */
+@               Word16 exp                            /* (i)   : exponent: x = round(x << exp) */
+@)
+@***********************************************************************
+@  x[]   ---  r0
+@  lg    ---  r1
+@  exp   ---  r2
+
+          .section  .text 
+          .global   Scale_sig_opt
+
+Scale_sig_opt:
+
+          STMFD   	r13!, {r4 - r12, r14} 
+          MOV           r4, #4
+          VMOV.S32      Q15, #0x8000       
+          VDUP.S32      Q14, r2  
+          MOV           r5, r0                          @ copy x[] address    
+          CMP           r1, #64
+          MOVEQ         r4, #1
+          BEQ           LOOP
+	  CMP           r1, #128
+	  MOVEQ         r4, #2
+	  BEQ           LOOP
+          CMP           r1, #256
+          BEQ           LOOP
+	  CMP           r1, #80
+	  MOVEQ         r4, #1
+	  BEQ           LOOP1
+
+LOOP1:
+          VLD1.S16      {Q0, Q1}, [r5]!                 @load 16 Word16 x[]     
+          VSHLL.S16     Q10, D0, #16
+          VSHLL.S16     Q11, D1, #16
+          VSHLL.S16     Q12, D2, #16
+          VSHLL.S16     Q13, D3, #16
+          VSHL.S32      Q10, Q10, Q14
+          VSHL.S32      Q11, Q11, Q14
+          VSHL.S32      Q12, Q12, Q14
+          VSHL.S32      Q13, Q13, Q14
+          VADDHN.S32    D16, Q10, Q15
+          VADDHN.S32    D17, Q11, Q15
+          VADDHN.S32    D18, Q12, Q15
+          VADDHN.S32    D19, Q13, Q15
+          VST1.S16      {Q8, Q9}, [r0]!                 @store 16 Word16 x[]
+
+LOOP:                
+          VLD1.S16      {Q0, Q1}, [r5]!                 @load 16 Word16 x[]
+          VLD1.S16      {Q2, Q3}, [r5]!                 @load 16 Word16 x[]
+          VLD1.S16      {Q4, Q5}, [r5]!                 @load 16 Word16 x[]
+          VLD1.S16      {Q6, Q7}, [r5]!                 @load 16 Word16 x[]
+
+          VSHLL.S16     Q8, D0, #16
+          VSHLL.S16     Q9, D1, #16
+          VSHLL.S16     Q10, D2, #16
+          VSHLL.S16     Q11, D3, #16     
+          VSHL.S32      Q8, Q8, Q14
+          VSHL.S32      Q9, Q9, Q14
+          VSHL.S32      Q10, Q10, Q14
+          VSHL.S32      Q11, Q11, Q14
+          VADDHN.S32    D16, Q8, Q15
+          VADDHN.S32    D17, Q9, Q15
+          VADDHN.S32    D18, Q10, Q15
+          VADDHN.S32    D19, Q11, Q15
+          VST1.S16      {Q8, Q9}, [r0]!                 @store 16 Word16 x[]
+
+   
+          VSHLL.S16     Q12, D4, #16
+          VSHLL.S16     Q13, D5, #16
+          VSHLL.S16     Q10, D6, #16
+          VSHLL.S16     Q11, D7, #16
+          VSHL.S32      Q12, Q12, Q14
+          VSHL.S32      Q13, Q13, Q14
+          VSHL.S32      Q10, Q10, Q14
+          VSHL.S32      Q11, Q11, Q14
+          VADDHN.S32    D16, Q12, Q15
+          VADDHN.S32    D17, Q13, Q15
+          VADDHN.S32    D18, Q10, Q15
+          VADDHN.S32    D19, Q11, Q15
+          VST1.S16      {Q8, Q9}, [r0]!                 @store 16 Word16 x[]
+
+          VSHLL.S16     Q10, D8, #16
+          VSHLL.S16     Q11, D9, #16
+          VSHLL.S16     Q12, D10, #16
+          VSHLL.S16     Q13, D11, #16
+          VSHL.S32      Q10, Q10, Q14
+          VSHL.S32      Q11, Q11, Q14
+          VSHL.S32      Q12, Q12, Q14
+          VSHL.S32      Q13, Q13, Q14
+          VADDHN.S32    D16, Q10, Q15
+          VADDHN.S32    D17, Q11, Q15
+          VADDHN.S32    D18, Q12, Q15
+          VADDHN.S32    D19, Q13, Q15
+          VST1.S16      {Q8, Q9}, [r0]!                 @store 16 Word16 x[]
+
+          VSHLL.S16     Q10, D12, #16   
+          VSHLL.S16     Q11, D13, #16
+          VSHLL.S16     Q12, D14, #16
+          VSHLL.S16     Q13, D15, #16
+          VSHL.S32      Q10, Q10, Q14
+          VSHL.S32      Q11, Q11, Q14
+          VSHL.S32      Q12, Q12, Q14
+          VSHL.S32      Q13, Q13, Q14
+          VADDHN.S32    D16, Q10, Q15
+          VADDHN.S32    D17, Q11, Q15
+          VADDHN.S32    D18, Q12, Q15
+          VADDHN.S32    D19, Q13, Q15 
+          VST1.S16      {Q8, Q9}, [r0]!                 @store 16 Word16 x[]  
+          SUBS          r4, r4, #1
+          BGT           LOOP     
+                
+                          
+Scale_sig_asm_end:
+
+          LDMFD   	r13!, {r4 - r12, r15} 
+          @ENDFUNC
+          .END
+ 
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/syn_filt_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/syn_filt_neon.s
index dc3d4a8..db4559c 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/syn_filt_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/syn_filt_neon.s
@@ -1,106 +1,106 @@
-@/*

-@ ** Copyright 2003-2010, VisualOn, Inc.

-@ **

-@ ** Licensed under the Apache License, Version 2.0 (the "License");

-@ ** you may not use this file except in compliance with the License.

-@ ** You may obtain a copy of the License at

-@ **

-@ **     http://www.apache.org/licenses/LICENSE-2.0

-@ **

-@ ** Unless required by applicable law or agreed to in writing, software

-@ ** distributed under the License is distributed on an "AS IS" BASIS,

-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-@ ** See the License for the specific language governing permissions and

-@ ** limitations under the License.

-@ */

-@

-@void Syn_filt(

-@     Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients           */

-@     Word16 x[],                           /* (i)     : input signal                             */

-@     Word16 y[],                           /* (o)     : output signal                            */

-@     Word16 mem[],                         /* (i/o)   : memory associated with this filtering.   */

-@)

-@***********************************************************************

-@ a[]    ---   r0

-@ x[]    ---   r1

-@ y[]    ---   r2

-@ mem[]  ---   r3

-@ m ---  16  lg --- 80  update --- 1

-

-          .section  .text 

-          .global   Syn_filt_asm

-

-Syn_filt_asm:

-

-          STMFD   	r13!, {r4 - r12, r14} 

-          SUB           r13, r13, #700                   @ y_buf[L_FRAME16k + M16k]

-   

-          MOV           r4, r3                           @ copy mem[] address

-          MOV           r5, r13                          @ copy yy = y_buf address

-

-          @ for(i = 0@ i < m@ i++)

-          @{

-          @    *yy++ = mem[i]@

-          @} 

-          VLD1.S16      {D0, D1, D2, D3}, [r4]!          @load 16 mems

-	  VST1.S16      {D0, D1, D2, D3}, [r5]!          @store 16 mem[] to *yy

-

-          LDRSH         r5, [r0], #2                     @ load a[0]

-          MOV           r8, #0                           @ i = 0

-          MOV           r5, r5, ASR #1                   @ a0 = a[0] >> 1

-          VMOV.S16      D8[0], r5

-          @ load all a[]

-          VLD1.S16      {D0, D1, D2, D3}, [r0]!          @ load a[1] ~ a[16]

-	  VREV64.16     D0, D0

-	  VREV64.16     D1, D1

-	  VREV64.16     D2, D2

-	  VREV64.16     D3, D3 

-	  MOV           r8, #0                           @ loop times

-	  MOV           r10, r13                         @ temp = y_buf

-	  ADD           r4, r13, #32                     @ yy[i] address

-

-          VLD1.S16      {D4, D5, D6, D7}, [r10]!         @ first 16 temp_p

-

-SYN_LOOP:

-

-          LDRSH         r6, [r1], #2                     @ load x[i]

-	  MUL           r12, r6, r5                      @ L_tmp = x[i] * a0

-	  ADD           r10, r4, r8, LSL #1              @ y[i], yy[i] address

-

-	  VDUP.S32      Q10, r12

-	  VMULL.S16     Q5, D3, D4                    

-          VMLAL.S16     Q5, D2, D5

-          VMLAL.S16     Q5, D1, D6

-          VMLAL.S16     Q5, D0, D7

-          VEXT.8        D4, D4, D5, #2

-          VEXT.8        D5, D5, D6, #2

-          VEXT.8        D6, D6, D7, #2

-          VPADD.S32     D12, D10, D11

-          ADD           r8, r8, #1

-          VPADD.S32     D10, D12, D12

-

-	  VDUP.S32      Q7, D10[0]

-

-	  VSUB.S32      Q9, Q10, Q7

-          VQRSHRN.S32   D20, Q9, #12   

-          VMOV.S16      r9, D20[0]

-          VEXT.8        D7, D7, D20, #2

-          CMP           r8, #80

-          STRH          r9, [r10]                        @ yy[i]

-          STRH          r9, [r2], #2                     @ y[i]          	         

-	  

-          BLT           SYN_LOOP

- 

-          @ update mem[]

-          ADD           r5, r13, #160                    @ yy[64] address

-	  VLD1.S16      {D0, D1, D2, D3}, [r5]!

-	  VST1.S16      {D0, D1, D2, D3}, [r3]!              

-

-Syn_filt_asm_end:

- 

-          ADD           r13, r13, #700		     

-          LDMFD   	r13!, {r4 - r12, r15} 

-          @ENDFUNC

-          .END

- 

-

+@/*
+@ ** Copyright 2003-2010, VisualOn, Inc.
+@ **
+@ ** Licensed under the Apache License, Version 2.0 (the "License");
+@ ** you may not use this file except in compliance with the License.
+@ ** You may obtain a copy of the License at
+@ **
+@ **     http://www.apache.org/licenses/LICENSE-2.0
+@ **
+@ ** Unless required by applicable law or agreed to in writing, software
+@ ** distributed under the License is distributed on an "AS IS" BASIS,
+@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@ ** See the License for the specific language governing permissions and
+@ ** limitations under the License.
+@ */
+@
+@void Syn_filt(
+@     Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients           */
+@     Word16 x[],                           /* (i)     : input signal                             */
+@     Word16 y[],                           /* (o)     : output signal                            */
+@     Word16 mem[],                         /* (i/o)   : memory associated with this filtering.   */
+@)
+@***********************************************************************
+@ a[]    ---   r0
+@ x[]    ---   r1
+@ y[]    ---   r2
+@ mem[]  ---   r3
+@ m ---  16  lg --- 80  update --- 1
+
+          .section  .text 
+          .global   Syn_filt_asm
+
+Syn_filt_asm:
+
+          STMFD   	r13!, {r4 - r12, r14} 
+          SUB           r13, r13, #700                   @ y_buf[L_FRAME16k + M16k]
+   
+          MOV           r4, r3                           @ copy mem[] address
+          MOV           r5, r13                          @ copy yy = y_buf address
+
+          @ for(i = 0@ i < m@ i++)
+          @{
+          @    *yy++ = mem[i]@
+          @} 
+          VLD1.S16      {D0, D1, D2, D3}, [r4]!          @load 16 mems
+	  VST1.S16      {D0, D1, D2, D3}, [r5]!          @store 16 mem[] to *yy
+
+          LDRSH         r5, [r0], #2                     @ load a[0]
+          MOV           r8, #0                           @ i = 0
+          MOV           r5, r5, ASR #1                   @ a0 = a[0] >> 1
+          VMOV.S16      D8[0], r5
+          @ load all a[]
+          VLD1.S16      {D0, D1, D2, D3}, [r0]!          @ load a[1] ~ a[16]
+	  VREV64.16     D0, D0
+	  VREV64.16     D1, D1
+	  VREV64.16     D2, D2
+	  VREV64.16     D3, D3 
+	  MOV           r8, #0                           @ loop times
+	  MOV           r10, r13                         @ temp = y_buf
+	  ADD           r4, r13, #32                     @ yy[i] address
+
+          VLD1.S16      {D4, D5, D6, D7}, [r10]!         @ first 16 temp_p
+
+SYN_LOOP:
+
+          LDRSH         r6, [r1], #2                     @ load x[i]
+	  MUL           r12, r6, r5                      @ L_tmp = x[i] * a0
+	  ADD           r10, r4, r8, LSL #1              @ y[i], yy[i] address
+
+	  VDUP.S32      Q10, r12
+	  VMULL.S16     Q5, D3, D4                    
+          VMLAL.S16     Q5, D2, D5
+          VMLAL.S16     Q5, D1, D6
+          VMLAL.S16     Q5, D0, D7
+          VEXT.8        D4, D4, D5, #2
+          VEXT.8        D5, D5, D6, #2
+          VEXT.8        D6, D6, D7, #2
+          VPADD.S32     D12, D10, D11
+          ADD           r8, r8, #1
+          VPADD.S32     D10, D12, D12
+
+	  VDUP.S32      Q7, D10[0]
+
+	  VSUB.S32      Q9, Q10, Q7
+          VQRSHRN.S32   D20, Q9, #12   
+          VMOV.S16      r9, D20[0]
+          VEXT.8        D7, D7, D20, #2
+          CMP           r8, #80
+          STRH          r9, [r10]                        @ yy[i]
+          STRH          r9, [r2], #2                     @ y[i]          	         
+	  
+          BLT           SYN_LOOP
+ 
+          @ update mem[]
+          ADD           r5, r13, #160                    @ yy[64] address
+	  VLD1.S16      {D0, D1, D2, D3}, [r5]!
+	  VST1.S16      {D0, D1, D2, D3}, [r3]!              
+
+Syn_filt_asm_end:
+ 
+          ADD           r13, r13, #700		     
+          LDMFD   	r13!, {r4 - r12, r15} 
+          @ENDFUNC
+          .END
+ 
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/autocorr.c b/media/libstagefright/codecs/amrwbenc/src/autocorr.c
index 33ed670..9baa937 100644
--- a/media/libstagefright/codecs/amrwbenc/src/autocorr.c
+++ b/media/libstagefright/codecs/amrwbenc/src/autocorr.c
@@ -1,127 +1,127 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-

-/***********************************************************************

-*       File: autocorr.c                                               *

-*                                                                      *

-*       Description:Compute autocorrelations of signal with windowing  *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "oper_32b.h"

-#include "acelp.h"

-#include "ham_wind.tab"

-

-void Autocorr(

-		Word16 x[],                           /* (i)    : Input signal                      */

-		Word16 m,                             /* (i)    : LPC order                         */

-		Word16 r_h[],                         /* (o) Q15: Autocorrelations  (msb)           */

-		Word16 r_l[]                          /* (o)    : Autocorrelations  (lsb)           */

-	     )

-{

-	Word32 i, norm, shift;

-	Word16 y[L_WINDOW];

-	Word32 L_sum, L_sum1, L_tmp, F_LEN;

-	Word16 *p1,*p2,*p3;

-	const Word16 *p4;

-	/* Windowing of signal */

-	p1 = x;

-	p4 = vo_window;

-	p3 = y;

-

-	for (i = 0; i < L_WINDOW; i+=4)

-	{

-		*p3++ = vo_mult_r((*p1++), (*p4++));

-		*p3++ = vo_mult_r((*p1++), (*p4++));

-		*p3++ = vo_mult_r((*p1++), (*p4++));

-		*p3++ = vo_mult_r((*p1++), (*p4++));

-	}

-

-	/* calculate energy of signal */

-	L_sum = vo_L_deposit_h(16);               /* sqrt(256), avoid overflow after rounding */

-	for (i = 0; i < L_WINDOW; i++)

-	{

-		L_tmp = vo_L_mult(y[i], y[i]);

-		L_tmp = (L_tmp >> 8);

-		L_sum += L_tmp;

-	}

-

-	/* scale signal to avoid overflow in autocorrelation */

-	norm = norm_l(L_sum);

-	shift = 4 - (norm >> 1);

-	if(shift > 0)

-	{

-		p1 = y;

-		for (i = 0; i < L_WINDOW; i+=4)

-		{

-			*p1 = vo_shr_r(*p1, shift); 

-			p1++;

-			*p1 = vo_shr_r(*p1, shift); 

-			p1++;

-			*p1 = vo_shr_r(*p1, shift);

-			p1++;

-			*p1 = vo_shr_r(*p1, shift); 

-			p1++;

-		}

-	}

-

-	/* Compute and normalize r[0] */

-	L_sum = 1; 

-	for (i = 0; i < L_WINDOW; i+=4)

-	{

-		L_sum += vo_L_mult(y[i], y[i]);

-		L_sum += vo_L_mult(y[i+1], y[i+1]);

-		L_sum += vo_L_mult(y[i+2], y[i+2]);

-		L_sum += vo_L_mult(y[i+3], y[i+3]);

-	}

-

-	norm = norm_l(L_sum);

-	L_sum = (L_sum << norm);

-

-	r_h[0] = L_sum >> 16;

-	r_l[0] = (L_sum & 0xffff)>>1;

-

-	/* Compute r[1] to r[m] */

-	for (i = 1; i <= 8; i++)

-	{

-		L_sum1 = 0;

-		L_sum = 0;

-		F_LEN = (Word32)(L_WINDOW - 2*i);

-		p1 = y;

-		p2 = y + (2*i)-1;

-		do{

-			L_sum1 += *p1 * *p2++;

-			L_sum += *p1++ * *p2;

-		}while(--F_LEN!=0);

-

-		L_sum1 += *p1 * *p2++;

-

-		L_sum1 = L_sum1<<norm;

-		L_sum = L_sum<<norm;

-

-		r_h[(2*i)-1] = L_sum1 >> 15;

-		r_l[(2*i)-1] = L_sum1 & 0x00007fff;

-		r_h[(2*i)] = L_sum >> 15;

-		r_l[(2*i)] = L_sum & 0x00007fff;

-	}

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+
+/***********************************************************************
+*       File: autocorr.c                                               *
+*                                                                      *
+*       Description:Compute autocorrelations of signal with windowing  *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "acelp.h"
+#include "ham_wind.tab"
+
+void Autocorr(
+		Word16 x[],                           /* (i)    : Input signal                      */
+		Word16 m,                             /* (i)    : LPC order                         */
+		Word16 r_h[],                         /* (o) Q15: Autocorrelations  (msb)           */
+		Word16 r_l[]                          /* (o)    : Autocorrelations  (lsb)           */
+	     )
+{
+	Word32 i, norm, shift;
+	Word16 y[L_WINDOW];
+	Word32 L_sum, L_sum1, L_tmp, F_LEN;
+	Word16 *p1,*p2,*p3;
+	const Word16 *p4;
+	/* Windowing of signal */
+	p1 = x;
+	p4 = vo_window;
+	p3 = y;
+
+	for (i = 0; i < L_WINDOW; i+=4)
+	{
+		*p3++ = vo_mult_r((*p1++), (*p4++));
+		*p3++ = vo_mult_r((*p1++), (*p4++));
+		*p3++ = vo_mult_r((*p1++), (*p4++));
+		*p3++ = vo_mult_r((*p1++), (*p4++));
+	}
+
+	/* calculate energy of signal */
+	L_sum = vo_L_deposit_h(16);               /* sqrt(256), avoid overflow after rounding */
+	for (i = 0; i < L_WINDOW; i++)
+	{
+		L_tmp = vo_L_mult(y[i], y[i]);
+		L_tmp = (L_tmp >> 8);
+		L_sum += L_tmp;
+	}
+
+	/* scale signal to avoid overflow in autocorrelation */
+	norm = norm_l(L_sum);
+	shift = 4 - (norm >> 1);
+	if(shift > 0)
+	{
+		p1 = y;
+		for (i = 0; i < L_WINDOW; i+=4)
+		{
+			*p1 = vo_shr_r(*p1, shift); 
+			p1++;
+			*p1 = vo_shr_r(*p1, shift); 
+			p1++;
+			*p1 = vo_shr_r(*p1, shift);
+			p1++;
+			*p1 = vo_shr_r(*p1, shift); 
+			p1++;
+		}
+	}
+
+	/* Compute and normalize r[0] */
+	L_sum = 1; 
+	for (i = 0; i < L_WINDOW; i+=4)
+	{
+		L_sum += vo_L_mult(y[i], y[i]);
+		L_sum += vo_L_mult(y[i+1], y[i+1]);
+		L_sum += vo_L_mult(y[i+2], y[i+2]);
+		L_sum += vo_L_mult(y[i+3], y[i+3]);
+	}
+
+	norm = norm_l(L_sum);
+	L_sum = (L_sum << norm);
+
+	r_h[0] = L_sum >> 16;
+	r_l[0] = (L_sum & 0xffff)>>1;
+
+	/* Compute r[1] to r[m] */
+	for (i = 1; i <= 8; i++)
+	{
+		L_sum1 = 0;
+		L_sum = 0;
+		F_LEN = (Word32)(L_WINDOW - 2*i);
+		p1 = y;
+		p2 = y + (2*i)-1;
+		do{
+			L_sum1 += *p1 * *p2++;
+			L_sum += *p1++ * *p2;
+		}while(--F_LEN!=0);
+
+		L_sum1 += *p1 * *p2++;
+
+		L_sum1 = L_sum1<<norm;
+		L_sum = L_sum<<norm;
+
+		r_h[(2*i)-1] = L_sum1 >> 15;
+		r_l[(2*i)-1] = L_sum1 & 0x00007fff;
+		r_h[(2*i)] = L_sum >> 15;
+		r_l[(2*i)] = L_sum & 0x00007fff;
+	}
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/az_isp.c b/media/libstagefright/codecs/amrwbenc/src/az_isp.c
index 8259f91..9333d19 100644
--- a/media/libstagefright/codecs/amrwbenc/src/az_isp.c
+++ b/media/libstagefright/codecs/amrwbenc/src/az_isp.c
@@ -1,268 +1,268 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*  File: az_isp.c

-*

-*  Description:

-*-----------------------------------------------------------------------*

-* Compute the ISPs from  the LPC coefficients  (order=M)                *

-*-----------------------------------------------------------------------*

-*                                                                       *

-* The ISPs are the roots of the two polynomials F1(z) and F2(z)         *

-* defined as                                                            *

-*               F1(z) = A(z) + z^-m A(z^-1)                             *

-*  and          F2(z) = A(z) - z^-m A(z^-1)                             *

-*                                                                       *

-* For a even order m=2n, F1(z) has M/2 conjugate roots on the unit      *

-* circle and F2(z) has M/2-1 conjugate roots on the unit circle in      *

-* addition to two roots at 0 and pi.                                    *

-*                                                                       *

-* For a 16th order LP analysis, F1(z) and F2(z) can be written as       *

-*                                                                       *

-*   F1(z) = (1 + a[M])   PRODUCT  (1 - 2 cos(w_i) z^-1 + z^-2 )         *

-*                        i=0,2,4,6,8,10,12,14                           *

-*                                                                       *

-*   F2(z) = (1 - a[M]) (1 - z^-2) PRODUCT (1 - 2 cos(w_i) z^-1 + z^-2 ) *

-*                                 i=1,3,5,7,9,11,13                     *

-*                                                                       *

-* The ISPs are the M-1 frequencies w_i, i=0...M-2 plus the last         *

-* predictor coefficient a[M].                                           *

-*-----------------------------------------------------------------------*

-

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "oper_32b.h"

-#include "stdio.h"

-#include "grid100.tab"

-

-#define M   16

-#define NC  (M/2)

-

-/* local function */

-static __inline Word16 Chebps2(Word16 x, Word16 f[], Word32 n);

-

-void Az_isp(

-		Word16 a[],                           /* (i) Q12 : predictor coefficients                 */

-		Word16 isp[],                         /* (o) Q15 : Immittance spectral pairs              */

-		Word16 old_isp[]                      /* (i)     : old isp[] (in case not found M roots)  */

-	   )

-{

-	Word32 i, j, nf, ip, order;

-	Word16 xlow, ylow, xhigh, yhigh, xmid, ymid, xint;

-	Word16 x, y, sign, exp;

-	Word16 *coef;

-	Word16 f1[NC + 1], f2[NC];

-	Word32 t0;

-	/*-------------------------------------------------------------*

-	 * find the sum and diff polynomials F1(z) and F2(z)           *

-	 *      F1(z) = [A(z) + z^M A(z^-1)]                           *

-	 *      F2(z) = [A(z) - z^M A(z^-1)]/(1-z^-2)                  *

-	 *                                                             *

-	 * for (i=0; i<NC; i++)                                        *

-	 * {                                                           *

-	 *   f1[i] = a[i] + a[M-i];                                    *

-	 *   f2[i] = a[i] - a[M-i];                                    *

-	 * }                                                           *

-	 * f1[NC] = 2.0*a[NC];                                         *

-	 *                                                             *

-	 * for (i=2; i<NC; i++)            Divide by (1-z^-2)          *

-	 *   f2[i] += f2[i-2];                                         *

-	 *-------------------------------------------------------------*/

-	for (i = 0; i < NC; i++)

-	{

-		t0 = a[i] << 15;

-		f1[i] = vo_round(t0 + (a[M - i] << 15));        /* =(a[i]+a[M-i])/2 */

-		f2[i] = vo_round(t0 - (a[M - i] << 15));        /* =(a[i]-a[M-i])/2 */

-	}

-	f1[NC] = a[NC];                        

-	for (i = 2; i < NC; i++)               /* Divide by (1-z^-2) */

-		f2[i] = add1(f2[i], f2[i - 2]);     

-

-	/*---------------------------------------------------------------------*

-	 * Find the ISPs (roots of F1(z) and F2(z) ) using the                 *

-	 * Chebyshev polynomial evaluation.                                    *

-	 * The roots of F1(z) and F2(z) are alternatively searched.            *

-	 * We start by finding the first root of F1(z) then we switch          *

-	 * to F2(z) then back to F1(z) and so on until all roots are found.    *

-	 *                                                                     *

-	 *  - Evaluate Chebyshev pol. at grid points and check for sign change.*

-	 *  - If sign change track the root by subdividing the interval        *

-	 *    2 times and ckecking sign change.                                *

-	 *---------------------------------------------------------------------*/

-	nf = 0;                                  /* number of found frequencies */

-	ip = 0;                                  /* indicator for f1 or f2      */

-	coef = f1;                             

-	order = NC;                            

-	xlow = vogrid[0];                        

-	ylow = Chebps2(xlow, coef, order);

-	j = 0;

-	while ((nf < M - 1) && (j < GRID_POINTS))

-	{

-		j ++;

-		xhigh = xlow;                     

-		yhigh = ylow;                      

-		xlow = vogrid[j];                    

-		ylow = Chebps2(xlow, coef, order);

-		if ((ylow * yhigh) <= (Word32) 0)

-		{

-			/* divide 2 times the interval */

-			for (i = 0; i < 2; i++)

-			{

-				xmid = (xlow >> 1) + (xhigh >> 1);        /* xmid = (xlow + xhigh)/2 */

-				ymid = Chebps2(xmid, coef, order);

-				if ((ylow * ymid) <= (Word32) 0)

-				{

-					yhigh = ymid;         

-					xhigh = xmid;          

-				} else

-				{

-					ylow = ymid;           

-					xlow = xmid;          

-				}

-			}

-			/*-------------------------------------------------------------*

-			 * Linear interpolation                                        *

-			 *    xint = xlow - ylow*(xhigh-xlow)/(yhigh-ylow);            *

-			 *-------------------------------------------------------------*/

-			x = xhigh - xlow;

-			y = yhigh - ylow;

-			if (y == 0)

-			{

-				xint = xlow;               

-			} else

-			{

-				sign = y;                 

-				y = abs_s(y);

-				exp = norm_s(y);

-				y = y << exp;

-				y = div_s((Word16) 16383, y);

-				t0 = x * y;

-				t0 = (t0 >> (19 - exp));

-				y = vo_extract_l(t0);         /* y= (xhigh-xlow)/(yhigh-ylow) in Q11 */

-				if (sign < 0)

-					y = -y;

-				t0 = ylow * y;      /* result in Q26 */

-				t0 = (t0 >> 10);        /* result in Q15 */

-				xint = vo_sub(xlow, vo_extract_l(t0));        /* xint = xlow - ylow*y */

-			}

-			isp[nf] = xint;                

-			xlow = xint;                   

-			nf++;                          

-			if (ip == 0)

-			{

-				ip = 1;                    

-				coef = f2;                

-				order = NC - 1;           

-			} else

-			{

-				ip = 0;                   

-				coef = f1;                 

-				order = NC;              

-			}

-			ylow = Chebps2(xlow, coef, order);

-		}

-	}

-	/* Check if M-1 roots found */

-	if(nf < M - 1)

-	{

-		for (i = 0; i < M; i++)

-		{

-			isp[i] = old_isp[i];          

-		}

-	} else

-	{

-		isp[M - 1] = a[M] << 3;                      /* From Q12 to Q15 with saturation */

-	}

-	return;

-}

-

-/*--------------------------------------------------------------*

-* function  Chebps2:                                           *

-*           ~~~~~~~                                            *

-*    Evaluates the Chebishev polynomial series                 *

-*--------------------------------------------------------------*

-*                                                              *

-*  The polynomial order is                                     *

-*     n = M/2   (M is the prediction order)                    *

-*  The polynomial is given by                                  *

-*    C(x) = f(0)T_n(x) + f(1)T_n-1(x) + ... +f(n-1)T_1(x) + f(n)/2 *

-* Arguments:                                                   *

-*  x:     input value of evaluation; x = cos(frequency) in Q15 *

-*  f[]:   coefficients of the pol.                      in Q11 *

-*  n:     order of the pol.                                    *

-*                                                              *

-* The value of C(x) is returned. (Satured to +-1.99 in Q14)    *

-*                                                              *

-*--------------------------------------------------------------*/

-

-static __inline Word16 Chebps2(Word16 x, Word16 f[], Word32 n)

-{

-	Word32 i, cheb;

-	Word16 b0_h, b0_l, b1_h, b1_l, b2_h, b2_l;

-	Word32 t0;

-

-	/* Note: All computation are done in Q24. */

-

-	t0 = f[0] << 13;

-	b2_h = t0 >> 16;

-	b2_l = (t0 & 0xffff)>>1;

-

-	t0 = ((b2_h * x)<<1) + (((b2_l * x)>>15)<<1);

-	t0 <<= 1;

-	t0 += (f[1] << 13);						/* + f[1] in Q24        */

-

-	b1_h = t0 >> 16;

-	b1_l = (t0 & 0xffff) >> 1;

-

-	for (i = 2; i < n; i++)

-	{

-		t0 = ((b1_h * x)<<1) + (((b1_l * x)>>15)<<1);

-

-		t0 += (b2_h * (-16384))<<1;

-		t0 += (f[i] << 12);

-		t0 <<= 1;

-		t0 -= (b2_l << 1);					/* t0 = 2.0*x*b1 - b2 + f[i]; */

-

-		b0_h = t0 >> 16;

-		b0_l = (t0 & 0xffff) >> 1;

-

-		b2_l = b1_l;                         /* b2 = b1; */

-		b2_h = b1_h;                       

-		b1_l = b0_l;                         /* b1 = b0; */

-		b1_h = b0_h;                       

-	}

-

-	t0 = ((b1_h * x)<<1) + (((b1_l * x)>>15)<<1);

-	t0 += (b2_h * (-32768))<<1;				/* t0 = x*b1 - b2          */

-	t0 -= (b2_l << 1);

-	t0 += (f[n] << 12);						/* t0 = x*b1 - b2 + f[i]/2 */

-

-	t0 = L_shl2(t0, 6);                     /* Q24 to Q30 with saturation */

-

-	cheb = extract_h(t0);                  /* Result in Q14              */

-

-	if (cheb == -32768)

-	{

-		cheb = -32767;                     /* to avoid saturation in Az_isp */

-	}

-	return (cheb);

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*  File: az_isp.c
+*
+*  Description:
+*-----------------------------------------------------------------------*
+* Compute the ISPs from  the LPC coefficients  (order=M)                *
+*-----------------------------------------------------------------------*
+*                                                                       *
+* The ISPs are the roots of the two polynomials F1(z) and F2(z)         *
+* defined as                                                            *
+*               F1(z) = A(z) + z^-m A(z^-1)                             *
+*  and          F2(z) = A(z) - z^-m A(z^-1)                             *
+*                                                                       *
+* For a even order m=2n, F1(z) has M/2 conjugate roots on the unit      *
+* circle and F2(z) has M/2-1 conjugate roots on the unit circle in      *
+* addition to two roots at 0 and pi.                                    *
+*                                                                       *
+* For a 16th order LP analysis, F1(z) and F2(z) can be written as       *
+*                                                                       *
+*   F1(z) = (1 + a[M])   PRODUCT  (1 - 2 cos(w_i) z^-1 + z^-2 )         *
+*                        i=0,2,4,6,8,10,12,14                           *
+*                                                                       *
+*   F2(z) = (1 - a[M]) (1 - z^-2) PRODUCT (1 - 2 cos(w_i) z^-1 + z^-2 ) *
+*                                 i=1,3,5,7,9,11,13                     *
+*                                                                       *
+* The ISPs are the M-1 frequencies w_i, i=0...M-2 plus the last         *
+* predictor coefficient a[M].                                           *
+*-----------------------------------------------------------------------*
+
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "stdio.h"
+#include "grid100.tab"
+
+#define M   16
+#define NC  (M/2)
+
+/* local function */
+static __inline Word16 Chebps2(Word16 x, Word16 f[], Word32 n);
+
+void Az_isp(
+		Word16 a[],                           /* (i) Q12 : predictor coefficients                 */
+		Word16 isp[],                         /* (o) Q15 : Immittance spectral pairs              */
+		Word16 old_isp[]                      /* (i)     : old isp[] (in case not found M roots)  */
+	   )
+{
+	Word32 i, j, nf, ip, order;
+	Word16 xlow, ylow, xhigh, yhigh, xmid, ymid, xint;
+	Word16 x, y, sign, exp;
+	Word16 *coef;
+	Word16 f1[NC + 1], f2[NC];
+	Word32 t0;
+	/*-------------------------------------------------------------*
+	 * find the sum and diff polynomials F1(z) and F2(z)           *
+	 *      F1(z) = [A(z) + z^M A(z^-1)]                           *
+	 *      F2(z) = [A(z) - z^M A(z^-1)]/(1-z^-2)                  *
+	 *                                                             *
+	 * for (i=0; i<NC; i++)                                        *
+	 * {                                                           *
+	 *   f1[i] = a[i] + a[M-i];                                    *
+	 *   f2[i] = a[i] - a[M-i];                                    *
+	 * }                                                           *
+	 * f1[NC] = 2.0*a[NC];                                         *
+	 *                                                             *
+	 * for (i=2; i<NC; i++)            Divide by (1-z^-2)          *
+	 *   f2[i] += f2[i-2];                                         *
+	 *-------------------------------------------------------------*/
+	for (i = 0; i < NC; i++)
+	{
+		t0 = a[i] << 15;
+		f1[i] = vo_round(t0 + (a[M - i] << 15));        /* =(a[i]+a[M-i])/2 */
+		f2[i] = vo_round(t0 - (a[M - i] << 15));        /* =(a[i]-a[M-i])/2 */
+	}
+	f1[NC] = a[NC];                        
+	for (i = 2; i < NC; i++)               /* Divide by (1-z^-2) */
+		f2[i] = add1(f2[i], f2[i - 2]);     
+
+	/*---------------------------------------------------------------------*
+	 * Find the ISPs (roots of F1(z) and F2(z) ) using the                 *
+	 * Chebyshev polynomial evaluation.                                    *
+	 * The roots of F1(z) and F2(z) are alternatively searched.            *
+	 * We start by finding the first root of F1(z) then we switch          *
+	 * to F2(z) then back to F1(z) and so on until all roots are found.    *
+	 *                                                                     *
+	 *  - Evaluate Chebyshev pol. at grid points and check for sign change.*
+	 *  - If sign change track the root by subdividing the interval        *
+	 *    2 times and ckecking sign change.                                *
+	 *---------------------------------------------------------------------*/
+	nf = 0;                                  /* number of found frequencies */
+	ip = 0;                                  /* indicator for f1 or f2      */
+	coef = f1;                             
+	order = NC;                            
+	xlow = vogrid[0];                        
+	ylow = Chebps2(xlow, coef, order);
+	j = 0;
+	while ((nf < M - 1) && (j < GRID_POINTS))
+	{
+		j ++;
+		xhigh = xlow;                     
+		yhigh = ylow;                      
+		xlow = vogrid[j];                    
+		ylow = Chebps2(xlow, coef, order);
+		if ((ylow * yhigh) <= (Word32) 0)
+		{
+			/* divide 2 times the interval */
+			for (i = 0; i < 2; i++)
+			{
+				xmid = (xlow >> 1) + (xhigh >> 1);        /* xmid = (xlow + xhigh)/2 */
+				ymid = Chebps2(xmid, coef, order);
+				if ((ylow * ymid) <= (Word32) 0)
+				{
+					yhigh = ymid;         
+					xhigh = xmid;          
+				} else
+				{
+					ylow = ymid;           
+					xlow = xmid;          
+				}
+			}
+			/*-------------------------------------------------------------*
+			 * Linear interpolation                                        *
+			 *    xint = xlow - ylow*(xhigh-xlow)/(yhigh-ylow);            *
+			 *-------------------------------------------------------------*/
+			x = xhigh - xlow;
+			y = yhigh - ylow;
+			if (y == 0)
+			{
+				xint = xlow;               
+			} else
+			{
+				sign = y;                 
+				y = abs_s(y);
+				exp = norm_s(y);
+				y = y << exp;
+				y = div_s((Word16) 16383, y);
+				t0 = x * y;
+				t0 = (t0 >> (19 - exp));
+				y = vo_extract_l(t0);         /* y= (xhigh-xlow)/(yhigh-ylow) in Q11 */
+				if (sign < 0)
+					y = -y;
+				t0 = ylow * y;      /* result in Q26 */
+				t0 = (t0 >> 10);        /* result in Q15 */
+				xint = vo_sub(xlow, vo_extract_l(t0));        /* xint = xlow - ylow*y */
+			}
+			isp[nf] = xint;                
+			xlow = xint;                   
+			nf++;                          
+			if (ip == 0)
+			{
+				ip = 1;                    
+				coef = f2;                
+				order = NC - 1;           
+			} else
+			{
+				ip = 0;                   
+				coef = f1;                 
+				order = NC;              
+			}
+			ylow = Chebps2(xlow, coef, order);
+		}
+	}
+	/* Check if M-1 roots found */
+	if(nf < M - 1)
+	{
+		for (i = 0; i < M; i++)
+		{
+			isp[i] = old_isp[i];          
+		}
+	} else
+	{
+		isp[M - 1] = a[M] << 3;                      /* From Q12 to Q15 with saturation */
+	}
+	return;
+}
+
+/*--------------------------------------------------------------*
+* function  Chebps2:                                           *
+*           ~~~~~~~                                            *
+*    Evaluates the Chebishev polynomial series                 *
+*--------------------------------------------------------------*
+*                                                              *
+*  The polynomial order is                                     *
+*     n = M/2   (M is the prediction order)                    *
+*  The polynomial is given by                                  *
+*    C(x) = f(0)T_n(x) + f(1)T_n-1(x) + ... +f(n-1)T_1(x) + f(n)/2 *
+* Arguments:                                                   *
+*  x:     input value of evaluation; x = cos(frequency) in Q15 *
+*  f[]:   coefficients of the pol.                      in Q11 *
+*  n:     order of the pol.                                    *
+*                                                              *
+* The value of C(x) is returned. (Satured to +-1.99 in Q14)    *
+*                                                              *
+*--------------------------------------------------------------*/
+
+static __inline Word16 Chebps2(Word16 x, Word16 f[], Word32 n)
+{
+	Word32 i, cheb;
+	Word16 b0_h, b0_l, b1_h, b1_l, b2_h, b2_l;
+	Word32 t0;
+
+	/* Note: All computation are done in Q24. */
+
+	t0 = f[0] << 13;
+	b2_h = t0 >> 16;
+	b2_l = (t0 & 0xffff)>>1;
+
+	t0 = ((b2_h * x)<<1) + (((b2_l * x)>>15)<<1);
+	t0 <<= 1;
+	t0 += (f[1] << 13);						/* + f[1] in Q24        */
+
+	b1_h = t0 >> 16;
+	b1_l = (t0 & 0xffff) >> 1;
+
+	for (i = 2; i < n; i++)
+	{
+		t0 = ((b1_h * x)<<1) + (((b1_l * x)>>15)<<1);
+
+		t0 += (b2_h * (-16384))<<1;
+		t0 += (f[i] << 12);
+		t0 <<= 1;
+		t0 -= (b2_l << 1);					/* t0 = 2.0*x*b1 - b2 + f[i]; */
+
+		b0_h = t0 >> 16;
+		b0_l = (t0 & 0xffff) >> 1;
+
+		b2_l = b1_l;                         /* b2 = b1; */
+		b2_h = b1_h;                       
+		b1_l = b0_l;                         /* b1 = b0; */
+		b1_h = b0_h;                       
+	}
+
+	t0 = ((b1_h * x)<<1) + (((b1_l * x)>>15)<<1);
+	t0 += (b2_h * (-32768))<<1;				/* t0 = x*b1 - b2          */
+	t0 -= (b2_l << 1);
+	t0 += (f[n] << 12);						/* t0 = x*b1 - b2 + f[i]/2 */
+
+	t0 = L_shl2(t0, 6);                     /* Q24 to Q30 with saturation */
+
+	cheb = extract_h(t0);                  /* Result in Q14              */
+
+	if (cheb == -32768)
+	{
+		cheb = -32767;                     /* to avoid saturation in Az_isp */
+	}
+	return (cheb);
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/bits.c b/media/libstagefright/codecs/amrwbenc/src/bits.c
index 90d1a00..61cac3d5 100644
--- a/media/libstagefright/codecs/amrwbenc/src/bits.c
+++ b/media/libstagefright/codecs/amrwbenc/src/bits.c
@@ -1,210 +1,210 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-       File: bits.c

-

-	   Description: Performs bit stream manipulation

-

-************************************************************************/

-

-#include <stdlib.h>

-#include <stdio.h>

-#include "typedef.h"

-#include "basic_op.h"

-#include "cnst.h"

-#include "bits.h"

-#include "acelp.h"

-#include "dtx.h"

-#include "mime_io.tab"

-

-

-int PackBits(Word16 prms[],             /*  i: analysis parameters */

-			 Word16 coding_mode,        /*  i: coding bit-stream ratio mode */

-			 Word16 mode,               /*  i: coding bit-stream ratio mode*/ 

-			 Coder_State *st            /*i/o: coder global parameters struct */           

-			 )

-{

-	Word16 i, frame_type;

-	UWord8 temp;

-	UWord8 *stream_ptr;

-	Word16 bitstreamformat = st->frameType;

-

-	unsigned short* dataOut = st->outputStream;

-

-	if (coding_mode == MRDTX)

-	{	   

-		st->sid_update_counter--;

-

-		if (st->prev_ft == TX_SPEECH)

-		{

-			frame_type = TX_SID_FIRST;

-			st->sid_update_counter = 3;

-		} else

-		{

-			if ((st->sid_handover_debt > 0) && (st->sid_update_counter > 2))

-			{

-				/* ensure extra updates are  properly delayed after a possible SID_FIRST */

-				frame_type = TX_SID_UPDATE;

-				st->sid_handover_debt--;

-			} else

-			{

-				if (st->sid_update_counter == 0)

-				{

-					frame_type = TX_SID_UPDATE;

-					st->sid_update_counter = 8;

-				} else

-				{

-					frame_type = TX_NO_DATA;

-				}

-			}

-		}

-	} else

-	{

-		st->sid_update_counter = 8;

-		frame_type = TX_SPEECH;

-	}

-	st->prev_ft = frame_type;

-

-	if(bitstreamformat == 0)				/* default file format */

-	{

-		*(dataOut) = TX_FRAME_TYPE;

-		*(dataOut + 1) = frame_type;

-		*(dataOut + 2) = mode;

-		for (i = 0; i < nb_of_bits[coding_mode]; i++)

-		{

-			*(dataOut + 3 + i) = prms[i];

-		}

-		return  (3 + nb_of_bits[coding_mode])<<1;

-	} else

-	{

-		if (bitstreamformat == 1)		/* ITU file format */

-		{  						

-			*(dataOut) = 0x6b21;

-			if(frame_type != TX_NO_DATA && frame_type != TX_SID_FIRST)

-			{

-				*(dataOut + 1) = nb_of_bits[coding_mode];

-				for (i = 0; i < nb_of_bits[coding_mode]; i++)

-				{

-					if(prms[i] == BIT_0){

-						*(dataOut + 2 + i) = BIT_0_ITU;	 			

-					}

-					else{

-						*(dataOut + 2 + i) = BIT_1_ITU;

-					}

-				}

-				return (2 + nb_of_bits[coding_mode])<<1;   

-			} else

-			{

-				*(dataOut + 1) = 0;

-				return 2<<1;	   

-			}

-		} else							/* MIME/storage file format */

-		{

-#define MRSID 9

-			/* change mode index in case of SID frame */

-			if (coding_mode == MRDTX)

-			{

-				coding_mode = MRSID;

-				if (frame_type == TX_SID_FIRST)

-				{

-					for (i = 0; i < NBBITS_SID; i++)	prms[i] = BIT_0;

-				}

-			}

-			/* -> force NO_DATA frame */

-			if (coding_mode < 0 || coding_mode > 15 || (coding_mode > MRSID && coding_mode < 14))

-			{

-				coding_mode = 15;

-			}

-			/* mark empty frames between SID updates as NO_DATA frames */

-			if (coding_mode == MRSID && frame_type == TX_NO_DATA)

-			{

-				coding_mode = 15;

-			}

-			/* set pointer for packed frame, note that we handle data as bytes */

-			stream_ptr = (UWord8*)dataOut;

-			/* insert table of contents (ToC) byte at the beginning of the packet */

-			*stream_ptr = toc_byte[coding_mode];

-			stream_ptr++;

-			temp = 0;

-			/* sort and pack AMR-WB speech or SID bits */

-			for (i = 1; i < unpacked_size[coding_mode] + 1; i++)

-			{

-				if (prms[sort_ptr[coding_mode][i-1]] == BIT_1)

-				{

-					temp++;

-				}

-				if (i&0x7)

-				{

-					temp <<= 1;

-				}

-				else

-				{

-					*stream_ptr = temp;

-					stream_ptr++;

-					temp = 0;

-				}

-			}

-			/* insert SID type indication and speech mode in case of SID frame */

-			if (coding_mode == MRSID)

-			{

-				if (frame_type == TX_SID_UPDATE)

-				{

-					temp++;

-				}

-				temp <<= 4;

-				temp += mode & 0x000F;

-			}

-			/* insert unused bits (zeros) at the tail of the last byte */

-			if (unused_size[coding_mode])

-			{

-				temp <<= (unused_size[coding_mode] - 1);

-			}

-			*stream_ptr = temp;

-			/* write packed frame into file (1 byte added to cover ToC entry) */

-			return (1 + packed_size[coding_mode]);

-		}

-	}

-}

-

-/*-----------------------------------------------------*

-* Parm_serial -> convert parameters to serial stream  *

-*-----------------------------------------------------*/

-

-void Parm_serial(

-		Word16 value,                         /* input : parameter value */

-		Word16 no_of_bits,                    /* input : number of bits  */

-		Word16 ** prms

-		)

-{

-	Word16 i, bit;

-	*prms += no_of_bits;                  

-	for (i = 0; i < no_of_bits; i++)

-	{

-		bit = (Word16) (value & 0x0001);    /* get lsb */

-		if (bit == 0)

-			*--(*prms) = BIT_0;

-		else

-			*--(*prms) = BIT_1;

-		value >>= 1;          

-	}

-	*prms += no_of_bits;                  

-	return;

-}

-

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+       File: bits.c
+
+	   Description: Performs bit stream manipulation
+
+************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "typedef.h"
+#include "basic_op.h"
+#include "cnst.h"
+#include "bits.h"
+#include "acelp.h"
+#include "dtx.h"
+#include "mime_io.tab"
+
+
+int PackBits(Word16 prms[],             /*  i: analysis parameters */
+			 Word16 coding_mode,        /*  i: coding bit-stream ratio mode */
+			 Word16 mode,               /*  i: coding bit-stream ratio mode*/ 
+			 Coder_State *st            /*i/o: coder global parameters struct */           
+			 )
+{
+	Word16 i, frame_type;
+	UWord8 temp;
+	UWord8 *stream_ptr;
+	Word16 bitstreamformat = st->frameType;
+
+	unsigned short* dataOut = st->outputStream;
+
+	if (coding_mode == MRDTX)
+	{	   
+		st->sid_update_counter--;
+
+		if (st->prev_ft == TX_SPEECH)
+		{
+			frame_type = TX_SID_FIRST;
+			st->sid_update_counter = 3;
+		} else
+		{
+			if ((st->sid_handover_debt > 0) && (st->sid_update_counter > 2))
+			{
+				/* ensure extra updates are  properly delayed after a possible SID_FIRST */
+				frame_type = TX_SID_UPDATE;
+				st->sid_handover_debt--;
+			} else
+			{
+				if (st->sid_update_counter == 0)
+				{
+					frame_type = TX_SID_UPDATE;
+					st->sid_update_counter = 8;
+				} else
+				{
+					frame_type = TX_NO_DATA;
+				}
+			}
+		}
+	} else
+	{
+		st->sid_update_counter = 8;
+		frame_type = TX_SPEECH;
+	}
+	st->prev_ft = frame_type;
+
+	if(bitstreamformat == 0)				/* default file format */
+	{
+		*(dataOut) = TX_FRAME_TYPE;
+		*(dataOut + 1) = frame_type;
+		*(dataOut + 2) = mode;
+		for (i = 0; i < nb_of_bits[coding_mode]; i++)
+		{
+			*(dataOut + 3 + i) = prms[i];
+		}
+		return  (3 + nb_of_bits[coding_mode])<<1;
+	} else
+	{
+		if (bitstreamformat == 1)		/* ITU file format */
+		{  						
+			*(dataOut) = 0x6b21;
+			if(frame_type != TX_NO_DATA && frame_type != TX_SID_FIRST)
+			{
+				*(dataOut + 1) = nb_of_bits[coding_mode];
+				for (i = 0; i < nb_of_bits[coding_mode]; i++)
+				{
+					if(prms[i] == BIT_0){
+						*(dataOut + 2 + i) = BIT_0_ITU;	 			
+					}
+					else{
+						*(dataOut + 2 + i) = BIT_1_ITU;
+					}
+				}
+				return (2 + nb_of_bits[coding_mode])<<1;   
+			} else
+			{
+				*(dataOut + 1) = 0;
+				return 2<<1;	   
+			}
+		} else							/* MIME/storage file format */
+		{
+#define MRSID 9
+			/* change mode index in case of SID frame */
+			if (coding_mode == MRDTX)
+			{
+				coding_mode = MRSID;
+				if (frame_type == TX_SID_FIRST)
+				{
+					for (i = 0; i < NBBITS_SID; i++)	prms[i] = BIT_0;
+				}
+			}
+			/* -> force NO_DATA frame */
+			if (coding_mode < 0 || coding_mode > 15 || (coding_mode > MRSID && coding_mode < 14))
+			{
+				coding_mode = 15;
+			}
+			/* mark empty frames between SID updates as NO_DATA frames */
+			if (coding_mode == MRSID && frame_type == TX_NO_DATA)
+			{
+				coding_mode = 15;
+			}
+			/* set pointer for packed frame, note that we handle data as bytes */
+			stream_ptr = (UWord8*)dataOut;
+			/* insert table of contents (ToC) byte at the beginning of the packet */
+			*stream_ptr = toc_byte[coding_mode];
+			stream_ptr++;
+			temp = 0;
+			/* sort and pack AMR-WB speech or SID bits */
+			for (i = 1; i < unpacked_size[coding_mode] + 1; i++)
+			{
+				if (prms[sort_ptr[coding_mode][i-1]] == BIT_1)
+				{
+					temp++;
+				}
+				if (i&0x7)
+				{
+					temp <<= 1;
+				}
+				else
+				{
+					*stream_ptr = temp;
+					stream_ptr++;
+					temp = 0;
+				}
+			}
+			/* insert SID type indication and speech mode in case of SID frame */
+			if (coding_mode == MRSID)
+			{
+				if (frame_type == TX_SID_UPDATE)
+				{
+					temp++;
+				}
+				temp <<= 4;
+				temp += mode & 0x000F;
+			}
+			/* insert unused bits (zeros) at the tail of the last byte */
+			if (unused_size[coding_mode])
+			{
+				temp <<= (unused_size[coding_mode] - 1);
+			}
+			*stream_ptr = temp;
+			/* write packed frame into file (1 byte added to cover ToC entry) */
+			return (1 + packed_size[coding_mode]);
+		}
+	}
+}
+
+/*-----------------------------------------------------*
+* Parm_serial -> convert parameters to serial stream  *
+*-----------------------------------------------------*/
+
+void Parm_serial(
+		Word16 value,                         /* input : parameter value */
+		Word16 no_of_bits,                    /* input : number of bits  */
+		Word16 ** prms
+		)
+{
+	Word16 i, bit;
+	*prms += no_of_bits;                  
+	for (i = 0; i < no_of_bits; i++)
+	{
+		bit = (Word16) (value & 0x0001);    /* get lsb */
+		if (bit == 0)
+			*--(*prms) = BIT_0;
+		else
+			*--(*prms) = BIT_1;
+		value >>= 1;          
+	}
+	*prms += no_of_bits;                  
+	return;
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c b/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c
index 39fc4c5..80990d9 100644
--- a/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c
+++ b/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c
@@ -1,297 +1,297 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/************************************************************************

-*      File: c2t64fx.c                                                  *

-*                                                                       *

-*	   Description:Performs algebraic codebook search for 6.60kbits mode*

-*                                                                       *

-*************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "math_op.h"

-#include "acelp.h"

-#include "cnst.h"

-

-#define NB_TRACK  2

-#define STEP      2

-#define NB_POS    32

-#define MSIZE     1024

-

-/*************************************************************************

-* Function:  ACELP_2t64_fx()                                             *

-*                                                                        *

-* 12 bits algebraic codebook.                                            *

-* 2 tracks x 32 positions per track = 64 samples.                        *

-*                                                                        *

-* 12 bits --> 2 pulses in a frame of 64 samples.                         *

-*                                                                        *

-* All pulses can have two (2) possible amplitudes: +1 or -1.             *

-* Each pulse can have 32 possible positions.                             *

-**************************************************************************/

-

-void ACELP_2t64_fx(

-		Word16 dn[],                          /* (i) <12b : correlation between target x[] and H[]      */

-		Word16 cn[],                          /* (i) <12b : residual after long term prediction         */

-		Word16 H[],                           /* (i) Q12: impulse response of weighted synthesis filter */

-		Word16 code[],                        /* (o) Q9 : algebraic (fixed) codebook excitation         */

-		Word16 y[],                           /* (o) Q9 : filtered fixed codebook excitation            */

-		Word16 * index                        /* (o) : index (12): 5+1+5+1 = 11 bits.                   */

-		)

-{

-	Word32 i, j, k, i0, i1, ix, iy, pos, pos2;

-	Word16 ps, psk, ps1, ps2, alpk, alp1, alp2, sq;

-	Word16 alp, val, exp, k_cn, k_dn;

-	Word16 *p0, *p1, *p2, *psign;

-	Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf;

-

-	Word16 sign[L_SUBFR], vec[L_SUBFR], dn2[L_SUBFR];

-	Word16 h_buf[4 * L_SUBFR] = {0};

-	Word16 rrixix[NB_TRACK][NB_POS];

-	Word16 rrixiy[MSIZE];

-	Word32 s, cor;

-

-	/*----------------------------------------------------------------*

-	 * Find sign for each pulse position.                             *

-	 *----------------------------------------------------------------*/

-	alp = 8192;                              /* alp = 2.0 (Q12) */

-

-	/* calculate energy for normalization of cn[] and dn[] */

-	/* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */

-#ifdef ASM_OPT             /* asm optimization branch */

-	s = Dot_product12_asm(cn, cn, L_SUBFR, &exp);

-#else

-	s = Dot_product12(cn, cn, L_SUBFR, &exp);

-#endif

-

-	Isqrt_n(&s, &exp);

-	s = L_shl(s, add1(exp, 5));             

-	k_cn = vo_round(s);

-

-	/* set k_dn = 32..512 (ener_dn = 2^30..2^22) */

-#ifdef ASM_OPT                  /* asm optimization branch */

-	s = Dot_product12_asm(dn, dn, L_SUBFR, &exp);

-#else

-	s = Dot_product12(dn, dn, L_SUBFR, &exp);

-#endif

-

-	Isqrt_n(&s, &exp);

-	k_dn = vo_round(L_shl(s, (exp + 8)));    /* k_dn = 256..4096 */

-	k_dn = vo_mult_r(alp, k_dn);              /* alp in Q12 */

-

-	/* mix normalized cn[] and dn[] */

-	p0 = cn;

-	p1 = dn;

-	p2 = dn2;

-

-	for (i = 0; i < L_SUBFR/4; i++)

-	{

-		s = (k_cn* (*p0++))+(k_dn * (*p1++));

-		*p2++ = s >> 7;

-		s = (k_cn* (*p0++))+(k_dn * (*p1++));

-		*p2++ = s >> 7;

-		s = (k_cn* (*p0++))+(k_dn * (*p1++));

-		*p2++ = s >> 7;

-		s = (k_cn* (*p0++))+(k_dn * (*p1++));

-		*p2++ = s >> 7; 

-	}

-

-	/* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[]    */

-	for (i = 0; i < L_SUBFR; i ++)

-	{

-		val = dn[i];                   

-		ps = dn2[i];                   

-		if (ps >= 0)

-		{

-			sign[i] = 32767;             /* sign = +1 (Q12) */

-			vec[i] = -32768;           

-		} else

-		{

-			sign[i] = -32768;            /* sign = -1 (Q12) */

-			vec[i] = 32767;            

-			dn[i] = -val;

-		}

-	}

-	/*------------------------------------------------------------*

-	 * Compute h_inv[i].                                          *

-	 *------------------------------------------------------------*/

-	/* impulse response buffer for fast computation */

-	h = h_buf + L_SUBFR;                             

-	h_inv = h + (L_SUBFR<<1);         

-

-	for (i = 0; i < L_SUBFR; i++)

-	{

-		h[i] = H[i];                       

-		h_inv[i] = vo_negate(h[i]);           

-	}

-

-	/*------------------------------------------------------------*

-	 * Compute rrixix[][] needed for the codebook search.         *

-	 * Result is multiplied by 0.5                                *

-	 *------------------------------------------------------------*/

-	/* Init pointers to last position of rrixix[] */

-	p0 = &rrixix[0][NB_POS - 1];           

-	p1 = &rrixix[1][NB_POS - 1];           

-

-	ptr_h1 = h;                            

-	cor = 0x00010000L;                          /* for rounding */

-	for (i = 0; i < NB_POS; i++)

-	{

-		cor += ((*ptr_h1) * (*ptr_h1) << 1);

-		ptr_h1++;

-		*p1-- = (extract_h(cor) >> 1);            

-		cor += ((*ptr_h1) * (*ptr_h1) << 1);

-		ptr_h1++;

-		*p0-- = (extract_h(cor) >> 1);            

-	}

-

-	/*------------------------------------------------------------*

-	 * Compute rrixiy[][] needed for the codebook search.         *

-	 *------------------------------------------------------------*/

-	pos = MSIZE - 1;                       

-	pos2 = MSIZE - 2;                      

-	ptr_hf = h + 1;                        

-

-	for (k = 0; k < NB_POS; k++)

-	{

-		p1 = &rrixiy[pos];                 

-		p0 = &rrixiy[pos2];                

-		cor = 0x00008000L;                        /* for rounding */

-		ptr_h1 = h;                        

-		ptr_h2 = ptr_hf;                   

-

-		for (i = (k + 1); i < NB_POS; i++)

-		{

-			cor += ((*ptr_h1) * (*ptr_h2))<<1;

-			ptr_h1++;

-			ptr_h2++;

-			*p1 = extract_h(cor);          

-			cor += ((*ptr_h1) * (*ptr_h2))<<1;

-			ptr_h1++;

-			ptr_h2++;

-			*p0 = extract_h(cor);         

-

-			p1 -= (NB_POS + 1);

-			p0 -= (NB_POS + 1);

-		}

-		cor += ((*ptr_h1) * (*ptr_h2))<<1;

-		ptr_h1++;

-		ptr_h2++;

-		*p1 = extract_h(cor);              

-

-		pos -= NB_POS;

-		pos2--;

-		ptr_hf += STEP;

-	}

-

-	/*------------------------------------------------------------*

-	 * Modification of rrixiy[][] to take signs into account.     *

-	 *------------------------------------------------------------*/

-	p0 = rrixiy;                          

-	for (i = 0; i < L_SUBFR; i += STEP)

-	{

-		psign = sign;                      

-		if (psign[i] < 0)

-		{

-			psign = vec;                   

-		}

-		for (j = 1; j < L_SUBFR; j += STEP)

-		{

-			*p0 = vo_mult(*p0, psign[j]);     

-			p0++;

-		}

-	}

-	/*-------------------------------------------------------------------*

-	 * search 2 pulses:                                                  *

-	 * ~@~~~~~~~~~~~~~~                                                  *

-	 * 32 pos x 32 pos = 1024 tests (all combinaisons is tested)         *

-	 *-------------------------------------------------------------------*/

-	p0 = rrixix[0];                        

-	p1 = rrixix[1];                        

-	p2 = rrixiy;                          

-

-	psk = -1;                              

-	alpk = 1;                              

-	ix = 0;                                

-	iy = 1;                                

-

-	for (i0 = 0; i0 < L_SUBFR; i0 += STEP)

-	{

-		ps1 = dn[i0];                      

-		alp1 = (*p0++);                    

-		pos = -1;                          

-		for (i1 = 1; i1 < L_SUBFR; i1 += STEP)

-		{

-			ps2 = add1(ps1, dn[i1]);

-			alp2 = add1(alp1, add1(*p1++, *p2++));

-			sq = vo_mult(ps2, ps2);

-			s = vo_L_mult(alpk, sq) - ((psk * alp2)<<1);

-			if (s > 0)

-			{

-				psk = sq;                  

-				alpk = alp2;               

-				pos = i1;                  

-			}

-		}

-		p1 -= NB_POS;

-		if (pos >= 0)

-		{

-			ix = i0;                      

-			iy = pos;                      

-		}

-	}

-	/*-------------------------------------------------------------------*

-	 * Build the codeword, the filtered codeword and index of codevector.*

-	 *-------------------------------------------------------------------*/

-

-	for (i = 0; i < L_SUBFR; i++)

-	{

-		code[i] = 0;                       

-	}

-

-	i0 = (ix >> 1);                       /* pos of pulse 1 (0..31) */

-	i1 = (iy >> 1);                       /* pos of pulse 2 (0..31) */

-	if (sign[ix] > 0)

-	{

-		code[ix] = 512;                     /* codeword in Q9 format */

-		p0 = h - ix;                       

-	} else

-	{

-		code[ix] = -512;                   

-		i0 += NB_POS;                      

-		p0 = h_inv - ix;                   

-	}

-	if (sign[iy] > 0)

-	{

-		code[iy] = 512;                    

-		p1 = h - iy;                       

-	} else

-	{

-		code[iy] = -512;                   

-		i1 += NB_POS;                      

-		p1 = h_inv - iy;                   

-	}

-	*index = add1((i0 << 6), i1);          

-	for (i = 0; i < L_SUBFR; i++)

-	{

-		y[i] = vo_shr_r(add1((*p0++), (*p1++)), 3);

-	}

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/************************************************************************
+*      File: c2t64fx.c                                                  *
+*                                                                       *
+*	   Description:Performs algebraic codebook search for 6.60kbits mode*
+*                                                                       *
+*************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+#include "acelp.h"
+#include "cnst.h"
+
+#define NB_TRACK  2
+#define STEP      2
+#define NB_POS    32
+#define MSIZE     1024
+
+/*************************************************************************
+* Function:  ACELP_2t64_fx()                                             *
+*                                                                        *
+* 12 bits algebraic codebook.                                            *
+* 2 tracks x 32 positions per track = 64 samples.                        *
+*                                                                        *
+* 12 bits --> 2 pulses in a frame of 64 samples.                         *
+*                                                                        *
+* All pulses can have two (2) possible amplitudes: +1 or -1.             *
+* Each pulse can have 32 possible positions.                             *
+**************************************************************************/
+
+void ACELP_2t64_fx(
+		Word16 dn[],                          /* (i) <12b : correlation between target x[] and H[]      */
+		Word16 cn[],                          /* (i) <12b : residual after long term prediction         */
+		Word16 H[],                           /* (i) Q12: impulse response of weighted synthesis filter */
+		Word16 code[],                        /* (o) Q9 : algebraic (fixed) codebook excitation         */
+		Word16 y[],                           /* (o) Q9 : filtered fixed codebook excitation            */
+		Word16 * index                        /* (o) : index (12): 5+1+5+1 = 11 bits.                   */
+		)
+{
+	Word32 i, j, k, i0, i1, ix, iy, pos, pos2;
+	Word16 ps, psk, ps1, ps2, alpk, alp1, alp2, sq;
+	Word16 alp, val, exp, k_cn, k_dn;
+	Word16 *p0, *p1, *p2, *psign;
+	Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf;
+
+	Word16 sign[L_SUBFR], vec[L_SUBFR], dn2[L_SUBFR];
+	Word16 h_buf[4 * L_SUBFR] = {0};
+	Word16 rrixix[NB_TRACK][NB_POS];
+	Word16 rrixiy[MSIZE];
+	Word32 s, cor;
+
+	/*----------------------------------------------------------------*
+	 * Find sign for each pulse position.                             *
+	 *----------------------------------------------------------------*/
+	alp = 8192;                              /* alp = 2.0 (Q12) */
+
+	/* calculate energy for normalization of cn[] and dn[] */
+	/* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */
+#ifdef ASM_OPT             /* asm optimization branch */
+	s = Dot_product12_asm(cn, cn, L_SUBFR, &exp);
+#else
+	s = Dot_product12(cn, cn, L_SUBFR, &exp);
+#endif
+
+	Isqrt_n(&s, &exp);
+	s = L_shl(s, add1(exp, 5));             
+	k_cn = vo_round(s);
+
+	/* set k_dn = 32..512 (ener_dn = 2^30..2^22) */
+#ifdef ASM_OPT                  /* asm optimization branch */
+	s = Dot_product12_asm(dn, dn, L_SUBFR, &exp);
+#else
+	s = Dot_product12(dn, dn, L_SUBFR, &exp);
+#endif
+
+	Isqrt_n(&s, &exp);
+	k_dn = vo_round(L_shl(s, (exp + 8)));    /* k_dn = 256..4096 */
+	k_dn = vo_mult_r(alp, k_dn);              /* alp in Q12 */
+
+	/* mix normalized cn[] and dn[] */
+	p0 = cn;
+	p1 = dn;
+	p2 = dn2;
+
+	for (i = 0; i < L_SUBFR/4; i++)
+	{
+		s = (k_cn* (*p0++))+(k_dn * (*p1++));
+		*p2++ = s >> 7;
+		s = (k_cn* (*p0++))+(k_dn * (*p1++));
+		*p2++ = s >> 7;
+		s = (k_cn* (*p0++))+(k_dn * (*p1++));
+		*p2++ = s >> 7;
+		s = (k_cn* (*p0++))+(k_dn * (*p1++));
+		*p2++ = s >> 7; 
+	}
+
+	/* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[]    */
+	for (i = 0; i < L_SUBFR; i ++)
+	{
+		val = dn[i];                   
+		ps = dn2[i];                   
+		if (ps >= 0)
+		{
+			sign[i] = 32767;             /* sign = +1 (Q12) */
+			vec[i] = -32768;           
+		} else
+		{
+			sign[i] = -32768;            /* sign = -1 (Q12) */
+			vec[i] = 32767;            
+			dn[i] = -val;
+		}
+	}
+	/*------------------------------------------------------------*
+	 * Compute h_inv[i].                                          *
+	 *------------------------------------------------------------*/
+	/* impulse response buffer for fast computation */
+	h = h_buf + L_SUBFR;                             
+	h_inv = h + (L_SUBFR<<1);         
+
+	for (i = 0; i < L_SUBFR; i++)
+	{
+		h[i] = H[i];                       
+		h_inv[i] = vo_negate(h[i]);           
+	}
+
+	/*------------------------------------------------------------*
+	 * Compute rrixix[][] needed for the codebook search.         *
+	 * Result is multiplied by 0.5                                *
+	 *------------------------------------------------------------*/
+	/* Init pointers to last position of rrixix[] */
+	p0 = &rrixix[0][NB_POS - 1];           
+	p1 = &rrixix[1][NB_POS - 1];           
+
+	ptr_h1 = h;                            
+	cor = 0x00010000L;                          /* for rounding */
+	for (i = 0; i < NB_POS; i++)
+	{
+		cor += ((*ptr_h1) * (*ptr_h1) << 1);
+		ptr_h1++;
+		*p1-- = (extract_h(cor) >> 1);            
+		cor += ((*ptr_h1) * (*ptr_h1) << 1);
+		ptr_h1++;
+		*p0-- = (extract_h(cor) >> 1);            
+	}
+
+	/*------------------------------------------------------------*
+	 * Compute rrixiy[][] needed for the codebook search.         *
+	 *------------------------------------------------------------*/
+	pos = MSIZE - 1;                       
+	pos2 = MSIZE - 2;                      
+	ptr_hf = h + 1;                        
+
+	for (k = 0; k < NB_POS; k++)
+	{
+		p1 = &rrixiy[pos];                 
+		p0 = &rrixiy[pos2];                
+		cor = 0x00008000L;                        /* for rounding */
+		ptr_h1 = h;                        
+		ptr_h2 = ptr_hf;                   
+
+		for (i = (k + 1); i < NB_POS; i++)
+		{
+			cor += ((*ptr_h1) * (*ptr_h2))<<1;
+			ptr_h1++;
+			ptr_h2++;
+			*p1 = extract_h(cor);          
+			cor += ((*ptr_h1) * (*ptr_h2))<<1;
+			ptr_h1++;
+			ptr_h2++;
+			*p0 = extract_h(cor);         
+
+			p1 -= (NB_POS + 1);
+			p0 -= (NB_POS + 1);
+		}
+		cor += ((*ptr_h1) * (*ptr_h2))<<1;
+		ptr_h1++;
+		ptr_h2++;
+		*p1 = extract_h(cor);              
+
+		pos -= NB_POS;
+		pos2--;
+		ptr_hf += STEP;
+	}
+
+	/*------------------------------------------------------------*
+	 * Modification of rrixiy[][] to take signs into account.     *
+	 *------------------------------------------------------------*/
+	p0 = rrixiy;                          
+	for (i = 0; i < L_SUBFR; i += STEP)
+	{
+		psign = sign;                      
+		if (psign[i] < 0)
+		{
+			psign = vec;                   
+		}
+		for (j = 1; j < L_SUBFR; j += STEP)
+		{
+			*p0 = vo_mult(*p0, psign[j]);     
+			p0++;
+		}
+	}
+	/*-------------------------------------------------------------------*
+	 * search 2 pulses:                                                  *
+	 * ~@~~~~~~~~~~~~~~                                                  *
+	 * 32 pos x 32 pos = 1024 tests (all combinaisons is tested)         *
+	 *-------------------------------------------------------------------*/
+	p0 = rrixix[0];                        
+	p1 = rrixix[1];                        
+	p2 = rrixiy;                          
+
+	psk = -1;                              
+	alpk = 1;                              
+	ix = 0;                                
+	iy = 1;                                
+
+	for (i0 = 0; i0 < L_SUBFR; i0 += STEP)
+	{
+		ps1 = dn[i0];                      
+		alp1 = (*p0++);                    
+		pos = -1;                          
+		for (i1 = 1; i1 < L_SUBFR; i1 += STEP)
+		{
+			ps2 = add1(ps1, dn[i1]);
+			alp2 = add1(alp1, add1(*p1++, *p2++));
+			sq = vo_mult(ps2, ps2);
+			s = vo_L_mult(alpk, sq) - ((psk * alp2)<<1);
+			if (s > 0)
+			{
+				psk = sq;                  
+				alpk = alp2;               
+				pos = i1;                  
+			}
+		}
+		p1 -= NB_POS;
+		if (pos >= 0)
+		{
+			ix = i0;                      
+			iy = pos;                      
+		}
+	}
+	/*-------------------------------------------------------------------*
+	 * Build the codeword, the filtered codeword and index of codevector.*
+	 *-------------------------------------------------------------------*/
+
+	for (i = 0; i < L_SUBFR; i++)
+	{
+		code[i] = 0;                       
+	}
+
+	i0 = (ix >> 1);                       /* pos of pulse 1 (0..31) */
+	i1 = (iy >> 1);                       /* pos of pulse 2 (0..31) */
+	if (sign[ix] > 0)
+	{
+		code[ix] = 512;                     /* codeword in Q9 format */
+		p0 = h - ix;                       
+	} else
+	{
+		code[ix] = -512;                   
+		i0 += NB_POS;                      
+		p0 = h_inv - ix;                   
+	}
+	if (sign[iy] > 0)
+	{
+		code[iy] = 512;                    
+		p1 = h - iy;                       
+	} else
+	{
+		code[iy] = -512;                   
+		i1 += NB_POS;                      
+		p1 = h_inv - iy;                   
+	}
+	*index = add1((i0 << 6), i1);          
+	for (i = 0; i < L_SUBFR; i++)
+	{
+		y[i] = vo_shr_r(add1((*p0++), (*p1++)), 3);
+	}
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c b/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c
index 27ba95d..17f3d47 100644
--- a/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c
+++ b/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c
@@ -1,1043 +1,1043 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*      File: c4t64fx.c                                                 *

-*                                                                      *

-*	   Description:Performs algebraic codebook search for higher modes *

-*                                                                      *

-************************************************************************/

-

-/************************************************************************

-* Function: ACELP_4t64_fx()                                             *

-*                                                                       *

-* 20, 36, 44, 52, 64, 72, 88 bits algebraic codebook.                   *

-* 4 tracks x 16 positions per track = 64 samples.                       *

-*                                                                       *

-* 20 bits --> 4 pulses in a frame of 64 samples.                        *

-* 36 bits --> 8 pulses in a frame of 64 samples.                        *

-* 44 bits --> 10 pulses in a frame of 64 samples.                       *

-* 52 bits --> 12 pulses in a frame of 64 samples.                       *

-* 64 bits --> 16 pulses in a frame of 64 samples.                       *

-* 72 bits --> 18 pulses in a frame of 64 samples.                       *

-* 88 bits --> 24 pulses in a frame of 64 samples.                       *

-*                                                                       *

-* All pulses can have two (2) possible amplitudes: +1 or -1.            *

-* Each pulse can have sixteen (16) possible positions.                  *

-*************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "math_op.h"

-#include "acelp.h"

-#include "cnst.h"

-

-#include "q_pulse.h"

-

-static Word16 tipos[36] = {

-	0, 1, 2, 3,                            /* starting point &ipos[0], 1st iter */

-	1, 2, 3, 0,                            /* starting point &ipos[4], 2nd iter */

-	2, 3, 0, 1,                            /* starting point &ipos[8], 3rd iter */

-	3, 0, 1, 2,                            /* starting point &ipos[12], 4th iter */

-	0, 1, 2, 3,

-	1, 2, 3, 0,

-	2, 3, 0, 1,

-	3, 0, 1, 2,

-	0, 1, 2, 3};                           /* end point for 24 pulses &ipos[35], 4th iter */

-

-#define NB_PULSE_MAX  24

-

-#define L_SUBFR   64

-#define NB_TRACK  4

-#define STEP      4

-#define NB_POS    16

-#define MSIZE     256

-#define NB_MAX    8

-#define NPMAXPT   ((NB_PULSE_MAX+NB_TRACK-1)/NB_TRACK)

-

-/* Private functions */

-void cor_h_vec_012(

-		Word16 h[],                           /* (i) scaled impulse response                 */

-		Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */

-		Word16 track,                         /* (i) track to use                            */

-		Word16 sign[],                        /* (i) sign vector                             */

-		Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */

-		Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */

-		Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */

-		);

-

-void cor_h_vec_012_asm(

-		Word16 h[],                           /* (i) scaled impulse response                 */

-		Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */

-		Word16 track,                         /* (i) track to use                            */

-		Word16 sign[],                        /* (i) sign vector                             */

-		Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */

-		Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */

-		Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */

-		);

-

-void cor_h_vec_30(

-		Word16 h[],                           /* (i) scaled impulse response                 */

-		Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */

-		Word16 track,                         /* (i) track to use                            */

-		Word16 sign[],                        /* (i) sign vector                             */

-		Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */

-		Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */

-		Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */

-		);

-

-void search_ixiy(

-		Word16 nb_pos_ix,                     /* (i) nb of pos for pulse 1 (1..8)       */

-		Word16 track_x,                       /* (i) track of pulse 1                   */

-		Word16 track_y,                       /* (i) track of pulse 2                   */

-		Word16 * ps,                          /* (i/o) correlation of all fixed pulses  */

-		Word16 * alp,                         /* (i/o) energy of all fixed pulses       */

-		Word16 * ix,                          /* (o) position of pulse 1                */

-		Word16 * iy,                          /* (o) position of pulse 2                */

-		Word16 dn[],                          /* (i) corr. between target and h[]       */

-		Word16 dn2[],                         /* (i) vector of selected positions       */

-		Word16 cor_x[],                       /* (i) corr. of pulse 1 with fixed pulses */

-		Word16 cor_y[],                       /* (i) corr. of pulse 2 with fixed pulses */

-		Word16 rrixiy[][MSIZE]                /* (i) corr. of pulse 1 with pulse 2   */

-		);

-

-

-void ACELP_4t64_fx(

-		Word16 dn[],                          /* (i) <12b : correlation between target x[] and H[]      */

-		Word16 cn[],                          /* (i) <12b : residual after long term prediction         */

-		Word16 H[],                           /* (i) Q12: impulse response of weighted synthesis filter */

-		Word16 code[],                        /* (o) Q9 : algebraic (fixed) codebook excitation         */

-		Word16 y[],                           /* (o) Q9 : filtered fixed codebook excitation            */

-		Word16 nbbits,                        /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits                */

-		Word16 ser_size,                      /* (i) : bit rate                                         */

-		Word16 _index[]                       /* (o) : index (20): 5+5+5+5 = 20 bits.                   */

-		/* (o) : index (36): 9+9+9+9 = 36 bits.                   */

-		/* (o) : index (44): 13+9+13+9 = 44 bits.                 */

-		/* (o) : index (52): 13+13+13+13 = 52 bits.               */

-		/* (o) : index (64): 2+2+2+2+14+14+14+14 = 64 bits.       */

-		/* (o) : index (72): 10+2+10+2+10+14+10+14 = 72 bits.     */

-		/* (o) : index (88): 11+11+11+11+11+11+11+11 = 88 bits.   */

-		)

-{

-	Word32 i, j, k;

-	Word16 st, ix, iy, pos, index, track, nb_pulse, nbiter, j_temp;

-	Word16 psk, ps, alpk, alp, val, k_cn, k_dn, exp;

-	Word16 *p0, *p1, *p2, *p3, *psign;

-	Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf, h_shift;

-	Word32 s, cor, L_tmp, L_index;

-	Word16 dn2[L_SUBFR], sign[L_SUBFR], vec[L_SUBFR];

-	Word16 ind[NPMAXPT * NB_TRACK];

-	Word16 codvec[NB_PULSE_MAX], nbpos[10];

-	Word16 cor_x[NB_POS], cor_y[NB_POS], pos_max[NB_TRACK];

-	Word16 h_buf[4 * L_SUBFR];

-	Word16 rrixix[NB_TRACK][NB_POS], rrixiy[NB_TRACK][MSIZE];

-	Word16 ipos[NB_PULSE_MAX];

-

-	switch (nbbits)

-	{

-		case 20:                               /* 20 bits, 4 pulses, 4 tracks */

-			nbiter = 4;                          /* 4x16x16=1024 loop */

-			alp = 8192;                          /* alp = 2.0 (Q12) */

-			nb_pulse = 4;                      

-			nbpos[0] = 4;                      

-			nbpos[1] = 8;                      

-			break;

-		case 36:                               /* 36 bits, 8 pulses, 4 tracks */

-			nbiter = 4;                          /* 4x20x16=1280 loop */

-			alp = 4096;                          /* alp = 1.0 (Q12) */

-			nb_pulse = 8;                      

-			nbpos[0] = 4;                      

-			nbpos[1] = 8;                      

-			nbpos[2] = 8;                      

-			break;

-		case 44:                               /* 44 bits, 10 pulses, 4 tracks */

-			nbiter = 4;                          /* 4x26x16=1664 loop */

-			alp = 4096;                          /* alp = 1.0 (Q12) */

-			nb_pulse = 10;                     

-			nbpos[0] = 4;                      

-			nbpos[1] = 6;                      

-			nbpos[2] = 8;                      

-			nbpos[3] = 8;                      

-			break;

-		case 52:                               /* 52 bits, 12 pulses, 4 tracks */

-			nbiter = 4;                          /* 4x26x16=1664 loop */

-			alp = 4096;                          /* alp = 1.0 (Q12) */

-			nb_pulse = 12;                     

-			nbpos[0] = 4;                      

-			nbpos[1] = 6;                      

-			nbpos[2] = 8;                      

-			nbpos[3] = 8;                      

-			break;

-		case 64:                               /* 64 bits, 16 pulses, 4 tracks */

-			nbiter = 3;                          /* 3x36x16=1728 loop */

-			alp = 3277;                          /* alp = 0.8 (Q12) */

-			nb_pulse = 16;                     

-			nbpos[0] = 4;                      

-			nbpos[1] = 4;                      

-			nbpos[2] = 6;                      

-			nbpos[3] = 6;                      

-			nbpos[4] = 8;                      

-			nbpos[5] = 8;                      

-			break;

-		case 72:                               /* 72 bits, 18 pulses, 4 tracks */

-			nbiter = 3;                          /* 3x35x16=1680 loop */

-			alp = 3072;                          /* alp = 0.75 (Q12) */

-			nb_pulse = 18;                     

-			nbpos[0] = 2;                      

-			nbpos[1] = 3;                      

-			nbpos[2] = 4;                      

-			nbpos[3] = 5;                      

-			nbpos[4] = 6;                      

-			nbpos[5] = 7;                      

-			nbpos[6] = 8;                      

-			break;

-		case 88:                               /* 88 bits, 24 pulses, 4 tracks */

-			if(ser_size > 462)

-				nbiter = 1;

-			else

-				nbiter = 2;                    /* 2x53x16=1696 loop */

-

-			alp = 2048;                          /* alp = 0.5 (Q12) */

-			nb_pulse = 24;                     

-			nbpos[0] = 2;                      

-			nbpos[1] = 2;                      

-			nbpos[2] = 3;                      

-			nbpos[3] = 4;                      

-			nbpos[4] = 5;                      

-			nbpos[5] = 6;                      

-			nbpos[6] = 7;                      

-			nbpos[7] = 8;                      

-			nbpos[8] = 8;                      

-			nbpos[9] = 8;                      

-			break;

-		default:

-			nbiter = 0;

-			alp = 0;

-			nb_pulse = 0;

-	}

-

-	for (i = 0; i < nb_pulse; i++)

-	{

-		codvec[i] = i;                     

-	}

-

-	/*----------------------------------------------------------------*

-	 * Find sign for each pulse position.                             *

-	 *----------------------------------------------------------------*/

-	/* calculate energy for normalization of cn[] and dn[] */

-	/* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */

-#ifdef ASM_OPT                  /* asm optimization branch */

-	s = Dot_product12_asm(cn, cn, L_SUBFR, &exp);

-#else

-	s = Dot_product12(cn, cn, L_SUBFR, &exp);

-#endif

-

-	Isqrt_n(&s, &exp);

-	s = L_shl(s, (exp + 5)); 

-	k_cn = extract_h(L_add(s, 0x8000));

-

-	/* set k_dn = 32..512 (ener_dn = 2^30..2^22) */

-#ifdef ASM_OPT                      /* asm optimization branch */

-	s = Dot_product12_asm(dn, dn, L_SUBFR, &exp);

-#else

-	s = Dot_product12(dn, dn, L_SUBFR, &exp);

-#endif

-

-	Isqrt_n(&s, &exp);

-	k_dn = (L_shl(s, (exp + 5 + 3)) + 0x8000) >> 16;    /* k_dn = 256..4096 */

-	k_dn = vo_mult_r(alp, k_dn);              /* alp in Q12 */

-

-	/* mix normalized cn[] and dn[] */

-	p0 = cn;

-	p1 = dn;

-	p2 = dn2;

-

-	for (i = 0; i < L_SUBFR/4; i++)

-	{

-		s = (k_cn* (*p0++))+(k_dn * (*p1++));

-		*p2++ = s >> 7;

-		s = (k_cn* (*p0++))+(k_dn * (*p1++));

-		*p2++ = s >> 7;

-		s = (k_cn* (*p0++))+(k_dn * (*p1++));

-		*p2++ = s >> 7;

-		s = (k_cn* (*p0++))+(k_dn * (*p1++));

-		*p2++ = s >> 7; 

-	}

-

-	/* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[]    */

-	for(i = 0; i < L_SUBFR; i++)

-	{

-		val = dn[i];                   

-		ps = dn2[i];                   

-		if (ps >= 0)

-		{

-			sign[i] = 32767;             /* sign = +1 (Q12) */

-			vec[i] = -32768;           

-		} else

-		{

-			sign[i] = -32768;            /* sign = -1 (Q12) */

-			vec[i] = 32767;            

-			dn[i] = -val;

-			dn2[i] = -ps;

-		}

-	}

-	/*----------------------------------------------------------------*

-	 * Select NB_MAX position per track according to max of dn2[].    *

-	 *----------------------------------------------------------------*/

-	pos = 0;

-	for (i = 0; i < NB_TRACK; i++)

-	{

-		for (k = 0; k < NB_MAX; k++)

-		{

-			ps = -1;                       

-			for (j = i; j < L_SUBFR; j += STEP)

-			{

-				if(dn2[j] > ps)

-				{

-					ps = dn2[j];          

-					pos = j;               

-				}

-			}

-			dn2[pos] = (k - NB_MAX);     /* dn2 < 0 when position is selected */

-			if (k == 0)

-			{

-				pos_max[i] = pos;          

-			}

-		}

-	}

-

-	/*--------------------------------------------------------------*

-	 * Scale h[] to avoid overflow and to get maximum of precision  *

-	 * on correlation.                                              *

-	 *                                                              *

-	 * Maximum of h[] (h[0]) is fixed to 2048 (MAX16 / 16).         *

-	 *  ==> This allow addition of 16 pulses without saturation.    *

-	 *                                                              *

-	 * Energy worst case (on resonant impulse response),            *

-	 * - energy of h[] is approximately MAX/16.                     *

-	 * - During search, the energy is divided by 8 to avoid         *

-	 *   overflow on "alp". (energy of h[] = MAX/128).              *

-	 *  ==> "alp" worst case detected is 22854 on sinusoidal wave.  *

-	 *--------------------------------------------------------------*/

-

-	/* impulse response buffer for fast computation */

-

-	h = h_buf;                             

-	h_inv = h_buf + (2 * L_SUBFR);   

-	L_tmp = 0;

-	for (i = 0; i < L_SUBFR; i++)

-	{

-		*h++ = 0;                          

-		*h_inv++ = 0;   

-		L_tmp += (H[i] * H[i]) << 1;

-	}

-	/* scale h[] down (/2) when energy of h[] is high with many pulses used */

-	val = extract_h(L_tmp);

-	h_shift = 0;                           

-

-	if ((nb_pulse >= 12) && (val > 1024))

-	{

-		h_shift = 1;                       

-	}

-	p0 = H;

-	p1 = h;

-	p2 = h_inv;

-

-	for (i = 0; i < L_SUBFR/4; i++)

-	{

-		*p1 = *p0++ >> h_shift;         

-		*p2++ = -(*p1++);  

-		*p1 = *p0++ >> h_shift;         

-		*p2++ = -(*p1++); 

-		*p1 = *p0++ >> h_shift;         

-		*p2++ = -(*p1++); 

-		*p1 = *p0++ >> h_shift;         

-		*p2++ = -(*p1++); 

-	}

-

-	/*------------------------------------------------------------*

-	 * Compute rrixix[][] needed for the codebook search.         *

-	 * This algorithm compute impulse response energy of all      *

-	 * positions (16) in each track (4).       Total = 4x16 = 64. *

-	 *------------------------------------------------------------*/

-

-	/* storage order --> i3i3, i2i2, i1i1, i0i0 */

-

-	/* Init pointers to last position of rrixix[] */

-	p0 = &rrixix[0][NB_POS - 1];           

-	p1 = &rrixix[1][NB_POS - 1];           

-	p2 = &rrixix[2][NB_POS - 1];           

-	p3 = &rrixix[3][NB_POS - 1];           

-

-	ptr_h1 = h;                            

-	cor = 0x00008000L;                             /* for rounding */

-	for (i = 0; i < NB_POS; i++)

-	{

-		cor += vo_L_mult((*ptr_h1), (*ptr_h1));

-		ptr_h1++;

-		*p3-- = extract_h(cor);            

-		cor += vo_L_mult((*ptr_h1), (*ptr_h1));

-		ptr_h1++;

-		*p2-- = extract_h(cor);            

-		cor += vo_L_mult((*ptr_h1), (*ptr_h1));

-		ptr_h1++;

-		*p1-- = extract_h(cor);            

-		cor += vo_L_mult((*ptr_h1), (*ptr_h1));

-		ptr_h1++;

-		*p0-- = extract_h(cor);            

-	}

-

-	/*------------------------------------------------------------*

-	 * Compute rrixiy[][] needed for the codebook search.         *

-	 * This algorithm compute correlation between 2 pulses        *

-	 * (2 impulses responses) in 4 possible adjacents tracks.     *

-	 * (track 0-1, 1-2, 2-3 and 3-0).     Total = 4x16x16 = 1024. *

-	 *------------------------------------------------------------*/

-

-	/* storage order --> i2i3, i1i2, i0i1, i3i0 */

-

-	pos = MSIZE - 1;                       

-	ptr_hf = h + 1;                        

-

-	for (k = 0; k < NB_POS; k++)

-	{

-		p3 = &rrixiy[2][pos];              

-		p2 = &rrixiy[1][pos];              

-		p1 = &rrixiy[0][pos];              

-		p0 = &rrixiy[3][pos - NB_POS];     

-

-		cor = 0x00008000L;                   /* for rounding */

-		ptr_h1 = h;                        

-		ptr_h2 = ptr_hf;                   

-

-		for (i = k + 1; i < NB_POS; i++)

-		{

-			cor += vo_L_mult((*ptr_h1), (*ptr_h2));

-			ptr_h1++;

-			ptr_h2++;

-			*p3 = extract_h(cor);          

-			cor += vo_L_mult((*ptr_h1), (*ptr_h2));

-			ptr_h1++;

-			ptr_h2++;

-			*p2 = extract_h(cor);          

-			cor += vo_L_mult((*ptr_h1), (*ptr_h2));

-			ptr_h1++;

-			ptr_h2++;

-			*p1 = extract_h(cor);          

-			cor += vo_L_mult((*ptr_h1), (*ptr_h2));

-			ptr_h1++;

-			ptr_h2++;

-			*p0 = extract_h(cor);         

-

-			p3 -= (NB_POS + 1);

-			p2 -= (NB_POS + 1);

-			p1 -= (NB_POS + 1);

-			p0 -= (NB_POS + 1);

-		}

-		cor += vo_L_mult((*ptr_h1), (*ptr_h2));

-		ptr_h1++;

-		ptr_h2++;

-		*p3 = extract_h(cor);              

-		cor += vo_L_mult((*ptr_h1), (*ptr_h2));

-		ptr_h1++;

-		ptr_h2++;

-		*p2 = extract_h(cor);              

-		cor += vo_L_mult((*ptr_h1), (*ptr_h2));

-		ptr_h1++;

-		ptr_h2++;

-		*p1 = extract_h(cor);              

-

-		pos -= NB_POS;

-		ptr_hf += STEP;

-	}

-

-	/* storage order --> i3i0, i2i3, i1i2, i0i1 */

-

-	pos = MSIZE - 1;                       

-	ptr_hf = h + 3;                        

-

-	for (k = 0; k < NB_POS; k++)

-	{

-		p3 = &rrixiy[3][pos];              

-		p2 = &rrixiy[2][pos - 1];          

-		p1 = &rrixiy[1][pos - 1];          

-		p0 = &rrixiy[0][pos - 1];          

-

-		cor = 0x00008000L;								/* for rounding */

-		ptr_h1 = h;                        

-		ptr_h2 = ptr_hf;                   

-

-		for (i = k + 1; i < NB_POS; i++)

-		{

-			cor += vo_L_mult((*ptr_h1), (*ptr_h2));

-			ptr_h1++;

-			ptr_h2++;

-			*p3 = extract_h(cor);          

-			cor += vo_L_mult((*ptr_h1), (*ptr_h2));

-			ptr_h1++;

-			ptr_h2++;

-			*p2 = extract_h(cor);          

-			cor += vo_L_mult((*ptr_h1), (*ptr_h2));

-			ptr_h1++;

-			ptr_h2++;

-			*p1 = extract_h(cor);          

-			cor += vo_L_mult((*ptr_h1), (*ptr_h2));

-			ptr_h1++;

-			ptr_h2++;

-			*p0 = extract_h(cor);          

-

-			p3 -= (NB_POS + 1);

-			p2 -= (NB_POS + 1);

-			p1 -= (NB_POS + 1);

-			p0 -= (NB_POS + 1);

-		}

-		cor += vo_L_mult((*ptr_h1), (*ptr_h2));

-		ptr_h1++;

-		ptr_h2++;

-		*p3 = extract_h(cor);              

-

-		pos--;

-		ptr_hf += STEP;

-	}

-

-	/*------------------------------------------------------------*

-	 * Modification of rrixiy[][] to take signs into account.     *

-	 *------------------------------------------------------------*/

-

-	p0 = &rrixiy[0][0];                    

-

-	for (k = 0; k < NB_TRACK; k++)

-	{

-		j_temp = (k + 1)&0x03;

-		for (i = k; i < L_SUBFR; i += STEP)

-		{

-			psign = sign;                  

-			if (psign[i] < 0)

-			{

-				psign = vec;               

-			}

-			j = j_temp;

-			for (; j < L_SUBFR; j += STEP)

-			{

-				*p0 = vo_mult(*p0, psign[j]);    

-				p0++;

-			}

-		}

-	}

-

-	/*-------------------------------------------------------------------*

-	 *                       Deep first search                           *

-	 *-------------------------------------------------------------------*/

-

-	psk = -1;                              

-	alpk = 1;                              

-

-	for (k = 0; k < nbiter; k++)

-	{

-		j_temp = k<<2;

-		for (i = 0; i < nb_pulse; i++)

-			ipos[i] = tipos[j_temp + i];

-

-		if(nbbits == 20)

-		{

-			pos = 0;                       

-			ps = 0;                        

-			alp = 0;                       

-			for (i = 0; i < L_SUBFR; i++)

-			{

-				vec[i] = 0;                

-			}

-		} else if ((nbbits == 36) || (nbbits == 44))

-		{

-			/* first stage: fix 2 pulses */

-			pos = 2;

-

-			ix = ind[0] = pos_max[ipos[0]];

-			iy = ind[1] = pos_max[ipos[1]];

-			ps = dn[ix] + dn[iy];

-			i = ix >> 2;                /* ix / STEP */

-			j = iy >> 2;                /* iy / STEP */

-			s = rrixix[ipos[0]][i] << 13;

-			s += rrixix[ipos[1]][j] << 13;

-			i = (i << 4) + j;         /* (ix/STEP)*NB_POS + (iy/STEP) */

-			s += rrixiy[ipos[0]][i] << 14;

-			alp = (s + 0x8000) >> 16;

-			if (sign[ix] < 0)

-				p0 = h_inv - ix;

-			else

-				p0 = h - ix;

-			if (sign[iy] < 0)

-				p1 = h_inv - iy;

-			else

-				p1 = h - iy;

-

-			for (i = 0; i < L_SUBFR; i++)

-			{

-				vec[i] = (*p0++) + (*p1++);

-			}

-

-			if(nbbits == 44)

-			{

-				ipos[8] = 0;               

-				ipos[9] = 1;               

-			}

-		} else

-		{

-			/* first stage: fix 4 pulses */

-			pos = 4;

-

-			ix = ind[0] = pos_max[ipos[0]];  

-			iy = ind[1] = pos_max[ipos[1]];  

-			i = ind[2] = pos_max[ipos[2]];   

-			j = ind[3] = pos_max[ipos[3]];   

-			ps = add1(add1(add1(dn[ix], dn[iy]), dn[i]), dn[j]);

-

-			if (sign[ix] < 0)

-				p0 = h_inv - ix;

-			else

-				p0 = h - ix;

-

-			if (sign[iy] < 0)

-				p1 = h_inv - iy;

-			else

-				p1 = h - iy;

-

-			if (sign[i] < 0)

-				p2 = h_inv - i;

-			else

-				p2 = h - i;

-

-			if (sign[j] < 0)

-				p3 = h_inv - j;

-			else

-				p3 = h - j;

-

-			L_tmp = 0L;

-			for(i = 0; i < L_SUBFR; i++)

-			{

-				vec[i]  = add1(add1(add1(*p0++, *p1++), *p2++), *p3++);

-				L_tmp  += (vec[i] * vec[i]) << 1;

-			}

-

-			alp = ((L_tmp >> 3) + 0x8000) >> 16;

-

-			if(nbbits == 72)

-			{

-				ipos[16] = 0;              

-				ipos[17] = 1;              

-			}

-		}

-

-		/* other stages of 2 pulses */

-

-		for (j = pos, st = 0; j < nb_pulse; j += 2, st++)

-		{

-			/*--------------------------------------------------*

-			 * Calculate correlation of all possible positions  *

-			 * of the next 2 pulses with previous fixed pulses. *

-			 * Each pulse can have 16 possible positions.       *

-			 *--------------------------------------------------*/

-			if(ipos[j] == 3)

-			{

-				cor_h_vec_30(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);

-			}

-			else

-			{

-#ifdef ASM_OPT                 /* asm optimization branch */

-				cor_h_vec_012_asm(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);

-#else

-				cor_h_vec_012(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);

-#endif

-			}

-			/*--------------------------------------------------*

-			 * Find best positions of 2 pulses.                 *

-			 *--------------------------------------------------*/

-			search_ixiy(nbpos[st], ipos[j], ipos[j + 1], &ps, &alp,

-					&ix, &iy, dn, dn2, cor_x, cor_y, rrixiy);

-

-			ind[j] = ix;                   

-			ind[j + 1] = iy;               

-

-			if (sign[ix] < 0)

-				p0 = h_inv - ix;

-			else

-				p0 = h - ix;

-			if (sign[iy] < 0)

-				p1 = h_inv - iy;

-			else

-				p1 = h - iy;

-

-			for (i = 0; i < L_SUBFR; i+=4)

-			{

-				vec[i]   += add1((*p0++), (*p1++));       

-				vec[i+1] += add1((*p0++), (*p1++));        

-				vec[i+2] += add1((*p0++), (*p1++));        

-				vec[i+3] += add1((*p0++), (*p1++));      

-			}

-		}

-		/* memorise the best codevector */

-		ps = vo_mult(ps, ps);

-		s = vo_L_msu(vo_L_mult(alpk, ps), psk, alp);

-		if (s > 0)

-		{

-			psk = ps;                      

-			alpk = alp;                    

-			for (i = 0; i < nb_pulse; i++)

-			{

-				codvec[i] = ind[i];        

-			}

-			for (i = 0; i < L_SUBFR; i++)

-			{

-				y[i] = vec[i];             

-			}

-		}

-	}

-	/*-------------------------------------------------------------------*

-	 * Build the codeword, the filtered codeword and index of codevector.*

-	 *-------------------------------------------------------------------*/

-	for (i = 0; i < NPMAXPT * NB_TRACK; i++)

-	{

-		ind[i] = -1;                       

-	}

-	for (i = 0; i < L_SUBFR; i++)

-	{

-		code[i] = 0;                       

-		y[i] = vo_shr_r(y[i], 3);               /* Q12 to Q9 */

-	}

-	val = (512 >> h_shift);               /* codeword in Q9 format */

-	for (k = 0; k < nb_pulse; k++)

-	{

-		i = codvec[k];                       /* read pulse position */

-		j = sign[i];                         /* read sign           */

-		index = i >> 2;                 /* index = pos of pulse (0..15) */

-		track = (Word16) (i & 0x03);         /* track = i % NB_TRACK (0..3)  */

-

-		if (j > 0)

-		{

-			code[i] += val;   

-			codvec[k] += 128;  

-		} else

-		{

-			code[i] -= val;   

-			index += NB_POS;    

-		}

-

-		i = (Word16)((vo_L_mult(track, NPMAXPT) >> 1));

-

-		while (ind[i] >= 0)

-		{

-			i += 1;

-		}

-		ind[i] = index;                    

-	}

-

-	k = 0;                                 

-	/* Build index of codevector */

-	if(nbbits == 20)

-	{

-		for (track = 0; track < NB_TRACK; track++)

-		{

-			_index[track] = (Word16)(quant_1p_N1(ind[k], 4));

-			k += NPMAXPT;

-		}

-	} else if(nbbits == 36)

-	{

-		for (track = 0; track < NB_TRACK; track++)

-		{

-			_index[track] = (Word16)(quant_2p_2N1(ind[k], ind[k + 1], 4));

-			k += NPMAXPT;

-		}

-	} else if(nbbits == 44)

-	{

-		for (track = 0; track < NB_TRACK - 2; track++)

-		{

-			_index[track] = (Word16)(quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4));

-			k += NPMAXPT;

-		}

-		for (track = 2; track < NB_TRACK; track++)

-		{

-			_index[track] = (Word16)(quant_2p_2N1(ind[k], ind[k + 1], 4));

-			k += NPMAXPT;

-		}

-	} else if(nbbits == 52)

-	{

-		for (track = 0; track < NB_TRACK; track++)

-		{

-			_index[track] = (Word16)(quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4));

-			k += NPMAXPT;

-		}

-	} else if(nbbits == 64)

-	{

-		for (track = 0; track < NB_TRACK; track++)

-		{

-			L_index = quant_4p_4N(&ind[k], 4);

-			_index[track] = (Word16)((L_index >> 14) & 3);

-			_index[track + NB_TRACK] = (Word16)(L_index & 0x3FFF);

-			k += NPMAXPT;

-		}

-	} else if(nbbits == 72)

-	{

-		for (track = 0; track < NB_TRACK - 2; track++)

-		{

-			L_index = quant_5p_5N(&ind[k], 4);

-			_index[track] = (Word16)((L_index >> 10) & 0x03FF);

-			_index[track + NB_TRACK] = (Word16)(L_index & 0x03FF);

-			k += NPMAXPT;

-		}

-		for (track = 2; track < NB_TRACK; track++)

-		{

-			L_index = quant_4p_4N(&ind[k], 4);

-			_index[track] = (Word16)((L_index >> 14) & 3);

-			_index[track + NB_TRACK] = (Word16)(L_index & 0x3FFF);

-			k += NPMAXPT;

-		}

-	} else if(nbbits == 88)

-	{

-		for (track = 0; track < NB_TRACK; track++)

-		{

-			L_index = quant_6p_6N_2(&ind[k], 4);

-			_index[track] = (Word16)((L_index >> 11) & 0x07FF);

-			_index[track + NB_TRACK] = (Word16)(L_index & 0x07FF);

-			k += NPMAXPT;

-		}

-	}

-	return;

-}

-

-

-/*-------------------------------------------------------------------*

- * Function  cor_h_vec()                                             *

- * ~~~~~~~~~~~~~~~~~~~~~                                             *

- * Compute correlations of h[] with vec[] for the specified track.   *

- *-------------------------------------------------------------------*/

-void cor_h_vec_30(

-		Word16 h[],                           /* (i) scaled impulse response                 */

-		Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */

-		Word16 track,                         /* (i) track to use                            */

-		Word16 sign[],                        /* (i) sign vector                             */

-		Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */

-		Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */

-		Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */

-		)

-{

-	Word32 i, j, pos, corr;

-	Word16 *p0, *p1, *p2,*p3,*cor_x,*cor_y;

-	Word32 L_sum1,L_sum2;

-	cor_x = cor_1;

-	cor_y = cor_2;

-	p0 = rrixix[track];

-	p3 = rrixix[0];

-	pos = track;

-

-	for (i = 0; i < NB_POS; i+=2)

-	{

-		L_sum1 = L_sum2 = 0L;

-		p1 = h;

-		p2 = &vec[pos];

-		for (j=pos;j < L_SUBFR; j++)

-		{

-			L_sum1 += *p1 * *p2;		

-			p2-=3;

-			L_sum2 += *p1++ * *p2;		

-			p2+=4;

-		}

-		p2-=3;

-		L_sum2 += *p1++ * *p2++;	

-		L_sum2 += *p1++ * *p2++;	

-		L_sum2 += *p1++ * *p2++;	

-

-		L_sum1 = (L_sum1 << 2);

-		L_sum2 = (L_sum2 << 2);

-

-		corr = vo_round(L_sum1);	

-		*cor_x++ = vo_mult(corr, sign[pos]) + (*p0++);

-		corr = vo_round(L_sum2);

-		*cor_y++ = vo_mult(corr, sign[pos-3]) + (*p3++);

-		pos += STEP;

-

-		L_sum1 = L_sum2 = 0L;

-		p1 = h;

-		p2 = &vec[pos];

-		for (j=pos;j < L_SUBFR; j++)

-		{

-			L_sum1 += *p1 * *p2;		

-			p2-=3;

-			L_sum2 += *p1++ * *p2;		

-			p2+=4;

-		}

-		p2-=3;

-		L_sum2 += *p1++ * *p2++;	

-		L_sum2 += *p1++ * *p2++;	

-		L_sum2 += *p1++ * *p2++;	

-

-		L_sum1 = (L_sum1 << 2);

-		L_sum2 = (L_sum2 << 2);

-

-		corr = vo_round(L_sum1);	

-		*cor_x++ = vo_mult(corr, sign[pos]) + (*p0++);

-		corr = vo_round(L_sum2);

-		*cor_y++ = vo_mult(corr, sign[pos-3]) + (*p3++);

-		pos += STEP;

-	}

-	return;

-}

-

-void cor_h_vec_012(

-		Word16 h[],                           /* (i) scaled impulse response                 */

-		Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */

-		Word16 track,                         /* (i) track to use                            */

-		Word16 sign[],                        /* (i) sign vector                             */

-		Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */

-		Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */

-		Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */

-		)

-{

-	Word32 i, j, pos, corr;

-	Word16 *p0, *p1, *p2,*p3,*cor_x,*cor_y;

-	Word32 L_sum1,L_sum2;

-	cor_x = cor_1;

-	cor_y = cor_2;

-	p0 = rrixix[track];

-	p3 = rrixix[track+1];

-	pos = track;

-

-	for (i = 0; i < NB_POS; i+=2)

-	{

-		L_sum1 = L_sum2 = 0L;

-		p1 = h;

-		p2 = &vec[pos];

-		for (j=62-pos ;j >= 0; j--)

-		{

-			L_sum1 += *p1 * *p2++;

-			L_sum2 += *p1++ * *p2;

-		}

-		L_sum1 += *p1 * *p2;

-		L_sum1 = (L_sum1 << 2);

-		L_sum2 = (L_sum2 << 2);

-

-		corr = (L_sum1 + 0x8000) >> 16;

-		cor_x[i] = vo_mult(corr, sign[pos]) + (*p0++);

-		corr = (L_sum2 + 0x8000) >> 16;

-		cor_y[i] = vo_mult(corr, sign[pos + 1]) + (*p3++);

-		pos += STEP;

-

-		L_sum1 = L_sum2 = 0L;

-		p1 = h;

-		p2 = &vec[pos];

-		for (j= 62-pos;j >= 0; j--)

-		{

-			L_sum1 += *p1 * *p2++;

-			L_sum2 += *p1++ * *p2;

-		}

-		L_sum1 += *p1 * *p2;

-		L_sum1 = (L_sum1 << 2);

-		L_sum2 = (L_sum2 << 2);

-

-		corr = (L_sum1 + 0x8000) >> 16;

-		cor_x[i+1] = vo_mult(corr, sign[pos]) + (*p0++);

-		corr = (L_sum2 + 0x8000) >> 16;

-		cor_y[i+1] = vo_mult(corr, sign[pos + 1]) + (*p3++);

-		pos += STEP;

-	}

-	return;

-}

-

-/*-------------------------------------------------------------------*

- * Function  search_ixiy()                                           *

- * ~~~~~~~~~~~~~~~~~~~~~~~                                           *

- * Find the best positions of 2 pulses in a subframe.                *

- *-------------------------------------------------------------------*/

-

-void search_ixiy(

-		Word16 nb_pos_ix,                     /* (i) nb of pos for pulse 1 (1..8)       */

-		Word16 track_x,                       /* (i) track of pulse 1                   */

-		Word16 track_y,                       /* (i) track of pulse 2                   */

-		Word16 * ps,                          /* (i/o) correlation of all fixed pulses  */

-		Word16 * alp,                         /* (i/o) energy of all fixed pulses       */

-		Word16 * ix,                          /* (o) position of pulse 1                */

-		Word16 * iy,                          /* (o) position of pulse 2                */

-		Word16 dn[],                          /* (i) corr. between target and h[]       */

-		Word16 dn2[],                         /* (i) vector of selected positions       */

-		Word16 cor_x[],                       /* (i) corr. of pulse 1 with fixed pulses */

-		Word16 cor_y[],                       /* (i) corr. of pulse 2 with fixed pulses */

-		Word16 rrixiy[][MSIZE]                /* (i) corr. of pulse 1 with pulse 2   */

-		)

-{

-	Word32 x, y, pos, thres_ix;

-	Word16 ps1, ps2, sq, sqk;

-	Word16 alp_16, alpk;

-	Word16 *p0, *p1, *p2;

-	Word32 s, alp0, alp1, alp2;

-

-	p0 = cor_x;                            

-	p1 = cor_y;                            

-	p2 = rrixiy[track_x];                  

-

-	thres_ix = nb_pos_ix - NB_MAX;

-

-	alp0 = L_deposit_h(*alp);

-	alp0 = (alp0 + 0x00008000L);       /* for rounding */

-

-	sqk = -1;                              

-	alpk = 1;                              

-

-	for (x = track_x; x < L_SUBFR; x += STEP)

-	{

-		ps1 = *ps + dn[x];

-		alp1 = alp0 + ((*p0++)<<13);

-

-		if (dn2[x] < thres_ix)

-		{

-			pos = -1;

-			for (y = track_y; y < L_SUBFR; y += STEP)

-			{

-				ps2 = add1(ps1, dn[y]);

-

-				alp2 = alp1 + ((*p1++)<<13);

-				alp2 = alp2 + ((*p2++)<<14);

-				alp_16 = extract_h(alp2);

-				sq = vo_mult(ps2, ps2);

-				s = vo_L_mult(alpk, sq) - ((sqk * alp_16)<<1);

-

-				if (s > 0)

-				{

-					sqk = sq;              

-					alpk = alp_16;         

-					pos = y;               

-				}

-			}

-			p1 -= NB_POS;

-

-			if (pos >= 0)

-			{

-				*ix = x;                   

-				*iy = pos;                 

-			}

-		} else

-		{

-			p2 += NB_POS;

-		}

-	}

-

-	*ps = add1(*ps, add1(dn[*ix], dn[*iy])); 

-	*alp = alpk;                           

-

-	return;

-}

-

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*      File: c4t64fx.c                                                 *
+*                                                                      *
+*	   Description:Performs algebraic codebook search for higher modes *
+*                                                                      *
+************************************************************************/
+
+/************************************************************************
+* Function: ACELP_4t64_fx()                                             *
+*                                                                       *
+* 20, 36, 44, 52, 64, 72, 88 bits algebraic codebook.                   *
+* 4 tracks x 16 positions per track = 64 samples.                       *
+*                                                                       *
+* 20 bits --> 4 pulses in a frame of 64 samples.                        *
+* 36 bits --> 8 pulses in a frame of 64 samples.                        *
+* 44 bits --> 10 pulses in a frame of 64 samples.                       *
+* 52 bits --> 12 pulses in a frame of 64 samples.                       *
+* 64 bits --> 16 pulses in a frame of 64 samples.                       *
+* 72 bits --> 18 pulses in a frame of 64 samples.                       *
+* 88 bits --> 24 pulses in a frame of 64 samples.                       *
+*                                                                       *
+* All pulses can have two (2) possible amplitudes: +1 or -1.            *
+* Each pulse can have sixteen (16) possible positions.                  *
+*************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+#include "acelp.h"
+#include "cnst.h"
+
+#include "q_pulse.h"
+
+static Word16 tipos[36] = {
+	0, 1, 2, 3,                            /* starting point &ipos[0], 1st iter */
+	1, 2, 3, 0,                            /* starting point &ipos[4], 2nd iter */
+	2, 3, 0, 1,                            /* starting point &ipos[8], 3rd iter */
+	3, 0, 1, 2,                            /* starting point &ipos[12], 4th iter */
+	0, 1, 2, 3,
+	1, 2, 3, 0,
+	2, 3, 0, 1,
+	3, 0, 1, 2,
+	0, 1, 2, 3};                           /* end point for 24 pulses &ipos[35], 4th iter */
+
+#define NB_PULSE_MAX  24
+
+#define L_SUBFR   64
+#define NB_TRACK  4
+#define STEP      4
+#define NB_POS    16
+#define MSIZE     256
+#define NB_MAX    8
+#define NPMAXPT   ((NB_PULSE_MAX+NB_TRACK-1)/NB_TRACK)
+
+/* Private functions */
+void cor_h_vec_012(
+		Word16 h[],                           /* (i) scaled impulse response                 */
+		Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */
+		Word16 track,                         /* (i) track to use                            */
+		Word16 sign[],                        /* (i) sign vector                             */
+		Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */
+		Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */
+		Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */
+		);
+
+void cor_h_vec_012_asm(
+		Word16 h[],                           /* (i) scaled impulse response                 */
+		Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */
+		Word16 track,                         /* (i) track to use                            */
+		Word16 sign[],                        /* (i) sign vector                             */
+		Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */
+		Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */
+		Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */
+		);
+
+void cor_h_vec_30(
+		Word16 h[],                           /* (i) scaled impulse response                 */
+		Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */
+		Word16 track,                         /* (i) track to use                            */
+		Word16 sign[],                        /* (i) sign vector                             */
+		Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */
+		Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */
+		Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */
+		);
+
+void search_ixiy(
+		Word16 nb_pos_ix,                     /* (i) nb of pos for pulse 1 (1..8)       */
+		Word16 track_x,                       /* (i) track of pulse 1                   */
+		Word16 track_y,                       /* (i) track of pulse 2                   */
+		Word16 * ps,                          /* (i/o) correlation of all fixed pulses  */
+		Word16 * alp,                         /* (i/o) energy of all fixed pulses       */
+		Word16 * ix,                          /* (o) position of pulse 1                */
+		Word16 * iy,                          /* (o) position of pulse 2                */
+		Word16 dn[],                          /* (i) corr. between target and h[]       */
+		Word16 dn2[],                         /* (i) vector of selected positions       */
+		Word16 cor_x[],                       /* (i) corr. of pulse 1 with fixed pulses */
+		Word16 cor_y[],                       /* (i) corr. of pulse 2 with fixed pulses */
+		Word16 rrixiy[][MSIZE]                /* (i) corr. of pulse 1 with pulse 2   */
+		);
+
+
+void ACELP_4t64_fx(
+		Word16 dn[],                          /* (i) <12b : correlation between target x[] and H[]      */
+		Word16 cn[],                          /* (i) <12b : residual after long term prediction         */
+		Word16 H[],                           /* (i) Q12: impulse response of weighted synthesis filter */
+		Word16 code[],                        /* (o) Q9 : algebraic (fixed) codebook excitation         */
+		Word16 y[],                           /* (o) Q9 : filtered fixed codebook excitation            */
+		Word16 nbbits,                        /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits                */
+		Word16 ser_size,                      /* (i) : bit rate                                         */
+		Word16 _index[]                       /* (o) : index (20): 5+5+5+5 = 20 bits.                   */
+		/* (o) : index (36): 9+9+9+9 = 36 bits.                   */
+		/* (o) : index (44): 13+9+13+9 = 44 bits.                 */
+		/* (o) : index (52): 13+13+13+13 = 52 bits.               */
+		/* (o) : index (64): 2+2+2+2+14+14+14+14 = 64 bits.       */
+		/* (o) : index (72): 10+2+10+2+10+14+10+14 = 72 bits.     */
+		/* (o) : index (88): 11+11+11+11+11+11+11+11 = 88 bits.   */
+		)
+{
+	Word32 i, j, k;
+	Word16 st, ix, iy, pos, index, track, nb_pulse, nbiter, j_temp;
+	Word16 psk, ps, alpk, alp, val, k_cn, k_dn, exp;
+	Word16 *p0, *p1, *p2, *p3, *psign;
+	Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf, h_shift;
+	Word32 s, cor, L_tmp, L_index;
+	Word16 dn2[L_SUBFR], sign[L_SUBFR], vec[L_SUBFR];
+	Word16 ind[NPMAXPT * NB_TRACK];
+	Word16 codvec[NB_PULSE_MAX], nbpos[10];
+	Word16 cor_x[NB_POS], cor_y[NB_POS], pos_max[NB_TRACK];
+	Word16 h_buf[4 * L_SUBFR];
+	Word16 rrixix[NB_TRACK][NB_POS], rrixiy[NB_TRACK][MSIZE];
+	Word16 ipos[NB_PULSE_MAX];
+
+	switch (nbbits)
+	{
+		case 20:                               /* 20 bits, 4 pulses, 4 tracks */
+			nbiter = 4;                          /* 4x16x16=1024 loop */
+			alp = 8192;                          /* alp = 2.0 (Q12) */
+			nb_pulse = 4;                      
+			nbpos[0] = 4;                      
+			nbpos[1] = 8;                      
+			break;
+		case 36:                               /* 36 bits, 8 pulses, 4 tracks */
+			nbiter = 4;                          /* 4x20x16=1280 loop */
+			alp = 4096;                          /* alp = 1.0 (Q12) */
+			nb_pulse = 8;                      
+			nbpos[0] = 4;                      
+			nbpos[1] = 8;                      
+			nbpos[2] = 8;                      
+			break;
+		case 44:                               /* 44 bits, 10 pulses, 4 tracks */
+			nbiter = 4;                          /* 4x26x16=1664 loop */
+			alp = 4096;                          /* alp = 1.0 (Q12) */
+			nb_pulse = 10;                     
+			nbpos[0] = 4;                      
+			nbpos[1] = 6;                      
+			nbpos[2] = 8;                      
+			nbpos[3] = 8;                      
+			break;
+		case 52:                               /* 52 bits, 12 pulses, 4 tracks */
+			nbiter = 4;                          /* 4x26x16=1664 loop */
+			alp = 4096;                          /* alp = 1.0 (Q12) */
+			nb_pulse = 12;                     
+			nbpos[0] = 4;                      
+			nbpos[1] = 6;                      
+			nbpos[2] = 8;                      
+			nbpos[3] = 8;                      
+			break;
+		case 64:                               /* 64 bits, 16 pulses, 4 tracks */
+			nbiter = 3;                          /* 3x36x16=1728 loop */
+			alp = 3277;                          /* alp = 0.8 (Q12) */
+			nb_pulse = 16;                     
+			nbpos[0] = 4;                      
+			nbpos[1] = 4;                      
+			nbpos[2] = 6;                      
+			nbpos[3] = 6;                      
+			nbpos[4] = 8;                      
+			nbpos[5] = 8;                      
+			break;
+		case 72:                               /* 72 bits, 18 pulses, 4 tracks */
+			nbiter = 3;                          /* 3x35x16=1680 loop */
+			alp = 3072;                          /* alp = 0.75 (Q12) */
+			nb_pulse = 18;                     
+			nbpos[0] = 2;                      
+			nbpos[1] = 3;                      
+			nbpos[2] = 4;                      
+			nbpos[3] = 5;                      
+			nbpos[4] = 6;                      
+			nbpos[5] = 7;                      
+			nbpos[6] = 8;                      
+			break;
+		case 88:                               /* 88 bits, 24 pulses, 4 tracks */
+			if(ser_size > 462)
+				nbiter = 1;
+			else
+				nbiter = 2;                    /* 2x53x16=1696 loop */
+
+			alp = 2048;                          /* alp = 0.5 (Q12) */
+			nb_pulse = 24;                     
+			nbpos[0] = 2;                      
+			nbpos[1] = 2;                      
+			nbpos[2] = 3;                      
+			nbpos[3] = 4;                      
+			nbpos[4] = 5;                      
+			nbpos[5] = 6;                      
+			nbpos[6] = 7;                      
+			nbpos[7] = 8;                      
+			nbpos[8] = 8;                      
+			nbpos[9] = 8;                      
+			break;
+		default:
+			nbiter = 0;
+			alp = 0;
+			nb_pulse = 0;
+	}
+
+	for (i = 0; i < nb_pulse; i++)
+	{
+		codvec[i] = i;                     
+	}
+
+	/*----------------------------------------------------------------*
+	 * Find sign for each pulse position.                             *
+	 *----------------------------------------------------------------*/
+	/* calculate energy for normalization of cn[] and dn[] */
+	/* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */
+#ifdef ASM_OPT                  /* asm optimization branch */
+	s = Dot_product12_asm(cn, cn, L_SUBFR, &exp);
+#else
+	s = Dot_product12(cn, cn, L_SUBFR, &exp);
+#endif
+
+	Isqrt_n(&s, &exp);
+	s = L_shl(s, (exp + 5)); 
+	k_cn = extract_h(L_add(s, 0x8000));
+
+	/* set k_dn = 32..512 (ener_dn = 2^30..2^22) */
+#ifdef ASM_OPT                      /* asm optimization branch */
+	s = Dot_product12_asm(dn, dn, L_SUBFR, &exp);
+#else
+	s = Dot_product12(dn, dn, L_SUBFR, &exp);
+#endif
+
+	Isqrt_n(&s, &exp);
+	k_dn = (L_shl(s, (exp + 5 + 3)) + 0x8000) >> 16;    /* k_dn = 256..4096 */
+	k_dn = vo_mult_r(alp, k_dn);              /* alp in Q12 */
+
+	/* mix normalized cn[] and dn[] */
+	p0 = cn;
+	p1 = dn;
+	p2 = dn2;
+
+	for (i = 0; i < L_SUBFR/4; i++)
+	{
+		s = (k_cn* (*p0++))+(k_dn * (*p1++));
+		*p2++ = s >> 7;
+		s = (k_cn* (*p0++))+(k_dn * (*p1++));
+		*p2++ = s >> 7;
+		s = (k_cn* (*p0++))+(k_dn * (*p1++));
+		*p2++ = s >> 7;
+		s = (k_cn* (*p0++))+(k_dn * (*p1++));
+		*p2++ = s >> 7; 
+	}
+
+	/* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[]    */
+	for(i = 0; i < L_SUBFR; i++)
+	{
+		val = dn[i];                   
+		ps = dn2[i];                   
+		if (ps >= 0)
+		{
+			sign[i] = 32767;             /* sign = +1 (Q12) */
+			vec[i] = -32768;           
+		} else
+		{
+			sign[i] = -32768;            /* sign = -1 (Q12) */
+			vec[i] = 32767;            
+			dn[i] = -val;
+			dn2[i] = -ps;
+		}
+	}
+	/*----------------------------------------------------------------*
+	 * Select NB_MAX position per track according to max of dn2[].    *
+	 *----------------------------------------------------------------*/
+	pos = 0;
+	for (i = 0; i < NB_TRACK; i++)
+	{
+		for (k = 0; k < NB_MAX; k++)
+		{
+			ps = -1;                       
+			for (j = i; j < L_SUBFR; j += STEP)
+			{
+				if(dn2[j] > ps)
+				{
+					ps = dn2[j];          
+					pos = j;               
+				}
+			}
+			dn2[pos] = (k - NB_MAX);     /* dn2 < 0 when position is selected */
+			if (k == 0)
+			{
+				pos_max[i] = pos;          
+			}
+		}
+	}
+
+	/*--------------------------------------------------------------*
+	 * Scale h[] to avoid overflow and to get maximum of precision  *
+	 * on correlation.                                              *
+	 *                                                              *
+	 * Maximum of h[] (h[0]) is fixed to 2048 (MAX16 / 16).         *
+	 *  ==> This allow addition of 16 pulses without saturation.    *
+	 *                                                              *
+	 * Energy worst case (on resonant impulse response),            *
+	 * - energy of h[] is approximately MAX/16.                     *
+	 * - During search, the energy is divided by 8 to avoid         *
+	 *   overflow on "alp". (energy of h[] = MAX/128).              *
+	 *  ==> "alp" worst case detected is 22854 on sinusoidal wave.  *
+	 *--------------------------------------------------------------*/
+
+	/* impulse response buffer for fast computation */
+
+	h = h_buf;                             
+	h_inv = h_buf + (2 * L_SUBFR);   
+	L_tmp = 0;
+	for (i = 0; i < L_SUBFR; i++)
+	{
+		*h++ = 0;                          
+		*h_inv++ = 0;   
+		L_tmp += (H[i] * H[i]) << 1;
+	}
+	/* scale h[] down (/2) when energy of h[] is high with many pulses used */
+	val = extract_h(L_tmp);
+	h_shift = 0;                           
+
+	if ((nb_pulse >= 12) && (val > 1024))
+	{
+		h_shift = 1;                       
+	}
+	p0 = H;
+	p1 = h;
+	p2 = h_inv;
+
+	for (i = 0; i < L_SUBFR/4; i++)
+	{
+		*p1 = *p0++ >> h_shift;         
+		*p2++ = -(*p1++);  
+		*p1 = *p0++ >> h_shift;         
+		*p2++ = -(*p1++); 
+		*p1 = *p0++ >> h_shift;         
+		*p2++ = -(*p1++); 
+		*p1 = *p0++ >> h_shift;         
+		*p2++ = -(*p1++); 
+	}
+
+	/*------------------------------------------------------------*
+	 * Compute rrixix[][] needed for the codebook search.         *
+	 * This algorithm compute impulse response energy of all      *
+	 * positions (16) in each track (4).       Total = 4x16 = 64. *
+	 *------------------------------------------------------------*/
+
+	/* storage order --> i3i3, i2i2, i1i1, i0i0 */
+
+	/* Init pointers to last position of rrixix[] */
+	p0 = &rrixix[0][NB_POS - 1];           
+	p1 = &rrixix[1][NB_POS - 1];           
+	p2 = &rrixix[2][NB_POS - 1];           
+	p3 = &rrixix[3][NB_POS - 1];           
+
+	ptr_h1 = h;                            
+	cor = 0x00008000L;                             /* for rounding */
+	for (i = 0; i < NB_POS; i++)
+	{
+		cor += vo_L_mult((*ptr_h1), (*ptr_h1));
+		ptr_h1++;
+		*p3-- = extract_h(cor);            
+		cor += vo_L_mult((*ptr_h1), (*ptr_h1));
+		ptr_h1++;
+		*p2-- = extract_h(cor);            
+		cor += vo_L_mult((*ptr_h1), (*ptr_h1));
+		ptr_h1++;
+		*p1-- = extract_h(cor);            
+		cor += vo_L_mult((*ptr_h1), (*ptr_h1));
+		ptr_h1++;
+		*p0-- = extract_h(cor);            
+	}
+
+	/*------------------------------------------------------------*
+	 * Compute rrixiy[][] needed for the codebook search.         *
+	 * This algorithm compute correlation between 2 pulses        *
+	 * (2 impulses responses) in 4 possible adjacents tracks.     *
+	 * (track 0-1, 1-2, 2-3 and 3-0).     Total = 4x16x16 = 1024. *
+	 *------------------------------------------------------------*/
+
+	/* storage order --> i2i3, i1i2, i0i1, i3i0 */
+
+	pos = MSIZE - 1;                       
+	ptr_hf = h + 1;                        
+
+	for (k = 0; k < NB_POS; k++)
+	{
+		p3 = &rrixiy[2][pos];              
+		p2 = &rrixiy[1][pos];              
+		p1 = &rrixiy[0][pos];              
+		p0 = &rrixiy[3][pos - NB_POS];     
+
+		cor = 0x00008000L;                   /* for rounding */
+		ptr_h1 = h;                        
+		ptr_h2 = ptr_hf;                   
+
+		for (i = k + 1; i < NB_POS; i++)
+		{
+			cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+			ptr_h1++;
+			ptr_h2++;
+			*p3 = extract_h(cor);          
+			cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+			ptr_h1++;
+			ptr_h2++;
+			*p2 = extract_h(cor);          
+			cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+			ptr_h1++;
+			ptr_h2++;
+			*p1 = extract_h(cor);          
+			cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+			ptr_h1++;
+			ptr_h2++;
+			*p0 = extract_h(cor);         
+
+			p3 -= (NB_POS + 1);
+			p2 -= (NB_POS + 1);
+			p1 -= (NB_POS + 1);
+			p0 -= (NB_POS + 1);
+		}
+		cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+		ptr_h1++;
+		ptr_h2++;
+		*p3 = extract_h(cor);              
+		cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+		ptr_h1++;
+		ptr_h2++;
+		*p2 = extract_h(cor);              
+		cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+		ptr_h1++;
+		ptr_h2++;
+		*p1 = extract_h(cor);              
+
+		pos -= NB_POS;
+		ptr_hf += STEP;
+	}
+
+	/* storage order --> i3i0, i2i3, i1i2, i0i1 */
+
+	pos = MSIZE - 1;                       
+	ptr_hf = h + 3;                        
+
+	for (k = 0; k < NB_POS; k++)
+	{
+		p3 = &rrixiy[3][pos];              
+		p2 = &rrixiy[2][pos - 1];          
+		p1 = &rrixiy[1][pos - 1];          
+		p0 = &rrixiy[0][pos - 1];          
+
+		cor = 0x00008000L;								/* for rounding */
+		ptr_h1 = h;                        
+		ptr_h2 = ptr_hf;                   
+
+		for (i = k + 1; i < NB_POS; i++)
+		{
+			cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+			ptr_h1++;
+			ptr_h2++;
+			*p3 = extract_h(cor);          
+			cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+			ptr_h1++;
+			ptr_h2++;
+			*p2 = extract_h(cor);          
+			cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+			ptr_h1++;
+			ptr_h2++;
+			*p1 = extract_h(cor);          
+			cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+			ptr_h1++;
+			ptr_h2++;
+			*p0 = extract_h(cor);          
+
+			p3 -= (NB_POS + 1);
+			p2 -= (NB_POS + 1);
+			p1 -= (NB_POS + 1);
+			p0 -= (NB_POS + 1);
+		}
+		cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+		ptr_h1++;
+		ptr_h2++;
+		*p3 = extract_h(cor);              
+
+		pos--;
+		ptr_hf += STEP;
+	}
+
+	/*------------------------------------------------------------*
+	 * Modification of rrixiy[][] to take signs into account.     *
+	 *------------------------------------------------------------*/
+
+	p0 = &rrixiy[0][0];                    
+
+	for (k = 0; k < NB_TRACK; k++)
+	{
+		j_temp = (k + 1)&0x03;
+		for (i = k; i < L_SUBFR; i += STEP)
+		{
+			psign = sign;                  
+			if (psign[i] < 0)
+			{
+				psign = vec;               
+			}
+			j = j_temp;
+			for (; j < L_SUBFR; j += STEP)
+			{
+				*p0 = vo_mult(*p0, psign[j]);    
+				p0++;
+			}
+		}
+	}
+
+	/*-------------------------------------------------------------------*
+	 *                       Deep first search                           *
+	 *-------------------------------------------------------------------*/
+
+	psk = -1;                              
+	alpk = 1;                              
+
+	for (k = 0; k < nbiter; k++)
+	{
+		j_temp = k<<2;
+		for (i = 0; i < nb_pulse; i++)
+			ipos[i] = tipos[j_temp + i];
+
+		if(nbbits == 20)
+		{
+			pos = 0;                       
+			ps = 0;                        
+			alp = 0;                       
+			for (i = 0; i < L_SUBFR; i++)
+			{
+				vec[i] = 0;                
+			}
+		} else if ((nbbits == 36) || (nbbits == 44))
+		{
+			/* first stage: fix 2 pulses */
+			pos = 2;
+
+			ix = ind[0] = pos_max[ipos[0]];
+			iy = ind[1] = pos_max[ipos[1]];
+			ps = dn[ix] + dn[iy];
+			i = ix >> 2;                /* ix / STEP */
+			j = iy >> 2;                /* iy / STEP */
+			s = rrixix[ipos[0]][i] << 13;
+			s += rrixix[ipos[1]][j] << 13;
+			i = (i << 4) + j;         /* (ix/STEP)*NB_POS + (iy/STEP) */
+			s += rrixiy[ipos[0]][i] << 14;
+			alp = (s + 0x8000) >> 16;
+			if (sign[ix] < 0)
+				p0 = h_inv - ix;
+			else
+				p0 = h - ix;
+			if (sign[iy] < 0)
+				p1 = h_inv - iy;
+			else
+				p1 = h - iy;
+
+			for (i = 0; i < L_SUBFR; i++)
+			{
+				vec[i] = (*p0++) + (*p1++);
+			}
+
+			if(nbbits == 44)
+			{
+				ipos[8] = 0;               
+				ipos[9] = 1;               
+			}
+		} else
+		{
+			/* first stage: fix 4 pulses */
+			pos = 4;
+
+			ix = ind[0] = pos_max[ipos[0]];  
+			iy = ind[1] = pos_max[ipos[1]];  
+			i = ind[2] = pos_max[ipos[2]];   
+			j = ind[3] = pos_max[ipos[3]];   
+			ps = add1(add1(add1(dn[ix], dn[iy]), dn[i]), dn[j]);
+
+			if (sign[ix] < 0)
+				p0 = h_inv - ix;
+			else
+				p0 = h - ix;
+
+			if (sign[iy] < 0)
+				p1 = h_inv - iy;
+			else
+				p1 = h - iy;
+
+			if (sign[i] < 0)
+				p2 = h_inv - i;
+			else
+				p2 = h - i;
+
+			if (sign[j] < 0)
+				p3 = h_inv - j;
+			else
+				p3 = h - j;
+
+			L_tmp = 0L;
+			for(i = 0; i < L_SUBFR; i++)
+			{
+				vec[i]  = add1(add1(add1(*p0++, *p1++), *p2++), *p3++);
+				L_tmp  += (vec[i] * vec[i]) << 1;
+			}
+
+			alp = ((L_tmp >> 3) + 0x8000) >> 16;
+
+			if(nbbits == 72)
+			{
+				ipos[16] = 0;              
+				ipos[17] = 1;              
+			}
+		}
+
+		/* other stages of 2 pulses */
+
+		for (j = pos, st = 0; j < nb_pulse; j += 2, st++)
+		{
+			/*--------------------------------------------------*
+			 * Calculate correlation of all possible positions  *
+			 * of the next 2 pulses with previous fixed pulses. *
+			 * Each pulse can have 16 possible positions.       *
+			 *--------------------------------------------------*/
+			if(ipos[j] == 3)
+			{
+				cor_h_vec_30(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);
+			}
+			else
+			{
+#ifdef ASM_OPT                 /* asm optimization branch */
+				cor_h_vec_012_asm(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);
+#else
+				cor_h_vec_012(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);
+#endif
+			}
+			/*--------------------------------------------------*
+			 * Find best positions of 2 pulses.                 *
+			 *--------------------------------------------------*/
+			search_ixiy(nbpos[st], ipos[j], ipos[j + 1], &ps, &alp,
+					&ix, &iy, dn, dn2, cor_x, cor_y, rrixiy);
+
+			ind[j] = ix;                   
+			ind[j + 1] = iy;               
+
+			if (sign[ix] < 0)
+				p0 = h_inv - ix;
+			else
+				p0 = h - ix;
+			if (sign[iy] < 0)
+				p1 = h_inv - iy;
+			else
+				p1 = h - iy;
+
+			for (i = 0; i < L_SUBFR; i+=4)
+			{
+				vec[i]   += add1((*p0++), (*p1++));       
+				vec[i+1] += add1((*p0++), (*p1++));        
+				vec[i+2] += add1((*p0++), (*p1++));        
+				vec[i+3] += add1((*p0++), (*p1++));      
+			}
+		}
+		/* memorise the best codevector */
+		ps = vo_mult(ps, ps);
+		s = vo_L_msu(vo_L_mult(alpk, ps), psk, alp);
+		if (s > 0)
+		{
+			psk = ps;                      
+			alpk = alp;                    
+			for (i = 0; i < nb_pulse; i++)
+			{
+				codvec[i] = ind[i];        
+			}
+			for (i = 0; i < L_SUBFR; i++)
+			{
+				y[i] = vec[i];             
+			}
+		}
+	}
+	/*-------------------------------------------------------------------*
+	 * Build the codeword, the filtered codeword and index of codevector.*
+	 *-------------------------------------------------------------------*/
+	for (i = 0; i < NPMAXPT * NB_TRACK; i++)
+	{
+		ind[i] = -1;                       
+	}
+	for (i = 0; i < L_SUBFR; i++)
+	{
+		code[i] = 0;                       
+		y[i] = vo_shr_r(y[i], 3);               /* Q12 to Q9 */
+	}
+	val = (512 >> h_shift);               /* codeword in Q9 format */
+	for (k = 0; k < nb_pulse; k++)
+	{
+		i = codvec[k];                       /* read pulse position */
+		j = sign[i];                         /* read sign           */
+		index = i >> 2;                 /* index = pos of pulse (0..15) */
+		track = (Word16) (i & 0x03);         /* track = i % NB_TRACK (0..3)  */
+
+		if (j > 0)
+		{
+			code[i] += val;   
+			codvec[k] += 128;  
+		} else
+		{
+			code[i] -= val;   
+			index += NB_POS;    
+		}
+
+		i = (Word16)((vo_L_mult(track, NPMAXPT) >> 1));
+
+		while (ind[i] >= 0)
+		{
+			i += 1;
+		}
+		ind[i] = index;                    
+	}
+
+	k = 0;                                 
+	/* Build index of codevector */
+	if(nbbits == 20)
+	{
+		for (track = 0; track < NB_TRACK; track++)
+		{
+			_index[track] = (Word16)(quant_1p_N1(ind[k], 4));
+			k += NPMAXPT;
+		}
+	} else if(nbbits == 36)
+	{
+		for (track = 0; track < NB_TRACK; track++)
+		{
+			_index[track] = (Word16)(quant_2p_2N1(ind[k], ind[k + 1], 4));
+			k += NPMAXPT;
+		}
+	} else if(nbbits == 44)
+	{
+		for (track = 0; track < NB_TRACK - 2; track++)
+		{
+			_index[track] = (Word16)(quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4));
+			k += NPMAXPT;
+		}
+		for (track = 2; track < NB_TRACK; track++)
+		{
+			_index[track] = (Word16)(quant_2p_2N1(ind[k], ind[k + 1], 4));
+			k += NPMAXPT;
+		}
+	} else if(nbbits == 52)
+	{
+		for (track = 0; track < NB_TRACK; track++)
+		{
+			_index[track] = (Word16)(quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4));
+			k += NPMAXPT;
+		}
+	} else if(nbbits == 64)
+	{
+		for (track = 0; track < NB_TRACK; track++)
+		{
+			L_index = quant_4p_4N(&ind[k], 4);
+			_index[track] = (Word16)((L_index >> 14) & 3);
+			_index[track + NB_TRACK] = (Word16)(L_index & 0x3FFF);
+			k += NPMAXPT;
+		}
+	} else if(nbbits == 72)
+	{
+		for (track = 0; track < NB_TRACK - 2; track++)
+		{
+			L_index = quant_5p_5N(&ind[k], 4);
+			_index[track] = (Word16)((L_index >> 10) & 0x03FF);
+			_index[track + NB_TRACK] = (Word16)(L_index & 0x03FF);
+			k += NPMAXPT;
+		}
+		for (track = 2; track < NB_TRACK; track++)
+		{
+			L_index = quant_4p_4N(&ind[k], 4);
+			_index[track] = (Word16)((L_index >> 14) & 3);
+			_index[track + NB_TRACK] = (Word16)(L_index & 0x3FFF);
+			k += NPMAXPT;
+		}
+	} else if(nbbits == 88)
+	{
+		for (track = 0; track < NB_TRACK; track++)
+		{
+			L_index = quant_6p_6N_2(&ind[k], 4);
+			_index[track] = (Word16)((L_index >> 11) & 0x07FF);
+			_index[track + NB_TRACK] = (Word16)(L_index & 0x07FF);
+			k += NPMAXPT;
+		}
+	}
+	return;
+}
+
+
+/*-------------------------------------------------------------------*
+ * Function  cor_h_vec()                                             *
+ * ~~~~~~~~~~~~~~~~~~~~~                                             *
+ * Compute correlations of h[] with vec[] for the specified track.   *
+ *-------------------------------------------------------------------*/
+void cor_h_vec_30(
+		Word16 h[],                           /* (i) scaled impulse response                 */
+		Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */
+		Word16 track,                         /* (i) track to use                            */
+		Word16 sign[],                        /* (i) sign vector                             */
+		Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */
+		Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */
+		Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */
+		)
+{
+	Word32 i, j, pos, corr;
+	Word16 *p0, *p1, *p2,*p3,*cor_x,*cor_y;
+	Word32 L_sum1,L_sum2;
+	cor_x = cor_1;
+	cor_y = cor_2;
+	p0 = rrixix[track];
+	p3 = rrixix[0];
+	pos = track;
+
+	for (i = 0; i < NB_POS; i+=2)
+	{
+		L_sum1 = L_sum2 = 0L;
+		p1 = h;
+		p2 = &vec[pos];
+		for (j=pos;j < L_SUBFR; j++)
+		{
+			L_sum1 += *p1 * *p2;		
+			p2-=3;
+			L_sum2 += *p1++ * *p2;		
+			p2+=4;
+		}
+		p2-=3;
+		L_sum2 += *p1++ * *p2++;	
+		L_sum2 += *p1++ * *p2++;	
+		L_sum2 += *p1++ * *p2++;	
+
+		L_sum1 = (L_sum1 << 2);
+		L_sum2 = (L_sum2 << 2);
+
+		corr = vo_round(L_sum1);	
+		*cor_x++ = vo_mult(corr, sign[pos]) + (*p0++);
+		corr = vo_round(L_sum2);
+		*cor_y++ = vo_mult(corr, sign[pos-3]) + (*p3++);
+		pos += STEP;
+
+		L_sum1 = L_sum2 = 0L;
+		p1 = h;
+		p2 = &vec[pos];
+		for (j=pos;j < L_SUBFR; j++)
+		{
+			L_sum1 += *p1 * *p2;		
+			p2-=3;
+			L_sum2 += *p1++ * *p2;		
+			p2+=4;
+		}
+		p2-=3;
+		L_sum2 += *p1++ * *p2++;	
+		L_sum2 += *p1++ * *p2++;	
+		L_sum2 += *p1++ * *p2++;	
+
+		L_sum1 = (L_sum1 << 2);
+		L_sum2 = (L_sum2 << 2);
+
+		corr = vo_round(L_sum1);	
+		*cor_x++ = vo_mult(corr, sign[pos]) + (*p0++);
+		corr = vo_round(L_sum2);
+		*cor_y++ = vo_mult(corr, sign[pos-3]) + (*p3++);
+		pos += STEP;
+	}
+	return;
+}
+
+void cor_h_vec_012(
+		Word16 h[],                           /* (i) scaled impulse response                 */
+		Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */
+		Word16 track,                         /* (i) track to use                            */
+		Word16 sign[],                        /* (i) sign vector                             */
+		Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */
+		Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */
+		Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */
+		)
+{
+	Word32 i, j, pos, corr;
+	Word16 *p0, *p1, *p2,*p3,*cor_x,*cor_y;
+	Word32 L_sum1,L_sum2;
+	cor_x = cor_1;
+	cor_y = cor_2;
+	p0 = rrixix[track];
+	p3 = rrixix[track+1];
+	pos = track;
+
+	for (i = 0; i < NB_POS; i+=2)
+	{
+		L_sum1 = L_sum2 = 0L;
+		p1 = h;
+		p2 = &vec[pos];
+		for (j=62-pos ;j >= 0; j--)
+		{
+			L_sum1 += *p1 * *p2++;
+			L_sum2 += *p1++ * *p2;
+		}
+		L_sum1 += *p1 * *p2;
+		L_sum1 = (L_sum1 << 2);
+		L_sum2 = (L_sum2 << 2);
+
+		corr = (L_sum1 + 0x8000) >> 16;
+		cor_x[i] = vo_mult(corr, sign[pos]) + (*p0++);
+		corr = (L_sum2 + 0x8000) >> 16;
+		cor_y[i] = vo_mult(corr, sign[pos + 1]) + (*p3++);
+		pos += STEP;
+
+		L_sum1 = L_sum2 = 0L;
+		p1 = h;
+		p2 = &vec[pos];
+		for (j= 62-pos;j >= 0; j--)
+		{
+			L_sum1 += *p1 * *p2++;
+			L_sum2 += *p1++ * *p2;
+		}
+		L_sum1 += *p1 * *p2;
+		L_sum1 = (L_sum1 << 2);
+		L_sum2 = (L_sum2 << 2);
+
+		corr = (L_sum1 + 0x8000) >> 16;
+		cor_x[i+1] = vo_mult(corr, sign[pos]) + (*p0++);
+		corr = (L_sum2 + 0x8000) >> 16;
+		cor_y[i+1] = vo_mult(corr, sign[pos + 1]) + (*p3++);
+		pos += STEP;
+	}
+	return;
+}
+
+/*-------------------------------------------------------------------*
+ * Function  search_ixiy()                                           *
+ * ~~~~~~~~~~~~~~~~~~~~~~~                                           *
+ * Find the best positions of 2 pulses in a subframe.                *
+ *-------------------------------------------------------------------*/
+
+void search_ixiy(
+		Word16 nb_pos_ix,                     /* (i) nb of pos for pulse 1 (1..8)       */
+		Word16 track_x,                       /* (i) track of pulse 1                   */
+		Word16 track_y,                       /* (i) track of pulse 2                   */
+		Word16 * ps,                          /* (i/o) correlation of all fixed pulses  */
+		Word16 * alp,                         /* (i/o) energy of all fixed pulses       */
+		Word16 * ix,                          /* (o) position of pulse 1                */
+		Word16 * iy,                          /* (o) position of pulse 2                */
+		Word16 dn[],                          /* (i) corr. between target and h[]       */
+		Word16 dn2[],                         /* (i) vector of selected positions       */
+		Word16 cor_x[],                       /* (i) corr. of pulse 1 with fixed pulses */
+		Word16 cor_y[],                       /* (i) corr. of pulse 2 with fixed pulses */
+		Word16 rrixiy[][MSIZE]                /* (i) corr. of pulse 1 with pulse 2   */
+		)
+{
+	Word32 x, y, pos, thres_ix;
+	Word16 ps1, ps2, sq, sqk;
+	Word16 alp_16, alpk;
+	Word16 *p0, *p1, *p2;
+	Word32 s, alp0, alp1, alp2;
+
+	p0 = cor_x;                            
+	p1 = cor_y;                            
+	p2 = rrixiy[track_x];                  
+
+	thres_ix = nb_pos_ix - NB_MAX;
+
+	alp0 = L_deposit_h(*alp);
+	alp0 = (alp0 + 0x00008000L);       /* for rounding */
+
+	sqk = -1;                              
+	alpk = 1;                              
+
+	for (x = track_x; x < L_SUBFR; x += STEP)
+	{
+		ps1 = *ps + dn[x];
+		alp1 = alp0 + ((*p0++)<<13);
+
+		if (dn2[x] < thres_ix)
+		{
+			pos = -1;
+			for (y = track_y; y < L_SUBFR; y += STEP)
+			{
+				ps2 = add1(ps1, dn[y]);
+
+				alp2 = alp1 + ((*p1++)<<13);
+				alp2 = alp2 + ((*p2++)<<14);
+				alp_16 = extract_h(alp2);
+				sq = vo_mult(ps2, ps2);
+				s = vo_L_mult(alpk, sq) - ((sqk * alp_16)<<1);
+
+				if (s > 0)
+				{
+					sqk = sq;              
+					alpk = alp_16;         
+					pos = y;               
+				}
+			}
+			p1 -= NB_POS;
+
+			if (pos >= 0)
+			{
+				*ix = x;                   
+				*iy = pos;                 
+			}
+		} else
+		{
+			p2 += NB_POS;
+		}
+	}
+
+	*ps = add1(*ps, add1(dn[*ix], dn[*iy])); 
+	*alp = alpk;                           
+
+	return;
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/cmnMemory.c b/media/libstagefright/codecs/amrwbenc/src/cmnMemory.c
index c17264c..dd7c26d 100644
--- a/media/libstagefright/codecs/amrwbenc/src/cmnMemory.c
+++ b/media/libstagefright/codecs/amrwbenc/src/cmnMemory.c
@@ -1,73 +1,73 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		cmnMemory.c

-

-	Content:	sample code for memory operator implementation

-

-*******************************************************************************/

-#include "cmnMemory.h"

-

-#include <malloc.h>

-#if defined LINUX

-#include <string.h>

-#endif

-

-//VO_MEM_OPERATOR		g_memOP;

-

-VO_U32 cmnMemAlloc (VO_S32 uID,  VO_MEM_INFO * pMemInfo)

-{

-	if (!pMemInfo)

-		return VO_ERR_INVALID_ARG;

-

-	pMemInfo->VBuffer = malloc (pMemInfo->Size);

-	return 0;

-}

-

-VO_U32 cmnMemFree (VO_S32 uID, VO_PTR pMem)

-{

-	free (pMem);

-	return 0;

-}

-

-VO_U32	cmnMemSet (VO_S32 uID, VO_PTR pBuff, VO_U8 uValue, VO_U32 uSize)

-{

-	memset (pBuff, uValue, uSize);

-	return 0;

-}

-

-VO_U32	cmnMemCopy (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize)

-{

-	memcpy (pDest, pSource, uSize);

-	return 0;

-}

-

-VO_U32	cmnMemCheck (VO_S32 uID, VO_PTR pBuffer, VO_U32 uSize)

-{

-	return 0;

-}

-

-VO_S32 cmnMemCompare (VO_S32 uID, VO_PTR pBuffer1, VO_PTR pBuffer2, VO_U32 uSize)

-{

-	return memcmp(pBuffer1, pBuffer2, uSize);

-}

-

-VO_U32	cmnMemMove (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize)

-{

-	memmove (pDest, pSource, uSize);

-	return 0;

-}

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		cmnMemory.c
+
+	Content:	sample code for memory operator implementation
+
+*******************************************************************************/
+#include "cmnMemory.h"
+
+#include <malloc.h>
+#if defined LINUX
+#include <string.h>
+#endif
+
+//VO_MEM_OPERATOR		g_memOP;
+
+VO_U32 cmnMemAlloc (VO_S32 uID,  VO_MEM_INFO * pMemInfo)
+{
+	if (!pMemInfo)
+		return VO_ERR_INVALID_ARG;
+
+	pMemInfo->VBuffer = malloc (pMemInfo->Size);
+	return 0;
+}
+
+VO_U32 cmnMemFree (VO_S32 uID, VO_PTR pMem)
+{
+	free (pMem);
+	return 0;
+}
+
+VO_U32	cmnMemSet (VO_S32 uID, VO_PTR pBuff, VO_U8 uValue, VO_U32 uSize)
+{
+	memset (pBuff, uValue, uSize);
+	return 0;
+}
+
+VO_U32	cmnMemCopy (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize)
+{
+	memcpy (pDest, pSource, uSize);
+	return 0;
+}
+
+VO_U32	cmnMemCheck (VO_S32 uID, VO_PTR pBuffer, VO_U32 uSize)
+{
+	return 0;
+}
+
+VO_S32 cmnMemCompare (VO_S32 uID, VO_PTR pBuffer1, VO_PTR pBuffer2, VO_U32 uSize)
+{
+	return memcmp(pBuffer1, pBuffer2, uSize);
+}
+
+VO_U32	cmnMemMove (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize)
+{
+	memmove (pDest, pSource, uSize);
+	return 0;
+}
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/convolve.c b/media/libstagefright/codecs/amrwbenc/src/convolve.c
index 66c74d6..4f7fd8a 100644
--- a/media/libstagefright/codecs/amrwbenc/src/convolve.c
+++ b/media/libstagefright/codecs/amrwbenc/src/convolve.c
@@ -1,109 +1,109 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-       File: convolve.c

-

-	   Description:Perform the convolution between two vectors x[] and h[]

-	               and write the result in the vector y[]

-

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-

-void Convolve (

-		Word16 x[],        /* (i)     : input vector                           */

-		Word16 h[],        /* (i)     : impulse response                       */

-		Word16 y[],        /* (o)     : output vector                          */

-		Word16 L           /* (i)     : vector size                            */

-	      )

-{

-	Word32  i, n;

-	Word16 *tmpH,*tmpX;

-	Word32 s;

-	for (n = 0; n < 64;)

-	{

-		tmpH = h+n;

-		tmpX = x;

-		i=n+1;

-		s = vo_mult32((*tmpX++), (*tmpH--));i--;

-		while(i>0)

-		{

-			s += vo_mult32((*tmpX++), (*tmpH--));

-			s += vo_mult32((*tmpX++), (*tmpH--));

-			s += vo_mult32((*tmpX++), (*tmpH--));

-			s += vo_mult32((*tmpX++), (*tmpH--));

-			i -= 4;

-		}

-		y[n] = ((s<<1) + 0x8000)>>16;   

-		n++;

-

-		tmpH = h+n;

-		tmpX = x;

-		i=n+1;

-		s =  vo_mult32((*tmpX++), (*tmpH--));i--;

-		s += vo_mult32((*tmpX++), (*tmpH--));i--;

-

-		while(i>0)

-		{

-			s += vo_mult32((*tmpX++), (*tmpH--));

-			s += vo_mult32((*tmpX++), (*tmpH--));

-			s += vo_mult32((*tmpX++), (*tmpH--));

-			s += vo_mult32((*tmpX++), (*tmpH--));

-			i -= 4;

-		}

-		y[n] = ((s<<1) + 0x8000)>>16;    

-		n++;

-

-		tmpH = h+n;

-		tmpX = x;

-		i=n+1;

-		s =  vo_mult32((*tmpX++), (*tmpH--));i--;

-		s += vo_mult32((*tmpX++), (*tmpH--));i--;

-		s += vo_mult32((*tmpX++), (*tmpH--));i--;

-

-		while(i>0)

-		{

-			s += vo_mult32((*tmpX++), (*tmpH--));

-			s += vo_mult32((*tmpX++), (*tmpH--));

-			s += vo_mult32((*tmpX++), (*tmpH--));

-			s += vo_mult32((*tmpX++), (*tmpH--));

-			i -= 4;

-		}

-		y[n] = ((s<<1) + 0x8000)>>16;   

-		n++;

-

-		s = 0;

-		tmpH = h+n;

-		tmpX = x;

-		i=n+1;

-		while(i>0)

-		{

-			s += vo_mult32((*tmpX++), (*tmpH--));

-			s += vo_mult32((*tmpX++), (*tmpH--));

-			s += vo_mult32((*tmpX++), (*tmpH--));

-			s += vo_mult32((*tmpX++), (*tmpH--));

-			i -= 4;

-		}

-		y[n] = ((s<<1) + 0x8000)>>16;   

-		n++;        

-	}

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+       File: convolve.c
+
+	   Description:Perform the convolution between two vectors x[] and h[]
+	               and write the result in the vector y[]
+
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+void Convolve (
+		Word16 x[],        /* (i)     : input vector                           */
+		Word16 h[],        /* (i)     : impulse response                       */
+		Word16 y[],        /* (o)     : output vector                          */
+		Word16 L           /* (i)     : vector size                            */
+	      )
+{
+	Word32  i, n;
+	Word16 *tmpH,*tmpX;
+	Word32 s;
+	for (n = 0; n < 64;)
+	{
+		tmpH = h+n;
+		tmpX = x;
+		i=n+1;
+		s = vo_mult32((*tmpX++), (*tmpH--));i--;
+		while(i>0)
+		{
+			s += vo_mult32((*tmpX++), (*tmpH--));
+			s += vo_mult32((*tmpX++), (*tmpH--));
+			s += vo_mult32((*tmpX++), (*tmpH--));
+			s += vo_mult32((*tmpX++), (*tmpH--));
+			i -= 4;
+		}
+		y[n] = ((s<<1) + 0x8000)>>16;   
+		n++;
+
+		tmpH = h+n;
+		tmpX = x;
+		i=n+1;
+		s =  vo_mult32((*tmpX++), (*tmpH--));i--;
+		s += vo_mult32((*tmpX++), (*tmpH--));i--;
+
+		while(i>0)
+		{
+			s += vo_mult32((*tmpX++), (*tmpH--));
+			s += vo_mult32((*tmpX++), (*tmpH--));
+			s += vo_mult32((*tmpX++), (*tmpH--));
+			s += vo_mult32((*tmpX++), (*tmpH--));
+			i -= 4;
+		}
+		y[n] = ((s<<1) + 0x8000)>>16;    
+		n++;
+
+		tmpH = h+n;
+		tmpX = x;
+		i=n+1;
+		s =  vo_mult32((*tmpX++), (*tmpH--));i--;
+		s += vo_mult32((*tmpX++), (*tmpH--));i--;
+		s += vo_mult32((*tmpX++), (*tmpH--));i--;
+
+		while(i>0)
+		{
+			s += vo_mult32((*tmpX++), (*tmpH--));
+			s += vo_mult32((*tmpX++), (*tmpH--));
+			s += vo_mult32((*tmpX++), (*tmpH--));
+			s += vo_mult32((*tmpX++), (*tmpH--));
+			i -= 4;
+		}
+		y[n] = ((s<<1) + 0x8000)>>16;   
+		n++;
+
+		s = 0;
+		tmpH = h+n;
+		tmpX = x;
+		i=n+1;
+		while(i>0)
+		{
+			s += vo_mult32((*tmpX++), (*tmpH--));
+			s += vo_mult32((*tmpX++), (*tmpH--));
+			s += vo_mult32((*tmpX++), (*tmpH--));
+			s += vo_mult32((*tmpX++), (*tmpH--));
+			i -= 4;
+		}
+		y[n] = ((s<<1) + 0x8000)>>16;   
+		n++;        
+	}
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/cor_h_x.c b/media/libstagefright/codecs/amrwbenc/src/cor_h_x.c
index 3c2e9d5..b645fa3 100644
--- a/media/libstagefright/codecs/amrwbenc/src/cor_h_x.c
+++ b/media/libstagefright/codecs/amrwbenc/src/cor_h_x.c
@@ -1,127 +1,127 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*       File: cor_h_x.c                                                *

-*                                                                      *

-*	   Description:Compute correlation between target "x[]" and "h[]"  *

-*	               Designed for codebook search (24 pulses, 4 tracks,  * 

-*				   4 pulses per track, 16 positions in each track) to  *

-*				   avoid saturation.                                   *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "math_op.h"

-

-#define L_SUBFR   64

-#define NB_TRACK  4

-#define STEP      4

-

-void cor_h_x(

-		Word16 h[],                           /* (i) Q12 : impulse response of weighted synthesis filter */

-		Word16 x[],                           /* (i) Q0  : target vector                                 */

-		Word16 dn[]                           /* (o) <12bit : correlation between target and h[]         */

-	    )

-{

-	Word32 i, j;

-	Word32 L_tmp, y32[L_SUBFR], L_tot;

-	Word16 *p1, *p2;

-	Word32 *p3;

-	Word32 L_max, L_max1, L_max2, L_max3;

-	/* first keep the result on 32 bits and find absolute maximum */

-	L_tot  = 1;                            

-	L_max  = 0; 

-	L_max1 = 0;

-	L_max2 = 0;

-	L_max3 = 0;

-	for (i = 0; i < L_SUBFR; i += STEP)

-	{

-		L_tmp = 1;                                    /* 1 -> to avoid null dn[] */

-		p1 = &x[i];

-		p2 = &h[0];

-		for (j = i; j < L_SUBFR; j++)

-			L_tmp += vo_L_mult(*p1++, *p2++);

-

-		y32[i] = L_tmp;               

-		L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;

-		if(L_tmp > L_max)

-		{

-			L_max = L_tmp;             

-		}

-

-		L_tmp = 1L;

-		p1 = &x[i+1];

-		p2 = &h[0];

-		for (j = i+1; j < L_SUBFR; j++)

-			L_tmp += vo_L_mult(*p1++, *p2++);

-

-		y32[i+1] = L_tmp;               

-		L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;

-		if(L_tmp > L_max1)

-		{

-			L_max1 = L_tmp;             

-		}

-

-		L_tmp = 1;

-		p1 = &x[i+2];

-		p2 = &h[0];

-		for (j = i+2; j < L_SUBFR; j++)

-			L_tmp += vo_L_mult(*p1++, *p2++);

-

-		y32[i+2] = L_tmp;               

-		L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;

-		if(L_tmp > L_max2)

-		{

-			L_max2 = L_tmp;             

-		}

-

-		L_tmp = 1;

-		p1 = &x[i+3];

-		p2 = &h[0];

-		for (j = i+3; j < L_SUBFR; j++)

-			L_tmp += vo_L_mult(*p1++, *p2++);

-

-		y32[i+3] = L_tmp;               

-		L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;

-		if(L_tmp > L_max3)

-		{

-			L_max3 = L_tmp;             

-		}

-	}

-	/* tot += 3*max / 8 */

-	L_max = ((L_max + L_max1 + L_max2 + L_max3) >> 2);

-	L_tot = vo_L_add(L_tot, L_max);       /* +max/4 */

-	L_tot = vo_L_add(L_tot, (L_max >> 1));  /* +max/8 */

-

-	/* Find the number of right shifts to do on y32[] so that    */

-	/* 6.0 x sumation of max of dn[] in each track not saturate. */

-	j = norm_l(L_tot) - 4;             /* 4 -> 16 x tot */

-	p1 = dn;

-	p3 = y32;

-	for (i = 0; i < L_SUBFR; i+=4)

-	{

-		*p1++ = vo_round(L_shl(*p3++, j));

-		*p1++ = vo_round(L_shl(*p3++, j));

-		*p1++ = vo_round(L_shl(*p3++, j));

-		*p1++ = vo_round(L_shl(*p3++, j));

-	}

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*       File: cor_h_x.c                                                *
+*                                                                      *
+*	   Description:Compute correlation between target "x[]" and "h[]"  *
+*	               Designed for codebook search (24 pulses, 4 tracks,  * 
+*				   4 pulses per track, 16 positions in each track) to  *
+*				   avoid saturation.                                   *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+
+#define L_SUBFR   64
+#define NB_TRACK  4
+#define STEP      4
+
+void cor_h_x(
+		Word16 h[],                           /* (i) Q12 : impulse response of weighted synthesis filter */
+		Word16 x[],                           /* (i) Q0  : target vector                                 */
+		Word16 dn[]                           /* (o) <12bit : correlation between target and h[]         */
+	    )
+{
+	Word32 i, j;
+	Word32 L_tmp, y32[L_SUBFR], L_tot;
+	Word16 *p1, *p2;
+	Word32 *p3;
+	Word32 L_max, L_max1, L_max2, L_max3;
+	/* first keep the result on 32 bits and find absolute maximum */
+	L_tot  = 1;                            
+	L_max  = 0; 
+	L_max1 = 0;
+	L_max2 = 0;
+	L_max3 = 0;
+	for (i = 0; i < L_SUBFR; i += STEP)
+	{
+		L_tmp = 1;                                    /* 1 -> to avoid null dn[] */
+		p1 = &x[i];
+		p2 = &h[0];
+		for (j = i; j < L_SUBFR; j++)
+			L_tmp += vo_L_mult(*p1++, *p2++);
+
+		y32[i] = L_tmp;               
+		L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;
+		if(L_tmp > L_max)
+		{
+			L_max = L_tmp;             
+		}
+
+		L_tmp = 1L;
+		p1 = &x[i+1];
+		p2 = &h[0];
+		for (j = i+1; j < L_SUBFR; j++)
+			L_tmp += vo_L_mult(*p1++, *p2++);
+
+		y32[i+1] = L_tmp;               
+		L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;
+		if(L_tmp > L_max1)
+		{
+			L_max1 = L_tmp;             
+		}
+
+		L_tmp = 1;
+		p1 = &x[i+2];
+		p2 = &h[0];
+		for (j = i+2; j < L_SUBFR; j++)
+			L_tmp += vo_L_mult(*p1++, *p2++);
+
+		y32[i+2] = L_tmp;               
+		L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;
+		if(L_tmp > L_max2)
+		{
+			L_max2 = L_tmp;             
+		}
+
+		L_tmp = 1;
+		p1 = &x[i+3];
+		p2 = &h[0];
+		for (j = i+3; j < L_SUBFR; j++)
+			L_tmp += vo_L_mult(*p1++, *p2++);
+
+		y32[i+3] = L_tmp;               
+		L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;
+		if(L_tmp > L_max3)
+		{
+			L_max3 = L_tmp;             
+		}
+	}
+	/* tot += 3*max / 8 */
+	L_max = ((L_max + L_max1 + L_max2 + L_max3) >> 2);
+	L_tot = vo_L_add(L_tot, L_max);       /* +max/4 */
+	L_tot = vo_L_add(L_tot, (L_max >> 1));  /* +max/8 */
+
+	/* Find the number of right shifts to do on y32[] so that    */
+	/* 6.0 x sumation of max of dn[] in each track not saturate. */
+	j = norm_l(L_tot) - 4;             /* 4 -> 16 x tot */
+	p1 = dn;
+	p3 = y32;
+	for (i = 0; i < L_SUBFR; i+=4)
+	{
+		*p1++ = vo_round(L_shl(*p3++, j));
+		*p1++ = vo_round(L_shl(*p3++, j));
+		*p1++ = vo_round(L_shl(*p3++, j));
+		*p1++ = vo_round(L_shl(*p3++, j));
+	}
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/decim54.c b/media/libstagefright/codecs/amrwbenc/src/decim54.c
index 429a7d6..7bc5576 100644
--- a/media/libstagefright/codecs/amrwbenc/src/decim54.c
+++ b/media/libstagefright/codecs/amrwbenc/src/decim54.c
@@ -1,146 +1,146 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*      File: decim54.c                                                 *

-*                                                                      *

-*	   Description:Decimation of 16kHz signal to 12.8kHz           *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "acelp.h"

-#include "cnst.h"

-

-#define FAC5   5

-#define DOWN_FAC  26215                    /* 4/5 in Q15 */

-

-#define NB_COEF_DOWN  15

-

-/* Local functions */

-static void Down_samp(

-		Word16 * sig,                         /* input:  signal to downsampling  */

-		Word16 * sig_d,                       /* output: downsampled signal      */

-		Word16 L_frame_d                      /* input:  length of output        */

-		);

-

-/* 1/5 resolution interpolation filter  (in Q14)  */

-/* -1.5dB @ 6kHz, -6dB @ 6.4kHz, -10dB @ 6.6kHz, -20dB @ 6.9kHz, -25dB @ 7kHz, -55dB @ 8kHz */

-

-static Word16 fir_down1[4][30] =

-{

-	{-5, 24, -50, 54, 0, -128, 294, -408, 344, 0, -647, 1505, -2379, 3034, 13107, 3034, -2379, 1505, -647, 0, 344, -408,

-	294, -128, 0, 54, -50, 24, -5, 0},

-

-	{-6, 19, -26, 0, 77, -188, 270, -233, 0, 434, -964, 1366, -1293, 0, 12254, 6575, -2746, 1030, 0, -507, 601, -441,

-	198, 0, -95, 99, -58, 18, 0, -1},

-

-	{-3, 9, 0, -41, 111, -170, 153, 0, -295, 649, -888, 770, 0, -1997, 9894, 9894, -1997, 0, 770, -888, 649, -295, 0,

-	153, -170, 111, -41, 0, 9, -3},

-

-	{-1, 0, 18, -58, 99, -95, 0, 198, -441, 601, -507, 0, 1030, -2746, 6575, 12254, 0, -1293, 1366, -964, 434, 0,

-	-233, 270, -188, 77, 0, -26, 19, -6}

-};

-

-void Init_Decim_12k8(

-		Word16 mem[]                          /* output: memory (2*NB_COEF_DOWN) set to zeros */

-		)

-{

-	Set_zero(mem, 2 * NB_COEF_DOWN);

-	return;

-}

-

-void Decim_12k8(

-		Word16 sig16k[],                      /* input:  signal to downsampling  */

-		Word16 lg,                            /* input:  length of input         */

-		Word16 sig12k8[],                     /* output: decimated signal        */

-		Word16 mem[]                          /* in/out: memory (2*NB_COEF_DOWN) */

-	       )

-{

-	Word16 lg_down;

-	Word16 signal[L_FRAME16k + (2 * NB_COEF_DOWN)];

-

-	Copy(mem, signal, 2 * NB_COEF_DOWN);

-

-	Copy(sig16k, signal + (2 * NB_COEF_DOWN), lg);

-

-	lg_down = (lg * DOWN_FAC)>>15;

-

-	Down_samp(signal + NB_COEF_DOWN, sig12k8, lg_down);

-

-	Copy(signal + lg, mem, 2 * NB_COEF_DOWN);

-

-	return;

-}

-

-static void Down_samp(

-		Word16 * sig,                         /* input:  signal to downsampling  */

-		Word16 * sig_d,                       /* output: downsampled signal      */

-		Word16 L_frame_d                      /* input:  length of output        */

-		)

-{

-	Word32 i, j, frac, pos;

-	Word16 *x, *y;

-	Word32 L_sum;

-

-	pos = 0;                                 /* position is in Q2 -> 1/4 resolution  */

-	for (j = 0; j < L_frame_d; j++)

-	{

-		i = (pos >> 2);                   /* integer part     */

-		frac = pos & 3;                   /* fractional part */

-		x = sig + i - NB_COEF_DOWN + 1;

-		y = (Word16 *)(fir_down1 + frac);

-

-		L_sum = vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x++),(*y++));

-		L_sum += vo_mult32((*x),(*y));

-

-		L_sum = L_shl2(L_sum, 2);              

-		sig_d[j] = extract_h(L_add(L_sum, 0x8000)); 

-		pos += FAC5;              /* pos + 5/4 */

-	}

-	return;

-}

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*      File: decim54.c                                                 *
+*                                                                      *
+*	   Description:Decimation of 16kHz signal to 12.8kHz           *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "acelp.h"
+#include "cnst.h"
+
+#define FAC5   5
+#define DOWN_FAC  26215                    /* 4/5 in Q15 */
+
+#define NB_COEF_DOWN  15
+
+/* Local functions */
+static void Down_samp(
+		Word16 * sig,                         /* input:  signal to downsampling  */
+		Word16 * sig_d,                       /* output: downsampled signal      */
+		Word16 L_frame_d                      /* input:  length of output        */
+		);
+
+/* 1/5 resolution interpolation filter  (in Q14)  */
+/* -1.5dB @ 6kHz, -6dB @ 6.4kHz, -10dB @ 6.6kHz, -20dB @ 6.9kHz, -25dB @ 7kHz, -55dB @ 8kHz */
+
+static Word16 fir_down1[4][30] =
+{
+	{-5, 24, -50, 54, 0, -128, 294, -408, 344, 0, -647, 1505, -2379, 3034, 13107, 3034, -2379, 1505, -647, 0, 344, -408,
+	294, -128, 0, 54, -50, 24, -5, 0},
+
+	{-6, 19, -26, 0, 77, -188, 270, -233, 0, 434, -964, 1366, -1293, 0, 12254, 6575, -2746, 1030, 0, -507, 601, -441,
+	198, 0, -95, 99, -58, 18, 0, -1},
+
+	{-3, 9, 0, -41, 111, -170, 153, 0, -295, 649, -888, 770, 0, -1997, 9894, 9894, -1997, 0, 770, -888, 649, -295, 0,
+	153, -170, 111, -41, 0, 9, -3},
+
+	{-1, 0, 18, -58, 99, -95, 0, 198, -441, 601, -507, 0, 1030, -2746, 6575, 12254, 0, -1293, 1366, -964, 434, 0,
+	-233, 270, -188, 77, 0, -26, 19, -6}
+};
+
+void Init_Decim_12k8(
+		Word16 mem[]                          /* output: memory (2*NB_COEF_DOWN) set to zeros */
+		)
+{
+	Set_zero(mem, 2 * NB_COEF_DOWN);
+	return;
+}
+
+void Decim_12k8(
+		Word16 sig16k[],                      /* input:  signal to downsampling  */
+		Word16 lg,                            /* input:  length of input         */
+		Word16 sig12k8[],                     /* output: decimated signal        */
+		Word16 mem[]                          /* in/out: memory (2*NB_COEF_DOWN) */
+	       )
+{
+	Word16 lg_down;
+	Word16 signal[L_FRAME16k + (2 * NB_COEF_DOWN)];
+
+	Copy(mem, signal, 2 * NB_COEF_DOWN);
+
+	Copy(sig16k, signal + (2 * NB_COEF_DOWN), lg);
+
+	lg_down = (lg * DOWN_FAC)>>15;
+
+	Down_samp(signal + NB_COEF_DOWN, sig12k8, lg_down);
+
+	Copy(signal + lg, mem, 2 * NB_COEF_DOWN);
+
+	return;
+}
+
+static void Down_samp(
+		Word16 * sig,                         /* input:  signal to downsampling  */
+		Word16 * sig_d,                       /* output: downsampled signal      */
+		Word16 L_frame_d                      /* input:  length of output        */
+		)
+{
+	Word32 i, j, frac, pos;
+	Word16 *x, *y;
+	Word32 L_sum;
+
+	pos = 0;                                 /* position is in Q2 -> 1/4 resolution  */
+	for (j = 0; j < L_frame_d; j++)
+	{
+		i = (pos >> 2);                   /* integer part     */
+		frac = pos & 3;                   /* fractional part */
+		x = sig + i - NB_COEF_DOWN + 1;
+		y = (Word16 *)(fir_down1 + frac);
+
+		L_sum = vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x++),(*y++));
+		L_sum += vo_mult32((*x),(*y));
+
+		L_sum = L_shl2(L_sum, 2);              
+		sig_d[j] = extract_h(L_add(L_sum, 0x8000)); 
+		pos += FAC5;              /* pos + 5/4 */
+	}
+	return;
+}
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/deemph.c b/media/libstagefright/codecs/amrwbenc/src/deemph.c
index 6ad528d..4ee1449 100644
--- a/media/libstagefright/codecs/amrwbenc/src/deemph.c
+++ b/media/libstagefright/codecs/amrwbenc/src/deemph.c
@@ -1,117 +1,117 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*       File: deemph.c                                                 *

-*                                                                      *

-*	   Description:filtering through 1/(1-mu z^ -1)                    *

-*	               Deemph2 --> signal is divided by 2                  *

-*				   Deemph_32 --> for 32 bits signal.                   *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "math_op.h"

-

-void Deemph(

-		Word16 x[],                           /* (i/o)   : input signal overwritten by the output */

-		Word16 mu,                            /* (i) Q15 : deemphasis factor                      */

-		Word16 L,                             /* (i)     : vector size                            */

-		Word16 * mem                          /* (i/o)   : memory (y[-1])                         */

-	   )

-{

-	Word32 i;

-	Word32 L_tmp;

-

-	L_tmp = L_deposit_h(x[0]);

-	L_tmp = L_mac(L_tmp, *mem, mu);

-	x[0] = vo_round(L_tmp);                   

-

-	for (i = 1; i < L; i++)

-	{

-		L_tmp = L_deposit_h(x[i]);

-		L_tmp = L_mac(L_tmp, x[i - 1], mu);

-		x[i] = voround(L_tmp);               

-	}

-

-	*mem = x[L - 1];                       

-

-	return;

-}

-

-

-void Deemph2(

-		Word16 x[],                           /* (i/o)   : input signal overwritten by the output */

-		Word16 mu,                            /* (i) Q15 : deemphasis factor                      */

-		Word16 L,                             /* (i)     : vector size                            */

-		Word16 * mem                          /* (i/o)   : memory (y[-1])                         */

-	    )

-{

-	Word32 i;

-	Word32 L_tmp;

-	L_tmp = x[0] << 15;

-	L_tmp += ((*mem) * mu)<<1;

-	x[0] = (L_tmp + 0x8000)>>16;                   

-	for (i = 1; i < L; i++)

-	{

-		L_tmp = x[i] << 15;

-		L_tmp += (x[i - 1] * mu)<<1;

-		x[i] = (L_tmp + 0x8000)>>16;               

-	}

-	*mem = x[L - 1];                       

-	return;

-}

-

-

-void Deemph_32(

-		Word16 x_hi[],                        /* (i)     : input signal (bit31..16) */

-		Word16 x_lo[],                        /* (i)     : input signal (bit15..4)  */

-		Word16 y[],                           /* (o)     : output signal (x16)      */

-		Word16 mu,                            /* (i) Q15 : deemphasis factor        */

-		Word16 L,                             /* (i)     : vector size              */

-		Word16 * mem                          /* (i/o)   : memory (y[-1])           */

-	      )

-{

-	Word16 fac;

-	Word32 i, L_tmp;

-

-	fac = mu >> 1;                                /* Q15 --> Q14 */

-

-	L_tmp = L_deposit_h(x_hi[0]);

-	L_tmp += (x_lo[0] * 8)<<1;

-	L_tmp = (L_tmp << 3);

-	L_tmp += ((*mem) * fac)<<1;

-	L_tmp = (L_tmp << 1);               

-	y[0] = (L_tmp + 0x8000)>>16;                  

-

-	for (i = 1; i < L; i++)

-	{

-		L_tmp = L_deposit_h(x_hi[i]);

-		L_tmp += (x_lo[i] * 8)<<1;

-		L_tmp = (L_tmp << 3);

-		L_tmp += (y[i - 1] * fac)<<1;

-		L_tmp = (L_tmp << 1);           

-		y[i] = (L_tmp + 0x8000)>>16;               

-	}

-

-	*mem = y[L - 1];                       

-

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*       File: deemph.c                                                 *
+*                                                                      *
+*	   Description:filtering through 1/(1-mu z^ -1)                    *
+*	               Deemph2 --> signal is divided by 2                  *
+*				   Deemph_32 --> for 32 bits signal.                   *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+
+void Deemph(
+		Word16 x[],                           /* (i/o)   : input signal overwritten by the output */
+		Word16 mu,                            /* (i) Q15 : deemphasis factor                      */
+		Word16 L,                             /* (i)     : vector size                            */
+		Word16 * mem                          /* (i/o)   : memory (y[-1])                         */
+	   )
+{
+	Word32 i;
+	Word32 L_tmp;
+
+	L_tmp = L_deposit_h(x[0]);
+	L_tmp = L_mac(L_tmp, *mem, mu);
+	x[0] = vo_round(L_tmp);                   
+
+	for (i = 1; i < L; i++)
+	{
+		L_tmp = L_deposit_h(x[i]);
+		L_tmp = L_mac(L_tmp, x[i - 1], mu);
+		x[i] = voround(L_tmp);               
+	}
+
+	*mem = x[L - 1];                       
+
+	return;
+}
+
+
+void Deemph2(
+		Word16 x[],                           /* (i/o)   : input signal overwritten by the output */
+		Word16 mu,                            /* (i) Q15 : deemphasis factor                      */
+		Word16 L,                             /* (i)     : vector size                            */
+		Word16 * mem                          /* (i/o)   : memory (y[-1])                         */
+	    )
+{
+	Word32 i;
+	Word32 L_tmp;
+	L_tmp = x[0] << 15;
+	L_tmp += ((*mem) * mu)<<1;
+	x[0] = (L_tmp + 0x8000)>>16;                   
+	for (i = 1; i < L; i++)
+	{
+		L_tmp = x[i] << 15;
+		L_tmp += (x[i - 1] * mu)<<1;
+		x[i] = (L_tmp + 0x8000)>>16;               
+	}
+	*mem = x[L - 1];                       
+	return;
+}
+
+
+void Deemph_32(
+		Word16 x_hi[],                        /* (i)     : input signal (bit31..16) */
+		Word16 x_lo[],                        /* (i)     : input signal (bit15..4)  */
+		Word16 y[],                           /* (o)     : output signal (x16)      */
+		Word16 mu,                            /* (i) Q15 : deemphasis factor        */
+		Word16 L,                             /* (i)     : vector size              */
+		Word16 * mem                          /* (i/o)   : memory (y[-1])           */
+	      )
+{
+	Word16 fac;
+	Word32 i, L_tmp;
+
+	fac = mu >> 1;                                /* Q15 --> Q14 */
+
+	L_tmp = L_deposit_h(x_hi[0]);
+	L_tmp += (x_lo[0] * 8)<<1;
+	L_tmp = (L_tmp << 3);
+	L_tmp += ((*mem) * fac)<<1;
+	L_tmp = (L_tmp << 1);               
+	y[0] = (L_tmp + 0x8000)>>16;                  
+
+	for (i = 1; i < L; i++)
+	{
+		L_tmp = L_deposit_h(x_hi[i]);
+		L_tmp += (x_lo[i] * 8)<<1;
+		L_tmp = (L_tmp << 3);
+		L_tmp += (y[i - 1] * fac)<<1;
+		L_tmp = (L_tmp << 1);           
+		y[i] = (L_tmp + 0x8000)>>16;               
+	}
+
+	*mem = y[L - 1];                       
+
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/dtx.c b/media/libstagefright/codecs/amrwbenc/src/dtx.c
index 02921eb..df53131 100644
--- a/media/libstagefright/codecs/amrwbenc/src/dtx.c
+++ b/media/libstagefright/codecs/amrwbenc/src/dtx.c
@@ -1,605 +1,605 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*       File: dtx.c                                                    *

-*                                                                      *

-*	    Description:DTX functions                                  *

-*                                                                      *

-************************************************************************/

-

-#include <stdio.h>

-#include <stdlib.h>

-#include "typedef.h"

-#include "basic_op.h"

-#include "oper_32b.h"

-#include "math_op.h"

-#include "cnst.h"

-#include "acelp.h"                         /* prototype of functions    */

-#include "bits.h"

-#include "dtx.h"

-#include "log2.h"

-#include "mem_align.h"

-

-static void aver_isf_history(

-		Word16 isf_old[],

-		Word16 indices[],

-		Word32 isf_aver[]

-		);

-

-static void find_frame_indices(

-		Word16 isf_old_tx[],

-		Word16 indices[],

-		dtx_encState * st

-		);

-

-static Word16 dithering_control(

-		dtx_encState * st

-		);

-

-/* excitation energy adjustment depending on speech coder mode used, Q7 */

-static Word16 en_adjust[9] =

-{

-	230,                                   /* mode0 = 7k  :  -5.4dB  */

-	179,                                   /* mode1 = 9k  :  -4.2dB  */

-	141,                                   /* mode2 = 12k :  -3.3dB  */

-	128,                                   /* mode3 = 14k :  -3.0dB  */

-	122,                                   /* mode4 = 16k :  -2.85dB */

-	115,                                   /* mode5 = 18k :  -2.7dB  */

-	115,                                   /* mode6 = 20k :  -2.7dB  */

-	115,                                   /* mode7 = 23k :  -2.7dB  */

-	115                                    /* mode8 = 24k :  -2.7dB  */

-};

-

-/**************************************************************************

-*

-* Function    : dtx_enc_init

-*

-**************************************************************************/

-Word16 dtx_enc_init(dtx_encState ** st, Word16 isf_init[], VO_MEM_OPERATOR *pMemOP)

-{

-	dtx_encState *s;

-

-	if (st == (dtx_encState **) NULL)

-	{

-		fprintf(stderr, "dtx_enc_init: invalid parameter\n");

-		return -1;

-	}

-	*st = NULL;

-

-	/* allocate memory */

-	if ((s = (dtx_encState *)mem_malloc(pMemOP, sizeof(dtx_encState), 32, VO_INDEX_ENC_AMRWB)) == NULL)

-	{

-		fprintf(stderr, "dtx_enc_init: can not malloc state structure\n");

-		return -1;

-	}

-	dtx_enc_reset(s, isf_init);

-	*st = s;

-	return 0;

-}

-

-/**************************************************************************

-*

-* Function    : dtx_enc_reset

-*

-**************************************************************************/

-Word16 dtx_enc_reset(dtx_encState * st, Word16 isf_init[])

-{

-	Word32 i;

-

-	if (st == (dtx_encState *) NULL)

-	{

-		fprintf(stderr, "dtx_enc_reset: invalid parameter\n");

-		return -1;

-	}

-	st->hist_ptr = 0;                      

-	st->log_en_index = 0;                  

-

-	/* Init isf_hist[] */

-	for (i = 0; i < DTX_HIST_SIZE; i++)

-	{

-		Copy(isf_init, &st->isf_hist[i * M], M);

-	}

-	st->cng_seed = RANDOM_INITSEED;       

-

-	/* Reset energy history */

-	Set_zero(st->log_en_hist, DTX_HIST_SIZE);

-

-	st->dtxHangoverCount = DTX_HANG_CONST; 

-	st->decAnaElapsedCount = 32767;        

-

-	for (i = 0; i < 28; i++)

-	{

-		st->D[i] = 0;                      

-	}

-

-	for (i = 0; i < DTX_HIST_SIZE - 1; i++)

-	{

-		st->sumD[i] = 0;                   

-	}

-

-	return 1;

-}

-

-/**************************************************************************

-*

-* Function    : dtx_enc_exit

-*

-**************************************************************************/

-void dtx_enc_exit(dtx_encState ** st, VO_MEM_OPERATOR *pMemOP)

-{

-	if (st == NULL || *st == NULL)

-		return;

-	/* deallocate memory */

-	mem_free(pMemOP, *st, VO_INDEX_ENC_AMRWB);

-	*st = NULL;

-	return;

-}

-

-

-/**************************************************************************

-*

-* Function    : dtx_enc

-*

-**************************************************************************/

-Word16 dtx_enc(

-		dtx_encState * st,                    /* i/o : State struct                                         */

-		Word16 isf[M],                        /* o   : CN ISF vector                                        */

-		Word16 * exc2,                        /* o   : CN excitation                                        */

-		Word16 ** prms

-	      )

-{

-	Word32 i, j;

-	Word16 indice[7];

-	Word16 log_en, gain, level, exp, exp0, tmp;

-	Word16 log_en_int_e, log_en_int_m;

-	Word32 L_isf[M], ener32, level32;

-	Word16 isf_order[3];

-	Word16 CN_dith;

-

-	/* VOX mode computation of SID parameters */

-	log_en = 0;

-	for (i = 0; i < M; i++)

-	{

-		L_isf[i] = 0;

-	}

-	/* average energy and isf */

-	for (i = 0; i < DTX_HIST_SIZE; i++)

-	{

-		/* Division by DTX_HIST_SIZE = 8 has been done in dtx_buffer. log_en is in Q10 */

-		log_en = add(log_en, st->log_en_hist[i]);

-

-	}

-	find_frame_indices(st->isf_hist, isf_order, st);

-	aver_isf_history(st->isf_hist, isf_order, L_isf);

-

-	for (j = 0; j < M; j++)

-	{

-		isf[j] = (Word16)(L_isf[j] >> 3);  /* divide by 8 */

-	}

-

-	/* quantize logarithmic energy to 6 bits (-6 : 66 dB) which corresponds to -2:22 in log2(E).  */

-	/* st->log_en_index = (short)( (log_en + 2.0) * 2.625 ); */

-

-	/* increase dynamics to 7 bits (Q8) */

-	log_en = (log_en >> 2);

-

-	/* Add 2 in Q8 = 512 to get log2(E) between 0:24 */

-	log_en = add(log_en, 512);

-

-	/* Multiply by 2.625 to get full 6 bit range. 2.625 = 21504 in Q13. The result is in Q6 */

-	log_en = mult(log_en, 21504);

-

-	/* Quantize Energy */

-	st->log_en_index = shr(log_en, 6);

-

-	if(st->log_en_index > 63)

-	{

-		st->log_en_index = 63;

-	}

-	if (st->log_en_index < 0)

-	{

-		st->log_en_index = 0;

-	}

-	/* Quantize ISFs */

-	Qisf_ns(isf, isf, indice);

-

-

-	Parm_serial(indice[0], 6, prms);

-	Parm_serial(indice[1], 6, prms);

-	Parm_serial(indice[2], 6, prms);

-	Parm_serial(indice[3], 5, prms);

-	Parm_serial(indice[4], 5, prms);

-

-	Parm_serial((st->log_en_index), 6, prms);

-

-	CN_dith = dithering_control(st);

-	Parm_serial(CN_dith, 1, prms);

-

-	/* level = (float)( pow( 2.0f, (float)st->log_en_index / 2.625 - 2.0 ) );    */

-	/* log2(E) in Q9 (log2(E) lies in between -2:22) */

-	log_en = shl(st->log_en_index, 15 - 6);

-

-	/* Divide by 2.625; log_en will be between 0:24  */

-	log_en = mult(log_en, 12483);

-	/* the result corresponds to log2(gain) in Q10 */

-

-	/* Find integer part  */

-	log_en_int_e = (log_en >> 10);

-

-	/* Find fractional part */

-	log_en_int_m = (Word16) (log_en & 0x3ff);

-	log_en_int_m = shl(log_en_int_m, 5);

-

-	/* Subtract 2 from log_en in Q9, i.e divide the gain by 2 (energy by 4) */

-	/* Add 16 in order to have the result of pow2 in Q16 */

-	log_en_int_e = add(log_en_int_e, 16 - 1);

-

-	level32 = Pow2(log_en_int_e, log_en_int_m); /* Q16 */

-	exp0 = norm_l(level32);

-	level32 = (level32 << exp0);        /* level in Q31 */

-	exp0 = (15 - exp0);

-	level = extract_h(level32);            /* level in Q15 */

-

-	/* generate white noise vector */

-	for (i = 0; i < L_FRAME; i++)

-	{

-		exc2[i] = (Random(&(st->cng_seed)) >> 4);

-	}

-

-	/* gain = level / sqrt(ener) * sqrt(L_FRAME) */

-

-	/* energy of generated excitation */

-	ener32 = Dot_product12(exc2, exc2, L_FRAME, &exp);

-

-	Isqrt_n(&ener32, &exp);

-

-	gain = extract_h(ener32);

-

-	gain = mult(level, gain);              /* gain in Q15 */

-

-	exp = add(exp0, exp);

-

-	/* Multiply by sqrt(L_FRAME)=16, i.e. shift left by 4 */

-	exp += 4;

-

-	for (i = 0; i < L_FRAME; i++)

-	{

-		tmp = mult(exc2[i], gain);         /* Q0 * Q15 */

-		exc2[i] = shl(tmp, exp); 

-	}

-

-	return 0;

-}

-

-/**************************************************************************

-*

-* Function    : dtx_buffer Purpose     : handles the DTX buffer

-*

-**************************************************************************/

-Word16 dtx_buffer(

-		dtx_encState * st,                    /* i/o : State struct                    */

-		Word16 isf_new[],                     /* i   : isf vector                      */

-		Word32 enr,                           /* i   : residual energy (in L_FRAME)    */

-		Word16 codec_mode

-		)

-{

-	Word16 log_en;

-

-	Word16 log_en_e;

-	Word16 log_en_m;

-	st->hist_ptr = add(st->hist_ptr, 1); 

-	if(st->hist_ptr == DTX_HIST_SIZE)

-	{

-		st->hist_ptr = 0;

-	}

-	/* copy lsp vector into buffer */

-	Copy(isf_new, &st->isf_hist[st->hist_ptr * M], M);

-

-	/* log_en = (float)log10(enr*0.0059322)/(float)log10(2.0f);  */

-	Log2(enr, &log_en_e, &log_en_m);

-

-	/* convert exponent and mantissa to Word16 Q7. Q7 is used to simplify averaging in dtx_enc */

-	log_en = shl(log_en_e, 7);             /* Q7 */

-	log_en = add(log_en, shr(log_en_m, 15 - 7));

-

-	/* Find energy per sample by multiplying with 0.0059322, i.e subtract log2(1/0.0059322) = 7.39722 The

-	 * constant 0.0059322 takes into account windowings and analysis length from autocorrelation

-	 * computations; 7.39722 in Q7 = 947  */

-	/* Subtract 3 dB = 0.99658 in log2(E) = 127 in Q7. */

-	/* log_en = sub( log_en, 947 + en_adjust[codec_mode] ); */

-

-	/* Find energy per sample (divide by L_FRAME=256), i.e subtract log2(256) = 8.0  (1024 in Q7) */

-	/* Subtract 3 dB = 0.99658 in log2(E) = 127 in Q7. */

-

-	log_en = sub(log_en, add(1024, en_adjust[codec_mode]));

-

-	/* Insert into the buffer */

-	st->log_en_hist[st->hist_ptr] = log_en;

-	return 0;

-}

-

-/**************************************************************************

-*

-* Function    : tx_dtx_handler Purpose     : adds extra speech hangover

-*                                            to analyze speech on

-*                                            the decoding side.

-**************************************************************************/

-void tx_dtx_handler(dtx_encState * st,     /* i/o : State struct           */

-		Word16 vad_flag,                      /* i   : vad decision           */

-		Word16 * usedMode                     /* i/o : mode changed or not    */

-		)

-{

-

-	/* this state machine is in synch with the GSMEFR txDtx machine      */

-	st->decAnaElapsedCount = add(st->decAnaElapsedCount, 1); 

-

-	if (vad_flag != 0)

-	{

-		st->dtxHangoverCount = DTX_HANG_CONST;

-	} else

-	{                                      /* non-speech */

-		if (st->dtxHangoverCount == 0)

-		{                                  /* out of decoder analysis hangover  */

-			st->decAnaElapsedCount = 0;    

-			*usedMode = MRDTX;            

-		} else

-		{                                  /* in possible analysis hangover */

-			st->dtxHangoverCount = sub(st->dtxHangoverCount, 1);

-

-			/* decAnaElapsedCount + dtxHangoverCount < DTX_ELAPSED_FRAMES_THRESH */

-			if (sub(add(st->decAnaElapsedCount, st->dtxHangoverCount),

-						DTX_ELAPSED_FRAMES_THRESH) < 0)

-			{

-				*usedMode = MRDTX;

-				/* if short time since decoder update, do not add extra HO */

-			}

-			/* else override VAD and stay in speech mode *usedMode and add extra hangover */

-		}

-	}

-

-	return;

-}

-

-

-

-static void aver_isf_history(

-		Word16 isf_old[],

-		Word16 indices[],

-		Word32 isf_aver[]

-		)

-{

-	Word32 i, j, k;

-	Word16 isf_tmp[2 * M];

-	Word32 L_tmp;

-

-	/* Memorize in isf_tmp[][] the ISF vectors to be replaced by */

-	/* the median ISF vector prior to the averaging               */

-	for (k = 0; k < 2; k++)

-	{

-		if ((indices[k] + 1) != 0)

-		{

-			for (i = 0; i < M; i++)

-			{

-				isf_tmp[k * M + i] = isf_old[indices[k] * M + i];      

-				isf_old[indices[k] * M + i] = isf_old[indices[2] * M + i];    

-			}

-		}

-	}

-

-	/* Perform the ISF averaging */

-	for (j = 0; j < M; j++)

-	{

-		L_tmp = 0;                      

-

-		for (i = 0; i < DTX_HIST_SIZE; i++)

-		{

-			L_tmp = L_add(L_tmp, L_deposit_l(isf_old[i * M + j]));

-		}

-		isf_aver[j] = L_tmp;              

-	}

-

-	/* Retrieve from isf_tmp[][] the ISF vectors saved prior to averaging */

-	for (k = 0; k < 2; k++)

-	{

-		if ((indices[k] + 1) != 0)

-		{

-			for (i = 0; i < M; i++)

-			{

-				isf_old[indices[k] * M + i] = isf_tmp[k * M + i];

-			}

-		}

-	}

-

-	return;

-}

-

-static void find_frame_indices(

-		Word16 isf_old_tx[],

-		Word16 indices[],

-		dtx_encState * st

-		)

-{

-	Word32 L_tmp, summin, summax, summax2nd;

-	Word16 i, j, tmp;

-	Word16 ptr;

-

-	/* Remove the effect of the oldest frame from the column */

-	/* sum sumD[0..DTX_HIST_SIZE-1]. sumD[DTX_HIST_SIZE] is    */

-	/* not updated since it will be removed later.           */

-

-	tmp = DTX_HIST_SIZE_MIN_ONE;           

-	j = -1;                                

-	for (i = 0; i < DTX_HIST_SIZE_MIN_ONE; i++)

-	{

-		j = add(j, tmp);

-		st->sumD[i] = L_sub(st->sumD[i], st->D[j]);     

-		tmp = sub(tmp, 1);

-	}

-

-	/* Shift the column sum sumD. The element sumD[DTX_HIST_SIZE-1]    */

-	/* corresponding to the oldest frame is removed. The sum of     */

-	/* the distances between the latest isf and other isfs, */

-	/* i.e. the element sumD[0], will be computed during this call. */

-	/* Hence this element is initialized to zero.                   */

-

-	for (i = DTX_HIST_SIZE_MIN_ONE; i > 0; i--)

-	{

-		st->sumD[i] = st->sumD[i - 1];     

-	}

-	st->sumD[0] = 0;                       

-

-	/* Remove the oldest frame from the distance matrix.           */

-	/* Note that the distance matrix is replaced by a one-         */

-	/* dimensional array to save static memory.                    */

-

-	tmp = 0;                               

-	for (i = 27; i >= 12; i = (Word16) (i - tmp))

-	{

-		tmp = add(tmp, 1);

-		for (j = tmp; j > 0; j--)

-		{

-			st->D[i - j + 1] = st->D[i - j - tmp];   

-		}

-	}

-

-	/* Compute the first column of the distance matrix D            */

-	/* (squared Euclidean distances from isf1[] to isf_old_tx[][]). */

-

-	ptr = st->hist_ptr;                 

-	for (i = 1; i < DTX_HIST_SIZE; i++)

-	{

-		/* Compute the distance between the latest isf and the other isfs. */

-		ptr = sub(ptr, 1);

-		if (ptr < 0)

-		{

-			ptr = DTX_HIST_SIZE_MIN_ONE;   

-		}

-		L_tmp = 0;                         

-		for (j = 0; j < M; j++)

-		{

-			tmp = sub(isf_old_tx[st->hist_ptr * M + j], isf_old_tx[ptr * M + j]);

-			L_tmp = L_mac(L_tmp, tmp, tmp);

-		}

-		st->D[i - 1] = L_tmp;           

-

-		/* Update also the column sums. */

-		st->sumD[0] = L_add(st->sumD[0], st->D[i - 1]); 

-		st->sumD[i] = L_add(st->sumD[i], st->D[i - 1]); 

-	}

-

-	/* Find the minimum and maximum distances */

-	summax = st->sumD[0];                  

-	summin = st->sumD[0];                  

-	indices[0] = 0;                        

-	indices[2] = 0;                        

-	for (i = 1; i < DTX_HIST_SIZE; i++)

-	{

-		if (L_sub(st->sumD[i], summax) > 0)

-		{

-			indices[0] = i;                

-			summax = st->sumD[i];          

-		}

-		if (L_sub(st->sumD[i], summin) < 0)

-		{

-			indices[2] = i;                

-			summin = st->sumD[i];          

-		}

-	}

-

-	/* Find the second largest distance */

-	summax2nd = -2147483647L;              

-	indices[1] = -1;                       

-	for (i = 0; i < DTX_HIST_SIZE; i++)

-	{

-		if ((L_sub(st->sumD[i], summax2nd) > 0) && (sub(i, indices[0]) != 0))

-		{

-			indices[1] = i;                

-			summax2nd = st->sumD[i];       

-		}

-	}

-

-	for (i = 0; i < 3; i++)

-	{

-		indices[i] = sub(st->hist_ptr, indices[i]);     

-		if (indices[i] < 0)

-		{

-			indices[i] = add(indices[i], DTX_HIST_SIZE);       

-		}

-	}

-

-	/* If maximum distance/MED_THRESH is smaller than minimum distance */

-	/* then the median ISF vector replacement is not performed         */

-	tmp = norm_l(summax);

-	summax = (summax << tmp);

-	summin = (summin << tmp);

-	L_tmp = L_mult(voround(summax), INV_MED_THRESH);

-	if(L_tmp <= summin)

-	{

-		indices[0] = -1; 

-	}

-	/* If second largest distance/MED_THRESH is smaller than     */

-	/* minimum distance then the median ISF vector replacement is    */

-	/* not performed                                                 */

-	summax2nd = L_shl(summax2nd, tmp);

-	L_tmp = L_mult(voround(summax2nd), INV_MED_THRESH);

-	if(L_tmp <= summin)

-	{

-		indices[1] = -1;                 

-	}

-	return;

-}

-

-static Word16 dithering_control(

-		dtx_encState * st

-		)

-{

-	Word16 tmp, mean, CN_dith, gain_diff;

-	Word32 i, ISF_diff;

-

-	/* determine how stationary the spectrum of background noise is */

-	ISF_diff = 0;

-	for (i = 0; i < 8; i++)

-	{

-		ISF_diff = L_add(ISF_diff, st->sumD[i]);

-	}

-	if ((ISF_diff >> 26) > 0)

-	{

-		CN_dith = 1;

-	} else

-	{

-		CN_dith = 0;

-	}

-

-	/* determine how stationary the energy of background noise is */

-	mean = 0;

-	for (i = 0; i < DTX_HIST_SIZE; i++)

-	{

-		mean = add(mean, st->log_en_hist[i]);

-	}

-	mean = (mean >> 3);

-	gain_diff = 0;

-	for (i = 0; i < DTX_HIST_SIZE; i++)

-	{

-		tmp = abs_s(sub(st->log_en_hist[i], mean));

-		gain_diff = add(gain_diff, tmp);

-	}

-	if (gain_diff > GAIN_THR)

-	{

-		CN_dith = 1;

-	}

-	return CN_dith;

-}

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*       File: dtx.c                                                    *
+*                                                                      *
+*	    Description:DTX functions                                  *
+*                                                                      *
+************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "math_op.h"
+#include "cnst.h"
+#include "acelp.h"                         /* prototype of functions    */
+#include "bits.h"
+#include "dtx.h"
+#include "log2.h"
+#include "mem_align.h"
+
+static void aver_isf_history(
+		Word16 isf_old[],
+		Word16 indices[],
+		Word32 isf_aver[]
+		);
+
+static void find_frame_indices(
+		Word16 isf_old_tx[],
+		Word16 indices[],
+		dtx_encState * st
+		);
+
+static Word16 dithering_control(
+		dtx_encState * st
+		);
+
+/* excitation energy adjustment depending on speech coder mode used, Q7 */
+static Word16 en_adjust[9] =
+{
+	230,                                   /* mode0 = 7k  :  -5.4dB  */
+	179,                                   /* mode1 = 9k  :  -4.2dB  */
+	141,                                   /* mode2 = 12k :  -3.3dB  */
+	128,                                   /* mode3 = 14k :  -3.0dB  */
+	122,                                   /* mode4 = 16k :  -2.85dB */
+	115,                                   /* mode5 = 18k :  -2.7dB  */
+	115,                                   /* mode6 = 20k :  -2.7dB  */
+	115,                                   /* mode7 = 23k :  -2.7dB  */
+	115                                    /* mode8 = 24k :  -2.7dB  */
+};
+
+/**************************************************************************
+*
+* Function    : dtx_enc_init
+*
+**************************************************************************/
+Word16 dtx_enc_init(dtx_encState ** st, Word16 isf_init[], VO_MEM_OPERATOR *pMemOP)
+{
+	dtx_encState *s;
+
+	if (st == (dtx_encState **) NULL)
+	{
+		fprintf(stderr, "dtx_enc_init: invalid parameter\n");
+		return -1;
+	}
+	*st = NULL;
+
+	/* allocate memory */
+	if ((s = (dtx_encState *)mem_malloc(pMemOP, sizeof(dtx_encState), 32, VO_INDEX_ENC_AMRWB)) == NULL)
+	{
+		fprintf(stderr, "dtx_enc_init: can not malloc state structure\n");
+		return -1;
+	}
+	dtx_enc_reset(s, isf_init);
+	*st = s;
+	return 0;
+}
+
+/**************************************************************************
+*
+* Function    : dtx_enc_reset
+*
+**************************************************************************/
+Word16 dtx_enc_reset(dtx_encState * st, Word16 isf_init[])
+{
+	Word32 i;
+
+	if (st == (dtx_encState *) NULL)
+	{
+		fprintf(stderr, "dtx_enc_reset: invalid parameter\n");
+		return -1;
+	}
+	st->hist_ptr = 0;                      
+	st->log_en_index = 0;                  
+
+	/* Init isf_hist[] */
+	for (i = 0; i < DTX_HIST_SIZE; i++)
+	{
+		Copy(isf_init, &st->isf_hist[i * M], M);
+	}
+	st->cng_seed = RANDOM_INITSEED;       
+
+	/* Reset energy history */
+	Set_zero(st->log_en_hist, DTX_HIST_SIZE);
+
+	st->dtxHangoverCount = DTX_HANG_CONST; 
+	st->decAnaElapsedCount = 32767;        
+
+	for (i = 0; i < 28; i++)
+	{
+		st->D[i] = 0;                      
+	}
+
+	for (i = 0; i < DTX_HIST_SIZE - 1; i++)
+	{
+		st->sumD[i] = 0;                   
+	}
+
+	return 1;
+}
+
+/**************************************************************************
+*
+* Function    : dtx_enc_exit
+*
+**************************************************************************/
+void dtx_enc_exit(dtx_encState ** st, VO_MEM_OPERATOR *pMemOP)
+{
+	if (st == NULL || *st == NULL)
+		return;
+	/* deallocate memory */
+	mem_free(pMemOP, *st, VO_INDEX_ENC_AMRWB);
+	*st = NULL;
+	return;
+}
+
+
+/**************************************************************************
+*
+* Function    : dtx_enc
+*
+**************************************************************************/
+Word16 dtx_enc(
+		dtx_encState * st,                    /* i/o : State struct                                         */
+		Word16 isf[M],                        /* o   : CN ISF vector                                        */
+		Word16 * exc2,                        /* o   : CN excitation                                        */
+		Word16 ** prms
+	      )
+{
+	Word32 i, j;
+	Word16 indice[7];
+	Word16 log_en, gain, level, exp, exp0, tmp;
+	Word16 log_en_int_e, log_en_int_m;
+	Word32 L_isf[M], ener32, level32;
+	Word16 isf_order[3];
+	Word16 CN_dith;
+
+	/* VOX mode computation of SID parameters */
+	log_en = 0;
+	for (i = 0; i < M; i++)
+	{
+		L_isf[i] = 0;
+	}
+	/* average energy and isf */
+	for (i = 0; i < DTX_HIST_SIZE; i++)
+	{
+		/* Division by DTX_HIST_SIZE = 8 has been done in dtx_buffer. log_en is in Q10 */
+		log_en = add(log_en, st->log_en_hist[i]);
+
+	}
+	find_frame_indices(st->isf_hist, isf_order, st);
+	aver_isf_history(st->isf_hist, isf_order, L_isf);
+
+	for (j = 0; j < M; j++)
+	{
+		isf[j] = (Word16)(L_isf[j] >> 3);  /* divide by 8 */
+	}
+
+	/* quantize logarithmic energy to 6 bits (-6 : 66 dB) which corresponds to -2:22 in log2(E).  */
+	/* st->log_en_index = (short)( (log_en + 2.0) * 2.625 ); */
+
+	/* increase dynamics to 7 bits (Q8) */
+	log_en = (log_en >> 2);
+
+	/* Add 2 in Q8 = 512 to get log2(E) between 0:24 */
+	log_en = add(log_en, 512);
+
+	/* Multiply by 2.625 to get full 6 bit range. 2.625 = 21504 in Q13. The result is in Q6 */
+	log_en = mult(log_en, 21504);
+
+	/* Quantize Energy */
+	st->log_en_index = shr(log_en, 6);
+
+	if(st->log_en_index > 63)
+	{
+		st->log_en_index = 63;
+	}
+	if (st->log_en_index < 0)
+	{
+		st->log_en_index = 0;
+	}
+	/* Quantize ISFs */
+	Qisf_ns(isf, isf, indice);
+
+
+	Parm_serial(indice[0], 6, prms);
+	Parm_serial(indice[1], 6, prms);
+	Parm_serial(indice[2], 6, prms);
+	Parm_serial(indice[3], 5, prms);
+	Parm_serial(indice[4], 5, prms);
+
+	Parm_serial((st->log_en_index), 6, prms);
+
+	CN_dith = dithering_control(st);
+	Parm_serial(CN_dith, 1, prms);
+
+	/* level = (float)( pow( 2.0f, (float)st->log_en_index / 2.625 - 2.0 ) );    */
+	/* log2(E) in Q9 (log2(E) lies in between -2:22) */
+	log_en = shl(st->log_en_index, 15 - 6);
+
+	/* Divide by 2.625; log_en will be between 0:24  */
+	log_en = mult(log_en, 12483);
+	/* the result corresponds to log2(gain) in Q10 */
+
+	/* Find integer part  */
+	log_en_int_e = (log_en >> 10);
+
+	/* Find fractional part */
+	log_en_int_m = (Word16) (log_en & 0x3ff);
+	log_en_int_m = shl(log_en_int_m, 5);
+
+	/* Subtract 2 from log_en in Q9, i.e divide the gain by 2 (energy by 4) */
+	/* Add 16 in order to have the result of pow2 in Q16 */
+	log_en_int_e = add(log_en_int_e, 16 - 1);
+
+	level32 = Pow2(log_en_int_e, log_en_int_m); /* Q16 */
+	exp0 = norm_l(level32);
+	level32 = (level32 << exp0);        /* level in Q31 */
+	exp0 = (15 - exp0);
+	level = extract_h(level32);            /* level in Q15 */
+
+	/* generate white noise vector */
+	for (i = 0; i < L_FRAME; i++)
+	{
+		exc2[i] = (Random(&(st->cng_seed)) >> 4);
+	}
+
+	/* gain = level / sqrt(ener) * sqrt(L_FRAME) */
+
+	/* energy of generated excitation */
+	ener32 = Dot_product12(exc2, exc2, L_FRAME, &exp);
+
+	Isqrt_n(&ener32, &exp);
+
+	gain = extract_h(ener32);
+
+	gain = mult(level, gain);              /* gain in Q15 */
+
+	exp = add(exp0, exp);
+
+	/* Multiply by sqrt(L_FRAME)=16, i.e. shift left by 4 */
+	exp += 4;
+
+	for (i = 0; i < L_FRAME; i++)
+	{
+		tmp = mult(exc2[i], gain);         /* Q0 * Q15 */
+		exc2[i] = shl(tmp, exp); 
+	}
+
+	return 0;
+}
+
+/**************************************************************************
+*
+* Function    : dtx_buffer Purpose     : handles the DTX buffer
+*
+**************************************************************************/
+Word16 dtx_buffer(
+		dtx_encState * st,                    /* i/o : State struct                    */
+		Word16 isf_new[],                     /* i   : isf vector                      */
+		Word32 enr,                           /* i   : residual energy (in L_FRAME)    */
+		Word16 codec_mode
+		)
+{
+	Word16 log_en;
+
+	Word16 log_en_e;
+	Word16 log_en_m;
+	st->hist_ptr = add(st->hist_ptr, 1); 
+	if(st->hist_ptr == DTX_HIST_SIZE)
+	{
+		st->hist_ptr = 0;
+	}
+	/* copy lsp vector into buffer */
+	Copy(isf_new, &st->isf_hist[st->hist_ptr * M], M);
+
+	/* log_en = (float)log10(enr*0.0059322)/(float)log10(2.0f);  */
+	Log2(enr, &log_en_e, &log_en_m);
+
+	/* convert exponent and mantissa to Word16 Q7. Q7 is used to simplify averaging in dtx_enc */
+	log_en = shl(log_en_e, 7);             /* Q7 */
+	log_en = add(log_en, shr(log_en_m, 15 - 7));
+
+	/* Find energy per sample by multiplying with 0.0059322, i.e subtract log2(1/0.0059322) = 7.39722 The
+	 * constant 0.0059322 takes into account windowings and analysis length from autocorrelation
+	 * computations; 7.39722 in Q7 = 947  */
+	/* Subtract 3 dB = 0.99658 in log2(E) = 127 in Q7. */
+	/* log_en = sub( log_en, 947 + en_adjust[codec_mode] ); */
+
+	/* Find energy per sample (divide by L_FRAME=256), i.e subtract log2(256) = 8.0  (1024 in Q7) */
+	/* Subtract 3 dB = 0.99658 in log2(E) = 127 in Q7. */
+
+	log_en = sub(log_en, add(1024, en_adjust[codec_mode]));
+
+	/* Insert into the buffer */
+	st->log_en_hist[st->hist_ptr] = log_en;
+	return 0;
+}
+
+/**************************************************************************
+*
+* Function    : tx_dtx_handler Purpose     : adds extra speech hangover
+*                                            to analyze speech on
+*                                            the decoding side.
+**************************************************************************/
+void tx_dtx_handler(dtx_encState * st,     /* i/o : State struct           */
+		Word16 vad_flag,                      /* i   : vad decision           */
+		Word16 * usedMode                     /* i/o : mode changed or not    */
+		)
+{
+
+	/* this state machine is in synch with the GSMEFR txDtx machine      */
+	st->decAnaElapsedCount = add(st->decAnaElapsedCount, 1); 
+
+	if (vad_flag != 0)
+	{
+		st->dtxHangoverCount = DTX_HANG_CONST;
+	} else
+	{                                      /* non-speech */
+		if (st->dtxHangoverCount == 0)
+		{                                  /* out of decoder analysis hangover  */
+			st->decAnaElapsedCount = 0;    
+			*usedMode = MRDTX;            
+		} else
+		{                                  /* in possible analysis hangover */
+			st->dtxHangoverCount = sub(st->dtxHangoverCount, 1);
+
+			/* decAnaElapsedCount + dtxHangoverCount < DTX_ELAPSED_FRAMES_THRESH */
+			if (sub(add(st->decAnaElapsedCount, st->dtxHangoverCount),
+						DTX_ELAPSED_FRAMES_THRESH) < 0)
+			{
+				*usedMode = MRDTX;
+				/* if short time since decoder update, do not add extra HO */
+			}
+			/* else override VAD and stay in speech mode *usedMode and add extra hangover */
+		}
+	}
+
+	return;
+}
+
+
+
+static void aver_isf_history(
+		Word16 isf_old[],
+		Word16 indices[],
+		Word32 isf_aver[]
+		)
+{
+	Word32 i, j, k;
+	Word16 isf_tmp[2 * M];
+	Word32 L_tmp;
+
+	/* Memorize in isf_tmp[][] the ISF vectors to be replaced by */
+	/* the median ISF vector prior to the averaging               */
+	for (k = 0; k < 2; k++)
+	{
+		if ((indices[k] + 1) != 0)
+		{
+			for (i = 0; i < M; i++)
+			{
+				isf_tmp[k * M + i] = isf_old[indices[k] * M + i];      
+				isf_old[indices[k] * M + i] = isf_old[indices[2] * M + i];    
+			}
+		}
+	}
+
+	/* Perform the ISF averaging */
+	for (j = 0; j < M; j++)
+	{
+		L_tmp = 0;                      
+
+		for (i = 0; i < DTX_HIST_SIZE; i++)
+		{
+			L_tmp = L_add(L_tmp, L_deposit_l(isf_old[i * M + j]));
+		}
+		isf_aver[j] = L_tmp;              
+	}
+
+	/* Retrieve from isf_tmp[][] the ISF vectors saved prior to averaging */
+	for (k = 0; k < 2; k++)
+	{
+		if ((indices[k] + 1) != 0)
+		{
+			for (i = 0; i < M; i++)
+			{
+				isf_old[indices[k] * M + i] = isf_tmp[k * M + i];
+			}
+		}
+	}
+
+	return;
+}
+
+static void find_frame_indices(
+		Word16 isf_old_tx[],
+		Word16 indices[],
+		dtx_encState * st
+		)
+{
+	Word32 L_tmp, summin, summax, summax2nd;
+	Word16 i, j, tmp;
+	Word16 ptr;
+
+	/* Remove the effect of the oldest frame from the column */
+	/* sum sumD[0..DTX_HIST_SIZE-1]. sumD[DTX_HIST_SIZE] is    */
+	/* not updated since it will be removed later.           */
+
+	tmp = DTX_HIST_SIZE_MIN_ONE;           
+	j = -1;                                
+	for (i = 0; i < DTX_HIST_SIZE_MIN_ONE; i++)
+	{
+		j = add(j, tmp);
+		st->sumD[i] = L_sub(st->sumD[i], st->D[j]);     
+		tmp = sub(tmp, 1);
+	}
+
+	/* Shift the column sum sumD. The element sumD[DTX_HIST_SIZE-1]    */
+	/* corresponding to the oldest frame is removed. The sum of     */
+	/* the distances between the latest isf and other isfs, */
+	/* i.e. the element sumD[0], will be computed during this call. */
+	/* Hence this element is initialized to zero.                   */
+
+	for (i = DTX_HIST_SIZE_MIN_ONE; i > 0; i--)
+	{
+		st->sumD[i] = st->sumD[i - 1];     
+	}
+	st->sumD[0] = 0;                       
+
+	/* Remove the oldest frame from the distance matrix.           */
+	/* Note that the distance matrix is replaced by a one-         */
+	/* dimensional array to save static memory.                    */
+
+	tmp = 0;                               
+	for (i = 27; i >= 12; i = (Word16) (i - tmp))
+	{
+		tmp = add(tmp, 1);
+		for (j = tmp; j > 0; j--)
+		{
+			st->D[i - j + 1] = st->D[i - j - tmp];   
+		}
+	}
+
+	/* Compute the first column of the distance matrix D            */
+	/* (squared Euclidean distances from isf1[] to isf_old_tx[][]). */
+
+	ptr = st->hist_ptr;                 
+	for (i = 1; i < DTX_HIST_SIZE; i++)
+	{
+		/* Compute the distance between the latest isf and the other isfs. */
+		ptr = sub(ptr, 1);
+		if (ptr < 0)
+		{
+			ptr = DTX_HIST_SIZE_MIN_ONE;   
+		}
+		L_tmp = 0;                         
+		for (j = 0; j < M; j++)
+		{
+			tmp = sub(isf_old_tx[st->hist_ptr * M + j], isf_old_tx[ptr * M + j]);
+			L_tmp = L_mac(L_tmp, tmp, tmp);
+		}
+		st->D[i - 1] = L_tmp;           
+
+		/* Update also the column sums. */
+		st->sumD[0] = L_add(st->sumD[0], st->D[i - 1]); 
+		st->sumD[i] = L_add(st->sumD[i], st->D[i - 1]); 
+	}
+
+	/* Find the minimum and maximum distances */
+	summax = st->sumD[0];                  
+	summin = st->sumD[0];                  
+	indices[0] = 0;                        
+	indices[2] = 0;                        
+	for (i = 1; i < DTX_HIST_SIZE; i++)
+	{
+		if (L_sub(st->sumD[i], summax) > 0)
+		{
+			indices[0] = i;                
+			summax = st->sumD[i];          
+		}
+		if (L_sub(st->sumD[i], summin) < 0)
+		{
+			indices[2] = i;                
+			summin = st->sumD[i];          
+		}
+	}
+
+	/* Find the second largest distance */
+	summax2nd = -2147483647L;              
+	indices[1] = -1;                       
+	for (i = 0; i < DTX_HIST_SIZE; i++)
+	{
+		if ((L_sub(st->sumD[i], summax2nd) > 0) && (sub(i, indices[0]) != 0))
+		{
+			indices[1] = i;                
+			summax2nd = st->sumD[i];       
+		}
+	}
+
+	for (i = 0; i < 3; i++)
+	{
+		indices[i] = sub(st->hist_ptr, indices[i]);     
+		if (indices[i] < 0)
+		{
+			indices[i] = add(indices[i], DTX_HIST_SIZE);       
+		}
+	}
+
+	/* If maximum distance/MED_THRESH is smaller than minimum distance */
+	/* then the median ISF vector replacement is not performed         */
+	tmp = norm_l(summax);
+	summax = (summax << tmp);
+	summin = (summin << tmp);
+	L_tmp = L_mult(voround(summax), INV_MED_THRESH);
+	if(L_tmp <= summin)
+	{
+		indices[0] = -1; 
+	}
+	/* If second largest distance/MED_THRESH is smaller than     */
+	/* minimum distance then the median ISF vector replacement is    */
+	/* not performed                                                 */
+	summax2nd = L_shl(summax2nd, tmp);
+	L_tmp = L_mult(voround(summax2nd), INV_MED_THRESH);
+	if(L_tmp <= summin)
+	{
+		indices[1] = -1;                 
+	}
+	return;
+}
+
+static Word16 dithering_control(
+		dtx_encState * st
+		)
+{
+	Word16 tmp, mean, CN_dith, gain_diff;
+	Word32 i, ISF_diff;
+
+	/* determine how stationary the spectrum of background noise is */
+	ISF_diff = 0;
+	for (i = 0; i < 8; i++)
+	{
+		ISF_diff = L_add(ISF_diff, st->sumD[i]);
+	}
+	if ((ISF_diff >> 26) > 0)
+	{
+		CN_dith = 1;
+	} else
+	{
+		CN_dith = 0;
+	}
+
+	/* determine how stationary the energy of background noise is */
+	mean = 0;
+	for (i = 0; i < DTX_HIST_SIZE; i++)
+	{
+		mean = add(mean, st->log_en_hist[i]);
+	}
+	mean = (mean >> 3);
+	gain_diff = 0;
+	for (i = 0; i < DTX_HIST_SIZE; i++)
+	{
+		tmp = abs_s(sub(st->log_en_hist[i], mean));
+		gain_diff = add(gain_diff, tmp);
+	}
+	if (gain_diff > GAIN_THR)
+	{
+		CN_dith = 1;
+	}
+	return CN_dith;
+}
diff --git a/media/libstagefright/codecs/amrwbenc/src/g_pitch.c b/media/libstagefright/codecs/amrwbenc/src/g_pitch.c
index 570138e..f5112c5 100644
--- a/media/libstagefright/codecs/amrwbenc/src/g_pitch.c
+++ b/media/libstagefright/codecs/amrwbenc/src/g_pitch.c
@@ -1,79 +1,79 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*      File: g_pitch.c                                                 *

-*                                                                      *

-*	   Description:Compute the gain of pitch. Result in Q12        *

-*	               if(gain < 0) gain = 0                           *

-*				   if(gain > 1.2) gain = 1.2           *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "math_op.h"

-

-Word16 G_pitch(                            /* (o) Q14 : Gain of pitch lag saturated to 1.2   */

-		Word16 xn[],                          /* (i)     : Pitch target.                        */

-		Word16 y1[],                          /* (i)     : filtered adaptive codebook.          */

-		Word16 g_coeff[],                     /* : Correlations need for gain quantization.     */

-		Word16 L_subfr                        /* : Length of subframe.                          */

-	      )

-{

-	Word32 i;

-	Word16 xy, yy, exp_xy, exp_yy, gain;

-	/* Compute scalar product <y1[],y1[]> */

-#ifdef ASM_OPT                  /* asm optimization branch */

-	/* Compute scalar product <xn[],y1[]> */

-	xy = extract_h(Dot_product12_asm(xn, y1, L_subfr, &exp_xy));

-	yy = extract_h(Dot_product12_asm(y1, y1, L_subfr, &exp_yy));

-

-#else

-	/* Compute scalar product <xn[],y1[]> */

-	xy = extract_h(Dot_product12(xn, y1, L_subfr, &exp_xy));

-	yy = extract_h(Dot_product12(y1, y1, L_subfr, &exp_yy));

-

-#endif

-

-	g_coeff[0] = yy;                       

-	g_coeff[1] = exp_yy;                   

-	g_coeff[2] = xy;                       

-	g_coeff[3] = exp_xy;                   

-

-	/* If (xy < 0) gain = 0 */

-	if (xy < 0)

-		return ((Word16) 0);

-

-	/* compute gain = xy/yy */

-

-	xy >>= 1;                       /* Be sure xy < yy */

-	gain = div_s(xy, yy);

-

-	i = exp_xy;

-	i -= exp_yy;

-

-	gain = shl(gain, i);                   

-

-	/* if (gain > 1.2) gain = 1.2  in Q14 */

-	if(gain > 19661)

-	{

-		gain = 19661;                      

-	}

-	return (gain);

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*      File: g_pitch.c                                                 *
+*                                                                      *
+*	   Description:Compute the gain of pitch. Result in Q12        *
+*	               if(gain < 0) gain = 0                           *
+*				   if(gain > 1.2) gain = 1.2           *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+
+Word16 G_pitch(                            /* (o) Q14 : Gain of pitch lag saturated to 1.2   */
+		Word16 xn[],                          /* (i)     : Pitch target.                        */
+		Word16 y1[],                          /* (i)     : filtered adaptive codebook.          */
+		Word16 g_coeff[],                     /* : Correlations need for gain quantization.     */
+		Word16 L_subfr                        /* : Length of subframe.                          */
+	      )
+{
+	Word32 i;
+	Word16 xy, yy, exp_xy, exp_yy, gain;
+	/* Compute scalar product <y1[],y1[]> */
+#ifdef ASM_OPT                  /* asm optimization branch */
+	/* Compute scalar product <xn[],y1[]> */
+	xy = extract_h(Dot_product12_asm(xn, y1, L_subfr, &exp_xy));
+	yy = extract_h(Dot_product12_asm(y1, y1, L_subfr, &exp_yy));
+
+#else
+	/* Compute scalar product <xn[],y1[]> */
+	xy = extract_h(Dot_product12(xn, y1, L_subfr, &exp_xy));
+	yy = extract_h(Dot_product12(y1, y1, L_subfr, &exp_yy));
+
+#endif
+
+	g_coeff[0] = yy;                       
+	g_coeff[1] = exp_yy;                   
+	g_coeff[2] = xy;                       
+	g_coeff[3] = exp_xy;                   
+
+	/* If (xy < 0) gain = 0 */
+	if (xy < 0)
+		return ((Word16) 0);
+
+	/* compute gain = xy/yy */
+
+	xy >>= 1;                       /* Be sure xy < yy */
+	gain = div_s(xy, yy);
+
+	i = exp_xy;
+	i -= exp_yy;
+
+	gain = shl(gain, i);                   
+
+	/* if (gain > 1.2) gain = 1.2  in Q14 */
+	if(gain > 19661)
+	{
+		gain = 19661;                      
+	}
+	return (gain);
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/gpclip.c b/media/libstagefright/codecs/amrwbenc/src/gpclip.c
index e23f2f4..24158e3 100644
--- a/media/libstagefright/codecs/amrwbenc/src/gpclip.c
+++ b/media/libstagefright/codecs/amrwbenc/src/gpclip.c
@@ -1,110 +1,110 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/**************************************************************************

-*      File: gpclip.c                                                     *

-*                                                                         *

-*      Description:To avoid unstable synthesis on frame erasure, the gain *

-*      need to be limited(gain pitch < 1.0) when the following            *

-*      case occurs                                                        *

-*      a resonance on LPC filter(lp_disp < 60Hz)                          *

-*      a good pitch prediction (lp_gp > 0.95)                             *

-*                                                                         *   

-***************************************************************************/

-#include "typedef.h"

-#include "basic_op.h"

-

-#define DIST_ISF_MAX    307                /* 120 Hz (6400Hz=16384) */

-#define DIST_ISF_THRES  154                /* 60     (6400Hz=16384) */

-#define GAIN_PIT_THRES  14746              /* 0.9 in Q14 */

-#define GAIN_PIT_MIN    9830               /* 0.6 in Q14 */

-#define M               16

-

-

-void Init_gp_clip(

-		Word16 mem[]                          /* (o) : memory of gain of pitch clipping algorithm */

-		)

-{

-	mem[0] = DIST_ISF_MAX;                 

-	mem[1] = GAIN_PIT_MIN;                 

-}

-

-

-Word16 Gp_clip(

-		Word16 mem[]                          /* (i/o) : memory of gain of pitch clipping algorithm */

-	      )

-{

-	Word16 clip = 0;

-	if ((mem[0] < DIST_ISF_THRES) && (mem[1] > GAIN_PIT_THRES))

-		clip = 1;                          

-

-	return (clip);

-}

-

-

-void Gp_clip_test_isf(

-		Word16 isf[],                         /* (i)   : isf values (in frequency domain)           */

-		Word16 mem[]                          /* (i/o) : memory of gain of pitch clipping algorithm */

-		)

-{

-	Word16 dist, dist_min;

-	Word32 i;

-

-	dist_min = vo_sub(isf[1], isf[0]);

-

-	for (i = 2; i < M - 1; i++)

-	{

-		dist = vo_sub(isf[i], isf[i - 1]);

-		if(dist < dist_min)

-		{

-			dist_min = dist;               

-		}

-	}

-

-	dist = extract_h(L_mac(vo_L_mult(26214, mem[0]), 6554, dist_min));

-

-	if (dist > DIST_ISF_MAX)

-	{

-		dist = DIST_ISF_MAX;               

-	}

-	mem[0] = dist;                        

-

-	return;

-}

-

-

-void Gp_clip_test_gain_pit(

-		Word16 gain_pit,                      /* (i) Q14 : gain of quantized pitch                    */

-		Word16 mem[]                          /* (i/o)   : memory of gain of pitch clipping algorithm */

-		)

-{

-	Word16 gain;

-	Word32 L_tmp;

-	L_tmp = (29491 * mem[1])<<1;

-	L_tmp += (3277 * gain_pit)<<1;

-

-	gain = extract_h(L_tmp);

-

-	if(gain < GAIN_PIT_MIN)

-	{

-		gain = GAIN_PIT_MIN;              

-	}

-	mem[1] = gain;                         

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/**************************************************************************
+*      File: gpclip.c                                                     *
+*                                                                         *
+*      Description:To avoid unstable synthesis on frame erasure, the gain *
+*      need to be limited(gain pitch < 1.0) when the following            *
+*      case occurs                                                        *
+*      a resonance on LPC filter(lp_disp < 60Hz)                          *
+*      a good pitch prediction (lp_gp > 0.95)                             *
+*                                                                         *   
+***************************************************************************/
+#include "typedef.h"
+#include "basic_op.h"
+
+#define DIST_ISF_MAX    307                /* 120 Hz (6400Hz=16384) */
+#define DIST_ISF_THRES  154                /* 60     (6400Hz=16384) */
+#define GAIN_PIT_THRES  14746              /* 0.9 in Q14 */
+#define GAIN_PIT_MIN    9830               /* 0.6 in Q14 */
+#define M               16
+
+
+void Init_gp_clip(
+		Word16 mem[]                          /* (o) : memory of gain of pitch clipping algorithm */
+		)
+{
+	mem[0] = DIST_ISF_MAX;                 
+	mem[1] = GAIN_PIT_MIN;                 
+}
+
+
+Word16 Gp_clip(
+		Word16 mem[]                          /* (i/o) : memory of gain of pitch clipping algorithm */
+	      )
+{
+	Word16 clip = 0;
+	if ((mem[0] < DIST_ISF_THRES) && (mem[1] > GAIN_PIT_THRES))
+		clip = 1;                          
+
+	return (clip);
+}
+
+
+void Gp_clip_test_isf(
+		Word16 isf[],                         /* (i)   : isf values (in frequency domain)           */
+		Word16 mem[]                          /* (i/o) : memory of gain of pitch clipping algorithm */
+		)
+{
+	Word16 dist, dist_min;
+	Word32 i;
+
+	dist_min = vo_sub(isf[1], isf[0]);
+
+	for (i = 2; i < M - 1; i++)
+	{
+		dist = vo_sub(isf[i], isf[i - 1]);
+		if(dist < dist_min)
+		{
+			dist_min = dist;               
+		}
+	}
+
+	dist = extract_h(L_mac(vo_L_mult(26214, mem[0]), 6554, dist_min));
+
+	if (dist > DIST_ISF_MAX)
+	{
+		dist = DIST_ISF_MAX;               
+	}
+	mem[0] = dist;                        
+
+	return;
+}
+
+
+void Gp_clip_test_gain_pit(
+		Word16 gain_pit,                      /* (i) Q14 : gain of quantized pitch                    */
+		Word16 mem[]                          /* (i/o)   : memory of gain of pitch clipping algorithm */
+		)
+{
+	Word16 gain;
+	Word32 L_tmp;
+	L_tmp = (29491 * mem[1])<<1;
+	L_tmp += (3277 * gain_pit)<<1;
+
+	gain = extract_h(L_tmp);
+
+	if(gain < GAIN_PIT_MIN)
+	{
+		gain = GAIN_PIT_MIN;              
+	}
+	mem[1] = gain;                         
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/homing.c b/media/libstagefright/codecs/amrwbenc/src/homing.c
index 015633f..565040f 100644
--- a/media/libstagefright/codecs/amrwbenc/src/homing.c
+++ b/media/libstagefright/codecs/amrwbenc/src/homing.c
@@ -1,46 +1,46 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*       File: homing.c                                                 *

-*                                                                      *

-*       Description:Performs the homing routines                       *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "cnst.h"

-#include "basic_op.h"

-#include "bits.h"

-#include "homing.tab"

-

-Word16 encoder_homing_frame_test(Word16 input_frame[])

-{

-	Word32 i;

-	Word16 j = 0;

-

-	/* check 320 input samples for matching EHF_MASK: defined in e_homing.h */

-	for (i = 0; i < L_FRAME16k; i++)

-	{

-		j = (Word16) (input_frame[i] ^ EHF_MASK);

-

-		if (j)

-			break;

-	}

-

-	return (Word16) (!j);

-}

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*       File: homing.c                                                 *
+*                                                                      *
+*       Description:Performs the homing routines                       *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "cnst.h"
+#include "basic_op.h"
+#include "bits.h"
+#include "homing.tab"
+
+Word16 encoder_homing_frame_test(Word16 input_frame[])
+{
+	Word32 i;
+	Word16 j = 0;
+
+	/* check 320 input samples for matching EHF_MASK: defined in e_homing.h */
+	for (i = 0; i < L_FRAME16k; i++)
+	{
+		j = (Word16) (input_frame[i] ^ EHF_MASK);
+
+		if (j)
+			break;
+	}
+
+	return (Word16) (!j);
+}
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/hp400.c b/media/libstagefright/codecs/amrwbenc/src/hp400.c
index 463a53a..fa66f1a 100644
--- a/media/libstagefright/codecs/amrwbenc/src/hp400.c
+++ b/media/libstagefright/codecs/amrwbenc/src/hp400.c
@@ -1,106 +1,106 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*      File: hp400.c                                                    *

-*                                                                       *

-*      Description:                                                     *

-* 2nd order high pass filter with cut off frequency at 400 Hz.          *

-* Designed with cheby2 function in MATLAB.                              *

-* Optimized for fixed-point to get the following frequency response:    *

-*                                                                       *

-*  frequency:     0Hz   100Hz  200Hz  300Hz  400Hz  630Hz  1.5kHz  3kHz *

-*  dB loss:     -infdB  -30dB  -20dB  -10dB  -3dB   +6dB    +1dB    0dB *

-*                                                                       *

-* Algorithm:                                                            *

-*                                                                       *

-*  y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2]                         *

-*                   + a[1]*y[i-1] + a[2]*y[i-2];                        *

-*                                                                       *

-*  Word16 b[3] = {3660, -7320,  3660};       in Q12                     *

-*  Word16 a[3] = {4096,  7320, -3540};       in Q12                     *

-*                                                                       *

-*  float -->   b[3] = {0.893554687, -1.787109375,  0.893554687};        *

-*              a[3] = {1.000000000,  1.787109375, -0.864257812};        *

-*                                                                       *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "oper_32b.h"

-#include "acelp.h"

-

-/* filter coefficients  */

-static Word16 b[3] = {915, -1830, 915};         /* Q12 (/4) */

-static Word16 a[3] = {16384, 29280, -14160};    /* Q12 (x4) */

-/* Initialization of static values */

-

-void Init_HP400_12k8(Word16 mem[])

-{

-	Set_zero(mem, 6);

-}

-

-

-void HP400_12k8(

-		Word16 signal[],                      /* input signal / output is divided by 16 */

-		Word16 lg,                            /* lenght of signal    */

-		Word16 mem[]                          /* filter memory [6]   */

-	       )

-{

-	Word16  x2;

-	Word16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1;

-	Word32 L_tmp;

-	Word32 num;

-	y2_hi = *mem++;

-	y2_lo = *mem++;

-	y1_hi = *mem++;

-	y1_lo = *mem++;

-	x0 = *mem++;   

-	x1 = *mem;   

-	num = (Word32)lg;

-	do

-	{

-		x2 = x1;

-		x1 = x0;

-		x0 = *signal;

-		/* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2]  */

-		/* + a[1]*y[i-1] + a[2] * y[i-2];  */

-		L_tmp = 8192L;                    /* rounding to maximise precision */

-		L_tmp += y1_lo * a[1];

-		L_tmp += y2_lo * a[2];

-		L_tmp = L_tmp >> 14;

-		L_tmp += (y1_hi * a[1] + y2_hi * a[2] + (x0 + x2)* b[0] + x1 * b[1]) << 1;

-		L_tmp <<= 1;           /* coeff Q12 --> Q13 */

-		y2_hi = y1_hi;

-		y2_lo = y1_lo;

-		y1_hi = (Word16)(L_tmp>>16);

-		y1_lo = (Word16)((L_tmp & 0xffff)>>1);

-

-		/* signal is divided by 16 to avoid overflow in energy computation */

-		*signal++ = (L_tmp + 0x8000) >> 16;

-	}while(--num !=0);

-

-	*mem-- = x1;

-	*mem-- = x0;

-	*mem-- = y1_lo;

-	*mem-- = y1_hi;

-	*mem-- = y2_lo;

-	*mem   = y2_hi;  

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*      File: hp400.c                                                    *
+*                                                                       *
+*      Description:                                                     *
+* 2nd order high pass filter with cut off frequency at 400 Hz.          *
+* Designed with cheby2 function in MATLAB.                              *
+* Optimized for fixed-point to get the following frequency response:    *
+*                                                                       *
+*  frequency:     0Hz   100Hz  200Hz  300Hz  400Hz  630Hz  1.5kHz  3kHz *
+*  dB loss:     -infdB  -30dB  -20dB  -10dB  -3dB   +6dB    +1dB    0dB *
+*                                                                       *
+* Algorithm:                                                            *
+*                                                                       *
+*  y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2]                         *
+*                   + a[1]*y[i-1] + a[2]*y[i-2];                        *
+*                                                                       *
+*  Word16 b[3] = {3660, -7320,  3660};       in Q12                     *
+*  Word16 a[3] = {4096,  7320, -3540};       in Q12                     *
+*                                                                       *
+*  float -->   b[3] = {0.893554687, -1.787109375,  0.893554687};        *
+*              a[3] = {1.000000000,  1.787109375, -0.864257812};        *
+*                                                                       *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "acelp.h"
+
+/* filter coefficients  */
+static Word16 b[3] = {915, -1830, 915};         /* Q12 (/4) */
+static Word16 a[3] = {16384, 29280, -14160};    /* Q12 (x4) */
+/* Initialization of static values */
+
+void Init_HP400_12k8(Word16 mem[])
+{
+	Set_zero(mem, 6);
+}
+
+
+void HP400_12k8(
+		Word16 signal[],                      /* input signal / output is divided by 16 */
+		Word16 lg,                            /* lenght of signal    */
+		Word16 mem[]                          /* filter memory [6]   */
+	       )
+{
+	Word16  x2;
+	Word16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1;
+	Word32 L_tmp;
+	Word32 num;
+	y2_hi = *mem++;
+	y2_lo = *mem++;
+	y1_hi = *mem++;
+	y1_lo = *mem++;
+	x0 = *mem++;   
+	x1 = *mem;   
+	num = (Word32)lg;
+	do
+	{
+		x2 = x1;
+		x1 = x0;
+		x0 = *signal;
+		/* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2]  */
+		/* + a[1]*y[i-1] + a[2] * y[i-2];  */
+		L_tmp = 8192L;                    /* rounding to maximise precision */
+		L_tmp += y1_lo * a[1];
+		L_tmp += y2_lo * a[2];
+		L_tmp = L_tmp >> 14;
+		L_tmp += (y1_hi * a[1] + y2_hi * a[2] + (x0 + x2)* b[0] + x1 * b[1]) << 1;
+		L_tmp <<= 1;           /* coeff Q12 --> Q13 */
+		y2_hi = y1_hi;
+		y2_lo = y1_lo;
+		y1_hi = (Word16)(L_tmp>>16);
+		y1_lo = (Word16)((L_tmp & 0xffff)>>1);
+
+		/* signal is divided by 16 to avoid overflow in energy computation */
+		*signal++ = (L_tmp + 0x8000) >> 16;
+	}while(--num !=0);
+
+	*mem-- = x1;
+	*mem-- = x0;
+	*mem-- = y1_lo;
+	*mem-- = y1_hi;
+	*mem-- = y2_lo;
+	*mem   = y2_hi;  
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/hp50.c b/media/libstagefright/codecs/amrwbenc/src/hp50.c
index 53e3d7b..36dd1f1 100644
--- a/media/libstagefright/codecs/amrwbenc/src/hp50.c
+++ b/media/libstagefright/codecs/amrwbenc/src/hp50.c
@@ -1,106 +1,106 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*      File: hp50.c                                                     *

-*                                                                       *

-*	   Description:                                                 *

-* 2nd order high pass filter with cut off frequency at 31 Hz.           *

-* Designed with cheby2 function in MATLAB.                              *

-* Optimized for fixed-point to get the following frequency response:    *

-*                                                                       *

-*  frequency:     0Hz    14Hz  24Hz   31Hz   37Hz   41Hz   47Hz         *

-*  dB loss:     -infdB  -15dB  -6dB   -3dB  -1.5dB  -1dB  -0.5dB        *

-*                                                                       *

-* Algorithm:                                                            *

-*                                                                       *

-*  y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2]                         *

-*                   + a[1]*y[i-1] + a[2]*y[i-2];                        *

-*                                                                       *

-*  Word16 b[3] = {4053, -8106, 4053};       in Q12                      *

-*  Word16 a[3] = {8192, 16211, -8021};       in Q12                     *

-*                                                                       *

-*  float -->   b[3] = {0.989501953, -1.979003906,  0.989501953};        *

-*              a[3] = {1.000000000,  1.978881836, -0.979125977};        *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "oper_32b.h"

-#include "cnst.h"

-#include "acelp.h"

-

-/* filter coefficients  */

-static Word16 b[3] = {4053, -8106, 4053};  /* Q12 */

-static Word16 a[3] = {8192, 16211, -8021}; /* Q12 (x2) */

-

-/* Initialization of static values */

-

-void Init_HP50_12k8(Word16 mem[])

-{

-	Set_zero(mem, 6);

-}

-

-

-void HP50_12k8(

-		Word16 signal[],                      /* input/output signal */

-		Word16 lg,                            /* lenght of signal    */

-		Word16 mem[]                          /* filter memory [6]   */

-	      )

-{

-	Word16 x2;

-	Word16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1;

-	Word32 L_tmp;

-	Word32 num;

-

-	y2_hi = *mem++;

-	y2_lo = *mem++;

-	y1_hi = *mem++;

-	y1_lo = *mem++;

-	x0 = *mem++;   

-	x1 = *mem;

-	num = (Word32)lg;

-	do

-	{

-		x2 = x1;

-		x1 = x0;

-		x0 = *signal;

-		/* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2]  */

-		/* + a[1]*y[i-1] + a[2] * y[i-2];  */

-		L_tmp = 8192 ;                    /* rounding to maximise precision */

-		L_tmp += y1_lo * a[1];

-		L_tmp += y2_lo * a[2];

-		L_tmp = L_tmp >> 14;

-		L_tmp += (y1_hi * a[1] + y2_hi * a[2] + (x0 + x2) * b[0] + x1 * b[1]) << 1;

-		L_tmp <<= 2;           /* coeff Q12 --> Q13 */

-		y2_hi = y1_hi;

-		y2_lo = y1_lo;

-		y1_hi = (Word16)(L_tmp>>16);

-		y1_lo = (Word16)((L_tmp & 0xffff)>>1);

-		*signal++ = extract_h((L_add((L_tmp<<1), 0x8000)));

-	}while(--num !=0);

-

-	*mem-- = x1;

-	*mem-- = x0;

-	*mem-- = y1_lo;

-	*mem-- = y1_hi;

-	*mem-- = y2_lo;

-	*mem-- = y2_hi;  

-

-	return;

-}

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*      File: hp50.c                                                     *
+*                                                                       *
+*	   Description:                                                 *
+* 2nd order high pass filter with cut off frequency at 31 Hz.           *
+* Designed with cheby2 function in MATLAB.                              *
+* Optimized for fixed-point to get the following frequency response:    *
+*                                                                       *
+*  frequency:     0Hz    14Hz  24Hz   31Hz   37Hz   41Hz   47Hz         *
+*  dB loss:     -infdB  -15dB  -6dB   -3dB  -1.5dB  -1dB  -0.5dB        *
+*                                                                       *
+* Algorithm:                                                            *
+*                                                                       *
+*  y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2]                         *
+*                   + a[1]*y[i-1] + a[2]*y[i-2];                        *
+*                                                                       *
+*  Word16 b[3] = {4053, -8106, 4053};       in Q12                      *
+*  Word16 a[3] = {8192, 16211, -8021};       in Q12                     *
+*                                                                       *
+*  float -->   b[3] = {0.989501953, -1.979003906,  0.989501953};        *
+*              a[3] = {1.000000000,  1.978881836, -0.979125977};        *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "cnst.h"
+#include "acelp.h"
+
+/* filter coefficients  */
+static Word16 b[3] = {4053, -8106, 4053};  /* Q12 */
+static Word16 a[3] = {8192, 16211, -8021}; /* Q12 (x2) */
+
+/* Initialization of static values */
+
+void Init_HP50_12k8(Word16 mem[])
+{
+	Set_zero(mem, 6);
+}
+
+
+void HP50_12k8(
+		Word16 signal[],                      /* input/output signal */
+		Word16 lg,                            /* lenght of signal    */
+		Word16 mem[]                          /* filter memory [6]   */
+	      )
+{
+	Word16 x2;
+	Word16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1;
+	Word32 L_tmp;
+	Word32 num;
+
+	y2_hi = *mem++;
+	y2_lo = *mem++;
+	y1_hi = *mem++;
+	y1_lo = *mem++;
+	x0 = *mem++;   
+	x1 = *mem;
+	num = (Word32)lg;
+	do
+	{
+		x2 = x1;
+		x1 = x0;
+		x0 = *signal;
+		/* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2]  */
+		/* + a[1]*y[i-1] + a[2] * y[i-2];  */
+		L_tmp = 8192 ;                    /* rounding to maximise precision */
+		L_tmp += y1_lo * a[1];
+		L_tmp += y2_lo * a[2];
+		L_tmp = L_tmp >> 14;
+		L_tmp += (y1_hi * a[1] + y2_hi * a[2] + (x0 + x2) * b[0] + x1 * b[1]) << 1;
+		L_tmp <<= 2;           /* coeff Q12 --> Q13 */
+		y2_hi = y1_hi;
+		y2_lo = y1_lo;
+		y1_hi = (Word16)(L_tmp>>16);
+		y1_lo = (Word16)((L_tmp & 0xffff)>>1);
+		*signal++ = extract_h((L_add((L_tmp<<1), 0x8000)));
+	}while(--num !=0);
+
+	*mem-- = x1;
+	*mem-- = x0;
+	*mem-- = y1_lo;
+	*mem-- = y1_hi;
+	*mem-- = y2_lo;
+	*mem-- = y2_hi;  
+
+	return;
+}
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/hp6k.c b/media/libstagefright/codecs/amrwbenc/src/hp6k.c
index 5ee5b20..578633a 100644
--- a/media/libstagefright/codecs/amrwbenc/src/hp6k.c
+++ b/media/libstagefright/codecs/amrwbenc/src/hp6k.c
@@ -1,93 +1,93 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*       File: hp6k.c                                                    *

-*                                                                       *

-*	Description:15th order band pass 6kHz to 7kHz FIR filter        *

-*       frequency: 4kHz   5kHz  5.5kHz  6kHz  6.5kHz  7kHz 7.5kHz 8kHz  *

-*	dB loss:  -60dB  -45dB  -13dB   -3dB   0dB    -3dB -13dB  -45dB *

-*	                                                                *                                                                 

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "acelp.h"

-#include "cnst.h"

-

-#define L_FIR 31

-

-/* filter coefficients (gain=4.0) */

-

-Word16 fir_6k_7k[L_FIR] =

-{

-	-32, 47, 32, -27, -369,

-	1122, -1421, 0, 3798, -8880,

-	12349, -10984, 3548, 7766, -18001,

-	22118, -18001, 7766, 3548, -10984,

-	12349, -8880, 3798, 0, -1421,

-	1122, -369, -27, 32, 47,

-	-32

-};

-

-

-void Init_Filt_6k_7k(Word16 mem[])         /* mem[30] */

-{

-	Set_zero(mem, L_FIR - 1);

-	return;

-}

-

-void Filt_6k_7k(

-		Word16 signal[],                      /* input:  signal                  */

-		Word16 lg,                            /* input:  length of input         */

-		Word16 mem[]                          /* in/out: memory (size=30)        */

-	       )

-{

-	Word16 x[L_SUBFR16k + (L_FIR - 1)];

-	Word32 i, L_tmp;

-

-	Copy(mem, x, L_FIR - 1);

-	for (i = lg - 1; i >= 0; i--)

-	{

-		x[i + L_FIR - 1] = signal[i] >> 2;                         /* gain of filter = 4 */

-	}	

-	for (i = 0; i < lg; i++)

-	{

-		L_tmp =  (x[i] + x[i+ 30]) * fir_6k_7k[0];

-		L_tmp += (x[i+1] + x[i + 29]) * fir_6k_7k[1];

-		L_tmp += (x[i+2] + x[i + 28]) * fir_6k_7k[2];

-		L_tmp += (x[i+3] + x[i + 27]) * fir_6k_7k[3];

-		L_tmp += (x[i+4] + x[i + 26]) * fir_6k_7k[4];

-		L_tmp += (x[i+5] + x[i + 25]) * fir_6k_7k[5];

-		L_tmp += (x[i+6] + x[i + 24]) * fir_6k_7k[6];

-		L_tmp += (x[i+7] + x[i + 23]) * fir_6k_7k[7];

-		L_tmp += (x[i+8] + x[i + 22]) * fir_6k_7k[8];

-		L_tmp += (x[i+9] + x[i + 21]) * fir_6k_7k[9];

-		L_tmp += (x[i+10] + x[i + 20]) * fir_6k_7k[10];

-		L_tmp += (x[i+11] + x[i + 19]) * fir_6k_7k[11];

-		L_tmp += (x[i+12] + x[i + 18]) * fir_6k_7k[12];

-		L_tmp += (x[i+13] + x[i + 17]) * fir_6k_7k[13];

-		L_tmp += (x[i+14] + x[i + 16]) * fir_6k_7k[14];

-		L_tmp += (x[i+15]) * fir_6k_7k[15];

-		signal[i] = (L_tmp + 0x4000) >> 15;

-	}

-

-	Copy(x + lg, mem, L_FIR - 1);

-

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*       File: hp6k.c                                                    *
+*                                                                       *
+*	Description:15th order band pass 6kHz to 7kHz FIR filter        *
+*       frequency: 4kHz   5kHz  5.5kHz  6kHz  6.5kHz  7kHz 7.5kHz 8kHz  *
+*	dB loss:  -60dB  -45dB  -13dB   -3dB   0dB    -3dB -13dB  -45dB *
+*	                                                                *                                                                 
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "acelp.h"
+#include "cnst.h"
+
+#define L_FIR 31
+
+/* filter coefficients (gain=4.0) */
+
+Word16 fir_6k_7k[L_FIR] =
+{
+	-32, 47, 32, -27, -369,
+	1122, -1421, 0, 3798, -8880,
+	12349, -10984, 3548, 7766, -18001,
+	22118, -18001, 7766, 3548, -10984,
+	12349, -8880, 3798, 0, -1421,
+	1122, -369, -27, 32, 47,
+	-32
+};
+
+
+void Init_Filt_6k_7k(Word16 mem[])         /* mem[30] */
+{
+	Set_zero(mem, L_FIR - 1);
+	return;
+}
+
+void Filt_6k_7k(
+		Word16 signal[],                      /* input:  signal                  */
+		Word16 lg,                            /* input:  length of input         */
+		Word16 mem[]                          /* in/out: memory (size=30)        */
+	       )
+{
+	Word16 x[L_SUBFR16k + (L_FIR - 1)];
+	Word32 i, L_tmp;
+
+	Copy(mem, x, L_FIR - 1);
+	for (i = lg - 1; i >= 0; i--)
+	{
+		x[i + L_FIR - 1] = signal[i] >> 2;                         /* gain of filter = 4 */
+	}	
+	for (i = 0; i < lg; i++)
+	{
+		L_tmp =  (x[i] + x[i+ 30]) * fir_6k_7k[0];
+		L_tmp += (x[i+1] + x[i + 29]) * fir_6k_7k[1];
+		L_tmp += (x[i+2] + x[i + 28]) * fir_6k_7k[2];
+		L_tmp += (x[i+3] + x[i + 27]) * fir_6k_7k[3];
+		L_tmp += (x[i+4] + x[i + 26]) * fir_6k_7k[4];
+		L_tmp += (x[i+5] + x[i + 25]) * fir_6k_7k[5];
+		L_tmp += (x[i+6] + x[i + 24]) * fir_6k_7k[6];
+		L_tmp += (x[i+7] + x[i + 23]) * fir_6k_7k[7];
+		L_tmp += (x[i+8] + x[i + 22]) * fir_6k_7k[8];
+		L_tmp += (x[i+9] + x[i + 21]) * fir_6k_7k[9];
+		L_tmp += (x[i+10] + x[i + 20]) * fir_6k_7k[10];
+		L_tmp += (x[i+11] + x[i + 19]) * fir_6k_7k[11];
+		L_tmp += (x[i+12] + x[i + 18]) * fir_6k_7k[12];
+		L_tmp += (x[i+13] + x[i + 17]) * fir_6k_7k[13];
+		L_tmp += (x[i+14] + x[i + 16]) * fir_6k_7k[14];
+		L_tmp += (x[i+15]) * fir_6k_7k[15];
+		signal[i] = (L_tmp + 0x4000) >> 15;
+	}
+
+	Copy(x + lg, mem, L_FIR - 1);
+
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c b/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c
index 7fb62a4..3510272 100644
--- a/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c
+++ b/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c
@@ -1,148 +1,148 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*       File: hp_wsp.c                                                  *

-*       Description:                                                    *

-*       3nd order high pass filter with cut off frequency at 180Hz      *

-* Algorithm:                                                            *

-*                                                                       *

-*  y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] + b[3]*x[i-3]           *

-*                   + a[1]*y[i-1] + a[2]*y[i-2] + a[3]*y[i-3];          *

-*                                                                       *

-* float a_coef[HP_ORDER]= {                                             *

-*    -2.64436711600664f,                                                *

-*    2.35087386625360f,                                                 *

-*   -0.70001156927424f};                                                *

-*                                                                       *

-* float b_coef[HP_ORDER+1]= {                                           *

-*     -0.83787057505665f,                                               *

-*    2.50975570071058f,                                                 *

-*   -2.50975570071058f,                                                 *

-*    0.83787057505665f};                                                *

-*                                                                       *

-*************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "oper_32b.h"

-#include "acelp.h"

-

-/* filter coefficients in Q12 */

-static Word16 a[4] = {8192, 21663, -19258, 5734};

-static Word16 b[4] = {-3432, +10280, -10280, +3432};

-

-/* Initialization of static values */

-void Init_Hp_wsp(Word16 mem[])

-{

-	Set_zero(mem, 9);

-

-	return;

-}

-

-void scale_mem_Hp_wsp(Word16 mem[], Word16 exp)

-{

-	Word32 i;

-	Word32 L_tmp;

-

-	for (i = 0; i < 6; i += 2)

-	{

-		L_tmp = ((mem[i] << 16) + (mem[i + 1]<<1));

-		L_tmp = L_shl(L_tmp, exp);

-		mem[i] = L_tmp >> 16;

-		mem[i + 1] = (L_tmp & 0xffff)>>1;

-	}

-

-	for (i = 6; i < 9; i++)

-	{

-		L_tmp = L_deposit_h(mem[i]);       /* x[i] */

-		L_tmp = L_shl(L_tmp, exp);

-		mem[i] = vo_round(L_tmp);

-	}

-

-	return;

-}

-

-

-void Hp_wsp(

-		Word16 wsp[],                         /* i   : wsp[]  signal       */

-		Word16 hp_wsp[],                      /* o   : hypass wsp[]        */

-		Word16 lg,                            /* i   : lenght of signal    */

-		Word16 mem[]                          /* i/o : filter memory [9]   */

-	   )

-{

-	Word16 x0, x1, x2, x3;

-	Word16 y3_hi, y3_lo, y2_hi, y2_lo, y1_hi, y1_lo;

-	Word32 i, L_tmp;

-

-	y3_hi = mem[0];                        

-	y3_lo = mem[1];                        

-	y2_hi = mem[2];                        

-	y2_lo = mem[3];                        

-	y1_hi = mem[4];                        

-	y1_lo = mem[5];                        

-	x0 = mem[6];                           

-	x1 = mem[7];                           

-	x2 = mem[8];                           

-

-	for (i = 0; i < lg; i++)

-	{

-		x3 = x2;                           

-		x2 = x1;                           

-		x1 = x0;                           

-		x0 = wsp[i];                       

-		/* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] + b[3]*x[i-3]  */

-		/* + a[1]*y[i-1] + a[2] * y[i-2]  + a[3]*y[i-3]  */

-

-		L_tmp = 16384L;                    /* rounding to maximise precision */

-		L_tmp += (y1_lo * a[1])<<1;

-		L_tmp += (y2_lo * a[2])<<1;

-		L_tmp += (y3_lo * a[3])<<1;

-		L_tmp = L_tmp >> 15;

-		L_tmp += (y1_hi * a[1])<<1;

-		L_tmp += (y2_hi * a[2])<<1;

-		L_tmp += (y3_hi * a[3])<<1;

-		L_tmp += (x0 * b[0])<<1;

-		L_tmp += (x1 * b[1])<<1;

-		L_tmp += (x2 * b[2])<<1;

-		L_tmp += (x3 * b[3])<<1;

-

-		L_tmp = L_tmp << 2;

-

-		y3_hi = y2_hi;                     

-		y3_lo = y2_lo;                     

-		y2_hi = y1_hi;                     

-		y2_lo = y1_lo; 

-		y1_hi = L_tmp >> 16;

-		y1_lo = (L_tmp & 0xffff) >>1;

-

-		hp_wsp[i] = (L_tmp + 0x4000)>>15;          

-	}

-

-	mem[0] = y3_hi;                        

-	mem[1] = y3_lo;                        

-	mem[2] = y2_hi;                        

-	mem[3] = y2_lo;                        

-	mem[4] = y1_hi;                        

-	mem[5] = y1_lo;                        

-	mem[6] = x0;                           

-	mem[7] = x1;                           

-	mem[8] = x2;                           

-

-	return;

-}

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*       File: hp_wsp.c                                                  *
+*       Description:                                                    *
+*       3nd order high pass filter with cut off frequency at 180Hz      *
+* Algorithm:                                                            *
+*                                                                       *
+*  y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] + b[3]*x[i-3]           *
+*                   + a[1]*y[i-1] + a[2]*y[i-2] + a[3]*y[i-3];          *
+*                                                                       *
+* float a_coef[HP_ORDER]= {                                             *
+*    -2.64436711600664f,                                                *
+*    2.35087386625360f,                                                 *
+*   -0.70001156927424f};                                                *
+*                                                                       *
+* float b_coef[HP_ORDER+1]= {                                           *
+*     -0.83787057505665f,                                               *
+*    2.50975570071058f,                                                 *
+*   -2.50975570071058f,                                                 *
+*    0.83787057505665f};                                                *
+*                                                                       *
+*************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "acelp.h"
+
+/* filter coefficients in Q12 */
+static Word16 a[4] = {8192, 21663, -19258, 5734};
+static Word16 b[4] = {-3432, +10280, -10280, +3432};
+
+/* Initialization of static values */
+void Init_Hp_wsp(Word16 mem[])
+{
+	Set_zero(mem, 9);
+
+	return;
+}
+
+void scale_mem_Hp_wsp(Word16 mem[], Word16 exp)
+{
+	Word32 i;
+	Word32 L_tmp;
+
+	for (i = 0; i < 6; i += 2)
+	{
+		L_tmp = ((mem[i] << 16) + (mem[i + 1]<<1));
+		L_tmp = L_shl(L_tmp, exp);
+		mem[i] = L_tmp >> 16;
+		mem[i + 1] = (L_tmp & 0xffff)>>1;
+	}
+
+	for (i = 6; i < 9; i++)
+	{
+		L_tmp = L_deposit_h(mem[i]);       /* x[i] */
+		L_tmp = L_shl(L_tmp, exp);
+		mem[i] = vo_round(L_tmp);
+	}
+
+	return;
+}
+
+
+void Hp_wsp(
+		Word16 wsp[],                         /* i   : wsp[]  signal       */
+		Word16 hp_wsp[],                      /* o   : hypass wsp[]        */
+		Word16 lg,                            /* i   : lenght of signal    */
+		Word16 mem[]                          /* i/o : filter memory [9]   */
+	   )
+{
+	Word16 x0, x1, x2, x3;
+	Word16 y3_hi, y3_lo, y2_hi, y2_lo, y1_hi, y1_lo;
+	Word32 i, L_tmp;
+
+	y3_hi = mem[0];                        
+	y3_lo = mem[1];                        
+	y2_hi = mem[2];                        
+	y2_lo = mem[3];                        
+	y1_hi = mem[4];                        
+	y1_lo = mem[5];                        
+	x0 = mem[6];                           
+	x1 = mem[7];                           
+	x2 = mem[8];                           
+
+	for (i = 0; i < lg; i++)
+	{
+		x3 = x2;                           
+		x2 = x1;                           
+		x1 = x0;                           
+		x0 = wsp[i];                       
+		/* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] + b[3]*x[i-3]  */
+		/* + a[1]*y[i-1] + a[2] * y[i-2]  + a[3]*y[i-3]  */
+
+		L_tmp = 16384L;                    /* rounding to maximise precision */
+		L_tmp += (y1_lo * a[1])<<1;
+		L_tmp += (y2_lo * a[2])<<1;
+		L_tmp += (y3_lo * a[3])<<1;
+		L_tmp = L_tmp >> 15;
+		L_tmp += (y1_hi * a[1])<<1;
+		L_tmp += (y2_hi * a[2])<<1;
+		L_tmp += (y3_hi * a[3])<<1;
+		L_tmp += (x0 * b[0])<<1;
+		L_tmp += (x1 * b[1])<<1;
+		L_tmp += (x2 * b[2])<<1;
+		L_tmp += (x3 * b[3])<<1;
+
+		L_tmp = L_tmp << 2;
+
+		y3_hi = y2_hi;                     
+		y3_lo = y2_lo;                     
+		y2_hi = y1_hi;                     
+		y2_lo = y1_lo; 
+		y1_hi = L_tmp >> 16;
+		y1_lo = (L_tmp & 0xffff) >>1;
+
+		hp_wsp[i] = (L_tmp + 0x4000)>>15;          
+	}
+
+	mem[0] = y3_hi;                        
+	mem[1] = y3_lo;                        
+	mem[2] = y2_hi;                        
+	mem[3] = y2_lo;                        
+	mem[4] = y1_hi;                        
+	mem[5] = y1_lo;                        
+	mem[6] = x0;                           
+	mem[7] = x1;                           
+	mem[8] = x2;                           
+
+	return;
+}
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/int_lpc.c b/media/libstagefright/codecs/amrwbenc/src/int_lpc.c
index be1fd0b..88285e8 100644
--- a/media/libstagefright/codecs/amrwbenc/src/int_lpc.c
+++ b/media/libstagefright/codecs/amrwbenc/src/int_lpc.c
@@ -1,66 +1,66 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*      File: int_lpc.c                                                 *

-*                                                                      *

-*      Description:Interpolation of the LP parameters in 4 subframes.  *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "cnst.h"

-#include "acelp.h"

-

-#define MP1 (M+1)

-

-

-void Int_isp(

-		Word16 isp_old[],                     /* input : isps from past frame              */

-		Word16 isp_new[],                     /* input : isps from present frame           */

-		Word16 frac[],                        /* input : fraction for 3 first subfr (Q15)  */

-		Word16 Az[]                           /* output: LP coefficients in 4 subframes    */

-	    )

-{

-	Word32 i, k; 

-	Word16 fac_old, fac_new;

-	Word16 isp[M];

-	Word32 L_tmp;

-

-	for (k = 0; k < 3; k++)

-	{

-		fac_new = frac[k];                

-		fac_old = (32767 - fac_new) + 1;  /* 1.0 - fac_new */

-

-		for (i = 0; i < M; i++)

-		{

-			L_tmp = (isp_old[i] * fac_old)<<1;

-			L_tmp += (isp_new[i] * fac_new)<<1;

-			isp[i] = (L_tmp + 0x8000)>>16;        

-		}

-		Isp_Az(isp, Az, M, 0);

-		Az += MP1;

-	}

-

-	/* 4th subframe: isp_new (frac=1.0) */

-	Isp_Az(isp_new, Az, M, 0);

-

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*      File: int_lpc.c                                                 *
+*                                                                      *
+*      Description:Interpolation of the LP parameters in 4 subframes.  *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "cnst.h"
+#include "acelp.h"
+
+#define MP1 (M+1)
+
+
+void Int_isp(
+		Word16 isp_old[],                     /* input : isps from past frame              */
+		Word16 isp_new[],                     /* input : isps from present frame           */
+		Word16 frac[],                        /* input : fraction for 3 first subfr (Q15)  */
+		Word16 Az[]                           /* output: LP coefficients in 4 subframes    */
+	    )
+{
+	Word32 i, k; 
+	Word16 fac_old, fac_new;
+	Word16 isp[M];
+	Word32 L_tmp;
+
+	for (k = 0; k < 3; k++)
+	{
+		fac_new = frac[k];                
+		fac_old = (32767 - fac_new) + 1;  /* 1.0 - fac_new */
+
+		for (i = 0; i < M; i++)
+		{
+			L_tmp = (isp_old[i] * fac_old)<<1;
+			L_tmp += (isp_new[i] * fac_new)<<1;
+			isp[i] = (L_tmp + 0x8000)>>16;        
+		}
+		Isp_Az(isp, Az, M, 0);
+		Az += MP1;
+	}
+
+	/* 4th subframe: isp_new (frac=1.0) */
+	Isp_Az(isp_new, Az, M, 0);
+
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/isp_az.c b/media/libstagefright/codecs/amrwbenc/src/isp_az.c
index 7b44d12..c235c5d 100644
--- a/media/libstagefright/codecs/amrwbenc/src/isp_az.c
+++ b/media/libstagefright/codecs/amrwbenc/src/isp_az.c
@@ -1,247 +1,247 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*      File: isp_az.c                                                  *

-*                                                                      *

-*      Description:Compute the LPC coefficients from isp (order=M)     *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "oper_32b.h"

-#include "cnst.h"

-

-#define NC (M/2)

-#define NC16k (M16k/2)

-

-/* local function */

-

-static void Get_isp_pol(Word16 * isp, Word32 * f, Word16 n);

-static void Get_isp_pol_16kHz(Word16 * isp, Word32 * f, Word16 n);

-

-void Isp_Az(

-		Word16 isp[],                         /* (i) Q15 : Immittance spectral pairs            */

-		Word16 a[],                           /* (o) Q12 : predictor coefficients (order = M)   */

-		Word16 m,

-		Word16 adaptive_scaling               /* (i) 0   : adaptive scaling disabled */

-		                                      /*     1   : adaptive scaling enabled  */

-	   )

-{

-	Word32 i, j; 

-	Word16 hi, lo;

-	Word32 f1[NC16k + 1], f2[NC16k];

-	Word16 nc;

-	Word32 t0;

-	Word16 q, q_sug;

-	Word32 tmax;

-

-	nc = (m >> 1);

-	if(nc > 8)

-	{

-		Get_isp_pol_16kHz(&isp[0], f1, nc);

-		for (i = 0; i <= nc; i++)

-		{

-			f1[i] = f1[i] << 2;

-		}

-	} else

-		Get_isp_pol(&isp[0], f1, nc);

-

-	if (nc > 8)

-	{

-		Get_isp_pol_16kHz(&isp[1], f2, (nc - 1));

-		for (i = 0; i <= nc - 1; i++)

-		{

-			f2[i] = f2[i] << 2;

-		}

-	} else

-		Get_isp_pol(&isp[1], f2, (nc - 1));

-

-	/*-----------------------------------------------------*

-	 *  Multiply F2(z) by (1 - z^-2)                       *

-	 *-----------------------------------------------------*/

-

-	for (i = (nc - 1); i > 1; i--)

-	{

-		f2[i] = vo_L_sub(f2[i], f2[i - 2]);          /* f2[i] -= f2[i-2]; */

-	}

-

-	/*----------------------------------------------------------*

-	 *  Scale F1(z) by (1+isp[m-1])  and  F2(z) by (1-isp[m-1]) *

-	 *----------------------------------------------------------*/

-

-	for (i = 0; i < nc; i++)

-	{

-		/* f1[i] *= (1.0 + isp[M-1]); */

-

-		hi = f1[i] >> 16;

-		lo = (f1[i] & 0xffff)>>1;

-

-		t0 = Mpy_32_16(hi, lo, isp[m - 1]);

-		f1[i] = vo_L_add(f1[i], t0); 

-

-		/* f2[i] *= (1.0 - isp[M-1]); */

-

-		hi = f2[i] >> 16;

-		lo = (f2[i] & 0xffff)>>1;

-		t0 = Mpy_32_16(hi, lo, isp[m - 1]);

-		f2[i] = vo_L_sub(f2[i], t0); 

-	}

-

-	/*-----------------------------------------------------*

-	 *  A(z) = (F1(z)+F2(z))/2                             *

-	 *  F1(z) is symmetric and F2(z) is antisymmetric      *

-	 *-----------------------------------------------------*/

-

-	/* a[0] = 1.0; */

-	a[0] = 4096;  

-	tmax = 1;                            

-	for (i = 1, j = m - 1; i < nc; i++, j--)

-	{

-		/* a[i] = 0.5*(f1[i] + f2[i]); */

-

-		t0 = vo_L_add(f1[i], f2[i]);          /* f1[i] + f2[i]             */

-		tmax |= L_abs(t0);                 

-		a[i] = (Word16)(vo_L_shr_r(t0, 12)); /* from Q23 to Q12 and * 0.5 */

-

-		/* a[j] = 0.5*(f1[i] - f2[i]); */

-

-		t0 = vo_L_sub(f1[i], f2[i]);          /* f1[i] - f2[i]             */

-		tmax |= L_abs(t0);                

-		a[j] = (Word16)(vo_L_shr_r(t0, 12)); /* from Q23 to Q12 and * 0.5 */

-	}

-

-	/* rescale data if overflow has occured and reprocess the loop */

-	if(adaptive_scaling == 1)

-		q = 4 - norm_l(tmax);        /* adaptive scaling enabled */

-	else

-		q = 0;                           /* adaptive scaling disabled */

-

-	if (q > 0)

-	{

-		q_sug = (12 + q);

-		for (i = 1, j = m - 1; i < nc; i++, j--)

-		{

-			/* a[i] = 0.5*(f1[i] + f2[i]); */

-			t0 = vo_L_add(f1[i], f2[i]);          /* f1[i] + f2[i]             */

-			a[i] = (Word16)(vo_L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */

-

-			/* a[j] = 0.5*(f1[i] - f2[i]); */

-			t0 = vo_L_sub(f1[i], f2[i]);          /* f1[i] - f2[i]             */

-			a[j] = (Word16)(vo_L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */

-		}

-		a[0] = shr(a[0], q); 

-	}

-	else

-	{

-		q_sug = 12; 

-		q     = 0; 

-	}

-	/* a[NC] = 0.5*f1[NC]*(1.0 + isp[M-1]); */

-	hi = f1[nc] >> 16;

-	lo = (f1[nc] & 0xffff)>>1;

-	t0 = Mpy_32_16(hi, lo, isp[m - 1]);

-	t0 = vo_L_add(f1[nc], t0);

-	a[nc] = (Word16)(L_shr_r(t0, q_sug));    /* from Q23 to Q12 and * 0.5 */

-	/* a[m] = isp[m-1]; */

-

-	a[m] = vo_shr_r(isp[m - 1], (3 + q));           /* from Q15 to Q12          */

-	return;

-}

-

-/*-----------------------------------------------------------*

-* procedure Get_isp_pol:                                    *

-*           ~~~~~~~~~~~                                     *

-*   Find the polynomial F1(z) or F2(z) from the ISPs.       *

-* This is performed by expanding the product polynomials:   *

-*                                                           *

-* F1(z) =   product   ( 1 - 2 isp_i z^-1 + z^-2 )           *

-*         i=0,2,4,6,8                                       *

-* F2(z) =   product   ( 1 - 2 isp_i z^-1 + z^-2 )           *

-*         i=1,3,5,7                                         *

-*                                                           *

-* where isp_i are the ISPs in the cosine domain.            *

-*-----------------------------------------------------------*

-*                                                           *

-* Parameters:                                               *

-*  isp[]   : isp vector (cosine domaine)         in Q15     *

-*  f[]     : the coefficients of F1 or F2        in Q23     *

-*  n       : == NC for F1(z); == NC-1 for F2(z)             *

-*-----------------------------------------------------------*/

-

-static void Get_isp_pol(Word16 * isp, Word32 * f, Word16 n)

-{

-	Word16 hi, lo;

-	Word32 i, j, t0;

-	/* All computation in Q23 */

-

-	f[0] = vo_L_mult(4096, 1024);               /* f[0] = 1.0;        in Q23  */

-	f[1] = vo_L_mult(isp[0], -256);             /* f[1] = -2.0*isp[0] in Q23  */

-

-	f += 2;                                  /* Advance f pointer          */

-	isp += 2;                                /* Advance isp pointer        */

-	for (i = 2; i <= n; i++)

-	{

-		*f = f[-2];                        

-		for (j = 1; j < i; j++, f--)

-		{

-			hi = f[-1]>>16;

-			lo = (f[-1] & 0xffff)>>1;

-

-			t0 = Mpy_32_16(hi, lo, *isp);  /* t0 = f[-1] * isp    */

-			t0 = t0 << 1;

-			*f = vo_L_sub(*f, t0);              /* *f -= t0            */

-			*f = vo_L_add(*f, f[-2]);           /* *f += f[-2]         */

-		}

-		*f -= (*isp << 9);           /* *f -= isp<<8        */

-		f += i;                            /* Advance f pointer   */

-		isp += 2;                          /* Advance isp pointer */

-	}

-	return;

-}

-

-static void Get_isp_pol_16kHz(Word16 * isp, Word32 * f, Word16 n)

-{

-	Word16 hi, lo;

-	Word32 i, j, t0;

-

-	/* All computation in Q23 */

-	f[0] = L_mult(4096, 256);                /* f[0] = 1.0;        in Q23  */

-	f[1] = L_mult(isp[0], -64);              /* f[1] = -2.0*isp[0] in Q23  */

-

-	f += 2;                                  /* Advance f pointer          */

-	isp += 2;                                /* Advance isp pointer        */

-

-	for (i = 2; i <= n; i++)

-	{

-		*f = f[-2];                        

-		for (j = 1; j < i; j++, f--)

-		{

-			VO_L_Extract(f[-1], &hi, &lo);

-			t0 = Mpy_32_16(hi, lo, *isp);  /* t0 = f[-1] * isp    */

-			t0 = L_shl2(t0, 1);

-			*f = L_sub(*f, t0);              /* *f -= t0            */

-			*f = L_add(*f, f[-2]);           /* *f += f[-2]         */

-		}

-		*f = L_msu(*f, *isp, 64);            /* *f -= isp<<8        */

-		f += i;                            /* Advance f pointer   */

-		isp += 2;                          /* Advance isp pointer */

-	}

-	return;

-}

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*      File: isp_az.c                                                  *
+*                                                                      *
+*      Description:Compute the LPC coefficients from isp (order=M)     *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "cnst.h"
+
+#define NC (M/2)
+#define NC16k (M16k/2)
+
+/* local function */
+
+static void Get_isp_pol(Word16 * isp, Word32 * f, Word16 n);
+static void Get_isp_pol_16kHz(Word16 * isp, Word32 * f, Word16 n);
+
+void Isp_Az(
+		Word16 isp[],                         /* (i) Q15 : Immittance spectral pairs            */
+		Word16 a[],                           /* (o) Q12 : predictor coefficients (order = M)   */
+		Word16 m,
+		Word16 adaptive_scaling               /* (i) 0   : adaptive scaling disabled */
+		                                      /*     1   : adaptive scaling enabled  */
+	   )
+{
+	Word32 i, j; 
+	Word16 hi, lo;
+	Word32 f1[NC16k + 1], f2[NC16k];
+	Word16 nc;
+	Word32 t0;
+	Word16 q, q_sug;
+	Word32 tmax;
+
+	nc = (m >> 1);
+	if(nc > 8)
+	{
+		Get_isp_pol_16kHz(&isp[0], f1, nc);
+		for (i = 0; i <= nc; i++)
+		{
+			f1[i] = f1[i] << 2;
+		}
+	} else
+		Get_isp_pol(&isp[0], f1, nc);
+
+	if (nc > 8)
+	{
+		Get_isp_pol_16kHz(&isp[1], f2, (nc - 1));
+		for (i = 0; i <= nc - 1; i++)
+		{
+			f2[i] = f2[i] << 2;
+		}
+	} else
+		Get_isp_pol(&isp[1], f2, (nc - 1));
+
+	/*-----------------------------------------------------*
+	 *  Multiply F2(z) by (1 - z^-2)                       *
+	 *-----------------------------------------------------*/
+
+	for (i = (nc - 1); i > 1; i--)
+	{
+		f2[i] = vo_L_sub(f2[i], f2[i - 2]);          /* f2[i] -= f2[i-2]; */
+	}
+
+	/*----------------------------------------------------------*
+	 *  Scale F1(z) by (1+isp[m-1])  and  F2(z) by (1-isp[m-1]) *
+	 *----------------------------------------------------------*/
+
+	for (i = 0; i < nc; i++)
+	{
+		/* f1[i] *= (1.0 + isp[M-1]); */
+
+		hi = f1[i] >> 16;
+		lo = (f1[i] & 0xffff)>>1;
+
+		t0 = Mpy_32_16(hi, lo, isp[m - 1]);
+		f1[i] = vo_L_add(f1[i], t0); 
+
+		/* f2[i] *= (1.0 - isp[M-1]); */
+
+		hi = f2[i] >> 16;
+		lo = (f2[i] & 0xffff)>>1;
+		t0 = Mpy_32_16(hi, lo, isp[m - 1]);
+		f2[i] = vo_L_sub(f2[i], t0); 
+	}
+
+	/*-----------------------------------------------------*
+	 *  A(z) = (F1(z)+F2(z))/2                             *
+	 *  F1(z) is symmetric and F2(z) is antisymmetric      *
+	 *-----------------------------------------------------*/
+
+	/* a[0] = 1.0; */
+	a[0] = 4096;  
+	tmax = 1;                            
+	for (i = 1, j = m - 1; i < nc; i++, j--)
+	{
+		/* a[i] = 0.5*(f1[i] + f2[i]); */
+
+		t0 = vo_L_add(f1[i], f2[i]);          /* f1[i] + f2[i]             */
+		tmax |= L_abs(t0);                 
+		a[i] = (Word16)(vo_L_shr_r(t0, 12)); /* from Q23 to Q12 and * 0.5 */
+
+		/* a[j] = 0.5*(f1[i] - f2[i]); */
+
+		t0 = vo_L_sub(f1[i], f2[i]);          /* f1[i] - f2[i]             */
+		tmax |= L_abs(t0);                
+		a[j] = (Word16)(vo_L_shr_r(t0, 12)); /* from Q23 to Q12 and * 0.5 */
+	}
+
+	/* rescale data if overflow has occured and reprocess the loop */
+	if(adaptive_scaling == 1)
+		q = 4 - norm_l(tmax);        /* adaptive scaling enabled */
+	else
+		q = 0;                           /* adaptive scaling disabled */
+
+	if (q > 0)
+	{
+		q_sug = (12 + q);
+		for (i = 1, j = m - 1; i < nc; i++, j--)
+		{
+			/* a[i] = 0.5*(f1[i] + f2[i]); */
+			t0 = vo_L_add(f1[i], f2[i]);          /* f1[i] + f2[i]             */
+			a[i] = (Word16)(vo_L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */
+
+			/* a[j] = 0.5*(f1[i] - f2[i]); */
+			t0 = vo_L_sub(f1[i], f2[i]);          /* f1[i] - f2[i]             */
+			a[j] = (Word16)(vo_L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */
+		}
+		a[0] = shr(a[0], q); 
+	}
+	else
+	{
+		q_sug = 12; 
+		q     = 0; 
+	}
+	/* a[NC] = 0.5*f1[NC]*(1.0 + isp[M-1]); */
+	hi = f1[nc] >> 16;
+	lo = (f1[nc] & 0xffff)>>1;
+	t0 = Mpy_32_16(hi, lo, isp[m - 1]);
+	t0 = vo_L_add(f1[nc], t0);
+	a[nc] = (Word16)(L_shr_r(t0, q_sug));    /* from Q23 to Q12 and * 0.5 */
+	/* a[m] = isp[m-1]; */
+
+	a[m] = vo_shr_r(isp[m - 1], (3 + q));           /* from Q15 to Q12          */
+	return;
+}
+
+/*-----------------------------------------------------------*
+* procedure Get_isp_pol:                                    *
+*           ~~~~~~~~~~~                                     *
+*   Find the polynomial F1(z) or F2(z) from the ISPs.       *
+* This is performed by expanding the product polynomials:   *
+*                                                           *
+* F1(z) =   product   ( 1 - 2 isp_i z^-1 + z^-2 )           *
+*         i=0,2,4,6,8                                       *
+* F2(z) =   product   ( 1 - 2 isp_i z^-1 + z^-2 )           *
+*         i=1,3,5,7                                         *
+*                                                           *
+* where isp_i are the ISPs in the cosine domain.            *
+*-----------------------------------------------------------*
+*                                                           *
+* Parameters:                                               *
+*  isp[]   : isp vector (cosine domaine)         in Q15     *
+*  f[]     : the coefficients of F1 or F2        in Q23     *
+*  n       : == NC for F1(z); == NC-1 for F2(z)             *
+*-----------------------------------------------------------*/
+
+static void Get_isp_pol(Word16 * isp, Word32 * f, Word16 n)
+{
+	Word16 hi, lo;
+	Word32 i, j, t0;
+	/* All computation in Q23 */
+
+	f[0] = vo_L_mult(4096, 1024);               /* f[0] = 1.0;        in Q23  */
+	f[1] = vo_L_mult(isp[0], -256);             /* f[1] = -2.0*isp[0] in Q23  */
+
+	f += 2;                                  /* Advance f pointer          */
+	isp += 2;                                /* Advance isp pointer        */
+	for (i = 2; i <= n; i++)
+	{
+		*f = f[-2];                        
+		for (j = 1; j < i; j++, f--)
+		{
+			hi = f[-1]>>16;
+			lo = (f[-1] & 0xffff)>>1;
+
+			t0 = Mpy_32_16(hi, lo, *isp);  /* t0 = f[-1] * isp    */
+			t0 = t0 << 1;
+			*f = vo_L_sub(*f, t0);              /* *f -= t0            */
+			*f = vo_L_add(*f, f[-2]);           /* *f += f[-2]         */
+		}
+		*f -= (*isp << 9);           /* *f -= isp<<8        */
+		f += i;                            /* Advance f pointer   */
+		isp += 2;                          /* Advance isp pointer */
+	}
+	return;
+}
+
+static void Get_isp_pol_16kHz(Word16 * isp, Word32 * f, Word16 n)
+{
+	Word16 hi, lo;
+	Word32 i, j, t0;
+
+	/* All computation in Q23 */
+	f[0] = L_mult(4096, 256);                /* f[0] = 1.0;        in Q23  */
+	f[1] = L_mult(isp[0], -64);              /* f[1] = -2.0*isp[0] in Q23  */
+
+	f += 2;                                  /* Advance f pointer          */
+	isp += 2;                                /* Advance isp pointer        */
+
+	for (i = 2; i <= n; i++)
+	{
+		*f = f[-2];                        
+		for (j = 1; j < i; j++, f--)
+		{
+			VO_L_Extract(f[-1], &hi, &lo);
+			t0 = Mpy_32_16(hi, lo, *isp);  /* t0 = f[-1] * isp    */
+			t0 = L_shl2(t0, 1);
+			*f = L_sub(*f, t0);              /* *f -= t0            */
+			*f = L_add(*f, f[-2]);           /* *f += f[-2]         */
+		}
+		*f = L_msu(*f, *isp, 64);            /* *f -= isp<<8        */
+		f += i;                            /* Advance f pointer   */
+		isp += 2;                          /* Advance isp pointer */
+	}
+	return;
+}
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/isp_isf.c b/media/libstagefright/codecs/amrwbenc/src/isp_isf.c
index 6c6e389..fbe80eb 100644
--- a/media/libstagefright/codecs/amrwbenc/src/isp_isf.c
+++ b/media/libstagefright/codecs/amrwbenc/src/isp_isf.c
@@ -1,91 +1,91 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*       File: isp_isf.c                                                *

-*                                                                      *

-*       Description:                                                   *

-*	Isp_isf   Transformation isp to isf                            *

-*	Isf_isp   Transformation isf to isp                            *

-*                                                                      *

-*	The transformation from isp[i] to isf[i] and isf[i] to isp[i]  *

-*	are approximated by a look-up table and interpolation          *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "isp_isf.tab"                     /* Look-up table for transformations */

-

-void Isp_isf(

-		Word16 isp[],                         /* (i) Q15 : isp[m] (range: -1<=val<1)                */

-		Word16 isf[],                         /* (o) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */

-		Word16 m                              /* (i)     : LPC order                                */

-	    )

-{

-	Word32 i, ind;

-	Word32 L_tmp;

-	ind = 127;                               /* beging at end of table -1 */

-	for (i = (m - 1); i >= 0; i--)

-	{

-		if (i >= (m - 2))

-		{                                  /* m-2 is a constant */

-			ind = 127;                       /* beging at end of table -1 */

-		}

-		/* find value in table that is just greater than isp[i] */

-		while (table[ind] < isp[i])

-			ind--;

-		/* acos(isp[i])= ind*128 + ( ( isp[i]-table[ind] ) * slope[ind] )/2048 */

-		L_tmp = vo_L_mult(vo_sub(isp[i], table[ind]), slope[ind]);

-		isf[i] = vo_round((L_tmp << 4));   /* (isp[i]-table[ind])*slope[ind])>>11 */

-		isf[i] = add1(isf[i], (ind << 7)); 

-	}

-	isf[m - 1] = (isf[m - 1] >> 1);      

-	return;

-}

-

-

-void Isf_isp(

-		Word16 isf[],                         /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */

-		Word16 isp[],                         /* (o) Q15 : isp[m] (range: -1<=val<1)                */

-		Word16 m                              /* (i)     : LPC order                                */

-	    )

-{

-	Word16 offset;

-	Word32 i, ind, L_tmp;

-

-	for (i = 0; i < m - 1; i++)

-	{

-		isp[i] = isf[i];                  

-	}

-	isp[m - 1] = (isf[m - 1] << 1);

-

-	for (i = 0; i < m; i++)

-	{

-		ind = (isp[i] >> 7);                      /* ind    = b7-b15 of isf[i] */

-		offset = (Word16) (isp[i] & 0x007f);      /* offset = b0-b6  of isf[i] */

-

-		/* isp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset) / 128 */

-		L_tmp = vo_L_mult(vo_sub(table[ind + 1], table[ind]), offset);

-		isp[i] = add1(table[ind], (Word16)((L_tmp >> 8)));   

-	}

-

-	return;

-}

-

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*       File: isp_isf.c                                                *
+*                                                                      *
+*       Description:                                                   *
+*	Isp_isf   Transformation isp to isf                            *
+*	Isf_isp   Transformation isf to isp                            *
+*                                                                      *
+*	The transformation from isp[i] to isf[i] and isf[i] to isp[i]  *
+*	are approximated by a look-up table and interpolation          *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "isp_isf.tab"                     /* Look-up table for transformations */
+
+void Isp_isf(
+		Word16 isp[],                         /* (i) Q15 : isp[m] (range: -1<=val<1)                */
+		Word16 isf[],                         /* (o) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
+		Word16 m                              /* (i)     : LPC order                                */
+	    )
+{
+	Word32 i, ind;
+	Word32 L_tmp;
+	ind = 127;                               /* beging at end of table -1 */
+	for (i = (m - 1); i >= 0; i--)
+	{
+		if (i >= (m - 2))
+		{                                  /* m-2 is a constant */
+			ind = 127;                       /* beging at end of table -1 */
+		}
+		/* find value in table that is just greater than isp[i] */
+		while (table[ind] < isp[i])
+			ind--;
+		/* acos(isp[i])= ind*128 + ( ( isp[i]-table[ind] ) * slope[ind] )/2048 */
+		L_tmp = vo_L_mult(vo_sub(isp[i], table[ind]), slope[ind]);
+		isf[i] = vo_round((L_tmp << 4));   /* (isp[i]-table[ind])*slope[ind])>>11 */
+		isf[i] = add1(isf[i], (ind << 7)); 
+	}
+	isf[m - 1] = (isf[m - 1] >> 1);      
+	return;
+}
+
+
+void Isf_isp(
+		Word16 isf[],                         /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
+		Word16 isp[],                         /* (o) Q15 : isp[m] (range: -1<=val<1)                */
+		Word16 m                              /* (i)     : LPC order                                */
+	    )
+{
+	Word16 offset;
+	Word32 i, ind, L_tmp;
+
+	for (i = 0; i < m - 1; i++)
+	{
+		isp[i] = isf[i];                  
+	}
+	isp[m - 1] = (isf[m - 1] << 1);
+
+	for (i = 0; i < m; i++)
+	{
+		ind = (isp[i] >> 7);                      /* ind    = b7-b15 of isf[i] */
+		offset = (Word16) (isp[i] & 0x007f);      /* offset = b0-b6  of isf[i] */
+
+		/* isp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset) / 128 */
+		L_tmp = vo_L_mult(vo_sub(table[ind + 1], table[ind]), offset);
+		isp[i] = add1(table[ind], (Word16)((L_tmp >> 8)));   
+	}
+
+	return;
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/lag_wind.c b/media/libstagefright/codecs/amrwbenc/src/lag_wind.c
index 0397704..49c622c 100644
--- a/media/libstagefright/codecs/amrwbenc/src/lag_wind.c
+++ b/media/libstagefright/codecs/amrwbenc/src/lag_wind.c
@@ -1,49 +1,49 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*      File: lag_wind.c                                                *

-*                                                                      *

-*	   Description: Lag_windows on autocorrelations                *

-*	                r[i] *= lag_wind[i]                            *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "oper_32b.h"

-#include "lag_wind.tab"

-

-

-void Lag_window(

-		Word16 r_h[],                         /* (i/o)   : Autocorrelations  (msb)          */

-		Word16 r_l[]                          /* (i/o)   : Autocorrelations  (lsb)          */

-	       )

-{

-	Word32 i;

-	Word32 x;

-

-	for (i = 1; i <= M; i++)

-	{

-		x = Mpy_32(r_h[i], r_l[i], volag_h[i - 1], volag_l[i - 1]);

-		r_h[i] = x >> 16;

-		r_l[i] = (x & 0xffff)>>1;

-	}

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*      File: lag_wind.c                                                *
+*                                                                      *
+*	   Description: Lag_windows on autocorrelations                *
+*	                r[i] *= lag_wind[i]                            *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "lag_wind.tab"
+
+
+void Lag_window(
+		Word16 r_h[],                         /* (i/o)   : Autocorrelations  (msb)          */
+		Word16 r_l[]                          /* (i/o)   : Autocorrelations  (lsb)          */
+	       )
+{
+	Word32 i;
+	Word32 x;
+
+	for (i = 1; i <= M; i++)
+	{
+		x = Mpy_32(r_h[i], r_l[i], volag_h[i - 1], volag_l[i - 1]);
+		r_h[i] = x >> 16;
+		r_l[i] = (x & 0xffff)>>1;
+	}
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/levinson.c b/media/libstagefright/codecs/amrwbenc/src/levinson.c
index 8bc6f62..a68845f 100644
--- a/media/libstagefright/codecs/amrwbenc/src/levinson.c
+++ b/media/libstagefright/codecs/amrwbenc/src/levinson.c
@@ -1,250 +1,250 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*      File: levinson.c                                                *

-*                                                                      *

-*      Description:LEVINSON-DURBIN algorithm in double precision       *

-*                                                                      *

-************************************************************************/

-/*---------------------------------------------------------------------------*

- *                         LEVINSON.C					     *

- *---------------------------------------------------------------------------*

- *                                                                           *

- *      LEVINSON-DURBIN algorithm in double precision                        *

- *                                                                           *

- *                                                                           *

- * Algorithm                                                                 *

- *                                                                           *

- *       R[i]    autocorrelations.                                           *

- *       A[i]    filter coefficients.                                        *

- *       K       reflection coefficients.                                    *

- *       Alpha   prediction gain.                                            *

- *                                                                           *

- *       Initialization:                                                     *

- *               A[0] = 1                                                    *

- *               K    = -R[1]/R[0]                                           *

- *               A[1] = K                                                    *

- *               Alpha = R[0] * (1-K**2]                                     *

- *                                                                           *

- *       Do for  i = 2 to M                                                  *

- *                                                                           *

- *            S =  SUM ( R[j]*A[i-j] ,j=1,i-1 ) +  R[i]                      *

- *                                                                           *

- *            K = -S / Alpha                                                 *

- *                                                                           *

- *            An[j] = A[j] + K*A[i-j]   for j=1 to i-1                       *

- *                                      where   An[i] = new A[i]             *

- *            An[i]=K                                                        *

- *                                                                           *

- *            Alpha=Alpha * (1-K**2)                                         *

- *                                                                           *

- *       END                                                                 *

- *                                                                           *

- * Remarks on the dynamics of the calculations.                              *

- *                                                                           *

- *       The numbers used are in double precision in the following format :  *

- *       A = AH <<16 + AL<<1.  AH and AL are 16 bit signed integers.         *

- *       Since the LSB's also contain a sign bit, this format does not       *

- *       correspond to standard 32 bit integers.  We use this format since   *

- *       it allows fast execution of multiplications and divisions.          *

- *                                                                           *

- *       "DPF" will refer to this special format in the following text.      *

- *       See oper_32b.c                                                      *

- *                                                                           *

- *       The R[i] were normalized in routine AUTO (hence, R[i] < 1.0).       *

- *       The K[i] and Alpha are theoretically < 1.0.                         *

- *       The A[i], for a sampling frequency of 8 kHz, are in practice        *

- *       always inferior to 16.0.                                            *

- *                                                                           *

- *       These characteristics allow straigthforward fixed-point             *

- *       implementation.  We choose to represent the parameters as           *

- *       follows :                                                           *

- *                                                                           *

- *               R[i]    Q31   +- .99..                                      *

- *               K[i]    Q31   +- .99..                                      *

- *               Alpha   Normalized -> mantissa in Q31 plus exponent         *

- *               A[i]    Q27   +- 15.999..                                   *

- *                                                                           *

- *       The additions are performed in 32 bit.  For the summation used      *

- *       to calculate the K[i], we multiply numbers in Q31 by numbers        *

- *       in Q27, with the result of the multiplications in Q27,              *

- *       resulting in a dynamic of +- 16.  This is sufficient to avoid       *

- *       overflow, since the final result of the summation is                *

- *       necessarily < 1.0 as both the K[i] and Alpha are                    *

- *       theoretically < 1.0.                                                *

- *___________________________________________________________________________*/

-#include "typedef.h"

-#include "basic_op.h"

-#include "oper_32b.h"

-#include "acelp.h"

-

-#define M   16

-#define NC  (M/2)

-

-void Init_Levinson(

-		Word16 * mem                          /* output  :static memory (18 words) */

-		)

-{

-	Set_zero(mem, 18);                     /* old_A[0..M-1] = 0, old_rc[0..1] = 0 */

-	return;

-}

-

-

-void Levinson(

-		Word16 Rh[],                          /* (i)     : Rh[M+1] Vector of autocorrelations (msb) */

-		Word16 Rl[],                          /* (i)     : Rl[M+1] Vector of autocorrelations (lsb) */

-		Word16 A[],                           /* (o) Q12 : A[M]    LPC coefficients  (m = 16)       */

-		Word16 rc[],                          /* (o) Q15 : rc[M]   Reflection coefficients.         */

-		Word16 * mem                          /* (i/o)   :static memory (18 words)                  */

-	     )

-{

-	Word32 i, j;

-	Word16 hi, lo;

-	Word16 Kh, Kl;                         /* reflection coefficient; hi and lo           */

-	Word16 alp_h, alp_l, alp_exp;          /* Prediction gain; hi lo and exponent         */

-	Word16 Ah[M + 1], Al[M + 1];           /* LPC coef. in double prec.                   */

-	Word16 Anh[M + 1], Anl[M + 1];         /* LPC coef.for next iteration in double prec. */

-	Word32 t0, t1, t2;                     /* temporary variable                          */

-	Word16 *old_A, *old_rc;

-

-	/* Last A(z) for case of unstable filter */

-	old_A = mem;                           

-	old_rc = mem + M;                      

-

-	/* K = A[1] = -R[1] / R[0] */

-

-	t1 = ((Rh[1] << 16) + (Rl[1] << 1));   /* R[1] in Q31 */

-	t2 = L_abs(t1);                        /* abs R[1]         */

-	t0 = Div_32(t2, Rh[0], Rl[0]);         /* R[1]/R[0] in Q31 */

-	if (t1 > 0)

-		t0 = -t0;                          /* -R[1]/R[0]       */

-

-	Kh = t0 >> 16;

-	Kl = (t0 & 0xffff)>>1;

-	rc[0] = Kh;                            

-	t0 = (t0 >> 4);                        /* A[1] in Q27      */

-

-	Ah[1] = t0 >> 16;

-	Al[1] = (t0 & 0xffff)>>1;

-

-	/* Alpha = R[0] * (1-K**2) */

-	t0 = Mpy_32(Kh, Kl, Kh, Kl);           /* K*K      in Q31 */

-	t0 = L_abs(t0);                        /* Some case <0 !! */

-	t0 = vo_L_sub((Word32) 0x7fffffffL, t0);  /* 1 - K*K  in Q31 */

-

-	hi = t0 >> 16;

-	lo = (t0 & 0xffff)>>1;

-

-	t0 = Mpy_32(Rh[0], Rl[0], hi, lo);     /* Alpha in Q31    */

-

-	/* Normalize Alpha */

-	alp_exp = norm_l(t0);

-	t0 = (t0 << alp_exp);

-

-	alp_h = t0 >> 16;

-	alp_l = (t0 & 0xffff)>>1;

-	/*--------------------------------------*

-	 * ITERATIONS  I=2 to M                 *

-	 *--------------------------------------*/

-	for (i = 2; i <= M; i++)

-	{

-		/* t0 = SUM ( R[j]*A[i-j] ,j=1,i-1 ) +  R[i] */

-		t0 = 0;                           

-		for (j = 1; j < i; j++)

-			t0 = vo_L_add(t0, Mpy_32(Rh[j], Rl[j], Ah[i - j], Al[i - j]));

-

-		t0 = t0 << 4;                 /* result in Q27 -> convert to Q31 */

-		/* No overflow possible            */

-		t1 = ((Rh[i] << 16) + (Rl[i] << 1));

-		t0 = vo_L_add(t0, t1);                /* add R[i] in Q31                 */

-

-		/* K = -t0 / Alpha */

-		t1 = L_abs(t0);

-		t2 = Div_32(t1, alp_h, alp_l);     /* abs(t0)/Alpha                   */

-		if (t0 > 0)

-			t2 = -t2;                   /* K =-t0/Alpha                    */

-		t2 = (t2 << alp_exp);           /* denormalize; compare to Alpha   */

-

-		Kh = t2 >> 16;

-		Kl = (t2 & 0xffff)>>1;

-

-		rc[i - 1] = Kh;                   

-		/* Test for unstable filter. If unstable keep old A(z) */

-		if (abs_s(Kh) > 32750)

-		{

-			A[0] = 4096;                    /* Ai[0] not stored (always 1.0) */

-			for (j = 0; j < M; j++)

-			{

-				A[j + 1] = old_A[j];       

-			}

-			rc[0] = old_rc[0];             /* only two rc coefficients are needed */

-			rc[1] = old_rc[1];

-			return;

-		}

-		/*------------------------------------------*

-		 *  Compute new LPC coeff. -> An[i]         *

-		 *  An[j]= A[j] + K*A[i-j]     , j=1 to i-1 *

-		 *  An[i]= K                                *

-		 *------------------------------------------*/

-		for (j = 1; j < i; j++)

-		{

-			t0 = Mpy_32(Kh, Kl, Ah[i - j], Al[i - j]);

-			t0 = vo_L_add(t0, ((Ah[j] << 16) + (Al[j] << 1)));

-			Anh[j] = t0 >> 16;

-			Anl[j] = (t0 & 0xffff)>>1;

-		}

-		t2 = (t2 >> 4);                 /* t2 = K in Q31 ->convert to Q27  */

-

-		VO_L_Extract(t2, &Anh[i], &Anl[i]);   /* An[i] in Q27                    */

-

-		/* Alpha = Alpha * (1-K**2) */

-		t0 = Mpy_32(Kh, Kl, Kh, Kl);               /* K*K      in Q31 */

-		t0 = L_abs(t0);                            /* Some case <0 !! */

-		t0 = vo_L_sub((Word32) 0x7fffffffL, t0);   /* 1 - K*K  in Q31 */

-		hi = t0 >> 16;

-		lo = (t0 & 0xffff)>>1;

-		t0 = Mpy_32(alp_h, alp_l, hi, lo); /* Alpha in Q31    */

-

-		/* Normalize Alpha */

-		j = norm_l(t0);

-		t0 = (t0 << j);

-		alp_h = t0 >> 16;

-		alp_l = (t0 & 0xffff)>>1;

-		alp_exp += j;         /* Add normalization to alp_exp */

-

-		/* A[j] = An[j] */

-		for (j = 1; j <= i; j++)

-		{

-			Ah[j] = Anh[j];               

-			Al[j] = Anl[j];                

-		}

-	}

-	/* Truncate A[i] in Q27 to Q12 with rounding */

-	A[0] = 4096;                          

-	for (i = 1; i <= M; i++)

-	{

-		t0 = (Ah[i] << 16) + (Al[i] << 1);

-		old_A[i - 1] = A[i] = vo_round((t0 << 1));      

-	}

-	old_rc[0] = rc[0];                    

-	old_rc[1] = rc[1];                    

-

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*      File: levinson.c                                                *
+*                                                                      *
+*      Description:LEVINSON-DURBIN algorithm in double precision       *
+*                                                                      *
+************************************************************************/
+/*---------------------------------------------------------------------------*
+ *                         LEVINSON.C					     *
+ *---------------------------------------------------------------------------*
+ *                                                                           *
+ *      LEVINSON-DURBIN algorithm in double precision                        *
+ *                                                                           *
+ *                                                                           *
+ * Algorithm                                                                 *
+ *                                                                           *
+ *       R[i]    autocorrelations.                                           *
+ *       A[i]    filter coefficients.                                        *
+ *       K       reflection coefficients.                                    *
+ *       Alpha   prediction gain.                                            *
+ *                                                                           *
+ *       Initialization:                                                     *
+ *               A[0] = 1                                                    *
+ *               K    = -R[1]/R[0]                                           *
+ *               A[1] = K                                                    *
+ *               Alpha = R[0] * (1-K**2]                                     *
+ *                                                                           *
+ *       Do for  i = 2 to M                                                  *
+ *                                                                           *
+ *            S =  SUM ( R[j]*A[i-j] ,j=1,i-1 ) +  R[i]                      *
+ *                                                                           *
+ *            K = -S / Alpha                                                 *
+ *                                                                           *
+ *            An[j] = A[j] + K*A[i-j]   for j=1 to i-1                       *
+ *                                      where   An[i] = new A[i]             *
+ *            An[i]=K                                                        *
+ *                                                                           *
+ *            Alpha=Alpha * (1-K**2)                                         *
+ *                                                                           *
+ *       END                                                                 *
+ *                                                                           *
+ * Remarks on the dynamics of the calculations.                              *
+ *                                                                           *
+ *       The numbers used are in double precision in the following format :  *
+ *       A = AH <<16 + AL<<1.  AH and AL are 16 bit signed integers.         *
+ *       Since the LSB's also contain a sign bit, this format does not       *
+ *       correspond to standard 32 bit integers.  We use this format since   *
+ *       it allows fast execution of multiplications and divisions.          *
+ *                                                                           *
+ *       "DPF" will refer to this special format in the following text.      *
+ *       See oper_32b.c                                                      *
+ *                                                                           *
+ *       The R[i] were normalized in routine AUTO (hence, R[i] < 1.0).       *
+ *       The K[i] and Alpha are theoretically < 1.0.                         *
+ *       The A[i], for a sampling frequency of 8 kHz, are in practice        *
+ *       always inferior to 16.0.                                            *
+ *                                                                           *
+ *       These characteristics allow straigthforward fixed-point             *
+ *       implementation.  We choose to represent the parameters as           *
+ *       follows :                                                           *
+ *                                                                           *
+ *               R[i]    Q31   +- .99..                                      *
+ *               K[i]    Q31   +- .99..                                      *
+ *               Alpha   Normalized -> mantissa in Q31 plus exponent         *
+ *               A[i]    Q27   +- 15.999..                                   *
+ *                                                                           *
+ *       The additions are performed in 32 bit.  For the summation used      *
+ *       to calculate the K[i], we multiply numbers in Q31 by numbers        *
+ *       in Q27, with the result of the multiplications in Q27,              *
+ *       resulting in a dynamic of +- 16.  This is sufficient to avoid       *
+ *       overflow, since the final result of the summation is                *
+ *       necessarily < 1.0 as both the K[i] and Alpha are                    *
+ *       theoretically < 1.0.                                                *
+ *___________________________________________________________________________*/
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "acelp.h"
+
+#define M   16
+#define NC  (M/2)
+
+void Init_Levinson(
+		Word16 * mem                          /* output  :static memory (18 words) */
+		)
+{
+	Set_zero(mem, 18);                     /* old_A[0..M-1] = 0, old_rc[0..1] = 0 */
+	return;
+}
+
+
+void Levinson(
+		Word16 Rh[],                          /* (i)     : Rh[M+1] Vector of autocorrelations (msb) */
+		Word16 Rl[],                          /* (i)     : Rl[M+1] Vector of autocorrelations (lsb) */
+		Word16 A[],                           /* (o) Q12 : A[M]    LPC coefficients  (m = 16)       */
+		Word16 rc[],                          /* (o) Q15 : rc[M]   Reflection coefficients.         */
+		Word16 * mem                          /* (i/o)   :static memory (18 words)                  */
+	     )
+{
+	Word32 i, j;
+	Word16 hi, lo;
+	Word16 Kh, Kl;                         /* reflection coefficient; hi and lo           */
+	Word16 alp_h, alp_l, alp_exp;          /* Prediction gain; hi lo and exponent         */
+	Word16 Ah[M + 1], Al[M + 1];           /* LPC coef. in double prec.                   */
+	Word16 Anh[M + 1], Anl[M + 1];         /* LPC coef.for next iteration in double prec. */
+	Word32 t0, t1, t2;                     /* temporary variable                          */
+	Word16 *old_A, *old_rc;
+
+	/* Last A(z) for case of unstable filter */
+	old_A = mem;                           
+	old_rc = mem + M;                      
+
+	/* K = A[1] = -R[1] / R[0] */
+
+	t1 = ((Rh[1] << 16) + (Rl[1] << 1));   /* R[1] in Q31 */
+	t2 = L_abs(t1);                        /* abs R[1]         */
+	t0 = Div_32(t2, Rh[0], Rl[0]);         /* R[1]/R[0] in Q31 */
+	if (t1 > 0)
+		t0 = -t0;                          /* -R[1]/R[0]       */
+
+	Kh = t0 >> 16;
+	Kl = (t0 & 0xffff)>>1;
+	rc[0] = Kh;                            
+	t0 = (t0 >> 4);                        /* A[1] in Q27      */
+
+	Ah[1] = t0 >> 16;
+	Al[1] = (t0 & 0xffff)>>1;
+
+	/* Alpha = R[0] * (1-K**2) */
+	t0 = Mpy_32(Kh, Kl, Kh, Kl);           /* K*K      in Q31 */
+	t0 = L_abs(t0);                        /* Some case <0 !! */
+	t0 = vo_L_sub((Word32) 0x7fffffffL, t0);  /* 1 - K*K  in Q31 */
+
+	hi = t0 >> 16;
+	lo = (t0 & 0xffff)>>1;
+
+	t0 = Mpy_32(Rh[0], Rl[0], hi, lo);     /* Alpha in Q31    */
+
+	/* Normalize Alpha */
+	alp_exp = norm_l(t0);
+	t0 = (t0 << alp_exp);
+
+	alp_h = t0 >> 16;
+	alp_l = (t0 & 0xffff)>>1;
+	/*--------------------------------------*
+	 * ITERATIONS  I=2 to M                 *
+	 *--------------------------------------*/
+	for (i = 2; i <= M; i++)
+	{
+		/* t0 = SUM ( R[j]*A[i-j] ,j=1,i-1 ) +  R[i] */
+		t0 = 0;                           
+		for (j = 1; j < i; j++)
+			t0 = vo_L_add(t0, Mpy_32(Rh[j], Rl[j], Ah[i - j], Al[i - j]));
+
+		t0 = t0 << 4;                 /* result in Q27 -> convert to Q31 */
+		/* No overflow possible            */
+		t1 = ((Rh[i] << 16) + (Rl[i] << 1));
+		t0 = vo_L_add(t0, t1);                /* add R[i] in Q31                 */
+
+		/* K = -t0 / Alpha */
+		t1 = L_abs(t0);
+		t2 = Div_32(t1, alp_h, alp_l);     /* abs(t0)/Alpha                   */
+		if (t0 > 0)
+			t2 = -t2;                   /* K =-t0/Alpha                    */
+		t2 = (t2 << alp_exp);           /* denormalize; compare to Alpha   */
+
+		Kh = t2 >> 16;
+		Kl = (t2 & 0xffff)>>1;
+
+		rc[i - 1] = Kh;                   
+		/* Test for unstable filter. If unstable keep old A(z) */
+		if (abs_s(Kh) > 32750)
+		{
+			A[0] = 4096;                    /* Ai[0] not stored (always 1.0) */
+			for (j = 0; j < M; j++)
+			{
+				A[j + 1] = old_A[j];       
+			}
+			rc[0] = old_rc[0];             /* only two rc coefficients are needed */
+			rc[1] = old_rc[1];
+			return;
+		}
+		/*------------------------------------------*
+		 *  Compute new LPC coeff. -> An[i]         *
+		 *  An[j]= A[j] + K*A[i-j]     , j=1 to i-1 *
+		 *  An[i]= K                                *
+		 *------------------------------------------*/
+		for (j = 1; j < i; j++)
+		{
+			t0 = Mpy_32(Kh, Kl, Ah[i - j], Al[i - j]);
+			t0 = vo_L_add(t0, ((Ah[j] << 16) + (Al[j] << 1)));
+			Anh[j] = t0 >> 16;
+			Anl[j] = (t0 & 0xffff)>>1;
+		}
+		t2 = (t2 >> 4);                 /* t2 = K in Q31 ->convert to Q27  */
+
+		VO_L_Extract(t2, &Anh[i], &Anl[i]);   /* An[i] in Q27                    */
+
+		/* Alpha = Alpha * (1-K**2) */
+		t0 = Mpy_32(Kh, Kl, Kh, Kl);               /* K*K      in Q31 */
+		t0 = L_abs(t0);                            /* Some case <0 !! */
+		t0 = vo_L_sub((Word32) 0x7fffffffL, t0);   /* 1 - K*K  in Q31 */
+		hi = t0 >> 16;
+		lo = (t0 & 0xffff)>>1;
+		t0 = Mpy_32(alp_h, alp_l, hi, lo); /* Alpha in Q31    */
+
+		/* Normalize Alpha */
+		j = norm_l(t0);
+		t0 = (t0 << j);
+		alp_h = t0 >> 16;
+		alp_l = (t0 & 0xffff)>>1;
+		alp_exp += j;         /* Add normalization to alp_exp */
+
+		/* A[j] = An[j] */
+		for (j = 1; j <= i; j++)
+		{
+			Ah[j] = Anh[j];               
+			Al[j] = Anl[j];                
+		}
+	}
+	/* Truncate A[i] in Q27 to Q12 with rounding */
+	A[0] = 4096;                          
+	for (i = 1; i <= M; i++)
+	{
+		t0 = (Ah[i] << 16) + (Al[i] << 1);
+		old_A[i - 1] = A[i] = vo_round((t0 << 1));      
+	}
+	old_rc[0] = rc[0];                    
+	old_rc[1] = rc[1];                    
+
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/log2.c b/media/libstagefright/codecs/amrwbenc/src/log2.c
index cd3d815..646d6af 100644
--- a/media/libstagefright/codecs/amrwbenc/src/log2.c
+++ b/media/libstagefright/codecs/amrwbenc/src/log2.c
@@ -1,111 +1,111 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*                                                                      *

-*      File             : log2.c                                       *

-*      Purpose          : Computes log2(L_x)                           *

-*                                                                      *

-************************************************************************/

-

-#include "log2.h"

-/********************************************************************************

-*                         INCLUDE FILES

-*********************************************************************************/

-#include "typedef.h"

-#include "basic_op.h"

-

-/*********************************************************************************

-*                         LOCAL VARIABLES AND TABLES

-**********************************************************************************/

-#include "log2_tab.h"     /* Table for Log2() */

-

-/*************************************************************************

-*

-*   FUNCTION:   Log2_norm()

-*

-*   PURPOSE:   Computes log2(L_x, exp),  where   L_x is positive and

-*              normalized, and exp is the normalisation exponent

-*              If L_x is negative or zero, the result is 0.

-*

-*   DESCRIPTION:

-*        The function Log2(L_x) is approximated by a table and linear

-*        interpolation. The following steps are used to compute Log2(L_x)

-*

-*           1- exponent = 30-norm_exponent

-*           2- i = bit25-b31 of L_x;  32<=i<=63  (because of normalization).

-*           3- a = bit10-b24

-*           4- i -=32

-*           5- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2

-*

-*************************************************************************/

-

-void Log2_norm (

-		Word32 L_x,         /* (i) : input value (normalized)                    */

-		Word16 exp,         /* (i) : norm_l (L_x)                                */

-		Word16 *exponent,   /* (o) : Integer part of Log2.   (range: 0<=val<=30) */

-		Word16 *fraction    /* (o) : Fractional part of Log2. (range: 0<=val<1)  */

-	       )

-{

-	Word16 i, a, tmp;

-	Word32 L_y;

-	if (L_x <= (Word32) 0)

-	{

-		*exponent = 0; 

-		*fraction = 0; 

-		return;

-	}

-	*exponent = (30 - exp); 

-	L_x = (L_x >> 9);

-	i = extract_h (L_x);                /* Extract b25-b31 */

-	L_x = (L_x >> 1);

-	a = (Word16)(L_x);                /* Extract b10-b24 of fraction */

-	a = (Word16)(a & (Word16)0x7fff);

-	i -= 32;

-	L_y = L_deposit_h (table[i]);       /* table[i] << 16        */

-	tmp = vo_sub(table[i], table[i + 1]); /* table[i] - table[i+1] */

-	L_y = vo_L_msu (L_y, tmp, a);          /* L_y -= tmp*a*2        */

-	*fraction = extract_h (L_y); 

-

-	return;

-}

-

-/*************************************************************************

-*

-*   FUNCTION:   Log2()

-*

-*   PURPOSE:   Computes log2(L_x),  where   L_x is positive.

-*              If L_x is negative or zero, the result is 0.

-*

-*   DESCRIPTION:

-*        normalizes L_x and then calls Log2_norm().

-*

-*************************************************************************/

-

-void Log2 (

-		Word32 L_x,         /* (i) : input value                                 */

-		Word16 *exponent,   /* (o) : Integer part of Log2.   (range: 0<=val<=30) */

-		Word16 *fraction    /* (o) : Fractional part of Log2. (range: 0<=val<1) */

-	  )

-{

-	Word16 exp;

-

-	exp = norm_l(L_x);

-	Log2_norm ((L_x << exp), exp, exponent, fraction);

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*                                                                      *
+*      File             : log2.c                                       *
+*      Purpose          : Computes log2(L_x)                           *
+*                                                                      *
+************************************************************************/
+
+#include "log2.h"
+/********************************************************************************
+*                         INCLUDE FILES
+*********************************************************************************/
+#include "typedef.h"
+#include "basic_op.h"
+
+/*********************************************************************************
+*                         LOCAL VARIABLES AND TABLES
+**********************************************************************************/
+#include "log2_tab.h"     /* Table for Log2() */
+
+/*************************************************************************
+*
+*   FUNCTION:   Log2_norm()
+*
+*   PURPOSE:   Computes log2(L_x, exp),  where   L_x is positive and
+*              normalized, and exp is the normalisation exponent
+*              If L_x is negative or zero, the result is 0.
+*
+*   DESCRIPTION:
+*        The function Log2(L_x) is approximated by a table and linear
+*        interpolation. The following steps are used to compute Log2(L_x)
+*
+*           1- exponent = 30-norm_exponent
+*           2- i = bit25-b31 of L_x;  32<=i<=63  (because of normalization).
+*           3- a = bit10-b24
+*           4- i -=32
+*           5- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2
+*
+*************************************************************************/
+
+void Log2_norm (
+		Word32 L_x,         /* (i) : input value (normalized)                    */
+		Word16 exp,         /* (i) : norm_l (L_x)                                */
+		Word16 *exponent,   /* (o) : Integer part of Log2.   (range: 0<=val<=30) */
+		Word16 *fraction    /* (o) : Fractional part of Log2. (range: 0<=val<1)  */
+	       )
+{
+	Word16 i, a, tmp;
+	Word32 L_y;
+	if (L_x <= (Word32) 0)
+	{
+		*exponent = 0; 
+		*fraction = 0; 
+		return;
+	}
+	*exponent = (30 - exp); 
+	L_x = (L_x >> 9);
+	i = extract_h (L_x);                /* Extract b25-b31 */
+	L_x = (L_x >> 1);
+	a = (Word16)(L_x);                /* Extract b10-b24 of fraction */
+	a = (Word16)(a & (Word16)0x7fff);
+	i -= 32;
+	L_y = L_deposit_h (table[i]);       /* table[i] << 16        */
+	tmp = vo_sub(table[i], table[i + 1]); /* table[i] - table[i+1] */
+	L_y = vo_L_msu (L_y, tmp, a);          /* L_y -= tmp*a*2        */
+	*fraction = extract_h (L_y); 
+
+	return;
+}
+
+/*************************************************************************
+*
+*   FUNCTION:   Log2()
+*
+*   PURPOSE:   Computes log2(L_x),  where   L_x is positive.
+*              If L_x is negative or zero, the result is 0.
+*
+*   DESCRIPTION:
+*        normalizes L_x and then calls Log2_norm().
+*
+*************************************************************************/
+
+void Log2 (
+		Word32 L_x,         /* (i) : input value                                 */
+		Word16 *exponent,   /* (o) : Integer part of Log2.   (range: 0<=val<=30) */
+		Word16 *fraction    /* (o) : Fractional part of Log2. (range: 0<=val<1) */
+	  )
+{
+	Word16 exp;
+
+	exp = norm_l(L_x);
+	Log2_norm ((L_x << exp), exp, exponent, fraction);
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c b/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c
index 63b746b..29bd46b 100644
--- a/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c
+++ b/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c
@@ -1,70 +1,70 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*       File: lp_dec2.c                                                *

-*                                                                      *

-*	Description:Decimate a vector by 2 with 2nd order fir filter   *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "cnst.h"

-

-#define L_FIR  5

-#define L_MEM  (L_FIR-2)

-

-/* static float h_fir[L_FIR] = {0.13, 0.23, 0.28, 0.23, 0.13}; */

-/* fixed-point: sum of coef = 32767 to avoid overflow on DC */

-static Word16 h_fir[L_FIR] = {4260, 7536, 9175, 7536, 4260};

-

-void LP_Decim2(

-		Word16 x[],                           /* in/out: signal to process         */

-		Word16 l,                             /* input : size of filtering         */

-		Word16 mem[]                          /* in/out: memory (size=3)           */

-	      )

-{

-	Word16 *p_x, x_buf[L_FRAME + L_MEM];

-	Word32 i, j;

-	Word32 L_tmp;

-	/* copy initial filter states into buffer */

-	p_x = x_buf;                           

-	for (i = 0; i < L_MEM; i++)

-	{

-		*p_x++ = mem[i];  

-		mem[i] = x[l - L_MEM + i];  

-	}

-	for (i = 0; i < l; i++)

-	{

-		*p_x++ = x[i];                     

-	}

-	for (i = 0, j = 0; i < l; i += 2, j++)

-	{

-		p_x = &x_buf[i];  

-		L_tmp  = ((*p_x++) * h_fir[0]);

-		L_tmp += ((*p_x++) * h_fir[1]);

-		L_tmp += ((*p_x++) * h_fir[2]);

-		L_tmp += ((*p_x++) * h_fir[3]);

-		L_tmp += ((*p_x++) * h_fir[4]);

-		x[j] = (L_tmp + 0x4000)>>15;              

-	}

-	return;

-}

-

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*       File: lp_dec2.c                                                *
+*                                                                      *
+*	Description:Decimate a vector by 2 with 2nd order fir filter   *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "cnst.h"
+
+#define L_FIR  5
+#define L_MEM  (L_FIR-2)
+
+/* static float h_fir[L_FIR] = {0.13, 0.23, 0.28, 0.23, 0.13}; */
+/* fixed-point: sum of coef = 32767 to avoid overflow on DC */
+static Word16 h_fir[L_FIR] = {4260, 7536, 9175, 7536, 4260};
+
+void LP_Decim2(
+		Word16 x[],                           /* in/out: signal to process         */
+		Word16 l,                             /* input : size of filtering         */
+		Word16 mem[]                          /* in/out: memory (size=3)           */
+	      )
+{
+	Word16 *p_x, x_buf[L_FRAME + L_MEM];
+	Word32 i, j;
+	Word32 L_tmp;
+	/* copy initial filter states into buffer */
+	p_x = x_buf;                           
+	for (i = 0; i < L_MEM; i++)
+	{
+		*p_x++ = mem[i];  
+		mem[i] = x[l - L_MEM + i];  
+	}
+	for (i = 0; i < l; i++)
+	{
+		*p_x++ = x[i];                     
+	}
+	for (i = 0, j = 0; i < l; i += 2, j++)
+	{
+		p_x = &x_buf[i];  
+		L_tmp  = ((*p_x++) * h_fir[0]);
+		L_tmp += ((*p_x++) * h_fir[1]);
+		L_tmp += ((*p_x++) * h_fir[2]);
+		L_tmp += ((*p_x++) * h_fir[3]);
+		L_tmp += ((*p_x++) * h_fir[4]);
+		x[j] = (L_tmp + 0x4000)>>15;              
+	}
+	return;
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/math_op.c b/media/libstagefright/codecs/amrwbenc/src/math_op.c
index 1c95ed0..1a7b513 100644
--- a/media/libstagefright/codecs/amrwbenc/src/math_op.c
+++ b/media/libstagefright/codecs/amrwbenc/src/math_op.c
@@ -1,219 +1,219 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/*___________________________________________________________________________

-|                                                                           |

-|  This file contains mathematic operations in fixed point.                 |

-|                                                                           |

-|  Isqrt()              : inverse square root (16 bits precision).          |

-|  Pow2()               : 2^x  (16 bits precision).                         |

-|  Log2()               : log2 (16 bits precision).                         |

-|  Dot_product()        : scalar product of <x[],y[]>                       |

-|                                                                           |

-|  These operations are not standard double precision operations.           |

-|  They are used where low complexity is important and the full 32 bits     |

-|  precision is not necessary. For example, the function Div_32() has a     |

-|  24 bits precision which is enough for our purposes.                      |

-|                                                                           |

-|  In this file, the values use theses representations:                     |

-|                                                                           |

-|  Word32 L_32     : standard signed 32 bits format                         |

-|  Word16 hi, lo   : L_32 = hi<<16 + lo<<1  (DPF - Double Precision Format) |

-|  Word32 frac, Word16 exp : L_32 = frac << exp-31  (normalised format)     |

-|  Word16 int, frac        : L_32 = int.frac        (fractional format)     |

-|___________________________________________________________________________|

-*/

-#include "typedef.h"

-#include "basic_op.h"

-#include "math_op.h"

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : Isqrt                                                   |

-|                                                                           |

-|       Compute 1/sqrt(L_x).                                                |

-|       if L_x is negative or zero, result is 1 (7fffffff).                 |

-|---------------------------------------------------------------------------|

-|  Algorithm:                                                               |

-|                                                                           |

-|   1- Normalization of L_x.                                                |

-|   2- call Isqrt_n(L_x, exponant)                                          |

-|   3- L_y = L_x << exponant                                                |

-|___________________________________________________________________________|

-*/

-Word32 Isqrt(                              /* (o) Q31 : output value (range: 0<=val<1)         */

-		Word32 L_x                            /* (i) Q0  : input value  (range: 0<=val<=7fffffff) */

-	    )

-{

-	Word16 exp;

-	Word32 L_y;

-	exp = norm_l(L_x);

-	L_x = (L_x << exp);                 /* L_x is normalized */

-	exp = (31 - exp);

-	Isqrt_n(&L_x, &exp);

-	L_y = (L_x << exp);                 /* denormalization   */

-	return (L_y);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : Isqrt_n                                                 |

-|                                                                           |

-|       Compute 1/sqrt(value).                                              |

-|       if value is negative or zero, result is 1 (frac=7fffffff, exp=0).   |

-|---------------------------------------------------------------------------|

-|  Algorithm:                                                               |

-|                                                                           |

-|   The function 1/sqrt(value) is approximated by a table and linear        |

-|   interpolation.                                                          |

-|                                                                           |

-|   1- If exponant is odd then shift fraction right once.                   |

-|   2- exponant = -((exponant-1)>>1)                                        |

-|   3- i = bit25-b30 of fraction, 16 <= i <= 63 ->because of normalization. |

-|   4- a = bit10-b24                                                        |

-|   5- i -=16                                                               |

-|   6- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2            |

-|___________________________________________________________________________|

-*/

-static Word16 table_isqrt[49] =

-{

-	32767, 31790, 30894, 30070, 29309, 28602, 27945, 27330, 26755, 26214,

-	25705, 25225, 24770, 24339, 23930, 23541, 23170, 22817, 22479, 22155,

-	21845, 21548, 21263, 20988, 20724, 20470, 20225, 19988, 19760, 19539,

-	19326, 19119, 18919, 18725, 18536, 18354, 18176, 18004, 17837, 17674,

-	17515, 17361, 17211, 17064, 16921, 16782, 16646, 16514, 16384

-};

-

-void Isqrt_n(

-		Word32 * frac,                        /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */

-		Word16 * exp                          /* (i/o)    : exponent (value = frac x 2^exponent) */

-	    )

-{

-	Word16 i, a, tmp;

-

-	if (*frac <= (Word32) 0)

-	{

-		*exp = 0;                          

-		*frac = 0x7fffffffL;               

-		return;

-	}

-

-	if((*exp & 1) == 1)                       /*If exponant odd -> shift right */

-		*frac = (*frac) >> 1;

-

-	*exp = negate((*exp - 1) >> 1);   

-

-	*frac = (*frac >> 9);               

-	i = extract_h(*frac);                  /* Extract b25-b31 */

-	*frac = (*frac >> 1);              

-	a = (Word16)(*frac);                  /* Extract b10-b24 */

-	a = (Word16) (a & (Word16) 0x7fff);    

-	i -= 16;

-	*frac = L_deposit_h(table_isqrt[i]);   /* table[i] << 16         */

-	tmp = vo_sub(table_isqrt[i], table_isqrt[i + 1]);      /* table[i] - table[i+1]) */

-	*frac = vo_L_msu(*frac, tmp, a);          /* frac -=  tmp*a*2       */

-

-	return;

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : Pow2()                                                  |

-|                                                                           |

-|     L_x = pow(2.0, exponant.fraction)         (exponant = interger part)  |

-|         = pow(2.0, 0.fraction) << exponant                                |

-|---------------------------------------------------------------------------|

-|  Algorithm:                                                               |

-|                                                                           |

-|   The function Pow2(L_x) is approximated by a table and linear            |

-|   interpolation.                                                          |

-|                                                                           |

-|   1- i = bit10-b15 of fraction,   0 <= i <= 31                            |

-|   2- a = bit0-b9   of fraction                                            |

-|   3- L_x = table[i]<<16 - (table[i] - table[i+1]) * a * 2                 |

-|   4- L_x = L_x >> (30-exponant)     (with rounding)                       |

-|___________________________________________________________________________|

-*/

-static Word16 table_pow2[33] =

-{

-	16384, 16743, 17109, 17484, 17867, 18258, 18658, 19066, 19484, 19911,

-	20347, 20792, 21247, 21713, 22188, 22674, 23170, 23678, 24196, 24726,

-	25268, 25821, 26386, 26964, 27554, 28158, 28774, 29405, 30048, 30706,

-	31379, 32066, 32767

-};

-

-Word32 Pow2(                               /* (o) Q0  : result       (range: 0<=val<=0x7fffffff) */

-		Word16 exponant,                      /* (i) Q0  : Integer part.      (range: 0<=val<=30)   */

-		Word16 fraction                       /* (i) Q15 : Fractionnal part.  (range: 0.0<=val<1.0) */

-	   )

-{

-	Word16 exp, i, a, tmp;

-	Word32 L_x;

-

-	L_x = vo_L_mult(fraction, 32);            /* L_x = fraction<<6           */

-	i = extract_h(L_x);                    /* Extract b10-b16 of fraction */

-	L_x =L_x >> 1;

-	a = (Word16)(L_x);                    /* Extract b0-b9   of fraction */

-	a = (Word16) (a & (Word16) 0x7fff); 

-

-	L_x = L_deposit_h(table_pow2[i]);      /* table[i] << 16        */

-	tmp = vo_sub(table_pow2[i], table_pow2[i + 1]);        /* table[i] - table[i+1] */

-	L_x -= (tmp * a)<<1;              /* L_x -= tmp*a*2        */

-

-	exp = vo_sub(30, exponant);

-	L_x = vo_L_shr_r(L_x, exp);

-

-	return (L_x);

-}

-

-/*___________________________________________________________________________

-|                                                                           |

-|   Function Name : Dot_product12()                                         |

-|                                                                           |

-|       Compute scalar product of <x[],y[]> using accumulator.              |

-|                                                                           |

-|       The result is normalized (in Q31) with exponent (0..30).            |

-|---------------------------------------------------------------------------|

-|  Algorithm:                                                               |

-|                                                                           |

-|       dot_product = sum(x[i]*y[i])     i=0..N-1                           |

-|___________________________________________________________________________|

-*/

-

-Word32 Dot_product12(                      /* (o) Q31: normalized result (1 < val <= -1) */

-		Word16 x[],                           /* (i) 12bits: x vector                       */

-		Word16 y[],                           /* (i) 12bits: y vector                       */

-		Word16 lg,                            /* (i)    : vector length                     */

-		Word16 * exp                          /* (o)    : exponent of result (0..+30)       */

-		)

-{

-	Word16 sft;

-	Word32 i, L_sum;

-	L_sum = 0;

-	for (i = 0; i < lg; i++)

-	{

-		L_sum += x[i] * y[i];

-	}

-	L_sum = (L_sum << 1) + 1;

-	/* Normalize acc in Q31 */

-	sft = norm_l(L_sum);

-	L_sum = L_sum << sft;

-	*exp = 30 - sft;            /* exponent = 0..30 */

-	return (L_sum);

-

-}

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/*___________________________________________________________________________
+|                                                                           |
+|  This file contains mathematic operations in fixed point.                 |
+|                                                                           |
+|  Isqrt()              : inverse square root (16 bits precision).          |
+|  Pow2()               : 2^x  (16 bits precision).                         |
+|  Log2()               : log2 (16 bits precision).                         |
+|  Dot_product()        : scalar product of <x[],y[]>                       |
+|                                                                           |
+|  These operations are not standard double precision operations.           |
+|  They are used where low complexity is important and the full 32 bits     |
+|  precision is not necessary. For example, the function Div_32() has a     |
+|  24 bits precision which is enough for our purposes.                      |
+|                                                                           |
+|  In this file, the values use theses representations:                     |
+|                                                                           |
+|  Word32 L_32     : standard signed 32 bits format                         |
+|  Word16 hi, lo   : L_32 = hi<<16 + lo<<1  (DPF - Double Precision Format) |
+|  Word32 frac, Word16 exp : L_32 = frac << exp-31  (normalised format)     |
+|  Word16 int, frac        : L_32 = int.frac        (fractional format)     |
+|___________________________________________________________________________|
+*/
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : Isqrt                                                   |
+|                                                                           |
+|       Compute 1/sqrt(L_x).                                                |
+|       if L_x is negative or zero, result is 1 (7fffffff).                 |
+|---------------------------------------------------------------------------|
+|  Algorithm:                                                               |
+|                                                                           |
+|   1- Normalization of L_x.                                                |
+|   2- call Isqrt_n(L_x, exponant)                                          |
+|   3- L_y = L_x << exponant                                                |
+|___________________________________________________________________________|
+*/
+Word32 Isqrt(                              /* (o) Q31 : output value (range: 0<=val<1)         */
+		Word32 L_x                            /* (i) Q0  : input value  (range: 0<=val<=7fffffff) */
+	    )
+{
+	Word16 exp;
+	Word32 L_y;
+	exp = norm_l(L_x);
+	L_x = (L_x << exp);                 /* L_x is normalized */
+	exp = (31 - exp);
+	Isqrt_n(&L_x, &exp);
+	L_y = (L_x << exp);                 /* denormalization   */
+	return (L_y);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : Isqrt_n                                                 |
+|                                                                           |
+|       Compute 1/sqrt(value).                                              |
+|       if value is negative or zero, result is 1 (frac=7fffffff, exp=0).   |
+|---------------------------------------------------------------------------|
+|  Algorithm:                                                               |
+|                                                                           |
+|   The function 1/sqrt(value) is approximated by a table and linear        |
+|   interpolation.                                                          |
+|                                                                           |
+|   1- If exponant is odd then shift fraction right once.                   |
+|   2- exponant = -((exponant-1)>>1)                                        |
+|   3- i = bit25-b30 of fraction, 16 <= i <= 63 ->because of normalization. |
+|   4- a = bit10-b24                                                        |
+|   5- i -=16                                                               |
+|   6- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2            |
+|___________________________________________________________________________|
+*/
+static Word16 table_isqrt[49] =
+{
+	32767, 31790, 30894, 30070, 29309, 28602, 27945, 27330, 26755, 26214,
+	25705, 25225, 24770, 24339, 23930, 23541, 23170, 22817, 22479, 22155,
+	21845, 21548, 21263, 20988, 20724, 20470, 20225, 19988, 19760, 19539,
+	19326, 19119, 18919, 18725, 18536, 18354, 18176, 18004, 17837, 17674,
+	17515, 17361, 17211, 17064, 16921, 16782, 16646, 16514, 16384
+};
+
+void Isqrt_n(
+		Word32 * frac,                        /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */
+		Word16 * exp                          /* (i/o)    : exponent (value = frac x 2^exponent) */
+	    )
+{
+	Word16 i, a, tmp;
+
+	if (*frac <= (Word32) 0)
+	{
+		*exp = 0;                          
+		*frac = 0x7fffffffL;               
+		return;
+	}
+
+	if((*exp & 1) == 1)                       /*If exponant odd -> shift right */
+		*frac = (*frac) >> 1;
+
+	*exp = negate((*exp - 1) >> 1);   
+
+	*frac = (*frac >> 9);               
+	i = extract_h(*frac);                  /* Extract b25-b31 */
+	*frac = (*frac >> 1);              
+	a = (Word16)(*frac);                  /* Extract b10-b24 */
+	a = (Word16) (a & (Word16) 0x7fff);    
+	i -= 16;
+	*frac = L_deposit_h(table_isqrt[i]);   /* table[i] << 16         */
+	tmp = vo_sub(table_isqrt[i], table_isqrt[i + 1]);      /* table[i] - table[i+1]) */
+	*frac = vo_L_msu(*frac, tmp, a);          /* frac -=  tmp*a*2       */
+
+	return;
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : Pow2()                                                  |
+|                                                                           |
+|     L_x = pow(2.0, exponant.fraction)         (exponant = interger part)  |
+|         = pow(2.0, 0.fraction) << exponant                                |
+|---------------------------------------------------------------------------|
+|  Algorithm:                                                               |
+|                                                                           |
+|   The function Pow2(L_x) is approximated by a table and linear            |
+|   interpolation.                                                          |
+|                                                                           |
+|   1- i = bit10-b15 of fraction,   0 <= i <= 31                            |
+|   2- a = bit0-b9   of fraction                                            |
+|   3- L_x = table[i]<<16 - (table[i] - table[i+1]) * a * 2                 |
+|   4- L_x = L_x >> (30-exponant)     (with rounding)                       |
+|___________________________________________________________________________|
+*/
+static Word16 table_pow2[33] =
+{
+	16384, 16743, 17109, 17484, 17867, 18258, 18658, 19066, 19484, 19911,
+	20347, 20792, 21247, 21713, 22188, 22674, 23170, 23678, 24196, 24726,
+	25268, 25821, 26386, 26964, 27554, 28158, 28774, 29405, 30048, 30706,
+	31379, 32066, 32767
+};
+
+Word32 Pow2(                               /* (o) Q0  : result       (range: 0<=val<=0x7fffffff) */
+		Word16 exponant,                      /* (i) Q0  : Integer part.      (range: 0<=val<=30)   */
+		Word16 fraction                       /* (i) Q15 : Fractionnal part.  (range: 0.0<=val<1.0) */
+	   )
+{
+	Word16 exp, i, a, tmp;
+	Word32 L_x;
+
+	L_x = vo_L_mult(fraction, 32);            /* L_x = fraction<<6           */
+	i = extract_h(L_x);                    /* Extract b10-b16 of fraction */
+	L_x =L_x >> 1;
+	a = (Word16)(L_x);                    /* Extract b0-b9   of fraction */
+	a = (Word16) (a & (Word16) 0x7fff); 
+
+	L_x = L_deposit_h(table_pow2[i]);      /* table[i] << 16        */
+	tmp = vo_sub(table_pow2[i], table_pow2[i + 1]);        /* table[i] - table[i+1] */
+	L_x -= (tmp * a)<<1;              /* L_x -= tmp*a*2        */
+
+	exp = vo_sub(30, exponant);
+	L_x = vo_L_shr_r(L_x, exp);
+
+	return (L_x);
+}
+
+/*___________________________________________________________________________
+|                                                                           |
+|   Function Name : Dot_product12()                                         |
+|                                                                           |
+|       Compute scalar product of <x[],y[]> using accumulator.              |
+|                                                                           |
+|       The result is normalized (in Q31) with exponent (0..30).            |
+|---------------------------------------------------------------------------|
+|  Algorithm:                                                               |
+|                                                                           |
+|       dot_product = sum(x[i]*y[i])     i=0..N-1                           |
+|___________________________________________________________________________|
+*/
+
+Word32 Dot_product12(                      /* (o) Q31: normalized result (1 < val <= -1) */
+		Word16 x[],                           /* (i) 12bits: x vector                       */
+		Word16 y[],                           /* (i) 12bits: y vector                       */
+		Word16 lg,                            /* (i)    : vector length                     */
+		Word16 * exp                          /* (o)    : exponent of result (0..+30)       */
+		)
+{
+	Word16 sft;
+	Word32 i, L_sum;
+	L_sum = 0;
+	for (i = 0; i < lg; i++)
+	{
+		L_sum += x[i] * y[i];
+	}
+	L_sum = (L_sum << 1) + 1;
+	/* Normalize acc in Q31 */
+	sft = norm_l(L_sum);
+	L_sum = L_sum << sft;
+	*exp = 30 - sft;            /* exponent = 0..30 */
+	return (L_sum);
+
+}
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/oper_32b.c b/media/libstagefright/codecs/amrwbenc/src/oper_32b.c
index 5f1523e..27cad76 100644
--- a/media/libstagefright/codecs/amrwbenc/src/oper_32b.c
+++ b/media/libstagefright/codecs/amrwbenc/src/oper_32b.c
@@ -1,223 +1,223 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/*****************************************************************************

- *  This file contains operations in double precision.                       *

- *  These operations are not standard double precision operations.           *

- *  They are used where single precision is not enough but the full 32 bits  *

- *  precision is not necessary. For example, the function Div_32() has a     *

- *  24 bits precision which is enough for our purposes.                      *

- *                                                                           *

- *  The double precision numbers use a special representation:               *

- *                                                                           *

- *     L_32 = hi<<16 + lo<<1                                                 *

- *                                                                           *

- *  L_32 is a 32 bit integer.                                                *

- *  hi and lo are 16 bit signed integers.                                    *

- *  As the low part also contains the sign, this allows fast multiplication. *

- *                                                                           *

- *      0x8000 0000 <= L_32 <= 0x7fff fffe.                                  *

- *                                                                           *

- *  We will use DPF (Double Precision Format )in this file to specify        *

- *  this special format.                                                     *

- *****************************************************************************

-*/

-#include "typedef.h"

-#include "basic_op.h"

-#include "oper_32b.h"

-

-/*****************************************************************************

- *                                                                           *

- *  Function L_Extract()                                                     *

- *                                                                           *

- *  Extract from a 32 bit integer two 16 bit DPF.                            *

- *                                                                           *

- *  Arguments:                                                               *

- *                                                                           *

- *   L_32      : 32 bit integer.                                             *

- *               0x8000 0000 <= L_32 <= 0x7fff ffff.                         *

- *   hi        : b16 to b31 of L_32                                          *

- *   lo        : (L_32 - hi<<16)>>1                                          *

- *****************************************************************************

-*/

-

-__inline void VO_L_Extract (Word32 L_32, Word16 *hi, Word16 *lo)

-{

-	*hi = (Word16)(L_32 >> 16);

-	*lo = (Word16)((L_32 & 0xffff) >> 1);

-	return;

-}

-

-/*****************************************************************************

- *                                                                           *

- *  Function L_Comp()                                                        *

- *                                                                           *

- *  Compose from two 16 bit DPF a 32 bit integer.                            *

- *                                                                           *

- *     L_32 = hi<<16 + lo<<1                                                 *

- *                                                                           *

- *  Arguments:                                                               *

- *                                                                           *

- *   hi        msb                                                           *

- *   lo        lsf (with sign)                                               *

- *                                                                           *

- *   Return Value :                                                          *

- *                                                                           *

- *             32 bit long signed integer (Word32) whose value falls in the  *

- *             range : 0x8000 0000 <= L_32 <= 0x7fff fff0.                   *

- *                                                                           *

- *****************************************************************************

-*/

-

-Word32 L_Comp (Word16 hi, Word16 lo)

-{

-	Word32 L_32;

-

-	L_32 = L_deposit_h (hi);

-

-	return (L_mac (L_32, lo, 1));       /* = hi<<16 + lo<<1 */

-}

-

-/*****************************************************************************

- * Function Mpy_32()                                                         *

- *                                                                           *

- *   Multiply two 32 bit integers (DPF). The result is divided by 2**31      *

- *                                                                           *

- *   L_32 = (hi1*hi2)<<1 + ( (hi1*lo2)>>15 + (lo1*hi2)>>15 )<<1              *

- *                                                                           *

- *   This operation can also be viewed as the multiplication of two Q31      *

- *   number and the result is also in Q31.                                   *

- *                                                                           *

- * Arguments:                                                                *

- *                                                                           *

- *  hi1         hi part of first number                                      *

- *  lo1         lo part of first number                                      *

- *  hi2         hi part of second number                                     *

- *  lo2         lo part of second number                                     *

- *                                                                           *

- *****************************************************************************

-*/

-

-__inline Word32  Mpy_32 (Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2)

-{

-	Word32 L_32;

-	L_32 = (hi1 * hi2);

-	L_32 += (hi1 * lo2) >> 15;

-	L_32 += (lo1 * hi2) >> 15;

-	L_32 <<= 1;

-

-	return (L_32);

-}

-

-/*****************************************************************************

- * Function Mpy_32_16()                                                      *

- *                                                                           *

- *   Multiply a 16 bit integer by a 32 bit (DPF). The result is divided      *

- *   by 2**15                                                                *

- *                                                                           *

- *                                                                           *

- *   L_32 = (hi1*lo2)<<1 + ((lo1*lo2)>>15)<<1                                *

- *                                                                           *

- * Arguments:                                                                *

- *                                                                           *

- *  hi          hi part of 32 bit number.                                    *

- *  lo          lo part of 32 bit number.                                    *

- *  n           16 bit number.                                               *

- *                                                                           *

- *****************************************************************************

-*/

-

-__inline Word32 Mpy_32_16 (Word16 hi, Word16 lo, Word16 n)

-{

-	Word32 L_32;

-

-	L_32 = (hi * n)<<1;

-	L_32 += (((lo * n)>>15)<<1);

-

-	return (L_32);

-}

-

-/*****************************************************************************

- *                                                                           *

- *   Function Name : Div_32                                                  *

- *                                                                           *

- *   Purpose :                                                               *

- *             Fractional integer division of two 32 bit numbers.            *

- *             L_num / L_denom.                                              *

- *             L_num and L_denom must be positive and L_num < L_denom.       *

- *             L_denom = denom_hi<<16 + denom_lo<<1                          *

- *             denom_hi is a normalize number.                               *

- *                                                                           *

- *   Inputs :                                                                *

- *                                                                           *

- *    L_num                                                                  *

- *             32 bit long signed integer (Word32) whose value falls in the  *

- *             range : 0x0000 0000 < L_num < L_denom                         *

- *                                                                           *

- *    L_denom = denom_hi<<16 + denom_lo<<1      (DPF)                        *

- *                                                                           *

- *       denom_hi                                                            *

- *             16 bit positive normalized integer whose value falls in the   *

- *             range : 0x4000 < hi < 0x7fff                                  *

- *       denom_lo                                                            *

- *             16 bit positive integer whose value falls in the              *

- *             range : 0 < lo < 0x7fff                                       *

- *                                                                           *

- *   Return Value :                                                          *

- *                                                                           *

- *    L_div                                                                  *

- *             32 bit long signed integer (Word32) whose value falls in the  *

- *             range : 0x0000 0000 <= L_div <= 0x7fff ffff.                  *

- *                                                                           *

- *  Algorithm:                                                               *

- *                                                                           *

- *  - find = 1/L_denom.                                                      *

- *      First approximation: approx = 1 / denom_hi                           *

- *      1/L_denom = approx * (2.0 - L_denom * approx )                       *

- *                                                                           *

- *  -  result = L_num * (1/L_denom)                                          *

- *****************************************************************************

-*/

-

-Word32 Div_32 (Word32 L_num, Word16 denom_hi, Word16 denom_lo)

-{

-	Word16 approx, hi, lo, n_hi, n_lo;

-	Word32 L_32;

-

-	/* First approximation: 1 / L_denom = 1/denom_hi */

-

-	approx = div_s ((Word16) 0x3fff, denom_hi);

-

-	/* 1/L_denom = approx * (2.0 - L_denom * approx) */

-

-	L_32 = Mpy_32_16 (denom_hi, denom_lo, approx);

-

-	L_32 = L_sub ((Word32) 0x7fffffffL, L_32);

-	hi = L_32 >> 16;

-	lo = (L_32 & 0xffff) >> 1;

-

-	L_32 = Mpy_32_16 (hi, lo, approx);

-

-	/* L_num * (1/L_denom) */

-	hi = L_32 >> 16;

-	lo = (L_32 & 0xffff) >> 1;

-	VO_L_Extract (L_num, &n_hi, &n_lo);

-	L_32 = Mpy_32 (n_hi, n_lo, hi, lo);

-	L_32 = L_shl2(L_32, 2);

-

-	return (L_32);

-}

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/*****************************************************************************
+ *  This file contains operations in double precision.                       *
+ *  These operations are not standard double precision operations.           *
+ *  They are used where single precision is not enough but the full 32 bits  *
+ *  precision is not necessary. For example, the function Div_32() has a     *
+ *  24 bits precision which is enough for our purposes.                      *
+ *                                                                           *
+ *  The double precision numbers use a special representation:               *
+ *                                                                           *
+ *     L_32 = hi<<16 + lo<<1                                                 *
+ *                                                                           *
+ *  L_32 is a 32 bit integer.                                                *
+ *  hi and lo are 16 bit signed integers.                                    *
+ *  As the low part also contains the sign, this allows fast multiplication. *
+ *                                                                           *
+ *      0x8000 0000 <= L_32 <= 0x7fff fffe.                                  *
+ *                                                                           *
+ *  We will use DPF (Double Precision Format )in this file to specify        *
+ *  this special format.                                                     *
+ *****************************************************************************
+*/
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+
+/*****************************************************************************
+ *                                                                           *
+ *  Function L_Extract()                                                     *
+ *                                                                           *
+ *  Extract from a 32 bit integer two 16 bit DPF.                            *
+ *                                                                           *
+ *  Arguments:                                                               *
+ *                                                                           *
+ *   L_32      : 32 bit integer.                                             *
+ *               0x8000 0000 <= L_32 <= 0x7fff ffff.                         *
+ *   hi        : b16 to b31 of L_32                                          *
+ *   lo        : (L_32 - hi<<16)>>1                                          *
+ *****************************************************************************
+*/
+
+__inline void VO_L_Extract (Word32 L_32, Word16 *hi, Word16 *lo)
+{
+	*hi = (Word16)(L_32 >> 16);
+	*lo = (Word16)((L_32 & 0xffff) >> 1);
+	return;
+}
+
+/*****************************************************************************
+ *                                                                           *
+ *  Function L_Comp()                                                        *
+ *                                                                           *
+ *  Compose from two 16 bit DPF a 32 bit integer.                            *
+ *                                                                           *
+ *     L_32 = hi<<16 + lo<<1                                                 *
+ *                                                                           *
+ *  Arguments:                                                               *
+ *                                                                           *
+ *   hi        msb                                                           *
+ *   lo        lsf (with sign)                                               *
+ *                                                                           *
+ *   Return Value :                                                          *
+ *                                                                           *
+ *             32 bit long signed integer (Word32) whose value falls in the  *
+ *             range : 0x8000 0000 <= L_32 <= 0x7fff fff0.                   *
+ *                                                                           *
+ *****************************************************************************
+*/
+
+Word32 L_Comp (Word16 hi, Word16 lo)
+{
+	Word32 L_32;
+
+	L_32 = L_deposit_h (hi);
+
+	return (L_mac (L_32, lo, 1));       /* = hi<<16 + lo<<1 */
+}
+
+/*****************************************************************************
+ * Function Mpy_32()                                                         *
+ *                                                                           *
+ *   Multiply two 32 bit integers (DPF). The result is divided by 2**31      *
+ *                                                                           *
+ *   L_32 = (hi1*hi2)<<1 + ( (hi1*lo2)>>15 + (lo1*hi2)>>15 )<<1              *
+ *                                                                           *
+ *   This operation can also be viewed as the multiplication of two Q31      *
+ *   number and the result is also in Q31.                                   *
+ *                                                                           *
+ * Arguments:                                                                *
+ *                                                                           *
+ *  hi1         hi part of first number                                      *
+ *  lo1         lo part of first number                                      *
+ *  hi2         hi part of second number                                     *
+ *  lo2         lo part of second number                                     *
+ *                                                                           *
+ *****************************************************************************
+*/
+
+__inline Word32  Mpy_32 (Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2)
+{
+	Word32 L_32;
+	L_32 = (hi1 * hi2);
+	L_32 += (hi1 * lo2) >> 15;
+	L_32 += (lo1 * hi2) >> 15;
+	L_32 <<= 1;
+
+	return (L_32);
+}
+
+/*****************************************************************************
+ * Function Mpy_32_16()                                                      *
+ *                                                                           *
+ *   Multiply a 16 bit integer by a 32 bit (DPF). The result is divided      *
+ *   by 2**15                                                                *
+ *                                                                           *
+ *                                                                           *
+ *   L_32 = (hi1*lo2)<<1 + ((lo1*lo2)>>15)<<1                                *
+ *                                                                           *
+ * Arguments:                                                                *
+ *                                                                           *
+ *  hi          hi part of 32 bit number.                                    *
+ *  lo          lo part of 32 bit number.                                    *
+ *  n           16 bit number.                                               *
+ *                                                                           *
+ *****************************************************************************
+*/
+
+__inline Word32 Mpy_32_16 (Word16 hi, Word16 lo, Word16 n)
+{
+	Word32 L_32;
+
+	L_32 = (hi * n)<<1;
+	L_32 += (((lo * n)>>15)<<1);
+
+	return (L_32);
+}
+
+/*****************************************************************************
+ *                                                                           *
+ *   Function Name : Div_32                                                  *
+ *                                                                           *
+ *   Purpose :                                                               *
+ *             Fractional integer division of two 32 bit numbers.            *
+ *             L_num / L_denom.                                              *
+ *             L_num and L_denom must be positive and L_num < L_denom.       *
+ *             L_denom = denom_hi<<16 + denom_lo<<1                          *
+ *             denom_hi is a normalize number.                               *
+ *                                                                           *
+ *   Inputs :                                                                *
+ *                                                                           *
+ *    L_num                                                                  *
+ *             32 bit long signed integer (Word32) whose value falls in the  *
+ *             range : 0x0000 0000 < L_num < L_denom                         *
+ *                                                                           *
+ *    L_denom = denom_hi<<16 + denom_lo<<1      (DPF)                        *
+ *                                                                           *
+ *       denom_hi                                                            *
+ *             16 bit positive normalized integer whose value falls in the   *
+ *             range : 0x4000 < hi < 0x7fff                                  *
+ *       denom_lo                                                            *
+ *             16 bit positive integer whose value falls in the              *
+ *             range : 0 < lo < 0x7fff                                       *
+ *                                                                           *
+ *   Return Value :                                                          *
+ *                                                                           *
+ *    L_div                                                                  *
+ *             32 bit long signed integer (Word32) whose value falls in the  *
+ *             range : 0x0000 0000 <= L_div <= 0x7fff ffff.                  *
+ *                                                                           *
+ *  Algorithm:                                                               *
+ *                                                                           *
+ *  - find = 1/L_denom.                                                      *
+ *      First approximation: approx = 1 / denom_hi                           *
+ *      1/L_denom = approx * (2.0 - L_denom * approx )                       *
+ *                                                                           *
+ *  -  result = L_num * (1/L_denom)                                          *
+ *****************************************************************************
+*/
+
+Word32 Div_32 (Word32 L_num, Word16 denom_hi, Word16 denom_lo)
+{
+	Word16 approx, hi, lo, n_hi, n_lo;
+	Word32 L_32;
+
+	/* First approximation: 1 / L_denom = 1/denom_hi */
+
+	approx = div_s ((Word16) 0x3fff, denom_hi);
+
+	/* 1/L_denom = approx * (2.0 - L_denom * approx) */
+
+	L_32 = Mpy_32_16 (denom_hi, denom_lo, approx);
+
+	L_32 = L_sub ((Word32) 0x7fffffffL, L_32);
+	hi = L_32 >> 16;
+	lo = (L_32 & 0xffff) >> 1;
+
+	L_32 = Mpy_32_16 (hi, lo, approx);
+
+	/* L_num * (1/L_denom) */
+	hi = L_32 >> 16;
+	lo = (L_32 & 0xffff) >> 1;
+	VO_L_Extract (L_num, &n_hi, &n_lo);
+	L_32 = Mpy_32 (n_hi, n_lo, hi, lo);
+	L_32 = L_shl2(L_32, 2);
+
+	return (L_32);
+}
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c b/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c
index 39ee966..08f430f 100644
--- a/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c
+++ b/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c
@@ -1,256 +1,256 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*      File: p_med_ol.c                                                *

-*                                                                      *

-*      Description: Compute the open loop pitch lag                    *

-*	            output: open loop pitch lag                        *                            

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "acelp.h"

-#include "oper_32b.h"

-#include "math_op.h"

-#include "p_med_ol.tab"

-

-Word16 Pitch_med_ol(

-		   Word16      wsp[],        /*   i: signal used to compute the open loop pitch*/  

-                                     /*      wsp[-pit_max] to wsp[-1] should be known */

-		   Coder_State *st,          /* i/o: codec global structure */

-		   Word16      L_frame       /*   i: length of frame to compute pitch */

-		)

-{

-	Word16 Tm;

-	Word16 hi, lo;

-	Word16 *ww, *we, *hp_wsp;

-	Word16 exp_R0, exp_R1, exp_R2;

-	Word32 i, j, max, R0, R1, R2;

-	Word16 *p1, *p2;

-	Word16 L_min = 17;                   /* minimum pitch lag: PIT_MIN / OPL_DECIM */

-	Word16 L_max = 115;                  /* maximum pitch lag: PIT_MAX / OPL_DECIM */

-	Word16 L_0 = st->old_T0_med;         /* old open-loop pitch */

-	Word16 *gain = &(st->ol_gain);       /* normalize correlation of hp_wsp for the lag */

-	Word16 *hp_wsp_mem = st->hp_wsp_mem; /* memory of the hypass filter for hp_wsp[] (lg = 9)*/

-	Word16 *old_hp_wsp = st->old_hp_wsp; /* hypass wsp[] */

-	Word16 wght_flg = st->ol_wght_flg;   /* is weighting function used */

-

-	ww = &corrweight[198];

-	we = &corrweight[98 + L_max - L_0];

-

-	max = MIN_32;                          

-	Tm = 0;                                

-	for (i = L_max; i > L_min; i--)

-	{

-		/* Compute the correlation */

-		R0 = 0;

-		p1 = wsp;

-		p2 = &wsp[-i];

-		for (j = 0; j < L_frame; j+=4)

-		{

-			R0 += vo_L_mult((*p1++), (*p2++));

-			R0 += vo_L_mult((*p1++), (*p2++));

-			R0 += vo_L_mult((*p1++), (*p2++));

-			R0 += vo_L_mult((*p1++), (*p2++));     

-		}

-		/* Weighting of the correlation function.   */

-		hi = R0>>16;

-		lo = (R0 & 0xffff)>>1;

-

-		R0 = Mpy_32_16(hi, lo, *ww);

-		ww--;

-

-		if ((L_0 > 0) && (wght_flg > 0))

-		{

-			/* Weight the neighbourhood of the old lag. */

-			hi = R0>>16;

-			lo = (R0 & 0xffff)>>1;

-			R0 = Mpy_32_16(hi, lo, *we);

-			we--;

-		}

-		if(R0 >= max)

-		{

-			max = R0;

-			Tm = i;

-		}

-	}

-

-	/* Hypass the wsp[] vector */

-	hp_wsp = old_hp_wsp + L_max;           

-	Hp_wsp(wsp, hp_wsp, L_frame, hp_wsp_mem);

-

-	/* Compute normalize correlation at delay Tm */

-	R0 = 0;                                

-	R1 = 0;                               

-	R2 = 0; 

-	p1 = hp_wsp;

-	p2 = hp_wsp - Tm;

-	for (j = 0; j < L_frame; j+=4)

-	{

-		R2 += vo_mult32(*p1, *p1);

-		R1 += vo_mult32(*p2, *p2);

-		R0 += vo_mult32(*p1++, *p2++);

-		R2 += vo_mult32(*p1, *p1);

-		R1 += vo_mult32(*p2, *p2);

-		R0 += vo_mult32(*p1++, *p2++);

-		R2 += vo_mult32(*p1, *p1);

-		R1 += vo_mult32(*p2, *p2);

-		R0 += vo_mult32(*p1++, *p2++);

-		R2 += vo_mult32(*p1, *p1);

-		R1 += vo_mult32(*p2, *p2);

-		R0 += vo_mult32(*p1++, *p2++);

-	}

-	R0 = R0 <<1;

-	R1 = (R1 <<1) + 1L;

-	R2 = (R2 <<1) + 1L;

-	/* gain = R0/ sqrt(R1*R2) */

-

-	exp_R0 = norm_l(R0);

-	R0 = (R0 << exp_R0);

-

-	exp_R1 = norm_l(R1);

-	R1 = (R1 << exp_R1);

-

-	exp_R2 = norm_l(R2);

-	R2 = (R2 << exp_R2);

-

-

-	R1 = vo_L_mult(vo_round(R1), vo_round(R2));

-

-	i = norm_l(R1);

-	R1 = (R1 << i);

-

-	exp_R1 += exp_R2;

-	exp_R1 += i;

-	exp_R1 = 62 - exp_R1;

-

-	Isqrt_n(&R1, &exp_R1);

-

-	R0 = vo_L_mult(voround(R0), voround(R1));

-	exp_R0 = 31 - exp_R0;

-	exp_R0 += exp_R1;

-

-	*gain = vo_round(L_shl(R0, exp_R0));

-

-	/* Shitf hp_wsp[] for next frame */

-

-	for (i = 0; i < L_max; i++)

-	{

-		old_hp_wsp[i] = old_hp_wsp[i + L_frame];

-	}

-

-	return (Tm);

-}

-

-/************************************************************************

-*  Function: median5                                                    *

-*                                                                       *

-*      Returns the median of the set {X[-2], X[-1],..., X[2]},          *

-*      whose elements are 16-bit integers.                              *

-*                                                                       *

-*  Input:                                                               *

-*      X[-2:2]   16-bit integers.                                       *

-*                                                                       *

-*  Return:                                                              *

-*      The median of {X[-2], X[-1],..., X[2]}.                          *

-************************************************************************/

-

-Word16 median5(Word16 x[])

-{

-	Word16 x1, x2, x3, x4, x5;

-	Word16 tmp;

-

-	x1 = x[-2];                            

-	x2 = x[-1];                            

-	x3 = x[0];                             

-	x4 = x[1];                             

-	x5 = x[2];                             

-

-	if (x2 < x1)

-	{

-		tmp = x1;

-		x1 = x2;

-		x2 = tmp;                          

-	}

-	if (x3 < x1)

-	{

-		tmp = x1;

-		x1 = x3;

-		x3 = tmp;                          

-	}

-	if (x4 < x1)

-	{

-		tmp = x1;

-		x1 = x4;

-		x4 = tmp;                          

-	}

-	if (x5 < x1)

-	{

-		x5 = x1;                           

-	}

-	if (x3 < x2)

-	{

-		tmp = x2;

-		x2 = x3;

-		x3 = tmp;                          

-	}

-	if (x4 < x2)

-	{

-		tmp = x2;

-		x2 = x4;

-		x4 = tmp;                          

-	}

-	if (x5 < x2)

-	{

-		x5 = x2;                           

-	}

-	if (x4 < x3)

-	{

-		x3 = x4;                           

-	}

-	if (x5 < x3)

-	{

-		x3 = x5;                           

-	}

-	return (x3);

-}

-

-

-Word16 Med_olag(                           /* output : median of  5 previous open-loop lags       */

-		Word16 prev_ol_lag,                /* input  : previous open-loop lag                     */

-		Word16 old_ol_lag[5]

-	       )

-{

-	Word32 i;

-

-	/* Use median of 5 previous open-loop lags as old lag */

-

-	for (i = 4; i > 0; i--)

-	{

-		old_ol_lag[i] = old_ol_lag[i - 1]; 

-	}

-

-	old_ol_lag[0] = prev_ol_lag;           

-

-	i = median5(&old_ol_lag[2]);

-

-	return i;

-

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*      File: p_med_ol.c                                                *
+*                                                                      *
+*      Description: Compute the open loop pitch lag                    *
+*	            output: open loop pitch lag                        *                            
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "acelp.h"
+#include "oper_32b.h"
+#include "math_op.h"
+#include "p_med_ol.tab"
+
+Word16 Pitch_med_ol(
+		   Word16      wsp[],        /*   i: signal used to compute the open loop pitch*/  
+                                     /*      wsp[-pit_max] to wsp[-1] should be known */
+		   Coder_State *st,          /* i/o: codec global structure */
+		   Word16      L_frame       /*   i: length of frame to compute pitch */
+		)
+{
+	Word16 Tm;
+	Word16 hi, lo;
+	Word16 *ww, *we, *hp_wsp;
+	Word16 exp_R0, exp_R1, exp_R2;
+	Word32 i, j, max, R0, R1, R2;
+	Word16 *p1, *p2;
+	Word16 L_min = 17;                   /* minimum pitch lag: PIT_MIN / OPL_DECIM */
+	Word16 L_max = 115;                  /* maximum pitch lag: PIT_MAX / OPL_DECIM */
+	Word16 L_0 = st->old_T0_med;         /* old open-loop pitch */
+	Word16 *gain = &(st->ol_gain);       /* normalize correlation of hp_wsp for the lag */
+	Word16 *hp_wsp_mem = st->hp_wsp_mem; /* memory of the hypass filter for hp_wsp[] (lg = 9)*/
+	Word16 *old_hp_wsp = st->old_hp_wsp; /* hypass wsp[] */
+	Word16 wght_flg = st->ol_wght_flg;   /* is weighting function used */
+
+	ww = &corrweight[198];
+	we = &corrweight[98 + L_max - L_0];
+
+	max = MIN_32;                          
+	Tm = 0;                                
+	for (i = L_max; i > L_min; i--)
+	{
+		/* Compute the correlation */
+		R0 = 0;
+		p1 = wsp;
+		p2 = &wsp[-i];
+		for (j = 0; j < L_frame; j+=4)
+		{
+			R0 += vo_L_mult((*p1++), (*p2++));
+			R0 += vo_L_mult((*p1++), (*p2++));
+			R0 += vo_L_mult((*p1++), (*p2++));
+			R0 += vo_L_mult((*p1++), (*p2++));     
+		}
+		/* Weighting of the correlation function.   */
+		hi = R0>>16;
+		lo = (R0 & 0xffff)>>1;
+
+		R0 = Mpy_32_16(hi, lo, *ww);
+		ww--;
+
+		if ((L_0 > 0) && (wght_flg > 0))
+		{
+			/* Weight the neighbourhood of the old lag. */
+			hi = R0>>16;
+			lo = (R0 & 0xffff)>>1;
+			R0 = Mpy_32_16(hi, lo, *we);
+			we--;
+		}
+		if(R0 >= max)
+		{
+			max = R0;
+			Tm = i;
+		}
+	}
+
+	/* Hypass the wsp[] vector */
+	hp_wsp = old_hp_wsp + L_max;           
+	Hp_wsp(wsp, hp_wsp, L_frame, hp_wsp_mem);
+
+	/* Compute normalize correlation at delay Tm */
+	R0 = 0;                                
+	R1 = 0;                               
+	R2 = 0; 
+	p1 = hp_wsp;
+	p2 = hp_wsp - Tm;
+	for (j = 0; j < L_frame; j+=4)
+	{
+		R2 += vo_mult32(*p1, *p1);
+		R1 += vo_mult32(*p2, *p2);
+		R0 += vo_mult32(*p1++, *p2++);
+		R2 += vo_mult32(*p1, *p1);
+		R1 += vo_mult32(*p2, *p2);
+		R0 += vo_mult32(*p1++, *p2++);
+		R2 += vo_mult32(*p1, *p1);
+		R1 += vo_mult32(*p2, *p2);
+		R0 += vo_mult32(*p1++, *p2++);
+		R2 += vo_mult32(*p1, *p1);
+		R1 += vo_mult32(*p2, *p2);
+		R0 += vo_mult32(*p1++, *p2++);
+	}
+	R0 = R0 <<1;
+	R1 = (R1 <<1) + 1L;
+	R2 = (R2 <<1) + 1L;
+	/* gain = R0/ sqrt(R1*R2) */
+
+	exp_R0 = norm_l(R0);
+	R0 = (R0 << exp_R0);
+
+	exp_R1 = norm_l(R1);
+	R1 = (R1 << exp_R1);
+
+	exp_R2 = norm_l(R2);
+	R2 = (R2 << exp_R2);
+
+
+	R1 = vo_L_mult(vo_round(R1), vo_round(R2));
+
+	i = norm_l(R1);
+	R1 = (R1 << i);
+
+	exp_R1 += exp_R2;
+	exp_R1 += i;
+	exp_R1 = 62 - exp_R1;
+
+	Isqrt_n(&R1, &exp_R1);
+
+	R0 = vo_L_mult(voround(R0), voround(R1));
+	exp_R0 = 31 - exp_R0;
+	exp_R0 += exp_R1;
+
+	*gain = vo_round(L_shl(R0, exp_R0));
+
+	/* Shitf hp_wsp[] for next frame */
+
+	for (i = 0; i < L_max; i++)
+	{
+		old_hp_wsp[i] = old_hp_wsp[i + L_frame];
+	}
+
+	return (Tm);
+}
+
+/************************************************************************
+*  Function: median5                                                    *
+*                                                                       *
+*      Returns the median of the set {X[-2], X[-1],..., X[2]},          *
+*      whose elements are 16-bit integers.                              *
+*                                                                       *
+*  Input:                                                               *
+*      X[-2:2]   16-bit integers.                                       *
+*                                                                       *
+*  Return:                                                              *
+*      The median of {X[-2], X[-1],..., X[2]}.                          *
+************************************************************************/
+
+Word16 median5(Word16 x[])
+{
+	Word16 x1, x2, x3, x4, x5;
+	Word16 tmp;
+
+	x1 = x[-2];                            
+	x2 = x[-1];                            
+	x3 = x[0];                             
+	x4 = x[1];                             
+	x5 = x[2];                             
+
+	if (x2 < x1)
+	{
+		tmp = x1;
+		x1 = x2;
+		x2 = tmp;                          
+	}
+	if (x3 < x1)
+	{
+		tmp = x1;
+		x1 = x3;
+		x3 = tmp;                          
+	}
+	if (x4 < x1)
+	{
+		tmp = x1;
+		x1 = x4;
+		x4 = tmp;                          
+	}
+	if (x5 < x1)
+	{
+		x5 = x1;                           
+	}
+	if (x3 < x2)
+	{
+		tmp = x2;
+		x2 = x3;
+		x3 = tmp;                          
+	}
+	if (x4 < x2)
+	{
+		tmp = x2;
+		x2 = x4;
+		x4 = tmp;                          
+	}
+	if (x5 < x2)
+	{
+		x5 = x2;                           
+	}
+	if (x4 < x3)
+	{
+		x3 = x4;                           
+	}
+	if (x5 < x3)
+	{
+		x3 = x5;                           
+	}
+	return (x3);
+}
+
+
+Word16 Med_olag(                           /* output : median of  5 previous open-loop lags       */
+		Word16 prev_ol_lag,                /* input  : previous open-loop lag                     */
+		Word16 old_ol_lag[5]
+	       )
+{
+	Word32 i;
+
+	/* Use median of 5 previous open-loop lags as old lag */
+
+	for (i = 4; i > 0; i--)
+	{
+		old_ol_lag[i] = old_ol_lag[i - 1]; 
+	}
+
+	old_ol_lag[0] = prev_ol_lag;           
+
+	i = median5(&old_ol_lag[2]);
+
+	return i;
+
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/pit_shrp.c b/media/libstagefright/codecs/amrwbenc/src/pit_shrp.c
index c8a227c..6f55b8f 100644
--- a/media/libstagefright/codecs/amrwbenc/src/pit_shrp.c
+++ b/media/libstagefright/codecs/amrwbenc/src/pit_shrp.c
@@ -1,49 +1,49 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*      File: pit_shrp.c                                                *

-*                                                                      *

-*      Description: Performs Pitch sharpening routine                  *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-

-void Pit_shrp(

-		Word16 * x,                           /* in/out: impulse response (or algebraic code) */

-		Word16 pit_lag,                       /* input : pitch lag                            */

-		Word16 sharp,                         /* input : pitch sharpening factor (Q15)        */

-		Word16 L_subfr                        /* input : subframe size                        */

-	     )

-{

-	Word32 i;

-	Word32 L_tmp;

-	Word16 *x_ptr = x + pit_lag;

-

-	for (i = pit_lag; i < L_subfr; i++)

-	{

-		L_tmp = (*x_ptr << 15);

-		L_tmp += *x++ * sharp;

-		*x_ptr++ = ((L_tmp + 0x4000)>>15);

-	}

-

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*      File: pit_shrp.c                                                *
+*                                                                      *
+*      Description: Performs Pitch sharpening routine                  *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+void Pit_shrp(
+		Word16 * x,                           /* in/out: impulse response (or algebraic code) */
+		Word16 pit_lag,                       /* input : pitch lag                            */
+		Word16 sharp,                         /* input : pitch sharpening factor (Q15)        */
+		Word16 L_subfr                        /* input : subframe size                        */
+	     )
+{
+	Word32 i;
+	Word32 L_tmp;
+	Word16 *x_ptr = x + pit_lag;
+
+	for (i = pit_lag; i < L_subfr; i++)
+	{
+		L_tmp = (*x_ptr << 15);
+		L_tmp += *x++ * sharp;
+		*x_ptr++ = ((L_tmp + 0x4000)>>15);
+	}
+
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c b/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c
index c115b11..41d7413 100644
--- a/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c
+++ b/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c
@@ -1,324 +1,324 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*      File: pitch_f4.c                                                *

-*                                                                      *

-*      Description: Find the closed loop pitch period with             *

-*	            1/4 subsample resolution.                          *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "math_op.h"

-#include "acelp.h"

-#include "cnst.h"

-

-#define UP_SAMP      4

-#define L_INTERPOL1  4

-

-/* Local functions */

-

-#ifdef ASM_OPT

-void Norm_corr_asm(

-		Word16 exc[],                         /* (i)     : excitation buffer                     */

-		Word16 xn[],                          /* (i)     : target vector                         */

-		Word16 h[],                           /* (i) Q15 : impulse response of synth/wgt filters */

-		Word16 L_subfr,

-		Word16 t_min,                         /* (i)     : minimum value of pitch lag.           */

-		Word16 t_max,                         /* (i)     : maximum value of pitch lag.           */

-		Word16 corr_norm[]                    /* (o) Q15 : normalized correlation                */

-		);

-#else

-static void Norm_Corr(

-		Word16 exc[],                         /* (i)     : excitation buffer                     */

-		Word16 xn[],                          /* (i)     : target vector                         */

-		Word16 h[],                           /* (i) Q15 : impulse response of synth/wgt filters */

-		Word16 L_subfr,

-		Word16 t_min,                         /* (i)     : minimum value of pitch lag.           */

-		Word16 t_max,                         /* (i)     : maximum value of pitch lag.           */

-		Word16 corr_norm[]                    /* (o) Q15 : normalized correlation                */

-		);

-#endif

-

-static Word16 Interpol_4(                  /* (o)  : interpolated value  */

-		Word16 * x,                           /* (i)  : input vector        */

-		Word32 frac                           /* (i)  : fraction (-4..+3)   */

-		);

-

-

-Word16 Pitch_fr4(                          /* (o)     : pitch period.                         */

-		Word16 exc[],                         /* (i)     : excitation buffer                     */

-		Word16 xn[],                          /* (i)     : target vector                         */

-		Word16 h[],                           /* (i) Q15 : impulse response of synth/wgt filters */

-		Word16 t0_min,                        /* (i)     : minimum value in the searched range.  */

-		Word16 t0_max,                        /* (i)     : maximum value in the searched range.  */

-		Word16 * pit_frac,                    /* (o)     : chosen fraction (0, 1, 2 or 3).       */

-		Word16 i_subfr,                       /* (i)     : indicator for first subframe.         */

-		Word16 t0_fr2,                        /* (i)     : minimum value for resolution 1/2      */

-		Word16 t0_fr1,                        /* (i)     : minimum value for resolution 1        */

-		Word16 L_subfr                        /* (i)     : Length of subframe                    */

-		)

-{

-	Word32 fraction, i;

-	Word16 t_min, t_max;

-	Word16 max, t0, step, temp;

-	Word16 *corr;

-	Word16 corr_v[40];                     /* Total length = t0_max-t0_min+1+2*L_inter */

-

-	/* Find interval to compute normalized correlation */

-

-	t_min = t0_min - L_INTERPOL1;

-	t_max = t0_max + L_INTERPOL1;

-	corr = &corr_v[-t_min];

-	/* Compute normalized correlation between target and filtered excitation */

-#ifdef ASM_OPT               /* asm optimization branch */

-    Norm_corr_asm(exc, xn, h, L_subfr, t_min, t_max, corr);

-#else

-	Norm_Corr(exc, xn, h, L_subfr, t_min, t_max, corr);

-#endif 

-

-	/* Find integer pitch */

-

-	max = corr[t0_min];

-	t0 = t0_min;

-	for (i = t0_min + 1; i <= t0_max; i++)

-	{

-		if (corr[i] >= max)

-		{

-			max = corr[i];                 

-			t0 = i;                        

-		}

-	}

-	/* If first subframe and t0 >= t0_fr1, do not search fractionnal pitch */

-	if ((i_subfr == 0) && (t0 >= t0_fr1))

-	{

-		*pit_frac = 0;

-		return (t0);

-	}

-	/*------------------------------------------------------------------*

-	 * Search fractionnal pitch with 1/4 subsample resolution.          *

-	 * Test the fractions around t0 and choose the one which maximizes  *

-	 * the interpolated normalized correlation.                         *

-	 *------------------------------------------------------------------*/

-

-	step = 1;               /* 1/4 subsample resolution */

-	fraction = -3;

-	if ((t0_fr2 == PIT_MIN)||((i_subfr == 0) && (t0 >= t0_fr2)))

-	{

-		step = 2;              /* 1/2 subsample resolution */

-		fraction = -2;

-	}

-	if(t0 == t0_min)

-	{

-		fraction = 0;

-	}

-	max = Interpol_4(&corr[t0], fraction);

-

-	for (i = fraction + step; i <= 3; i += step)

-	{

-		temp = Interpol_4(&corr[t0], i);

-		if(temp > max)

-		{

-			max = temp;

-			fraction = i;

-		}

-	}

-	/* limit the fraction value in the interval [0,1,2,3] */

-	if (fraction < 0)

-	{

-		fraction += UP_SAMP;

-		t0 -= 1;

-	}

-	*pit_frac = fraction;

-	return (t0);

-}

-

-

-/***********************************************************************************

-* Function:  Norm_Corr()                                                            *

-*                                                                                   *

-* Description: Find the normalized correlation between the target vector and the    *

-* filtered past excitation.                                                         *

-* (correlation between target and filtered excitation divided by the                *

-*  square root of energy of target and filtered excitation).                        *

-************************************************************************************/

-#ifndef ASM_OPT

-static void Norm_Corr(

-		Word16 exc[],                         /* (i)     : excitation buffer                     */

-		Word16 xn[],                          /* (i)     : target vector                         */

-		Word16 h[],                           /* (i) Q15 : impulse response of synth/wgt filters */

-		Word16 L_subfr,

-		Word16 t_min,                         /* (i)     : minimum value of pitch lag.           */

-		Word16 t_max,                         /* (i)     : maximum value of pitch lag.           */

-		Word16 corr_norm[])                   /* (o) Q15 : normalized correlation                */

-{

-	Word32 i, k, t;

-	Word32 corr, exp_corr, norm, exp, scale;

-	Word16 exp_norm, excf[L_SUBFR], tmp;

-	Word32 L_tmp, L_tmp1, L_tmp2;

-

-	/* compute the filtered excitation for the first delay t_min */

-	k = -t_min;

-

-#ifdef ASM_OPT              /* asm optimization branch */

-	Convolve_asm(&exc[k], h, excf, 64);

-#else

-	Convolve(&exc[k], h, excf, 64);

-#endif

-

-	/* Compute rounded down 1/sqrt(energy of xn[]) */

-	L_tmp = 0; 

-	for (i = 0; i < 64; i+=4)

-	{

-		L_tmp += (xn[i] * xn[i]);

-		L_tmp += (xn[i+1] * xn[i+1]);

-		L_tmp += (xn[i+2] * xn[i+2]);

-		L_tmp += (xn[i+3] * xn[i+3]);

-	}

-

-	L_tmp = (L_tmp << 1) + 1;

-	exp = norm_l(L_tmp);

-	exp = (32 - exp);

-	//exp = exp + 2;                     /* energy of xn[] x 2 + rounded up     */

-	scale = -(exp >> 1);           /* (1<<scale) < 1/sqrt(energy rounded) */

-

-	/* loop for every possible period */

-

-	for (t = t_min; t <= t_max; t++)

-	{

-		/* Compute correlation between xn[] and excf[] */

-		L_tmp  = 0;  

-		L_tmp1 = 0;

-		for (i = 0; i < 64; i+=4)

-		{

-			L_tmp  += (xn[i] * excf[i]);

-			L_tmp1 += (excf[i] * excf[i]);

-			L_tmp  += (xn[i+1] * excf[i+1]);

-			L_tmp1 += (excf[i+1] * excf[i+1]);

-			L_tmp  += (xn[i+2] * excf[i+2]);

-			L_tmp1 += (excf[i+2] * excf[i+2]);

-			L_tmp  += (xn[i+3] * excf[i+3]);

-			L_tmp1 += (excf[i+3] * excf[i+3]);

-		}

-

-		L_tmp = (L_tmp << 1) + 1;

-		L_tmp1 = (L_tmp1 << 1) + 1;

-

-		exp = norm_l(L_tmp);

-		L_tmp = (L_tmp << exp);

-		exp_corr = (30 - exp);

-		corr = extract_h(L_tmp);

-

-		exp = norm_l(L_tmp1);

-		L_tmp = (L_tmp1 << exp);

-		exp_norm = (30 - exp);

-

-		Isqrt_n(&L_tmp, &exp_norm);

-		norm = extract_h(L_tmp);

-

-		/* Normalize correlation = correlation * (1/sqrt(energy)) */

-

-		L_tmp = vo_L_mult(corr, norm);

-

-		L_tmp2 = exp_corr + exp_norm + scale;

-		if(L_tmp2 < 0)

-		{

-			L_tmp2 = -L_tmp2;

-			L_tmp = L_tmp >> L_tmp2;

-		}

-		else

-		{

-			L_tmp = L_tmp << L_tmp2;

-		}

-

-		corr_norm[t] = vo_round(L_tmp);      

-		/* modify the filtered excitation excf[] for the next iteration */

-

-		if(t != t_max)

-		{

-			k = -(t + 1);

-			tmp = exc[k];

-			for (i = 63; i > 0; i--)

-			{

-				excf[i] = add1(vo_mult(tmp, h[i]), excf[i - 1]);

-			}

-			excf[0] = vo_mult(tmp, h[0]);

-		}

-	}

-	return;

-}

-

-#endif

-/************************************************************************************

-* Function: Interpol_4()                                                             *

-*                                                                                    *

-* Description: For interpolating the normalized correlation with 1/4 resolution.     *

-**************************************************************************************/

-

-/* 1/4 resolution interpolation filter (-3 dB at 0.791*fs/2) in Q14 */

-static Word16 inter4_1[4][8] =

-{

-	{-12, 420, -1732, 5429, 13418, -1242, 73, 32},

-	{-26, 455, -2142, 9910, 9910,  -2142, 455, -26},

-	{32,  73, -1242, 13418, 5429, -1732, 420, -12},

-	{206, -766, 1376, 14746, 1376, -766, 206, 0}

-};

-

-/*** Coefficients in floating point

-static float inter4_1[UP_SAMP*L_INTERPOL1+1] = {

-0.900000,

-0.818959,  0.604850,  0.331379,  0.083958,

--0.075795, -0.130717, -0.105685, -0.046774,

-0.004467,  0.027789,  0.025642,  0.012571,

-0.001927, -0.001571, -0.000753,  0.000000};

-***/

-

-static Word16 Interpol_4(                  /* (o)  : interpolated value  */

-		Word16 * x,                           /* (i)  : input vector        */

-		Word32 frac                           /* (i)  : fraction (-4..+3)   */

-		)

-{

-	Word16 sum;

-	Word32  k, L_sum;

-	Word16 *ptr;

-

-	if (frac < 0)

-	{

-		frac += UP_SAMP;

-		x--;

-	}

-	x = x - L_INTERPOL1 + 1;

-	k = UP_SAMP - 1 - frac;

-	ptr = &(inter4_1[k][0]);

-

-	L_sum  = vo_mult32(x[0], (*ptr++));

-	L_sum += vo_mult32(x[1], (*ptr++));

-	L_sum += vo_mult32(x[2], (*ptr++));

-	L_sum += vo_mult32(x[3], (*ptr++));

-	L_sum += vo_mult32(x[4], (*ptr++));  

-	L_sum += vo_mult32(x[5], (*ptr++));

-	L_sum += vo_mult32(x[6], (*ptr++));

-	L_sum += vo_mult32(x[7], (*ptr++));   

-

-	sum = extract_h(L_add(L_shl2(L_sum, 2), 0x8000));

-	return (sum);

-}

-

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*      File: pitch_f4.c                                                *
+*                                                                      *
+*      Description: Find the closed loop pitch period with             *
+*	            1/4 subsample resolution.                          *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+#include "acelp.h"
+#include "cnst.h"
+
+#define UP_SAMP      4
+#define L_INTERPOL1  4
+
+/* Local functions */
+
+#ifdef ASM_OPT
+void Norm_corr_asm(
+		Word16 exc[],                         /* (i)     : excitation buffer                     */
+		Word16 xn[],                          /* (i)     : target vector                         */
+		Word16 h[],                           /* (i) Q15 : impulse response of synth/wgt filters */
+		Word16 L_subfr,
+		Word16 t_min,                         /* (i)     : minimum value of pitch lag.           */
+		Word16 t_max,                         /* (i)     : maximum value of pitch lag.           */
+		Word16 corr_norm[]                    /* (o) Q15 : normalized correlation                */
+		);
+#else
+static void Norm_Corr(
+		Word16 exc[],                         /* (i)     : excitation buffer                     */
+		Word16 xn[],                          /* (i)     : target vector                         */
+		Word16 h[],                           /* (i) Q15 : impulse response of synth/wgt filters */
+		Word16 L_subfr,
+		Word16 t_min,                         /* (i)     : minimum value of pitch lag.           */
+		Word16 t_max,                         /* (i)     : maximum value of pitch lag.           */
+		Word16 corr_norm[]                    /* (o) Q15 : normalized correlation                */
+		);
+#endif
+
+static Word16 Interpol_4(                  /* (o)  : interpolated value  */
+		Word16 * x,                           /* (i)  : input vector        */
+		Word32 frac                           /* (i)  : fraction (-4..+3)   */
+		);
+
+
+Word16 Pitch_fr4(                          /* (o)     : pitch period.                         */
+		Word16 exc[],                         /* (i)     : excitation buffer                     */
+		Word16 xn[],                          /* (i)     : target vector                         */
+		Word16 h[],                           /* (i) Q15 : impulse response of synth/wgt filters */
+		Word16 t0_min,                        /* (i)     : minimum value in the searched range.  */
+		Word16 t0_max,                        /* (i)     : maximum value in the searched range.  */
+		Word16 * pit_frac,                    /* (o)     : chosen fraction (0, 1, 2 or 3).       */
+		Word16 i_subfr,                       /* (i)     : indicator for first subframe.         */
+		Word16 t0_fr2,                        /* (i)     : minimum value for resolution 1/2      */
+		Word16 t0_fr1,                        /* (i)     : minimum value for resolution 1        */
+		Word16 L_subfr                        /* (i)     : Length of subframe                    */
+		)
+{
+	Word32 fraction, i;
+	Word16 t_min, t_max;
+	Word16 max, t0, step, temp;
+	Word16 *corr;
+	Word16 corr_v[40];                     /* Total length = t0_max-t0_min+1+2*L_inter */
+
+	/* Find interval to compute normalized correlation */
+
+	t_min = t0_min - L_INTERPOL1;
+	t_max = t0_max + L_INTERPOL1;
+	corr = &corr_v[-t_min];
+	/* Compute normalized correlation between target and filtered excitation */
+#ifdef ASM_OPT               /* asm optimization branch */
+    Norm_corr_asm(exc, xn, h, L_subfr, t_min, t_max, corr);
+#else
+	Norm_Corr(exc, xn, h, L_subfr, t_min, t_max, corr);
+#endif 
+
+	/* Find integer pitch */
+
+	max = corr[t0_min];
+	t0 = t0_min;
+	for (i = t0_min + 1; i <= t0_max; i++)
+	{
+		if (corr[i] >= max)
+		{
+			max = corr[i];                 
+			t0 = i;                        
+		}
+	}
+	/* If first subframe and t0 >= t0_fr1, do not search fractionnal pitch */
+	if ((i_subfr == 0) && (t0 >= t0_fr1))
+	{
+		*pit_frac = 0;
+		return (t0);
+	}
+	/*------------------------------------------------------------------*
+	 * Search fractionnal pitch with 1/4 subsample resolution.          *
+	 * Test the fractions around t0 and choose the one which maximizes  *
+	 * the interpolated normalized correlation.                         *
+	 *------------------------------------------------------------------*/
+
+	step = 1;               /* 1/4 subsample resolution */
+	fraction = -3;
+	if ((t0_fr2 == PIT_MIN)||((i_subfr == 0) && (t0 >= t0_fr2)))
+	{
+		step = 2;              /* 1/2 subsample resolution */
+		fraction = -2;
+	}
+	if(t0 == t0_min)
+	{
+		fraction = 0;
+	}
+	max = Interpol_4(&corr[t0], fraction);
+
+	for (i = fraction + step; i <= 3; i += step)
+	{
+		temp = Interpol_4(&corr[t0], i);
+		if(temp > max)
+		{
+			max = temp;
+			fraction = i;
+		}
+	}
+	/* limit the fraction value in the interval [0,1,2,3] */
+	if (fraction < 0)
+	{
+		fraction += UP_SAMP;
+		t0 -= 1;
+	}
+	*pit_frac = fraction;
+	return (t0);
+}
+
+
+/***********************************************************************************
+* Function:  Norm_Corr()                                                            *
+*                                                                                   *
+* Description: Find the normalized correlation between the target vector and the    *
+* filtered past excitation.                                                         *
+* (correlation between target and filtered excitation divided by the                *
+*  square root of energy of target and filtered excitation).                        *
+************************************************************************************/
+#ifndef ASM_OPT
+static void Norm_Corr(
+		Word16 exc[],                         /* (i)     : excitation buffer                     */
+		Word16 xn[],                          /* (i)     : target vector                         */
+		Word16 h[],                           /* (i) Q15 : impulse response of synth/wgt filters */
+		Word16 L_subfr,
+		Word16 t_min,                         /* (i)     : minimum value of pitch lag.           */
+		Word16 t_max,                         /* (i)     : maximum value of pitch lag.           */
+		Word16 corr_norm[])                   /* (o) Q15 : normalized correlation                */
+{
+	Word32 i, k, t;
+	Word32 corr, exp_corr, norm, exp, scale;
+	Word16 exp_norm, excf[L_SUBFR], tmp;
+	Word32 L_tmp, L_tmp1, L_tmp2;
+
+	/* compute the filtered excitation for the first delay t_min */
+	k = -t_min;
+
+#ifdef ASM_OPT              /* asm optimization branch */
+	Convolve_asm(&exc[k], h, excf, 64);
+#else
+	Convolve(&exc[k], h, excf, 64);
+#endif
+
+	/* Compute rounded down 1/sqrt(energy of xn[]) */
+	L_tmp = 0; 
+	for (i = 0; i < 64; i+=4)
+	{
+		L_tmp += (xn[i] * xn[i]);
+		L_tmp += (xn[i+1] * xn[i+1]);
+		L_tmp += (xn[i+2] * xn[i+2]);
+		L_tmp += (xn[i+3] * xn[i+3]);
+	}
+
+	L_tmp = (L_tmp << 1) + 1;
+	exp = norm_l(L_tmp);
+	exp = (32 - exp);
+	//exp = exp + 2;                     /* energy of xn[] x 2 + rounded up     */
+	scale = -(exp >> 1);           /* (1<<scale) < 1/sqrt(energy rounded) */
+
+	/* loop for every possible period */
+
+	for (t = t_min; t <= t_max; t++)
+	{
+		/* Compute correlation between xn[] and excf[] */
+		L_tmp  = 0;  
+		L_tmp1 = 0;
+		for (i = 0; i < 64; i+=4)
+		{
+			L_tmp  += (xn[i] * excf[i]);
+			L_tmp1 += (excf[i] * excf[i]);
+			L_tmp  += (xn[i+1] * excf[i+1]);
+			L_tmp1 += (excf[i+1] * excf[i+1]);
+			L_tmp  += (xn[i+2] * excf[i+2]);
+			L_tmp1 += (excf[i+2] * excf[i+2]);
+			L_tmp  += (xn[i+3] * excf[i+3]);
+			L_tmp1 += (excf[i+3] * excf[i+3]);
+		}
+
+		L_tmp = (L_tmp << 1) + 1;
+		L_tmp1 = (L_tmp1 << 1) + 1;
+
+		exp = norm_l(L_tmp);
+		L_tmp = (L_tmp << exp);
+		exp_corr = (30 - exp);
+		corr = extract_h(L_tmp);
+
+		exp = norm_l(L_tmp1);
+		L_tmp = (L_tmp1 << exp);
+		exp_norm = (30 - exp);
+
+		Isqrt_n(&L_tmp, &exp_norm);
+		norm = extract_h(L_tmp);
+
+		/* Normalize correlation = correlation * (1/sqrt(energy)) */
+
+		L_tmp = vo_L_mult(corr, norm);
+
+		L_tmp2 = exp_corr + exp_norm + scale;
+		if(L_tmp2 < 0)
+		{
+			L_tmp2 = -L_tmp2;
+			L_tmp = L_tmp >> L_tmp2;
+		}
+		else
+		{
+			L_tmp = L_tmp << L_tmp2;
+		}
+
+		corr_norm[t] = vo_round(L_tmp);      
+		/* modify the filtered excitation excf[] for the next iteration */
+
+		if(t != t_max)
+		{
+			k = -(t + 1);
+			tmp = exc[k];
+			for (i = 63; i > 0; i--)
+			{
+				excf[i] = add1(vo_mult(tmp, h[i]), excf[i - 1]);
+			}
+			excf[0] = vo_mult(tmp, h[0]);
+		}
+	}
+	return;
+}
+
+#endif
+/************************************************************************************
+* Function: Interpol_4()                                                             *
+*                                                                                    *
+* Description: For interpolating the normalized correlation with 1/4 resolution.     *
+**************************************************************************************/
+
+/* 1/4 resolution interpolation filter (-3 dB at 0.791*fs/2) in Q14 */
+static Word16 inter4_1[4][8] =
+{
+	{-12, 420, -1732, 5429, 13418, -1242, 73, 32},
+	{-26, 455, -2142, 9910, 9910,  -2142, 455, -26},
+	{32,  73, -1242, 13418, 5429, -1732, 420, -12},
+	{206, -766, 1376, 14746, 1376, -766, 206, 0}
+};
+
+/*** Coefficients in floating point
+static float inter4_1[UP_SAMP*L_INTERPOL1+1] = {
+0.900000,
+0.818959,  0.604850,  0.331379,  0.083958,
+-0.075795, -0.130717, -0.105685, -0.046774,
+0.004467,  0.027789,  0.025642,  0.012571,
+0.001927, -0.001571, -0.000753,  0.000000};
+***/
+
+static Word16 Interpol_4(                  /* (o)  : interpolated value  */
+		Word16 * x,                           /* (i)  : input vector        */
+		Word32 frac                           /* (i)  : fraction (-4..+3)   */
+		)
+{
+	Word16 sum;
+	Word32  k, L_sum;
+	Word16 *ptr;
+
+	if (frac < 0)
+	{
+		frac += UP_SAMP;
+		x--;
+	}
+	x = x - L_INTERPOL1 + 1;
+	k = UP_SAMP - 1 - frac;
+	ptr = &(inter4_1[k][0]);
+
+	L_sum  = vo_mult32(x[0], (*ptr++));
+	L_sum += vo_mult32(x[1], (*ptr++));
+	L_sum += vo_mult32(x[2], (*ptr++));
+	L_sum += vo_mult32(x[3], (*ptr++));
+	L_sum += vo_mult32(x[4], (*ptr++));  
+	L_sum += vo_mult32(x[5], (*ptr++));
+	L_sum += vo_mult32(x[6], (*ptr++));
+	L_sum += vo_mult32(x[7], (*ptr++));   
+
+	sum = extract_h(L_add(L_shl2(L_sum, 2), 0x8000));
+	return (sum);
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/pred_lt4.c b/media/libstagefright/codecs/amrwbenc/src/pred_lt4.c
index ac1ff22..b359651 100644
--- a/media/libstagefright/codecs/amrwbenc/src/pred_lt4.c
+++ b/media/libstagefright/codecs/amrwbenc/src/pred_lt4.c
@@ -1,120 +1,120 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*      File: pred_lt4.c                                                *

-*                                                                      *

-*      Description: Compute the result of long term prediction with    *

-*      fractional interpolation of resolution 1/4                      *

-*      on return exc[0..L_subr-1] contains the interpolated signal     *

-*      (adaptive codebook excitation)                                  *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-

-#define UP_SAMP      4

-#define L_INTERPOL2  16

-

-/* 1/4 resolution interpolation filter (-3 dB at 0.856*fs/2) in Q14 */

-

-Word16 inter4_2[4][32] =

-{

-	{0,-2,4,-2,-10,38,-88,165,-275,424,-619,871,-1207,1699,-2598,5531,14031,-2147,780,-249,

-	-16,153,-213,226,-209,175,-133,91,-55,28,-10,2},

-

-	{1,-7,19,-33,47,-52,43,-9,-60,175,-355,626,-1044,1749,-3267,10359,10359,-3267,1749,-1044,

-	626,-355,175,-60,-9,43,-52,47,-33,19, -7, 1},

-

-	{2,-10,28,-55,91,-133,175,-209,226,-213,153,-16,-249,780,-2147,14031,5531,-2598,1699,-1207,

-	871,-619,424,-275,165,-88,38,-10,-2,4,-2,0},

-

-	{1,-7,22,-49,92,-153,231,-325,431,-544,656,-762,853,-923,968,15401,968,-923,853,-762,

-	656,-544,431,-325,231,-153,92,-49,22,-7, 1, 0}

-

-};

-

-void Pred_lt4(

-		Word16 exc[],                         /* in/out: excitation buffer */

-		Word16 T0,                            /* input : integer pitch lag */

-		Word16 frac,                          /* input : fraction of lag   */

-		Word16 L_subfr                        /* input : subframe size     */

-	     )

-{

-	Word16 j, k, *x;

-	Word32 L_sum;

-	Word16 *ptr, *ptr1;

-	Word16 *ptr2;

-

-	x = exc - T0;   

-	frac = -frac;

-	if (frac < 0)

-	{

-		frac += UP_SAMP;

-		x--;

-	}   

-	x -= 15;                                     /* x = L_INTERPOL2 - 1 */

-	k = 3 - frac;                                /* k = UP_SAMP - 1 - frac */

-

-	ptr2 = &(inter4_2[k][0]);

-	for (j = 0; j < L_subfr; j++)

-	{

-		ptr = ptr2;

-		ptr1 = x;

-		L_sum  = vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-		L_sum += vo_mult32((*ptr1++), (*ptr++));

-

-		L_sum = L_shl2(L_sum, 2);

-		exc[j] = extract_h(L_add(L_sum, 0x8000));

-		x++;

-	}

-

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*      File: pred_lt4.c                                                *
+*                                                                      *
+*      Description: Compute the result of long term prediction with    *
+*      fractional interpolation of resolution 1/4                      *
+*      on return exc[0..L_subr-1] contains the interpolated signal     *
+*      (adaptive codebook excitation)                                  *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+#define UP_SAMP      4
+#define L_INTERPOL2  16
+
+/* 1/4 resolution interpolation filter (-3 dB at 0.856*fs/2) in Q14 */
+
+Word16 inter4_2[4][32] =
+{
+	{0,-2,4,-2,-10,38,-88,165,-275,424,-619,871,-1207,1699,-2598,5531,14031,-2147,780,-249,
+	-16,153,-213,226,-209,175,-133,91,-55,28,-10,2},
+
+	{1,-7,19,-33,47,-52,43,-9,-60,175,-355,626,-1044,1749,-3267,10359,10359,-3267,1749,-1044,
+	626,-355,175,-60,-9,43,-52,47,-33,19, -7, 1},
+
+	{2,-10,28,-55,91,-133,175,-209,226,-213,153,-16,-249,780,-2147,14031,5531,-2598,1699,-1207,
+	871,-619,424,-275,165,-88,38,-10,-2,4,-2,0},
+
+	{1,-7,22,-49,92,-153,231,-325,431,-544,656,-762,853,-923,968,15401,968,-923,853,-762,
+	656,-544,431,-325,231,-153,92,-49,22,-7, 1, 0}
+
+};
+
+void Pred_lt4(
+		Word16 exc[],                         /* in/out: excitation buffer */
+		Word16 T0,                            /* input : integer pitch lag */
+		Word16 frac,                          /* input : fraction of lag   */
+		Word16 L_subfr                        /* input : subframe size     */
+	     )
+{
+	Word16 j, k, *x;
+	Word32 L_sum;
+	Word16 *ptr, *ptr1;
+	Word16 *ptr2;
+
+	x = exc - T0;   
+	frac = -frac;
+	if (frac < 0)
+	{
+		frac += UP_SAMP;
+		x--;
+	}   
+	x -= 15;                                     /* x = L_INTERPOL2 - 1 */
+	k = 3 - frac;                                /* k = UP_SAMP - 1 - frac */
+
+	ptr2 = &(inter4_2[k][0]);
+	for (j = 0; j < L_subfr; j++)
+	{
+		ptr = ptr2;
+		ptr1 = x;
+		L_sum  = vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+		L_sum += vo_mult32((*ptr1++), (*ptr++));
+
+		L_sum = L_shl2(L_sum, 2);
+		exc[j] = extract_h(L_add(L_sum, 0x8000));
+		x++;
+	}
+
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/preemph.c b/media/libstagefright/codecs/amrwbenc/src/preemph.c
index f5bcd33..5408617 100644
--- a/media/libstagefright/codecs/amrwbenc/src/preemph.c
+++ b/media/libstagefright/codecs/amrwbenc/src/preemph.c
@@ -1,88 +1,88 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*      File: preemph.c                                                *

-*                                                                     *

-*      Description: Preemphasis: filtering through 1 - g z^-1         *

-*	           Preemph2 --> signal is multiplied by 2             *

-*                                                                     *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-

-void Preemph(

-		Word16 x[],                           /* (i/o)   : input signal overwritten by the output */

-		Word16 mu,                            /* (i) Q15 : preemphasis coefficient                */

-		Word16 lg,                            /* (i)     : lenght of filtering                    */

-		Word16 * mem                          /* (i/o)   : memory (x[-1])                         */

-	    )

-{

-	Word16 temp;

-	Word32 i, L_tmp;

-

-	temp = x[lg - 1];                     

-

-	for (i = lg - 1; i > 0; i--)

-	{

-		L_tmp = L_deposit_h(x[i]);

-		L_tmp -= (x[i - 1] * mu)<<1;

-		x[i] = (L_tmp + 0x8000)>>16;               

-	}

-

-	L_tmp = L_deposit_h(x[0]);

-	L_tmp -= ((*mem) * mu)<<1;

-	x[0] = (L_tmp + 0x8000)>>16;                   

-

-	*mem = temp;                           

-

-	return;

-}

-

-

-void Preemph2(

-		Word16 x[],                           /* (i/o)   : input signal overwritten by the output */

-		Word16 mu,                            /* (i) Q15 : preemphasis coefficient                */

-		Word16 lg,                            /* (i)     : lenght of filtering                    */

-		Word16 * mem                          /* (i/o)   : memory (x[-1])                         */

-	     )

-{

-	Word16 temp;

-	Word32 i, L_tmp;

-

-	temp = x[lg - 1];                     

-

-	for (i = (Word16) (lg - 1); i > 0; i--)

-	{

-		L_tmp = L_deposit_h(x[i]);

-		L_tmp -= (x[i - 1] * mu)<<1;

-		L_tmp = (L_tmp << 1);

-		x[i] = (L_tmp + 0x8000)>>16;               

-	}

-

-	L_tmp = L_deposit_h(x[0]);

-	L_tmp -= ((*mem) * mu)<<1;

-	L_tmp = (L_tmp << 1);

-	x[0] = (L_tmp + 0x8000)>>16;                   

-

-	*mem = temp;                           

-

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*      File: preemph.c                                                *
+*                                                                     *
+*      Description: Preemphasis: filtering through 1 - g z^-1         *
+*	           Preemph2 --> signal is multiplied by 2             *
+*                                                                     *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+void Preemph(
+		Word16 x[],                           /* (i/o)   : input signal overwritten by the output */
+		Word16 mu,                            /* (i) Q15 : preemphasis coefficient                */
+		Word16 lg,                            /* (i)     : lenght of filtering                    */
+		Word16 * mem                          /* (i/o)   : memory (x[-1])                         */
+	    )
+{
+	Word16 temp;
+	Word32 i, L_tmp;
+
+	temp = x[lg - 1];                     
+
+	for (i = lg - 1; i > 0; i--)
+	{
+		L_tmp = L_deposit_h(x[i]);
+		L_tmp -= (x[i - 1] * mu)<<1;
+		x[i] = (L_tmp + 0x8000)>>16;               
+	}
+
+	L_tmp = L_deposit_h(x[0]);
+	L_tmp -= ((*mem) * mu)<<1;
+	x[0] = (L_tmp + 0x8000)>>16;                   
+
+	*mem = temp;                           
+
+	return;
+}
+
+
+void Preemph2(
+		Word16 x[],                           /* (i/o)   : input signal overwritten by the output */
+		Word16 mu,                            /* (i) Q15 : preemphasis coefficient                */
+		Word16 lg,                            /* (i)     : lenght of filtering                    */
+		Word16 * mem                          /* (i/o)   : memory (x[-1])                         */
+	     )
+{
+	Word16 temp;
+	Word32 i, L_tmp;
+
+	temp = x[lg - 1];                     
+
+	for (i = (Word16) (lg - 1); i > 0; i--)
+	{
+		L_tmp = L_deposit_h(x[i]);
+		L_tmp -= (x[i - 1] * mu)<<1;
+		L_tmp = (L_tmp << 1);
+		x[i] = (L_tmp + 0x8000)>>16;               
+	}
+
+	L_tmp = L_deposit_h(x[0]);
+	L_tmp -= ((*mem) * mu)<<1;
+	L_tmp = (L_tmp << 1);
+	x[0] = (L_tmp + 0x8000)>>16;                   
+
+	*mem = temp;                           
+
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/q_gain2.c b/media/libstagefright/codecs/amrwbenc/src/q_gain2.c
index 59eefe4..7bc299f 100644
--- a/media/libstagefright/codecs/amrwbenc/src/q_gain2.c
+++ b/media/libstagefright/codecs/amrwbenc/src/q_gain2.c
@@ -1,346 +1,346 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/**************************************************************************

-*  File: q_gain2.c                                                         *

-*                                                                          *

-*  Description:                                                            *

-* Quantization of pitch and codebook gains.                                *

-* MA prediction is performed on the innovation energy (in dB with mean     *

-* removed).                                                                *

-* An initial predicted gain, g_0, is first determined and the correction   *

-* factor     alpha = gain / g_0    is quantized.                           *

-* The pitch gain and the correction factor are vector quantized and the    *

-* mean-squared weighted error criterion is used in the quantizer search.   *

-****************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "oper_32b.h"

-#include "math_op.h"

-#include "log2.h"

-#include "acelp.h"

-#include "q_gain2.tab"

-

-#define MEAN_ENER    30

-#define RANGE        64

-#define PRED_ORDER   4

-

-

-/* MA prediction coeff ={0.5, 0.4, 0.3, 0.2} in Q13 */

-static Word16 pred[PRED_ORDER] = {4096, 3277, 2458, 1638};

-

-

-void Init_Q_gain2(

-		Word16 * mem                          /* output  :static memory (2 words)      */

-		)

-{

-	Word32 i;

-

-	/* 4nd order quantizer energy predictor (init to -14.0 in Q10) */

-	for (i = 0; i < PRED_ORDER; i++)

-	{

-		mem[i] = -14336;                     /* past_qua_en[i] */

-	}

-

-	return;

-}

-

-Word16 Q_gain2(                            /* Return index of quantization.          */

-		Word16 xn[],                          /* (i) Q_xn: Target vector.               */

-		Word16 y1[],                          /* (i) Q_xn: Adaptive codebook.           */

-		Word16 Q_xn,                          /* (i)     : xn and y1 format             */

-		Word16 y2[],                          /* (i) Q9  : Filtered innovative vector.  */

-		Word16 code[],                        /* (i) Q9  : Innovative vector.           */

-		Word16 g_coeff[],                     /* (i)     : Correlations <xn y1> <y1 y1> */

-		/*           Compute in G_pitch().        */

-		Word16 L_subfr,                       /* (i)     : Subframe lenght.             */

-		Word16 nbits,                         /* (i)     : number of bits (6 or 7)      */

-		Word16 * gain_pit,                    /* (i/o)Q14: Pitch gain.                  */

-		Word32 * gain_cod,                    /* (o) Q16 : Code gain.                   */

-		Word16 gp_clip,                       /* (i)     : Gp Clipping flag             */

-		Word16 * mem                          /* (i/o)   : static memory (2 words)      */

-	      )

-{

-	Word16 index, *p, min_ind, size;

-	Word16 exp, frac, gcode0, exp_gcode0, e_max, exp_code, qua_ener;

-	Word16 g_pitch, g2_pitch, g_code, g_pit_cod, g2_code, g2_code_lo;

-	Word16 coeff[5], coeff_lo[5], exp_coeff[5];

-	Word16 exp_max[5];

-	Word32 i, j, L_tmp, dist_min;

-	Word16 *past_qua_en, *t_qua_gain;

-

-	past_qua_en = mem;                     

-

-	/*-----------------------------------------------------------------*

-	 * - Find the initial quantization pitch index                     *

-	 * - Set gains search range                                        *

-	 *-----------------------------------------------------------------*/

-	if (nbits == 6)

-	{

-		t_qua_gain = t_qua_gain6b;         

-		min_ind = 0;                       

-		size = RANGE;                      

-

-		if(gp_clip == 1)

-		{

-			size = size - 16;          /* limit gain pitch to 1.0 */

-		}

-	} else

-	{

-		t_qua_gain = t_qua_gain7b;         

-

-		p = t_qua_gain7b + RANGE;            /* pt at 1/4th of table */

-

-		j = nb_qua_gain7b - RANGE;         

-

-		if (gp_clip == 1)

-		{

-			j = j - 27;                /* limit gain pitch to 1.0 */

-		}

-		min_ind = 0;                       

-		g_pitch = *gain_pit;               

-

-		for (i = 0; i < j; i++, p += 2)

-		{

-			if (g_pitch > *p)

-			{

-				min_ind = min_ind + 1;

-			}

-		}

-		size = RANGE;                      

-	}

-

-	/*------------------------------------------------------------------*

-	 *  Compute coefficient need for the quantization.                  *

-	 *                                                                  *

-	 *  coeff[0] =    y1 y1                                             *

-	 *  coeff[1] = -2 xn y1                                             *

-	 *  coeff[2] =    y2 y2                                             *

-	 *  coeff[3] = -2 xn y2                                             *

-	 *  coeff[4] =  2 y1 y2                                             *

-	 *                                                                  *

-	 * Product <y1 y1> and <xn y1> have been compute in G_pitch() and   *

-	 * are in vector g_coeff[].                                         *

-	 *------------------------------------------------------------------*/

-

-	coeff[0] = g_coeff[0];                 

-	exp_coeff[0] = g_coeff[1];             

-	coeff[1] = negate(g_coeff[2]);                    /* coeff[1] = -2 xn y1 */

-	exp_coeff[1] = g_coeff[3] + 1;     

-

-	/* Compute scalar product <y2[],y2[]> */

-#ifdef ASM_OPT                   /* asm optimization branch */

-	coeff[2] = extract_h(Dot_product12_asm(y2, y2, L_subfr, &exp));

-#else

-	coeff[2] = extract_h(Dot_product12(y2, y2, L_subfr, &exp));

-#endif

-	exp_coeff[2] = (exp - 18) + (Q_xn << 1);     /* -18 (y2 Q9) */

-

-	/* Compute scalar product -2*<xn[],y2[]> */

-#ifdef ASM_OPT                  /* asm optimization branch */

-	coeff[3] = extract_h(L_negate(Dot_product12_asm(xn, y2, L_subfr, &exp)));

-#else

-	coeff[3] = extract_h(L_negate(Dot_product12(xn, y2, L_subfr, &exp)));

-#endif

-

-	exp_coeff[3] = (exp - 8) + Q_xn;  /* -9 (y2 Q9), +1 (2 xn y2) */

-

-	/* Compute scalar product 2*<y1[],y2[]> */

-#ifdef ASM_OPT                 /* asm optimization branch */

-	coeff[4] = extract_h(Dot_product12_asm(y1, y2, L_subfr, &exp));

-#else

-	coeff[4] = extract_h(Dot_product12(y1, y2, L_subfr, &exp));

-#endif

-	exp_coeff[4] = (exp - 8) + Q_xn;  /* -9 (y2 Q9), +1 (2 y1 y2) */

-

-	/*-----------------------------------------------------------------*

-	 *  Find energy of code and compute:                               *

-	 *                                                                 *

-	 *    L_tmp = MEAN_ENER - 10log10(energy of code/ L_subfr)         *

-	 *          = MEAN_ENER - 3.0103*log2(energy of code/ L_subfr)     *

-	 *-----------------------------------------------------------------*/

-#ifdef ASM_OPT                 /* asm optimization branch */

-	L_tmp = Dot_product12_asm(code, code, L_subfr, &exp_code);

-#else

-	L_tmp = Dot_product12(code, code, L_subfr, &exp_code);

-#endif

-	/* exp_code: -18 (code in Q9), -6 (/L_subfr), -31 (L_tmp Q31->Q0) */

-	exp_code = (exp_code - (18 + 6 + 31));

-

-	Log2(L_tmp, &exp, &frac);

-	exp += exp_code;

-	L_tmp = Mpy_32_16(exp, frac, -24660);  /* x -3.0103(Q13) -> Q14 */

-

-	L_tmp += (MEAN_ENER * 8192)<<1; /* + MEAN_ENER in Q14 */

-

-	/*-----------------------------------------------------------------*

-	 * Compute gcode0.                                                 *

-	 *  = Sum(i=0,1) pred[i]*past_qua_en[i] + mean_ener - ener_code    *

-	 *-----------------------------------------------------------------*/

-	L_tmp = (L_tmp << 10);              /* From Q14 to Q24 */

-	L_tmp += (pred[0] * past_qua_en[0])<<1;      /* Q13*Q10 -> Q24 */

-	L_tmp += (pred[1] * past_qua_en[1])<<1;      /* Q13*Q10 -> Q24 */

-	L_tmp += (pred[2] * past_qua_en[2])<<1;      /* Q13*Q10 -> Q24 */

-	L_tmp += (pred[3] * past_qua_en[3])<<1;      /* Q13*Q10 -> Q24 */

-

-	gcode0 = extract_h(L_tmp);             /* From Q24 to Q8  */

-

-	/*-----------------------------------------------------------------*

-	 * gcode0 = pow(10.0, gcode0/20)                                   *

-	 *        = pow(2, 3.321928*gcode0/20)                             *

-	 *        = pow(2, 0.166096*gcode0)                                *

-	 *-----------------------------------------------------------------*/

-

-	L_tmp = vo_L_mult(gcode0, 5443);          /* *0.166096 in Q15 -> Q24     */

-	L_tmp = L_tmp >> 8;               /* From Q24 to Q16             */

-	VO_L_Extract(L_tmp, &exp_gcode0, &frac);  /* Extract exponent of gcode0  */

-

-	gcode0 = (Word16)(Pow2(14, frac));    /* Put 14 as exponent so that  */

-	/* output of Pow2() will be:   */

-	/* 16384 < Pow2() <= 32767     */

-	exp_gcode0 -= 14;

-

-	/*-------------------------------------------------------------------------*

-	 * Find the best quantizer                                                 *

-	 * ~~~~~~~~~~~~~~~~~~~~~~~                                                 *

-	 * Before doing the computation we need to aling exponents of coeff[]      *

-	 * to be sure to have the maximum precision.                               *

-	 *                                                                         *

-	 * In the table the pitch gains are in Q14, the code gains are in Q11 and  *

-	 * are multiply by gcode0 which have been multiply by 2^exp_gcode0.        *

-	 * Also when we compute g_pitch*g_pitch, g_code*g_code and g_pitch*g_code  *

-	 * we divide by 2^15.                                                      *

-	 * Considering all the scaling above we have:                              *

-	 *                                                                         *

-	 *   exp_code = exp_gcode0-11+15 = exp_gcode0+4                            *

-	 *                                                                         *

-	 *   g_pitch*g_pitch  = -14-14+15                                          *

-	 *   g_pitch          = -14                                                *

-	 *   g_code*g_code    = (2*exp_code)+15                                    *

-	 *   g_code           = exp_code                                           *

-	 *   g_pitch*g_code   = -14 + exp_code +15                                 *

-	 *                                                                         *

-	 *   g_pitch*g_pitch * coeff[0]  ;exp_max0 = exp_coeff[0] - 13             *

-	 *   g_pitch         * coeff[1]  ;exp_max1 = exp_coeff[1] - 14             *

-	 *   g_code*g_code   * coeff[2]  ;exp_max2 = exp_coeff[2] +15+(2*exp_code) *

-	 *   g_code          * coeff[3]  ;exp_max3 = exp_coeff[3] + exp_code       *

-	 *   g_pitch*g_code  * coeff[4]  ;exp_max4 = exp_coeff[4] + 1 + exp_code   *

-	 *-------------------------------------------------------------------------*/

-

-	exp_code = (exp_gcode0 + 4);

-	exp_max[0] = (exp_coeff[0] - 13);    

-	exp_max[1] = (exp_coeff[1] - 14);    

-	exp_max[2] = (exp_coeff[2] + (15 + (exp_code << 1)));  

-	exp_max[3] = (exp_coeff[3] + exp_code);   

-	exp_max[4] = (exp_coeff[4] + (1 + exp_code));  

-

-	/* Find maximum exponant */

-

-	e_max = exp_max[0];                   

-	for (i = 1; i < 5; i++)

-	{

-		if(exp_max[i] > e_max)

-		{

-			e_max = exp_max[i];            

-		}

-	}

-

-	/* align coeff[] and save in special 32 bit double precision */

-

-	for (i = 0; i < 5; i++)

-	{

-		j = add1(vo_sub(e_max, exp_max[i]), 2);/* /4 to avoid overflow */

-		L_tmp = L_deposit_h(coeff[i]);

-		L_tmp = L_shr(L_tmp, j);

-		VO_L_Extract(L_tmp, &coeff[i], &coeff_lo[i]);

-		coeff_lo[i] = (coeff_lo[i] >> 3);   /* lo >> 3 */

-	}

-

-	/* Codebook search */

-	dist_min = MAX_32;                     

-	p = &t_qua_gain[min_ind << 1];      

-

-	index = 0;                             

-	for (i = 0; i < size; i++)

-	{

-		g_pitch = *p++;                    

-		g_code = *p++;                     

-

-		g_code = ((g_code * gcode0) + 0x4000)>>15;

-		g2_pitch = ((g_pitch * g_pitch) + 0x4000)>>15;

-		g_pit_cod = ((g_code * g_pitch) + 0x4000)>>15;

-		L_tmp = (g_code * g_code)<<1;

-		VO_L_Extract(L_tmp, &g2_code, &g2_code_lo);

-

-		L_tmp = (coeff[2] * g2_code_lo)<<1;

-		L_tmp =  (L_tmp >> 3);

-		L_tmp += (coeff_lo[0] * g2_pitch)<<1;

-		L_tmp += (coeff_lo[1] * g_pitch)<<1;

-		L_tmp += (coeff_lo[2] * g2_code)<<1;

-		L_tmp += (coeff_lo[3] * g_code)<<1;

-		L_tmp += (coeff_lo[4] * g_pit_cod)<<1;

-		L_tmp =  (L_tmp >> 12);

-		L_tmp += (coeff[0] * g2_pitch)<<1;

-		L_tmp += (coeff[1] * g_pitch)<<1;

-		L_tmp += (coeff[2] * g2_code)<<1;

-		L_tmp += (coeff[3] * g_code)<<1;

-		L_tmp += (coeff[4] * g_pit_cod)<<1;

-

-		if(L_tmp < dist_min)

-		{

-			dist_min = L_tmp;              

-			index = i;                     

-		}

-	}

-

-	/* Read the quantized gains */

-	index = index + min_ind;

-	p = &t_qua_gain[(index + index)];    

-	*gain_pit = *p++;                       /* selected pitch gain in Q14 */

-	g_code = *p++;                          /* selected code gain in Q11  */

-

-	L_tmp = vo_L_mult(g_code, gcode0);             /* Q11*Q0 -> Q12 */

-	L_tmp = L_shl(L_tmp, (exp_gcode0 + 4));   /* Q12 -> Q16 */

-

-	*gain_cod = L_tmp;                       /* gain of code in Q16 */

-

-	/*---------------------------------------------------*

-	 * qua_ener = 20*log10(g_code)                       *

-	 *          = 6.0206*log2(g_code)                    *

-	 *          = 6.0206*(log2(g_codeQ11) - 11)          *

-	 *---------------------------------------------------*/

-

-	L_tmp = L_deposit_l(g_code);

-	Log2(L_tmp, &exp, &frac);

-	exp -= 11;

-	L_tmp = Mpy_32_16(exp, frac, 24660);   /* x 6.0206 in Q12 */

-

-	qua_ener = (Word16)(L_tmp >> 3); /* result in Q10 */

-

-	/* update table of past quantized energies */

-

-	past_qua_en[3] = past_qua_en[2];       

-	past_qua_en[2] = past_qua_en[1];       

-	past_qua_en[1] = past_qua_en[0];       

-	past_qua_en[0] = qua_ener;             

-

-	return (index);

-}

-

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/**************************************************************************
+*  File: q_gain2.c                                                         *
+*                                                                          *
+*  Description:                                                            *
+* Quantization of pitch and codebook gains.                                *
+* MA prediction is performed on the innovation energy (in dB with mean     *
+* removed).                                                                *
+* An initial predicted gain, g_0, is first determined and the correction   *
+* factor     alpha = gain / g_0    is quantized.                           *
+* The pitch gain and the correction factor are vector quantized and the    *
+* mean-squared weighted error criterion is used in the quantizer search.   *
+****************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "math_op.h"
+#include "log2.h"
+#include "acelp.h"
+#include "q_gain2.tab"
+
+#define MEAN_ENER    30
+#define RANGE        64
+#define PRED_ORDER   4
+
+
+/* MA prediction coeff ={0.5, 0.4, 0.3, 0.2} in Q13 */
+static Word16 pred[PRED_ORDER] = {4096, 3277, 2458, 1638};
+
+
+void Init_Q_gain2(
+		Word16 * mem                          /* output  :static memory (2 words)      */
+		)
+{
+	Word32 i;
+
+	/* 4nd order quantizer energy predictor (init to -14.0 in Q10) */
+	for (i = 0; i < PRED_ORDER; i++)
+	{
+		mem[i] = -14336;                     /* past_qua_en[i] */
+	}
+
+	return;
+}
+
+Word16 Q_gain2(                            /* Return index of quantization.          */
+		Word16 xn[],                          /* (i) Q_xn: Target vector.               */
+		Word16 y1[],                          /* (i) Q_xn: Adaptive codebook.           */
+		Word16 Q_xn,                          /* (i)     : xn and y1 format             */
+		Word16 y2[],                          /* (i) Q9  : Filtered innovative vector.  */
+		Word16 code[],                        /* (i) Q9  : Innovative vector.           */
+		Word16 g_coeff[],                     /* (i)     : Correlations <xn y1> <y1 y1> */
+		/*           Compute in G_pitch().        */
+		Word16 L_subfr,                       /* (i)     : Subframe lenght.             */
+		Word16 nbits,                         /* (i)     : number of bits (6 or 7)      */
+		Word16 * gain_pit,                    /* (i/o)Q14: Pitch gain.                  */
+		Word32 * gain_cod,                    /* (o) Q16 : Code gain.                   */
+		Word16 gp_clip,                       /* (i)     : Gp Clipping flag             */
+		Word16 * mem                          /* (i/o)   : static memory (2 words)      */
+	      )
+{
+	Word16 index, *p, min_ind, size;
+	Word16 exp, frac, gcode0, exp_gcode0, e_max, exp_code, qua_ener;
+	Word16 g_pitch, g2_pitch, g_code, g_pit_cod, g2_code, g2_code_lo;
+	Word16 coeff[5], coeff_lo[5], exp_coeff[5];
+	Word16 exp_max[5];
+	Word32 i, j, L_tmp, dist_min;
+	Word16 *past_qua_en, *t_qua_gain;
+
+	past_qua_en = mem;                     
+
+	/*-----------------------------------------------------------------*
+	 * - Find the initial quantization pitch index                     *
+	 * - Set gains search range                                        *
+	 *-----------------------------------------------------------------*/
+	if (nbits == 6)
+	{
+		t_qua_gain = t_qua_gain6b;         
+		min_ind = 0;                       
+		size = RANGE;                      
+
+		if(gp_clip == 1)
+		{
+			size = size - 16;          /* limit gain pitch to 1.0 */
+		}
+	} else
+	{
+		t_qua_gain = t_qua_gain7b;         
+
+		p = t_qua_gain7b + RANGE;            /* pt at 1/4th of table */
+
+		j = nb_qua_gain7b - RANGE;         
+
+		if (gp_clip == 1)
+		{
+			j = j - 27;                /* limit gain pitch to 1.0 */
+		}
+		min_ind = 0;                       
+		g_pitch = *gain_pit;               
+
+		for (i = 0; i < j; i++, p += 2)
+		{
+			if (g_pitch > *p)
+			{
+				min_ind = min_ind + 1;
+			}
+		}
+		size = RANGE;                      
+	}
+
+	/*------------------------------------------------------------------*
+	 *  Compute coefficient need for the quantization.                  *
+	 *                                                                  *
+	 *  coeff[0] =    y1 y1                                             *
+	 *  coeff[1] = -2 xn y1                                             *
+	 *  coeff[2] =    y2 y2                                             *
+	 *  coeff[3] = -2 xn y2                                             *
+	 *  coeff[4] =  2 y1 y2                                             *
+	 *                                                                  *
+	 * Product <y1 y1> and <xn y1> have been compute in G_pitch() and   *
+	 * are in vector g_coeff[].                                         *
+	 *------------------------------------------------------------------*/
+
+	coeff[0] = g_coeff[0];                 
+	exp_coeff[0] = g_coeff[1];             
+	coeff[1] = negate(g_coeff[2]);                    /* coeff[1] = -2 xn y1 */
+	exp_coeff[1] = g_coeff[3] + 1;     
+
+	/* Compute scalar product <y2[],y2[]> */
+#ifdef ASM_OPT                   /* asm optimization branch */
+	coeff[2] = extract_h(Dot_product12_asm(y2, y2, L_subfr, &exp));
+#else
+	coeff[2] = extract_h(Dot_product12(y2, y2, L_subfr, &exp));
+#endif
+	exp_coeff[2] = (exp - 18) + (Q_xn << 1);     /* -18 (y2 Q9) */
+
+	/* Compute scalar product -2*<xn[],y2[]> */
+#ifdef ASM_OPT                  /* asm optimization branch */
+	coeff[3] = extract_h(L_negate(Dot_product12_asm(xn, y2, L_subfr, &exp)));
+#else
+	coeff[3] = extract_h(L_negate(Dot_product12(xn, y2, L_subfr, &exp)));
+#endif
+
+	exp_coeff[3] = (exp - 8) + Q_xn;  /* -9 (y2 Q9), +1 (2 xn y2) */
+
+	/* Compute scalar product 2*<y1[],y2[]> */
+#ifdef ASM_OPT                 /* asm optimization branch */
+	coeff[4] = extract_h(Dot_product12_asm(y1, y2, L_subfr, &exp));
+#else
+	coeff[4] = extract_h(Dot_product12(y1, y2, L_subfr, &exp));
+#endif
+	exp_coeff[4] = (exp - 8) + Q_xn;  /* -9 (y2 Q9), +1 (2 y1 y2) */
+
+	/*-----------------------------------------------------------------*
+	 *  Find energy of code and compute:                               *
+	 *                                                                 *
+	 *    L_tmp = MEAN_ENER - 10log10(energy of code/ L_subfr)         *
+	 *          = MEAN_ENER - 3.0103*log2(energy of code/ L_subfr)     *
+	 *-----------------------------------------------------------------*/
+#ifdef ASM_OPT                 /* asm optimization branch */
+	L_tmp = Dot_product12_asm(code, code, L_subfr, &exp_code);
+#else
+	L_tmp = Dot_product12(code, code, L_subfr, &exp_code);
+#endif
+	/* exp_code: -18 (code in Q9), -6 (/L_subfr), -31 (L_tmp Q31->Q0) */
+	exp_code = (exp_code - (18 + 6 + 31));
+
+	Log2(L_tmp, &exp, &frac);
+	exp += exp_code;
+	L_tmp = Mpy_32_16(exp, frac, -24660);  /* x -3.0103(Q13) -> Q14 */
+
+	L_tmp += (MEAN_ENER * 8192)<<1; /* + MEAN_ENER in Q14 */
+
+	/*-----------------------------------------------------------------*
+	 * Compute gcode0.                                                 *
+	 *  = Sum(i=0,1) pred[i]*past_qua_en[i] + mean_ener - ener_code    *
+	 *-----------------------------------------------------------------*/
+	L_tmp = (L_tmp << 10);              /* From Q14 to Q24 */
+	L_tmp += (pred[0] * past_qua_en[0])<<1;      /* Q13*Q10 -> Q24 */
+	L_tmp += (pred[1] * past_qua_en[1])<<1;      /* Q13*Q10 -> Q24 */
+	L_tmp += (pred[2] * past_qua_en[2])<<1;      /* Q13*Q10 -> Q24 */
+	L_tmp += (pred[3] * past_qua_en[3])<<1;      /* Q13*Q10 -> Q24 */
+
+	gcode0 = extract_h(L_tmp);             /* From Q24 to Q8  */
+
+	/*-----------------------------------------------------------------*
+	 * gcode0 = pow(10.0, gcode0/20)                                   *
+	 *        = pow(2, 3.321928*gcode0/20)                             *
+	 *        = pow(2, 0.166096*gcode0)                                *
+	 *-----------------------------------------------------------------*/
+
+	L_tmp = vo_L_mult(gcode0, 5443);          /* *0.166096 in Q15 -> Q24     */
+	L_tmp = L_tmp >> 8;               /* From Q24 to Q16             */
+	VO_L_Extract(L_tmp, &exp_gcode0, &frac);  /* Extract exponent of gcode0  */
+
+	gcode0 = (Word16)(Pow2(14, frac));    /* Put 14 as exponent so that  */
+	/* output of Pow2() will be:   */
+	/* 16384 < Pow2() <= 32767     */
+	exp_gcode0 -= 14;
+
+	/*-------------------------------------------------------------------------*
+	 * Find the best quantizer                                                 *
+	 * ~~~~~~~~~~~~~~~~~~~~~~~                                                 *
+	 * Before doing the computation we need to aling exponents of coeff[]      *
+	 * to be sure to have the maximum precision.                               *
+	 *                                                                         *
+	 * In the table the pitch gains are in Q14, the code gains are in Q11 and  *
+	 * are multiply by gcode0 which have been multiply by 2^exp_gcode0.        *
+	 * Also when we compute g_pitch*g_pitch, g_code*g_code and g_pitch*g_code  *
+	 * we divide by 2^15.                                                      *
+	 * Considering all the scaling above we have:                              *
+	 *                                                                         *
+	 *   exp_code = exp_gcode0-11+15 = exp_gcode0+4                            *
+	 *                                                                         *
+	 *   g_pitch*g_pitch  = -14-14+15                                          *
+	 *   g_pitch          = -14                                                *
+	 *   g_code*g_code    = (2*exp_code)+15                                    *
+	 *   g_code           = exp_code                                           *
+	 *   g_pitch*g_code   = -14 + exp_code +15                                 *
+	 *                                                                         *
+	 *   g_pitch*g_pitch * coeff[0]  ;exp_max0 = exp_coeff[0] - 13             *
+	 *   g_pitch         * coeff[1]  ;exp_max1 = exp_coeff[1] - 14             *
+	 *   g_code*g_code   * coeff[2]  ;exp_max2 = exp_coeff[2] +15+(2*exp_code) *
+	 *   g_code          * coeff[3]  ;exp_max3 = exp_coeff[3] + exp_code       *
+	 *   g_pitch*g_code  * coeff[4]  ;exp_max4 = exp_coeff[4] + 1 + exp_code   *
+	 *-------------------------------------------------------------------------*/
+
+	exp_code = (exp_gcode0 + 4);
+	exp_max[0] = (exp_coeff[0] - 13);    
+	exp_max[1] = (exp_coeff[1] - 14);    
+	exp_max[2] = (exp_coeff[2] + (15 + (exp_code << 1)));  
+	exp_max[3] = (exp_coeff[3] + exp_code);   
+	exp_max[4] = (exp_coeff[4] + (1 + exp_code));  
+
+	/* Find maximum exponant */
+
+	e_max = exp_max[0];                   
+	for (i = 1; i < 5; i++)
+	{
+		if(exp_max[i] > e_max)
+		{
+			e_max = exp_max[i];            
+		}
+	}
+
+	/* align coeff[] and save in special 32 bit double precision */
+
+	for (i = 0; i < 5; i++)
+	{
+		j = add1(vo_sub(e_max, exp_max[i]), 2);/* /4 to avoid overflow */
+		L_tmp = L_deposit_h(coeff[i]);
+		L_tmp = L_shr(L_tmp, j);
+		VO_L_Extract(L_tmp, &coeff[i], &coeff_lo[i]);
+		coeff_lo[i] = (coeff_lo[i] >> 3);   /* lo >> 3 */
+	}
+
+	/* Codebook search */
+	dist_min = MAX_32;                     
+	p = &t_qua_gain[min_ind << 1];      
+
+	index = 0;                             
+	for (i = 0; i < size; i++)
+	{
+		g_pitch = *p++;                    
+		g_code = *p++;                     
+
+		g_code = ((g_code * gcode0) + 0x4000)>>15;
+		g2_pitch = ((g_pitch * g_pitch) + 0x4000)>>15;
+		g_pit_cod = ((g_code * g_pitch) + 0x4000)>>15;
+		L_tmp = (g_code * g_code)<<1;
+		VO_L_Extract(L_tmp, &g2_code, &g2_code_lo);
+
+		L_tmp = (coeff[2] * g2_code_lo)<<1;
+		L_tmp =  (L_tmp >> 3);
+		L_tmp += (coeff_lo[0] * g2_pitch)<<1;
+		L_tmp += (coeff_lo[1] * g_pitch)<<1;
+		L_tmp += (coeff_lo[2] * g2_code)<<1;
+		L_tmp += (coeff_lo[3] * g_code)<<1;
+		L_tmp += (coeff_lo[4] * g_pit_cod)<<1;
+		L_tmp =  (L_tmp >> 12);
+		L_tmp += (coeff[0] * g2_pitch)<<1;
+		L_tmp += (coeff[1] * g_pitch)<<1;
+		L_tmp += (coeff[2] * g2_code)<<1;
+		L_tmp += (coeff[3] * g_code)<<1;
+		L_tmp += (coeff[4] * g_pit_cod)<<1;
+
+		if(L_tmp < dist_min)
+		{
+			dist_min = L_tmp;              
+			index = i;                     
+		}
+	}
+
+	/* Read the quantized gains */
+	index = index + min_ind;
+	p = &t_qua_gain[(index + index)];    
+	*gain_pit = *p++;                       /* selected pitch gain in Q14 */
+	g_code = *p++;                          /* selected code gain in Q11  */
+
+	L_tmp = vo_L_mult(g_code, gcode0);             /* Q11*Q0 -> Q12 */
+	L_tmp = L_shl(L_tmp, (exp_gcode0 + 4));   /* Q12 -> Q16 */
+
+	*gain_cod = L_tmp;                       /* gain of code in Q16 */
+
+	/*---------------------------------------------------*
+	 * qua_ener = 20*log10(g_code)                       *
+	 *          = 6.0206*log2(g_code)                    *
+	 *          = 6.0206*(log2(g_codeQ11) - 11)          *
+	 *---------------------------------------------------*/
+
+	L_tmp = L_deposit_l(g_code);
+	Log2(L_tmp, &exp, &frac);
+	exp -= 11;
+	L_tmp = Mpy_32_16(exp, frac, 24660);   /* x 6.0206 in Q12 */
+
+	qua_ener = (Word16)(L_tmp >> 3); /* result in Q10 */
+
+	/* update table of past quantized energies */
+
+	past_qua_en[3] = past_qua_en[2];       
+	past_qua_en[2] = past_qua_en[1];       
+	past_qua_en[1] = past_qua_en[0];       
+	past_qua_en[0] = qua_ener;             
+
+	return (index);
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/q_pulse.c b/media/libstagefright/codecs/amrwbenc/src/q_pulse.c
index a28ba40..496ca80 100644
--- a/media/libstagefright/codecs/amrwbenc/src/q_pulse.c
+++ b/media/libstagefright/codecs/amrwbenc/src/q_pulse.c
@@ -1,400 +1,400 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*      File: q_pulse.c                                                 *

-*                                                                      *

-*      Description: Coding and decoding of algebraic codebook          *

-*                                                                      *

-************************************************************************/

-

-#include <stdio.h>

-#include "typedef.h"

-#include "basic_op.h"

-#include "q_pulse.h"

-

-#define NB_POS 16                          /* pos in track, mask for sign bit */

-

-Word32 quant_1p_N1(                        /* (o) return N+1 bits             */

-		Word16 pos,                        /* (i) position of the pulse       */

-		Word16 N)                          /* (i) number of bits for position */

-{

-	Word16 mask;

-	Word32 index;

-

-	mask = (1 << N) - 1;              /* mask = ((1<<N)-1); */

-	/*-------------------------------------------------------*

-	 * Quantization of 1 pulse with N+1 bits:                *

-	 *-------------------------------------------------------*/

-	index = L_deposit_l((Word16) (pos & mask));

-	if ((pos & NB_POS) != 0)

-	{

-		index = vo_L_add(index, L_deposit_l(1 << N));   /* index += 1 << N; */

-	}

-	return (index);

-}

-

-

-Word32 quant_2p_2N1(                       /* (o) return (2*N)+1 bits         */

-		Word16 pos1,                          /* (i) position of the pulse 1     */

-		Word16 pos2,                          /* (i) position of the pulse 2     */

-		Word16 N)                             /* (i) number of bits for position */

-{

-	Word16 mask, tmp;

-	Word32 index;

-	mask = (1 << N) - 1;              /* mask = ((1<<N)-1); */

-	/*-------------------------------------------------------*

-	 * Quantization of 2 pulses with 2*N+1 bits:             *

-	 *-------------------------------------------------------*/

-	if (((pos2 ^ pos1) & NB_POS) == 0)

-	{

-		/* sign of 1st pulse == sign of 2th pulse */

-		if(pos1 <= pos2)          /* ((pos1 - pos2) <= 0) */

-		{

-			/* index = ((pos1 & mask) << N) + (pos2 & mask); */

-			index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask))));

-		} else

-		{

-			/* ((pos2 & mask) << N) + (pos1 & mask); */

-			index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask))));

-		}

-		if ((pos1 & NB_POS) != 0)

-		{

-			tmp = (N << 1);

-			index = vo_L_add(index, (1L << tmp));       /* index += 1 << (2*N); */

-		}

-	} else

-	{

-		/* sign of 1st pulse != sign of 2th pulse */

-		if (vo_sub((Word16) (pos1 & mask), (Word16) (pos2 & mask)) <= 0)

-		{

-			/* index = ((pos2 & mask) << N) + (pos1 & mask); */

-			index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask)))); 

-			if ((pos2 & NB_POS) != 0)

-			{

-				tmp = (N << 1);           /* index += 1 << (2*N); */

-				index = vo_L_add(index, (1L << tmp));

-			}

-		} else

-		{

-			/* index = ((pos1 & mask) << N) + (pos2 & mask);	 */

-			index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask)))); 

-			if ((pos1 & NB_POS) != 0)

-			{

-				tmp = (N << 1);

-				index = vo_L_add(index, (1 << tmp));    /* index += 1 << (2*N); */

-			}

-		}

-	}

-	return (index);

-}

-

-

-Word32 quant_3p_3N1(                       /* (o) return (3*N)+1 bits         */

-		Word16 pos1,                          /* (i) position of the pulse 1     */

-		Word16 pos2,                          /* (i) position of the pulse 2     */

-		Word16 pos3,                          /* (i) position of the pulse 3     */

-		Word16 N)                             /* (i) number of bits for position */

-{

-	Word16 nb_pos;

-	Word32 index;

-

-	nb_pos =(1 <<(N - 1));            /* nb_pos = (1<<(N-1)); */

-	/*-------------------------------------------------------*

-	 * Quantization of 3 pulses with 3*N+1 bits:             *

-	 *-------------------------------------------------------*/

-	if (((pos1 ^ pos2) & nb_pos) == 0)

-	{

-		index = quant_2p_2N1(pos1, pos2, sub(N, 1));    /* index = quant_2p_2N1(pos1, pos2, (N-1)); */

-		/* index += (pos1 & nb_pos) << N; */

-		index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));  

-		/* index += quant_1p_N1(pos3, N) << (2*N); */

-		index = vo_L_add(index, (quant_1p_N1(pos3, N)<<(N << 1)));

-

-	} else if (((pos1 ^ pos3) & nb_pos) == 0)

-	{

-		index = quant_2p_2N1(pos1, pos3, sub(N, 1));    /* index = quant_2p_2N1(pos1, pos3, (N-1)); */

-		index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N)); 

-		/* index += (pos1 & nb_pos) << N; */

-		index = vo_L_add(index, (quant_1p_N1(pos2, N) << (N << 1)));

-		/* index += quant_1p_N1(pos2, N) <<

-		 * (2*N); */

-	} else

-	{

-		index = quant_2p_2N1(pos2, pos3, (N - 1));    /* index = quant_2p_2N1(pos2, pos3, (N-1)); */

-		/* index += (pos2 & nb_pos) << N;			 */

-		index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));  

-		/* index += quant_1p_N1(pos1, N) << (2*N);	 */

-		index = vo_L_add(index, (quant_1p_N1(pos1, N) << (N << 1)));

-	}

-	return (index);

-}

-

-

-Word32 quant_4p_4N1(                       /* (o) return (4*N)+1 bits         */

-		Word16 pos1,                          /* (i) position of the pulse 1     */

-		Word16 pos2,                          /* (i) position of the pulse 2     */

-		Word16 pos3,                          /* (i) position of the pulse 3     */

-		Word16 pos4,                          /* (i) position of the pulse 4     */

-		Word16 N)                             /* (i) number of bits for position */

-{

-	Word16 nb_pos;

-	Word32 index;

-

-	nb_pos = 1 << (N - 1);            /* nb_pos = (1<<(N-1));  */

-	/*-------------------------------------------------------*

-	 * Quantization of 4 pulses with 4*N+1 bits:             *

-	 *-------------------------------------------------------*/

-	if (((pos1 ^ pos2) & nb_pos) == 0)

-	{

-		index = quant_2p_2N1(pos1, pos2, sub(N, 1));    /* index = quant_2p_2N1(pos1, pos2, (N-1)); */

-		/* index += (pos1 & nb_pos) << N;	 */

-		index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));  

-		/* index += quant_2p_2N1(pos3, pos4, N) << (2*N); */

-		index = vo_L_add(index, (quant_2p_2N1(pos3, pos4, N) << (N << 1)));

-	} else if (((pos1 ^ pos3) & nb_pos) == 0)

-	{

-		index = quant_2p_2N1(pos1, pos3, (N - 1));

-		/* index += (pos1 & nb_pos) << N; */

-		index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));  

-		/* index += quant_2p_2N1(pos2, pos4, N) << (2*N); */

-		index = vo_L_add(index, (quant_2p_2N1(pos2, pos4, N) << (N << 1)));

-	} else

-	{

-		index = quant_2p_2N1(pos2, pos3, (N - 1));

-		/* index += (pos2 & nb_pos) << N; */

-		index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));  

-		/* index += quant_2p_2N1(pos1, pos4, N) << (2*N); */

-		index = vo_L_add(index, (quant_2p_2N1(pos1, pos4, N) << (N << 1)));

-	}

-	return (index);

-}

-

-

-Word32 quant_4p_4N(                        /* (o) return 4*N bits             */

-		Word16 pos[],                         /* (i) position of the pulse 1..4  */

-		Word16 N)                             /* (i) number of bits for position */

-{

-	Word16 nb_pos, mask, n_1, tmp;

-	Word16 posA[4], posB[4];

-	Word32 i, j, k, index;

-

-	n_1 = (Word16) (N - 1);                

-	nb_pos = (1 << n_1);                  /* nb_pos = (1<<n_1); */

-	mask = vo_sub((1 << N), 1);              /* mask = ((1<<N)-1); */

-

-	i = 0;                                 

-	j = 0;                                 

-	for (k = 0; k < 4; k++)

-	{

-		if ((pos[k] & nb_pos) == 0)

-		{

-			posA[i++] = pos[k];            

-		} else

-		{

-			posB[j++] = pos[k];            

-		}

-	}

-

-	switch (i)

-	{

-		case 0:

-			tmp = vo_sub((N << 2), 3);           /* index = 1 << ((4*N)-3); */

-			index = (1L << tmp);

-			/* index += quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1); */

-			index = vo_L_add(index, quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1));

-			break;

-		case 1:

-			/* index = quant_1p_N1(posA[0], n_1) << ((3*n_1)+1); */

-			tmp = add1((Word16)((vo_L_mult(3, n_1) >> 1)), 1);

-			index = L_shl(quant_1p_N1(posA[0], n_1), tmp);

-			/* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */

-			index = vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));

-			break;

-		case 2:

-			tmp = ((n_1 << 1) + 1);         /* index = quant_2p_2N1(posA[0], posA[1], n_1) << ((2*n_1)+1); */

-			index = L_shl(quant_2p_2N1(posA[0], posA[1], n_1), tmp);

-			/* index += quant_2p_2N1(posB[0], posB[1], n_1); */

-			index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1));

-			break;

-		case 3:

-			/* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << N; */

-			index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), N);

-			index = vo_L_add(index, quant_1p_N1(posB[0], n_1));        /* index += quant_1p_N1(posB[0], n_1); */

-			break;

-		case 4:

-			index = quant_4p_4N1(posA[0], posA[1], posA[2], posA[3], n_1);

-			break;

-		default:

-			index = 0;

-			fprintf(stderr, "Error in function quant_4p_4N\n");

-	}

-	tmp = ((N << 2) - 2);               /* index += (i & 3) << ((4*N)-2); */

-	index = vo_L_add(index, L_shl((L_deposit_l(i) & (3L)), tmp));

-

-	return (index);

-}

-

-

-

-Word32 quant_5p_5N(                        /* (o) return 5*N bits             */

-		Word16 pos[],                         /* (i) position of the pulse 1..5  */

-		Word16 N)                             /* (i) number of bits for position */

-{

-	Word16 nb_pos, n_1, tmp;

-	Word16 posA[5], posB[5];

-	Word32 i, j, k, index, tmp2;

-

-	n_1 = (Word16) (N - 1);                

-	nb_pos = (1 << n_1);                  /* nb_pos = (1<<n_1); */

-

-	i = 0;                                 

-	j = 0;                                 

-	for (k = 0; k < 5; k++)

-	{

-		if ((pos[k] & nb_pos) == 0)

-		{

-			posA[i++] = pos[k];            

-		} else

-		{

-			posB[j++] = pos[k];            

-		}

-	}

-

-	switch (i)

-	{

-		case 0:

-			tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1);        /* ((5*N)-1)) */

-			index = L_shl(1L, tmp);   /* index = 1 << ((5*N)-1); */

-			tmp = add1((N << 1), 1);  /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);*/

-			tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);

-			index = vo_L_add(index, tmp2);

-			index = vo_L_add(index, quant_2p_2N1(posB[3], posB[4], N));        /* index += quant_2p_2N1(posB[3], posB[4], N); */

-			break;

-		case 1:

-			tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1);        /* index = 1 << ((5*N)-1); */

-			index = L_shl(1L, tmp);

-			tmp = add1((N << 1), 1);   /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) <<((2*N)+1);  */

-			tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);

-			index = vo_L_add(index, tmp2);

-			index = vo_L_add(index, quant_2p_2N1(posB[3], posA[0], N));        /* index += quant_2p_2N1(posB[3], posA[0], N); */

-			break;

-		case 2:

-			tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1);        /* ((5*N)-1)) */

-			index = L_shl(1L, tmp);            /* index = 1 << ((5*N)-1); */

-			tmp = add1((N << 1), 1);           /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);  */

-			tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);

-			index = vo_L_add(index, tmp2);

-			index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], N));        /* index += quant_2p_2N1(posA[0], posA[1], N); */

-			break;

-		case 3:

-			tmp = add1((N << 1), 1);           /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */

-			index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);

-			index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], N));        /* index += quant_2p_2N1(posB[0], posB[1], N); */

-			break;

-		case 4:

-			tmp = add1((N << 1), 1);           /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */

-			index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);

-			index = vo_L_add(index, quant_2p_2N1(posA[3], posB[0], N));        /* index += quant_2p_2N1(posA[3], posB[0], N); */

-			break;

-		case 5:

-			tmp = add1((N << 1), 1);           /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */

-			index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);

-			index = vo_L_add(index, quant_2p_2N1(posA[3], posA[4], N));        /* index += quant_2p_2N1(posA[3], posA[4], N); */

-			break;

-		default:

-			index = 0;

-			fprintf(stderr, "Error in function quant_5p_5N\n");

-	}

-

-	return (index);

-}

-

-

-Word32 quant_6p_6N_2(                      /* (o) return (6*N)-2 bits         */

-		Word16 pos[],                         /* (i) position of the pulse 1..6  */

-		Word16 N)                             /* (i) number of bits for position */

-{

-	Word16 nb_pos, n_1;

-	Word16 posA[6], posB[6];

-	Word32 i, j, k, index;

-

-	/* !!  N and n_1 are constants -> it doesn't need to be operated by Basic Operators */

-	n_1 = (Word16) (N - 1);                

-	nb_pos = (1 << n_1);                  /* nb_pos = (1<<n_1); */

-

-	i = 0;                                 

-	j = 0;                                 

-	for (k = 0; k < 6; k++)

-	{

-		if ((pos[k] & nb_pos) == 0)

-		{

-			posA[i++] = pos[k];            

-		} else

-		{

-			posB[j++] = pos[k];            

-		}

-	}

-

-	switch (i)

-	{

-		case 0:

-			index = (1 << (Word16) (6 * N - 5));        /* index = 1 << ((6*N)-5); */

-			index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */

-			index = vo_L_add(index, quant_1p_N1(posB[5], n_1));        /* index += quant_1p_N1(posB[5], n_1); */

-			break;

-		case 1:

-			index = (1L << (Word16) (6 * N - 5));        /* index = 1 << ((6*N)-5); */

-			index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */

-			index = vo_L_add(index, quant_1p_N1(posA[0], n_1));        /* index += quant_1p_N1(posA[0], n_1); */

-			break;

-		case 2:

-			index = (1L << (Word16) (6 * N - 5));        /* index = 1 << ((6*N)-5); */

-			/* index += quant_4p_4N(posB, n_1) << ((2*n_1)+1); */

-			index = vo_L_add(index, (quant_4p_4N(posB, n_1) << (Word16) (2 * n_1 + 1)));

-			index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], n_1));      /* index += quant_2p_2N1(posA[0], posA[1], n_1); */

-			break;

-		case 3:

-			index = (quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << (Word16) (3 * n_1 + 1));    

-			                                  /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((3*n_1)+1); */

-			index =vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));     

-			                                 /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */

-			break;

-		case 4:

-			i = 2;                            

-			index = (quant_4p_4N(posA, n_1) << (Word16) (2 * n_1 + 1));  /* index = quant_4p_4N(posA, n_1) << ((2*n_1)+1); */

-			index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1));      /* index += quant_2p_2N1(posB[0], posB[1], n_1); */

-			break;

-		case 5:

-			i = 1;                            

-			index = (quant_5p_5N(posA, n_1) << N);       /* index = quant_5p_5N(posA, n_1) << N; */

-			index = vo_L_add(index, quant_1p_N1(posB[0], n_1));        /* index += quant_1p_N1(posB[0], n_1); */

-			break;

-		case 6:

-			i = 0;                             

-			index = (quant_5p_5N(posA, n_1) << N);       /* index = quant_5p_5N(posA, n_1) << N; */

-			index = vo_L_add(index, quant_1p_N1(posA[5], n_1));        /* index += quant_1p_N1(posA[5], n_1); */

-			break;

-		default:

-			index = 0;

-			fprintf(stderr, "Error in function quant_6p_6N_2\n");

-	}

-	index = vo_L_add(index, ((L_deposit_l(i) & 3L) << (Word16) (6 * N - 4)));   /* index += (i & 3) << ((6*N)-4); */

-

-	return (index);

-}

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*      File: q_pulse.c                                                 *
+*                                                                      *
+*      Description: Coding and decoding of algebraic codebook          *
+*                                                                      *
+************************************************************************/
+
+#include <stdio.h>
+#include "typedef.h"
+#include "basic_op.h"
+#include "q_pulse.h"
+
+#define NB_POS 16                          /* pos in track, mask for sign bit */
+
+Word32 quant_1p_N1(                        /* (o) return N+1 bits             */
+		Word16 pos,                        /* (i) position of the pulse       */
+		Word16 N)                          /* (i) number of bits for position */
+{
+	Word16 mask;
+	Word32 index;
+
+	mask = (1 << N) - 1;              /* mask = ((1<<N)-1); */
+	/*-------------------------------------------------------*
+	 * Quantization of 1 pulse with N+1 bits:                *
+	 *-------------------------------------------------------*/
+	index = L_deposit_l((Word16) (pos & mask));
+	if ((pos & NB_POS) != 0)
+	{
+		index = vo_L_add(index, L_deposit_l(1 << N));   /* index += 1 << N; */
+	}
+	return (index);
+}
+
+
+Word32 quant_2p_2N1(                       /* (o) return (2*N)+1 bits         */
+		Word16 pos1,                          /* (i) position of the pulse 1     */
+		Word16 pos2,                          /* (i) position of the pulse 2     */
+		Word16 N)                             /* (i) number of bits for position */
+{
+	Word16 mask, tmp;
+	Word32 index;
+	mask = (1 << N) - 1;              /* mask = ((1<<N)-1); */
+	/*-------------------------------------------------------*
+	 * Quantization of 2 pulses with 2*N+1 bits:             *
+	 *-------------------------------------------------------*/
+	if (((pos2 ^ pos1) & NB_POS) == 0)
+	{
+		/* sign of 1st pulse == sign of 2th pulse */
+		if(pos1 <= pos2)          /* ((pos1 - pos2) <= 0) */
+		{
+			/* index = ((pos1 & mask) << N) + (pos2 & mask); */
+			index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask))));
+		} else
+		{
+			/* ((pos2 & mask) << N) + (pos1 & mask); */
+			index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask))));
+		}
+		if ((pos1 & NB_POS) != 0)
+		{
+			tmp = (N << 1);
+			index = vo_L_add(index, (1L << tmp));       /* index += 1 << (2*N); */
+		}
+	} else
+	{
+		/* sign of 1st pulse != sign of 2th pulse */
+		if (vo_sub((Word16) (pos1 & mask), (Word16) (pos2 & mask)) <= 0)
+		{
+			/* index = ((pos2 & mask) << N) + (pos1 & mask); */
+			index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask)))); 
+			if ((pos2 & NB_POS) != 0)
+			{
+				tmp = (N << 1);           /* index += 1 << (2*N); */
+				index = vo_L_add(index, (1L << tmp));
+			}
+		} else
+		{
+			/* index = ((pos1 & mask) << N) + (pos2 & mask);	 */
+			index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask)))); 
+			if ((pos1 & NB_POS) != 0)
+			{
+				tmp = (N << 1);
+				index = vo_L_add(index, (1 << tmp));    /* index += 1 << (2*N); */
+			}
+		}
+	}
+	return (index);
+}
+
+
+Word32 quant_3p_3N1(                       /* (o) return (3*N)+1 bits         */
+		Word16 pos1,                          /* (i) position of the pulse 1     */
+		Word16 pos2,                          /* (i) position of the pulse 2     */
+		Word16 pos3,                          /* (i) position of the pulse 3     */
+		Word16 N)                             /* (i) number of bits for position */
+{
+	Word16 nb_pos;
+	Word32 index;
+
+	nb_pos =(1 <<(N - 1));            /* nb_pos = (1<<(N-1)); */
+	/*-------------------------------------------------------*
+	 * Quantization of 3 pulses with 3*N+1 bits:             *
+	 *-------------------------------------------------------*/
+	if (((pos1 ^ pos2) & nb_pos) == 0)
+	{
+		index = quant_2p_2N1(pos1, pos2, sub(N, 1));    /* index = quant_2p_2N1(pos1, pos2, (N-1)); */
+		/* index += (pos1 & nb_pos) << N; */
+		index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));  
+		/* index += quant_1p_N1(pos3, N) << (2*N); */
+		index = vo_L_add(index, (quant_1p_N1(pos3, N)<<(N << 1)));
+
+	} else if (((pos1 ^ pos3) & nb_pos) == 0)
+	{
+		index = quant_2p_2N1(pos1, pos3, sub(N, 1));    /* index = quant_2p_2N1(pos1, pos3, (N-1)); */
+		index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N)); 
+		/* index += (pos1 & nb_pos) << N; */
+		index = vo_L_add(index, (quant_1p_N1(pos2, N) << (N << 1)));
+		/* index += quant_1p_N1(pos2, N) <<
+		 * (2*N); */
+	} else
+	{
+		index = quant_2p_2N1(pos2, pos3, (N - 1));    /* index = quant_2p_2N1(pos2, pos3, (N-1)); */
+		/* index += (pos2 & nb_pos) << N;			 */
+		index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));  
+		/* index += quant_1p_N1(pos1, N) << (2*N);	 */
+		index = vo_L_add(index, (quant_1p_N1(pos1, N) << (N << 1)));
+	}
+	return (index);
+}
+
+
+Word32 quant_4p_4N1(                       /* (o) return (4*N)+1 bits         */
+		Word16 pos1,                          /* (i) position of the pulse 1     */
+		Word16 pos2,                          /* (i) position of the pulse 2     */
+		Word16 pos3,                          /* (i) position of the pulse 3     */
+		Word16 pos4,                          /* (i) position of the pulse 4     */
+		Word16 N)                             /* (i) number of bits for position */
+{
+	Word16 nb_pos;
+	Word32 index;
+
+	nb_pos = 1 << (N - 1);            /* nb_pos = (1<<(N-1));  */
+	/*-------------------------------------------------------*
+	 * Quantization of 4 pulses with 4*N+1 bits:             *
+	 *-------------------------------------------------------*/
+	if (((pos1 ^ pos2) & nb_pos) == 0)
+	{
+		index = quant_2p_2N1(pos1, pos2, sub(N, 1));    /* index = quant_2p_2N1(pos1, pos2, (N-1)); */
+		/* index += (pos1 & nb_pos) << N;	 */
+		index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));  
+		/* index += quant_2p_2N1(pos3, pos4, N) << (2*N); */
+		index = vo_L_add(index, (quant_2p_2N1(pos3, pos4, N) << (N << 1)));
+	} else if (((pos1 ^ pos3) & nb_pos) == 0)
+	{
+		index = quant_2p_2N1(pos1, pos3, (N - 1));
+		/* index += (pos1 & nb_pos) << N; */
+		index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));  
+		/* index += quant_2p_2N1(pos2, pos4, N) << (2*N); */
+		index = vo_L_add(index, (quant_2p_2N1(pos2, pos4, N) << (N << 1)));
+	} else
+	{
+		index = quant_2p_2N1(pos2, pos3, (N - 1));
+		/* index += (pos2 & nb_pos) << N; */
+		index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));  
+		/* index += quant_2p_2N1(pos1, pos4, N) << (2*N); */
+		index = vo_L_add(index, (quant_2p_2N1(pos1, pos4, N) << (N << 1)));
+	}
+	return (index);
+}
+
+
+Word32 quant_4p_4N(                        /* (o) return 4*N bits             */
+		Word16 pos[],                         /* (i) position of the pulse 1..4  */
+		Word16 N)                             /* (i) number of bits for position */
+{
+	Word16 nb_pos, mask, n_1, tmp;
+	Word16 posA[4], posB[4];
+	Word32 i, j, k, index;
+
+	n_1 = (Word16) (N - 1);                
+	nb_pos = (1 << n_1);                  /* nb_pos = (1<<n_1); */
+	mask = vo_sub((1 << N), 1);              /* mask = ((1<<N)-1); */
+
+	i = 0;                                 
+	j = 0;                                 
+	for (k = 0; k < 4; k++)
+	{
+		if ((pos[k] & nb_pos) == 0)
+		{
+			posA[i++] = pos[k];            
+		} else
+		{
+			posB[j++] = pos[k];            
+		}
+	}
+
+	switch (i)
+	{
+		case 0:
+			tmp = vo_sub((N << 2), 3);           /* index = 1 << ((4*N)-3); */
+			index = (1L << tmp);
+			/* index += quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1); */
+			index = vo_L_add(index, quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1));
+			break;
+		case 1:
+			/* index = quant_1p_N1(posA[0], n_1) << ((3*n_1)+1); */
+			tmp = add1((Word16)((vo_L_mult(3, n_1) >> 1)), 1);
+			index = L_shl(quant_1p_N1(posA[0], n_1), tmp);
+			/* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */
+			index = vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));
+			break;
+		case 2:
+			tmp = ((n_1 << 1) + 1);         /* index = quant_2p_2N1(posA[0], posA[1], n_1) << ((2*n_1)+1); */
+			index = L_shl(quant_2p_2N1(posA[0], posA[1], n_1), tmp);
+			/* index += quant_2p_2N1(posB[0], posB[1], n_1); */
+			index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1));
+			break;
+		case 3:
+			/* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << N; */
+			index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), N);
+			index = vo_L_add(index, quant_1p_N1(posB[0], n_1));        /* index += quant_1p_N1(posB[0], n_1); */
+			break;
+		case 4:
+			index = quant_4p_4N1(posA[0], posA[1], posA[2], posA[3], n_1);
+			break;
+		default:
+			index = 0;
+			fprintf(stderr, "Error in function quant_4p_4N\n");
+	}
+	tmp = ((N << 2) - 2);               /* index += (i & 3) << ((4*N)-2); */
+	index = vo_L_add(index, L_shl((L_deposit_l(i) & (3L)), tmp));
+
+	return (index);
+}
+
+
+
+Word32 quant_5p_5N(                        /* (o) return 5*N bits             */
+		Word16 pos[],                         /* (i) position of the pulse 1..5  */
+		Word16 N)                             /* (i) number of bits for position */
+{
+	Word16 nb_pos, n_1, tmp;
+	Word16 posA[5], posB[5];
+	Word32 i, j, k, index, tmp2;
+
+	n_1 = (Word16) (N - 1);                
+	nb_pos = (1 << n_1);                  /* nb_pos = (1<<n_1); */
+
+	i = 0;                                 
+	j = 0;                                 
+	for (k = 0; k < 5; k++)
+	{
+		if ((pos[k] & nb_pos) == 0)
+		{
+			posA[i++] = pos[k];            
+		} else
+		{
+			posB[j++] = pos[k];            
+		}
+	}
+
+	switch (i)
+	{
+		case 0:
+			tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1);        /* ((5*N)-1)) */
+			index = L_shl(1L, tmp);   /* index = 1 << ((5*N)-1); */
+			tmp = add1((N << 1), 1);  /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);*/
+			tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
+			index = vo_L_add(index, tmp2);
+			index = vo_L_add(index, quant_2p_2N1(posB[3], posB[4], N));        /* index += quant_2p_2N1(posB[3], posB[4], N); */
+			break;
+		case 1:
+			tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1);        /* index = 1 << ((5*N)-1); */
+			index = L_shl(1L, tmp);
+			tmp = add1((N << 1), 1);   /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) <<((2*N)+1);  */
+			tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
+			index = vo_L_add(index, tmp2);
+			index = vo_L_add(index, quant_2p_2N1(posB[3], posA[0], N));        /* index += quant_2p_2N1(posB[3], posA[0], N); */
+			break;
+		case 2:
+			tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1);        /* ((5*N)-1)) */
+			index = L_shl(1L, tmp);            /* index = 1 << ((5*N)-1); */
+			tmp = add1((N << 1), 1);           /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);  */
+			tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
+			index = vo_L_add(index, tmp2);
+			index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], N));        /* index += quant_2p_2N1(posA[0], posA[1], N); */
+			break;
+		case 3:
+			tmp = add1((N << 1), 1);           /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */
+			index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
+			index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], N));        /* index += quant_2p_2N1(posB[0], posB[1], N); */
+			break;
+		case 4:
+			tmp = add1((N << 1), 1);           /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */
+			index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
+			index = vo_L_add(index, quant_2p_2N1(posA[3], posB[0], N));        /* index += quant_2p_2N1(posA[3], posB[0], N); */
+			break;
+		case 5:
+			tmp = add1((N << 1), 1);           /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */
+			index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
+			index = vo_L_add(index, quant_2p_2N1(posA[3], posA[4], N));        /* index += quant_2p_2N1(posA[3], posA[4], N); */
+			break;
+		default:
+			index = 0;
+			fprintf(stderr, "Error in function quant_5p_5N\n");
+	}
+
+	return (index);
+}
+
+
+Word32 quant_6p_6N_2(                      /* (o) return (6*N)-2 bits         */
+		Word16 pos[],                         /* (i) position of the pulse 1..6  */
+		Word16 N)                             /* (i) number of bits for position */
+{
+	Word16 nb_pos, n_1;
+	Word16 posA[6], posB[6];
+	Word32 i, j, k, index;
+
+	/* !!  N and n_1 are constants -> it doesn't need to be operated by Basic Operators */
+	n_1 = (Word16) (N - 1);                
+	nb_pos = (1 << n_1);                  /* nb_pos = (1<<n_1); */
+
+	i = 0;                                 
+	j = 0;                                 
+	for (k = 0; k < 6; k++)
+	{
+		if ((pos[k] & nb_pos) == 0)
+		{
+			posA[i++] = pos[k];            
+		} else
+		{
+			posB[j++] = pos[k];            
+		}
+	}
+
+	switch (i)
+	{
+		case 0:
+			index = (1 << (Word16) (6 * N - 5));        /* index = 1 << ((6*N)-5); */
+			index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */
+			index = vo_L_add(index, quant_1p_N1(posB[5], n_1));        /* index += quant_1p_N1(posB[5], n_1); */
+			break;
+		case 1:
+			index = (1L << (Word16) (6 * N - 5));        /* index = 1 << ((6*N)-5); */
+			index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */
+			index = vo_L_add(index, quant_1p_N1(posA[0], n_1));        /* index += quant_1p_N1(posA[0], n_1); */
+			break;
+		case 2:
+			index = (1L << (Word16) (6 * N - 5));        /* index = 1 << ((6*N)-5); */
+			/* index += quant_4p_4N(posB, n_1) << ((2*n_1)+1); */
+			index = vo_L_add(index, (quant_4p_4N(posB, n_1) << (Word16) (2 * n_1 + 1)));
+			index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], n_1));      /* index += quant_2p_2N1(posA[0], posA[1], n_1); */
+			break;
+		case 3:
+			index = (quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << (Word16) (3 * n_1 + 1));    
+			                                  /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((3*n_1)+1); */
+			index =vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));     
+			                                 /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */
+			break;
+		case 4:
+			i = 2;                            
+			index = (quant_4p_4N(posA, n_1) << (Word16) (2 * n_1 + 1));  /* index = quant_4p_4N(posA, n_1) << ((2*n_1)+1); */
+			index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1));      /* index += quant_2p_2N1(posB[0], posB[1], n_1); */
+			break;
+		case 5:
+			i = 1;                            
+			index = (quant_5p_5N(posA, n_1) << N);       /* index = quant_5p_5N(posA, n_1) << N; */
+			index = vo_L_add(index, quant_1p_N1(posB[0], n_1));        /* index += quant_1p_N1(posB[0], n_1); */
+			break;
+		case 6:
+			i = 0;                             
+			index = (quant_5p_5N(posA, n_1) << N);       /* index = quant_5p_5N(posA, n_1) << N; */
+			index = vo_L_add(index, quant_1p_N1(posA[5], n_1));        /* index += quant_1p_N1(posA[5], n_1); */
+			break;
+		default:
+			index = 0;
+			fprintf(stderr, "Error in function quant_6p_6N_2\n");
+	}
+	index = vo_L_add(index, ((L_deposit_l(i) & 3L) << (Word16) (6 * N - 4)));   /* index += (i & 3) << ((6*N)-4); */
+
+	return (index);
+}
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c b/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c
index 00b0a53..f6d53de 100644
--- a/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c
+++ b/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c
@@ -1,111 +1,111 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***************************************************************************

-*      File: qisf_ns.c                                                     *

-*                                                                          *

-*      Description: Coding/Decoding of ISF parameters for background noise.*

-*                    The ISF vector is quantized using VQ with split-by-5  *

-*                                                                          *

-****************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "acelp.h"

-#include "qisf_ns.tab"                     /* Codebooks of ISFs */

-

-/*------------------------------------------------------------------*

-* routine:   Qisf_ns()                                             *

-*            ~~~~~~~~~                                             *

-*------------------------------------------------------------------*/

-

-void Qisf_ns(

-		Word16 * isf1,                        /* input : ISF in the frequency domain (0..0.5) */

-		Word16 * isf_q,                       /* output: quantized ISF                        */

-		Word16 * indice                       /* output: quantization indices                 */

-	    )

-{

-	Word16 i;

-	Word32 tmp;

-

-	for (i = 0; i < ORDER; i++)

-	{

-		isf_q[i] = sub(isf1[i], mean_isf_noise[i]);     

-	}

-

-	indice[0] = Sub_VQ(&isf_q[0], dico1_isf_noise, 2, SIZE_BK_NOISE1, &tmp);    

-	indice[1] = Sub_VQ(&isf_q[2], dico2_isf_noise, 3, SIZE_BK_NOISE2, &tmp);    

-	indice[2] = Sub_VQ(&isf_q[5], dico3_isf_noise, 3, SIZE_BK_NOISE3, &tmp);    

-	indice[3] = Sub_VQ(&isf_q[8], dico4_isf_noise, 4, SIZE_BK_NOISE4, &tmp);    

-	indice[4] = Sub_VQ(&isf_q[12], dico5_isf_noise, 4, SIZE_BK_NOISE5, &tmp);   

-

-	/* decoding the ISFs */

-

-	Disf_ns(indice, isf_q);

-

-	return;

-}

-

-/********************************************************************

-* Function:   Disf_ns()                                             *

-*            ~~~~~~~~~                                              *

-* Decoding of ISF parameters                                        *

-*-------------------------------------------------------------------*

-*  Arguments:                                                       *

-*    indice[] : indices of the selected codebook entries            *

-*    isf[]    : quantized ISFs (in frequency domain)                *

-*********************************************************************/

-

-void Disf_ns(

-		Word16 * indice,                      /* input:  quantization indices                  */

-		Word16 * isf_q                        /* input : ISF in the frequency domain (0..0.5)  */

-	    )

-{

-	Word16 i;

-

-	for (i = 0; i < 2; i++)

-	{

-		isf_q[i] = dico1_isf_noise[indice[0] * 2 + i];  

-	}

-	for (i = 0; i < 3; i++)

-	{

-		isf_q[i + 2] = dico2_isf_noise[indice[1] * 3 + i];      

-	}

-	for (i = 0; i < 3; i++)

-	{

-		isf_q[i + 5] = dico3_isf_noise[indice[2] * 3 + i];      

-	}

-	for (i = 0; i < 4; i++)

-	{

-		isf_q[i + 8] = dico4_isf_noise[indice[3] * 4 + i];      

-	}

-	for (i = 0; i < 4; i++)

-	{

-		isf_q[i + 12] = dico5_isf_noise[indice[4] * 4 + i];     

-	}

-

-	for (i = 0; i < ORDER; i++)

-	{

-		isf_q[i] = add(isf_q[i], mean_isf_noise[i]);   

-	}

-

-	Reorder_isf(isf_q, ISF_GAP, ORDER);

-

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***************************************************************************
+*      File: qisf_ns.c                                                     *
+*                                                                          *
+*      Description: Coding/Decoding of ISF parameters for background noise.*
+*                    The ISF vector is quantized using VQ with split-by-5  *
+*                                                                          *
+****************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "acelp.h"
+#include "qisf_ns.tab"                     /* Codebooks of ISFs */
+
+/*------------------------------------------------------------------*
+* routine:   Qisf_ns()                                             *
+*            ~~~~~~~~~                                             *
+*------------------------------------------------------------------*/
+
+void Qisf_ns(
+		Word16 * isf1,                        /* input : ISF in the frequency domain (0..0.5) */
+		Word16 * isf_q,                       /* output: quantized ISF                        */
+		Word16 * indice                       /* output: quantization indices                 */
+	    )
+{
+	Word16 i;
+	Word32 tmp;
+
+	for (i = 0; i < ORDER; i++)
+	{
+		isf_q[i] = sub(isf1[i], mean_isf_noise[i]);     
+	}
+
+	indice[0] = Sub_VQ(&isf_q[0], dico1_isf_noise, 2, SIZE_BK_NOISE1, &tmp);    
+	indice[1] = Sub_VQ(&isf_q[2], dico2_isf_noise, 3, SIZE_BK_NOISE2, &tmp);    
+	indice[2] = Sub_VQ(&isf_q[5], dico3_isf_noise, 3, SIZE_BK_NOISE3, &tmp);    
+	indice[3] = Sub_VQ(&isf_q[8], dico4_isf_noise, 4, SIZE_BK_NOISE4, &tmp);    
+	indice[4] = Sub_VQ(&isf_q[12], dico5_isf_noise, 4, SIZE_BK_NOISE5, &tmp);   
+
+	/* decoding the ISFs */
+
+	Disf_ns(indice, isf_q);
+
+	return;
+}
+
+/********************************************************************
+* Function:   Disf_ns()                                             *
+*            ~~~~~~~~~                                              *
+* Decoding of ISF parameters                                        *
+*-------------------------------------------------------------------*
+*  Arguments:                                                       *
+*    indice[] : indices of the selected codebook entries            *
+*    isf[]    : quantized ISFs (in frequency domain)                *
+*********************************************************************/
+
+void Disf_ns(
+		Word16 * indice,                      /* input:  quantization indices                  */
+		Word16 * isf_q                        /* input : ISF in the frequency domain (0..0.5)  */
+	    )
+{
+	Word16 i;
+
+	for (i = 0; i < 2; i++)
+	{
+		isf_q[i] = dico1_isf_noise[indice[0] * 2 + i];  
+	}
+	for (i = 0; i < 3; i++)
+	{
+		isf_q[i + 2] = dico2_isf_noise[indice[1] * 3 + i];      
+	}
+	for (i = 0; i < 3; i++)
+	{
+		isf_q[i + 5] = dico3_isf_noise[indice[2] * 3 + i];      
+	}
+	for (i = 0; i < 4; i++)
+	{
+		isf_q[i + 8] = dico4_isf_noise[indice[3] * 4 + i];      
+	}
+	for (i = 0; i < 4; i++)
+	{
+		isf_q[i + 12] = dico5_isf_noise[indice[4] * 4 + i];     
+	}
+
+	for (i = 0; i < ORDER; i++)
+	{
+		isf_q[i] = add(isf_q[i], mean_isf_noise[i]);   
+	}
+
+	Reorder_isf(isf_q, ISF_GAP, ORDER);
+
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c b/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c
index ccedb5c..ac13a67 100644
--- a/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c
+++ b/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c
@@ -1,542 +1,542 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*       File: apisf_2s.c                                               *

-*                                                                      *

-*       Description: Coding/Decodeing of ISF parameters with predication

-*       The ISF vector is quantized using two-stage VQ with split-by-2 *

-*       in 1st stage and split-by-5(or 3) in the second stage          *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "cnst.h"

-#include "acelp.h"

-#include "qpisf_2s.tab"                    /* Codebooks of isfs */

-

-#define MU         10923                   /* Prediction factor   (1.0/3.0) in Q15 */

-#define N_SURV_MAX 4                       /* 4 survivors max */

-#define ALPHA      29491                   /* 0. 9 in Q15     */

-#define ONE_ALPHA (32768-ALPHA)            /* (1.0 - ALPHA) in Q15 */

-

-/* private functions */

-static void VQ_stage1(

-		Word16 * x,                           /* input : ISF residual vector           */

-		Word16 * dico,                        /* input : quantization codebook         */

-		Word16 dim,                           /* input : dimention of vector           */

-		Word16 dico_size,                     /* input : size of quantization codebook */

-		Word16 * index,                       /* output: indices of survivors          */

-		Word16 surv                           /* input : number of survivor            */

-		);

-

-/**************************************************************************

-* Function:   Qpisf_2s_46B()                                              *

-*                                                                         *

-* Description: Quantization of isf parameters with prediction. (46 bits)  *

-*                                                                         *

-* The isf vector is quantized using two-stage VQ with split-by-2 in       *

-*  1st stage and split-by-5 in the second stage.                          *

-***************************************************************************/

-

-void Qpisf_2s_46b(

-		Word16 * isf1,                        /* (i) Q15 : ISF in the frequency domain (0..0.5) */

-		Word16 * isf_q,                       /* (o) Q15 : quantized ISF               (0..0.5) */

-		Word16 * past_isfq,                   /* (io)Q15 : past ISF quantizer                   */

-		Word16 * indice,                      /* (o)     : quantization indices                 */

-		Word16 nb_surv                        /* (i)     : number of survivor (1, 2, 3 or 4)    */

-		)

-{

-	Word16 tmp_ind[5];

-	Word16 surv1[N_SURV_MAX];              /* indices of survivors from 1st stage */

-	Word32 i, k, temp, min_err, distance;

-	Word16 isf[ORDER];

-	Word16 isf_stage2[ORDER];

-

-	for (i = 0; i < ORDER; i++)

-	{

-		isf[i] = vo_sub(isf1[i], mean_isf[i]);

-		isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i])); 

-	}

-

-	VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);

-

-	distance = MAX_32;          

-

-	for (k = 0; k < nb_surv; k++)

-	{

-		for (i = 0; i < 9; i++)

-		{

-			isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]); 

-		}

-		tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf, 3, SIZE_BK21, &min_err); 

-		temp = min_err;

-		tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico22_isf, 3, SIZE_BK22, &min_err); 

-		temp = vo_L_add(temp, min_err);

-		tmp_ind[2] = Sub_VQ(&isf_stage2[6], dico23_isf, 3, SIZE_BK23, &min_err);  

-		temp = vo_L_add(temp, min_err);

-

-		if(temp < distance)

-		{

-			distance = temp;               

-			indice[0] = surv1[k];          

-			for (i = 0; i < 3; i++)

-			{

-				indice[i + 2] = tmp_ind[i];

-			}

-		}

-	}

-

-

-	VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);

-

-	distance = MAX_32;                   

-

-	for (k = 0; k < nb_surv; k++)

-	{

-		for (i = 0; i < 7; i++)

-		{

-			isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);       

-		}

-

-		tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico24_isf, 3, SIZE_BK24, &min_err);

-		temp = min_err; 

-		tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico25_isf, 4, SIZE_BK25, &min_err);

-		temp = vo_L_add(temp, min_err);

-

-		if(temp < distance)

-		{

-			distance = temp;               

-			indice[1] = surv1[k];          

-			for (i = 0; i < 2; i++)

-			{

-				indice[i + 5] = tmp_ind[i];

-			}

-		}

-	}

-

-	Dpisf_2s_46b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);

-

-	return;

-}

-

-/*****************************************************************************

-* Function:   Qpisf_2s_36B()                                                 *

-*                                                                            *

-* Description: Quantization of isf parameters with prediction. (36 bits)     *

-*                                                                            *

-* The isf vector is quantized using two-stage VQ with split-by-2 in          *

-*  1st stage and split-by-3 in the second stage.                             *

-******************************************************************************/

-

-void Qpisf_2s_36b(

-		Word16 * isf1,                        /* (i) Q15 : ISF in the frequency domain (0..0.5) */

-		Word16 * isf_q,                       /* (o) Q15 : quantized ISF               (0..0.5) */

-		Word16 * past_isfq,                   /* (io)Q15 : past ISF quantizer                   */

-		Word16 * indice,                      /* (o)     : quantization indices                 */

-		Word16 nb_surv                        /* (i)     : number of survivor (1, 2, 3 or 4)    */

-		)

-{

-	Word16 i, k, tmp_ind[5];

-	Word16 surv1[N_SURV_MAX];              /* indices of survivors from 1st stage */

-	Word32 temp, min_err, distance;

-	Word16 isf[ORDER];

-	Word16 isf_stage2[ORDER];

-

-	for (i = 0; i < ORDER; i++)

-	{

-		isf[i] = vo_sub(isf1[i], mean_isf[i]);

-		isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));

-	}

-

-	VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);

-

-	distance = MAX_32;                  

-

-	for (k = 0; k < nb_surv; k++)

-	{

-		for (i = 0; i < 9; i++)

-		{

-			isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]); 

-		}

-

-		tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf_36b, 5, SIZE_BK21_36b, &min_err);        

-		temp = min_err;                  

-		tmp_ind[1] = Sub_VQ(&isf_stage2[5], dico22_isf_36b, 4, SIZE_BK22_36b, &min_err);        

-		temp = vo_L_add(temp, min_err);

-

-		if(temp < distance)

-		{

-			distance = temp;               

-			indice[0] = surv1[k];          

-			for (i = 0; i < 2; i++)

-			{

-				indice[i + 2] = tmp_ind[i];

-			}

-		}

-	}

-

-	VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);

-	distance = MAX_32;                    

-

-	for (k = 0; k < nb_surv; k++)

-	{

-		for (i = 0; i < 7; i++)

-		{

-			isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);     

-		}

-

-		tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico23_isf_36b, 7, SIZE_BK23_36b, &min_err);  

-		temp = min_err;                  

-

-		if(temp < distance)

-		{

-			distance = temp;               

-			indice[1] = surv1[k];          

-			indice[4] = tmp_ind[0];        

-		}

-	}

-

-	Dpisf_2s_36b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);

-

-	return;

-}

-

-/*********************************************************************

-* Function: Dpisf_2s_46b()                                           *

-*                                                                    *

-* Description: Decoding of ISF parameters                            *

-**********************************************************************/

-

-void Dpisf_2s_46b(

-		Word16 * indice,                      /* input:  quantization indices                       */

-		Word16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */

-		Word16 * past_isfq,                   /* i/0   : past ISF quantizer                    */

-		Word16 * isfold,                      /* input : past quantized ISF                    */

-		Word16 * isf_buf,                     /* input : isf buffer                                                        */

-		Word16 bfi,                           /* input : Bad frame indicator                   */

-		Word16 enc_dec

-		)

-{

-	Word16 ref_isf[M], tmp;

-	Word32 i, j, L_tmp;

-

-	if (bfi == 0)                          /* Good frame */

-	{

-		for (i = 0; i < 9; i++)

-		{

-			isf_q[i] = dico1_isf[indice[0] * 9 + i];    

-		}

-		for (i = 0; i < 7; i++)

-		{

-			isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];       

-		}

-

-		for (i = 0; i < 3; i++)

-		{

-			isf_q[i] = add1(isf_q[i], dico21_isf[indice[2] * 3 + i]);   

-			isf_q[i + 3] = add1(isf_q[i + 3], dico22_isf[indice[3] * 3 + i]);  

-			isf_q[i + 6] = add1(isf_q[i + 6], dico23_isf[indice[4] * 3 + i]); 

-			isf_q[i + 9] = add1(isf_q[i + 9], dico24_isf[indice[5] * 3 + i]); 

-		}

-

-		for (i = 0; i < 4; i++)

-		{

-			isf_q[i + 12] = add1(isf_q[i + 12], dico25_isf[indice[6] * 4 + i]);  

-		}

-

-		for (i = 0; i < ORDER; i++)

-		{

-			tmp = isf_q[i];               

-			isf_q[i] = add1(tmp, mean_isf[i]);  

-			isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));

-			past_isfq[i] = tmp;  

-		}

-

-		if (enc_dec)

-		{

-			for (i = 0; i < M; i++)

-			{

-				for (j = (L_MEANBUF - 1); j > 0; j--)

-				{

-					isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; 

-				}

-				isf_buf[i] = isf_q[i]; 

-			}

-		}

-	} else

-	{                                      /* bad frame */

-		for (i = 0; i < M; i++)

-		{

-			L_tmp = mean_isf[i] << 14;

-			for (j = 0; j < L_MEANBUF; j++)

-			{

-				L_tmp += (isf_buf[j * M + i] << 14);

-			}

-			ref_isf[i] = vo_round(L_tmp);

-		}

-

-		/* use the past ISFs slightly shifted towards their mean */

-		for (i = 0; i < ORDER; i++)

-		{

-			isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i])); 

-		}

-

-		/* estimate past quantized residual to be used in next frame */

-		for (i = 0; i < ORDER; i++)

-		{

-			tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU));      /* predicted ISF */

-			past_isfq[i] = vo_sub(isf_q[i], tmp); 

-			past_isfq[i] = (past_isfq[i] >> 1);        /* past_isfq[i] *= 0.5 */

-		}

-	}

-

-	Reorder_isf(isf_q, ISF_GAP, ORDER);

-	return;

-}

-

-/*********************************************************************

-* Function:   Disf_2s_36b()                                          *

-*                                                                    *

-* Description: Decoding of ISF parameters                            *

-*********************************************************************/

-

-void Dpisf_2s_36b(

-		Word16 * indice,                      /* input:  quantization indices                       */

-		Word16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */

-		Word16 * past_isfq,                   /* i/0   : past ISF quantizer                    */

-		Word16 * isfold,                      /* input : past quantized ISF                    */

-		Word16 * isf_buf,                     /* input : isf buffer                                                        */

-		Word16 bfi,                           /* input : Bad frame indicator                   */

-		Word16 enc_dec

-		)

-{

-	Word16 ref_isf[M], tmp;

-	Word32 i, j, L_tmp;

-

-	if (bfi == 0)                          /* Good frame */

-	{

-		for (i = 0; i < 9; i++)

-		{

-			isf_q[i] = dico1_isf[indice[0] * 9 + i];    

-		}

-		for (i = 0; i < 7; i++)

-		{

-			isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];       

-		}

-

-		for (i = 0; i < 5; i++)

-		{

-			isf_q[i] = add1(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]);       

-		}

-		for (i = 0; i < 4; i++)

-		{

-			isf_q[i + 5] = add1(isf_q[i + 5], dico22_isf_36b[indice[3] * 4 + i]);        

-		}

-		for (i = 0; i < 7; i++)

-		{

-			isf_q[i + 9] = add1(isf_q[i + 9], dico23_isf_36b[indice[4] * 7 + i]);       

-		}

-

-		for (i = 0; i < ORDER; i++)

-		{

-			tmp = isf_q[i];

-			isf_q[i] = add1(tmp, mean_isf[i]);   

-			isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));   

-			past_isfq[i] = tmp;           

-		}

-

-

-		if (enc_dec)

-		{

-			for (i = 0; i < M; i++)

-			{

-				for (j = (L_MEANBUF - 1); j > 0; j--)

-				{

-					isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];      

-				}

-				isf_buf[i] = isf_q[i];    

-			}

-		}

-	} else

-	{                                      /* bad frame */

-		for (i = 0; i < M; i++)

-		{

-			L_tmp = (mean_isf[i] << 14);

-			for (j = 0; j < L_MEANBUF; j++)

-			{

-				L_tmp += (isf_buf[j * M + i] << 14);

-			}

-			ref_isf[i] = vo_round(L_tmp);    

-		}

-

-		/* use the past ISFs slightly shifted towards their mean */

-		for (i = 0; i < ORDER; i++)

-		{

-			isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));        

-		}

-

-		/* estimate past quantized residual to be used in next frame */

-		for (i = 0; i < ORDER; i++)

-		{

-			tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU));      /* predicted ISF */

-			past_isfq[i] = vo_sub(isf_q[i], tmp);  

-			past_isfq[i] = past_isfq[i] >> 1;         /* past_isfq[i] *= 0.5 */

-		}

-	}

-

-	Reorder_isf(isf_q, ISF_GAP, ORDER);

-

-	return;

-}

-

-

-/***************************************************************************

-* Function:  Reorder_isf()                                                 *

-*                                                                          *

-* Description: To make sure that the  isfs are properly order and to       *

-*              keep a certain minimum distance between consecutive isfs.   *

-*--------------------------------------------------------------------------*

-*    Argument         description                     in/out               *

-*                                                                          *

-*     isf[]           vector of isfs                    i/o                *

-*     min_dist        minimum required distance         i                  *

-*     n               LPC order                         i                  *

-****************************************************************************/

-

-void Reorder_isf(

-		Word16 * isf,                         /* (i/o) Q15: ISF in the frequency domain (0..0.5) */

-		Word16 min_dist,                      /* (i) Q15  : minimum distance to keep             */

-		Word16 n                              /* (i)      : number of ISF                        */

-		)

-{

-	Word32 i; 

-	Word16 isf_min;

-

-	isf_min = min_dist;                    

-	for (i = 0; i < n - 1; i++)

-	{

-		if(isf[i] < isf_min)

-		{

-			isf[i] = isf_min;              

-		}

-		isf_min = (isf[i] + min_dist);

-	}

-	return;

-}

-

-

-Word16 Sub_VQ(                             /* output: return quantization index     */

-		Word16 * x,                           /* input : ISF residual vector           */

-		Word16 * dico,                        /* input : quantization codebook         */

-		Word16 dim,                           /* input : dimention of vector           */

-		Word16 dico_size,                     /* input : size of quantization codebook */

-		Word32 * distance                     /* output: error of quantization         */

-	     )

-{

-	Word16 temp, *p_dico;

-	Word32 i, j, index;

-	Word32 dist_min, dist;

-

-	dist_min = MAX_32;                     

-	p_dico = dico;                         

-

-	index = 0;                             

-	for (i = 0; i < dico_size; i++)

-	{

-		dist = 0;  

-

-		for (j = 0; j < dim; j++)

-		{

-			temp = x[j] - (*p_dico++);

-			dist += (temp * temp)<<1;

-		}

-

-		if(dist < dist_min)

-		{

-			dist_min = dist;               

-			index = i;                     

-		}

-	}

-

-	*distance = dist_min;                  

-

-	/* Reading the selected vector */

-	p_dico = &dico[index * dim];           

-	for (j = 0; j < dim; j++)

-	{

-		x[j] = *p_dico++;                  

-	}

-

-	return index;

-}

-

-

-static void VQ_stage1(

-		Word16 * x,                           /* input : ISF residual vector           */

-		Word16 * dico,                        /* input : quantization codebook         */

-		Word16 dim,                           /* input : dimention of vector           */

-		Word16 dico_size,                     /* input : size of quantization codebook */

-		Word16 * index,                       /* output: indices of survivors          */

-		Word16 surv                           /* input : number of survivor            */

-		)

-{

-	Word16 temp, *p_dico;

-	Word32 i, j, k, l;

-	Word32 dist_min[N_SURV_MAX], dist;

-

-	dist_min[0] = MAX_32;

-	dist_min[1] = MAX_32;

-	dist_min[2] = MAX_32;

-	dist_min[3] = MAX_32;

-	index[0] = 0;

-	index[1] = 1;

-	index[2] = 2;

-	index[3] = 3;

-

-	p_dico = dico;                         

-

-	for (i = 0; i < dico_size; i++)

-	{

-		dist = 0;                          

-		for (j = 0; j < dim; j++)

-		{

-			temp = x[j] -  (*p_dico++);

-			dist += (temp * temp)<<1;

-		}

-

-		for (k = 0; k < surv; k++)

-		{

-			if(dist < dist_min[k])

-			{

-				for (l = surv - 1; l > k; l--)

-				{

-					dist_min[l] = dist_min[l - 1];      

-					index[l] = index[l - 1];    

-				}

-				dist_min[k] = dist;        

-				index[k] = i;              

-				break;

-			}

-		}

-	}

-	return;

-}

-

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*       File: apisf_2s.c                                               *
+*                                                                      *
+*       Description: Coding/Decodeing of ISF parameters with predication
+*       The ISF vector is quantized using two-stage VQ with split-by-2 *
+*       in 1st stage and split-by-5(or 3) in the second stage          *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "cnst.h"
+#include "acelp.h"
+#include "qpisf_2s.tab"                    /* Codebooks of isfs */
+
+#define MU         10923                   /* Prediction factor   (1.0/3.0) in Q15 */
+#define N_SURV_MAX 4                       /* 4 survivors max */
+#define ALPHA      29491                   /* 0. 9 in Q15     */
+#define ONE_ALPHA (32768-ALPHA)            /* (1.0 - ALPHA) in Q15 */
+
+/* private functions */
+static void VQ_stage1(
+		Word16 * x,                           /* input : ISF residual vector           */
+		Word16 * dico,                        /* input : quantization codebook         */
+		Word16 dim,                           /* input : dimention of vector           */
+		Word16 dico_size,                     /* input : size of quantization codebook */
+		Word16 * index,                       /* output: indices of survivors          */
+		Word16 surv                           /* input : number of survivor            */
+		);
+
+/**************************************************************************
+* Function:   Qpisf_2s_46B()                                              *
+*                                                                         *
+* Description: Quantization of isf parameters with prediction. (46 bits)  *
+*                                                                         *
+* The isf vector is quantized using two-stage VQ with split-by-2 in       *
+*  1st stage and split-by-5 in the second stage.                          *
+***************************************************************************/
+
+void Qpisf_2s_46b(
+		Word16 * isf1,                        /* (i) Q15 : ISF in the frequency domain (0..0.5) */
+		Word16 * isf_q,                       /* (o) Q15 : quantized ISF               (0..0.5) */
+		Word16 * past_isfq,                   /* (io)Q15 : past ISF quantizer                   */
+		Word16 * indice,                      /* (o)     : quantization indices                 */
+		Word16 nb_surv                        /* (i)     : number of survivor (1, 2, 3 or 4)    */
+		)
+{
+	Word16 tmp_ind[5];
+	Word16 surv1[N_SURV_MAX];              /* indices of survivors from 1st stage */
+	Word32 i, k, temp, min_err, distance;
+	Word16 isf[ORDER];
+	Word16 isf_stage2[ORDER];
+
+	for (i = 0; i < ORDER; i++)
+	{
+		isf[i] = vo_sub(isf1[i], mean_isf[i]);
+		isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i])); 
+	}
+
+	VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
+
+	distance = MAX_32;          
+
+	for (k = 0; k < nb_surv; k++)
+	{
+		for (i = 0; i < 9; i++)
+		{
+			isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]); 
+		}
+		tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf, 3, SIZE_BK21, &min_err); 
+		temp = min_err;
+		tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico22_isf, 3, SIZE_BK22, &min_err); 
+		temp = vo_L_add(temp, min_err);
+		tmp_ind[2] = Sub_VQ(&isf_stage2[6], dico23_isf, 3, SIZE_BK23, &min_err);  
+		temp = vo_L_add(temp, min_err);
+
+		if(temp < distance)
+		{
+			distance = temp;               
+			indice[0] = surv1[k];          
+			for (i = 0; i < 3; i++)
+			{
+				indice[i + 2] = tmp_ind[i];
+			}
+		}
+	}
+
+
+	VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
+
+	distance = MAX_32;                   
+
+	for (k = 0; k < nb_surv; k++)
+	{
+		for (i = 0; i < 7; i++)
+		{
+			isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);       
+		}
+
+		tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico24_isf, 3, SIZE_BK24, &min_err);
+		temp = min_err; 
+		tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico25_isf, 4, SIZE_BK25, &min_err);
+		temp = vo_L_add(temp, min_err);
+
+		if(temp < distance)
+		{
+			distance = temp;               
+			indice[1] = surv1[k];          
+			for (i = 0; i < 2; i++)
+			{
+				indice[i + 5] = tmp_ind[i];
+			}
+		}
+	}
+
+	Dpisf_2s_46b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
+
+	return;
+}
+
+/*****************************************************************************
+* Function:   Qpisf_2s_36B()                                                 *
+*                                                                            *
+* Description: Quantization of isf parameters with prediction. (36 bits)     *
+*                                                                            *
+* The isf vector is quantized using two-stage VQ with split-by-2 in          *
+*  1st stage and split-by-3 in the second stage.                             *
+******************************************************************************/
+
+void Qpisf_2s_36b(
+		Word16 * isf1,                        /* (i) Q15 : ISF in the frequency domain (0..0.5) */
+		Word16 * isf_q,                       /* (o) Q15 : quantized ISF               (0..0.5) */
+		Word16 * past_isfq,                   /* (io)Q15 : past ISF quantizer                   */
+		Word16 * indice,                      /* (o)     : quantization indices                 */
+		Word16 nb_surv                        /* (i)     : number of survivor (1, 2, 3 or 4)    */
+		)
+{
+	Word16 i, k, tmp_ind[5];
+	Word16 surv1[N_SURV_MAX];              /* indices of survivors from 1st stage */
+	Word32 temp, min_err, distance;
+	Word16 isf[ORDER];
+	Word16 isf_stage2[ORDER];
+
+	for (i = 0; i < ORDER; i++)
+	{
+		isf[i] = vo_sub(isf1[i], mean_isf[i]);
+		isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
+	}
+
+	VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
+
+	distance = MAX_32;                  
+
+	for (k = 0; k < nb_surv; k++)
+	{
+		for (i = 0; i < 9; i++)
+		{
+			isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]); 
+		}
+
+		tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf_36b, 5, SIZE_BK21_36b, &min_err);        
+		temp = min_err;                  
+		tmp_ind[1] = Sub_VQ(&isf_stage2[5], dico22_isf_36b, 4, SIZE_BK22_36b, &min_err);        
+		temp = vo_L_add(temp, min_err);
+
+		if(temp < distance)
+		{
+			distance = temp;               
+			indice[0] = surv1[k];          
+			for (i = 0; i < 2; i++)
+			{
+				indice[i + 2] = tmp_ind[i];
+			}
+		}
+	}
+
+	VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
+	distance = MAX_32;                    
+
+	for (k = 0; k < nb_surv; k++)
+	{
+		for (i = 0; i < 7; i++)
+		{
+			isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);     
+		}
+
+		tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico23_isf_36b, 7, SIZE_BK23_36b, &min_err);  
+		temp = min_err;                  
+
+		if(temp < distance)
+		{
+			distance = temp;               
+			indice[1] = surv1[k];          
+			indice[4] = tmp_ind[0];        
+		}
+	}
+
+	Dpisf_2s_36b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
+
+	return;
+}
+
+/*********************************************************************
+* Function: Dpisf_2s_46b()                                           *
+*                                                                    *
+* Description: Decoding of ISF parameters                            *
+**********************************************************************/
+
+void Dpisf_2s_46b(
+		Word16 * indice,                      /* input:  quantization indices                       */
+		Word16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */
+		Word16 * past_isfq,                   /* i/0   : past ISF quantizer                    */
+		Word16 * isfold,                      /* input : past quantized ISF                    */
+		Word16 * isf_buf,                     /* input : isf buffer                                                        */
+		Word16 bfi,                           /* input : Bad frame indicator                   */
+		Word16 enc_dec
+		)
+{
+	Word16 ref_isf[M], tmp;
+	Word32 i, j, L_tmp;
+
+	if (bfi == 0)                          /* Good frame */
+	{
+		for (i = 0; i < 9; i++)
+		{
+			isf_q[i] = dico1_isf[indice[0] * 9 + i];    
+		}
+		for (i = 0; i < 7; i++)
+		{
+			isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];       
+		}
+
+		for (i = 0; i < 3; i++)
+		{
+			isf_q[i] = add1(isf_q[i], dico21_isf[indice[2] * 3 + i]);   
+			isf_q[i + 3] = add1(isf_q[i + 3], dico22_isf[indice[3] * 3 + i]);  
+			isf_q[i + 6] = add1(isf_q[i + 6], dico23_isf[indice[4] * 3 + i]); 
+			isf_q[i + 9] = add1(isf_q[i + 9], dico24_isf[indice[5] * 3 + i]); 
+		}
+
+		for (i = 0; i < 4; i++)
+		{
+			isf_q[i + 12] = add1(isf_q[i + 12], dico25_isf[indice[6] * 4 + i]);  
+		}
+
+		for (i = 0; i < ORDER; i++)
+		{
+			tmp = isf_q[i];               
+			isf_q[i] = add1(tmp, mean_isf[i]);  
+			isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
+			past_isfq[i] = tmp;  
+		}
+
+		if (enc_dec)
+		{
+			for (i = 0; i < M; i++)
+			{
+				for (j = (L_MEANBUF - 1); j > 0; j--)
+				{
+					isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; 
+				}
+				isf_buf[i] = isf_q[i]; 
+			}
+		}
+	} else
+	{                                      /* bad frame */
+		for (i = 0; i < M; i++)
+		{
+			L_tmp = mean_isf[i] << 14;
+			for (j = 0; j < L_MEANBUF; j++)
+			{
+				L_tmp += (isf_buf[j * M + i] << 14);
+			}
+			ref_isf[i] = vo_round(L_tmp);
+		}
+
+		/* use the past ISFs slightly shifted towards their mean */
+		for (i = 0; i < ORDER; i++)
+		{
+			isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i])); 
+		}
+
+		/* estimate past quantized residual to be used in next frame */
+		for (i = 0; i < ORDER; i++)
+		{
+			tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU));      /* predicted ISF */
+			past_isfq[i] = vo_sub(isf_q[i], tmp); 
+			past_isfq[i] = (past_isfq[i] >> 1);        /* past_isfq[i] *= 0.5 */
+		}
+	}
+
+	Reorder_isf(isf_q, ISF_GAP, ORDER);
+	return;
+}
+
+/*********************************************************************
+* Function:   Disf_2s_36b()                                          *
+*                                                                    *
+* Description: Decoding of ISF parameters                            *
+*********************************************************************/
+
+void Dpisf_2s_36b(
+		Word16 * indice,                      /* input:  quantization indices                       */
+		Word16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */
+		Word16 * past_isfq,                   /* i/0   : past ISF quantizer                    */
+		Word16 * isfold,                      /* input : past quantized ISF                    */
+		Word16 * isf_buf,                     /* input : isf buffer                                                        */
+		Word16 bfi,                           /* input : Bad frame indicator                   */
+		Word16 enc_dec
+		)
+{
+	Word16 ref_isf[M], tmp;
+	Word32 i, j, L_tmp;
+
+	if (bfi == 0)                          /* Good frame */
+	{
+		for (i = 0; i < 9; i++)
+		{
+			isf_q[i] = dico1_isf[indice[0] * 9 + i];    
+		}
+		for (i = 0; i < 7; i++)
+		{
+			isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];       
+		}
+
+		for (i = 0; i < 5; i++)
+		{
+			isf_q[i] = add1(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]);       
+		}
+		for (i = 0; i < 4; i++)
+		{
+			isf_q[i + 5] = add1(isf_q[i + 5], dico22_isf_36b[indice[3] * 4 + i]);        
+		}
+		for (i = 0; i < 7; i++)
+		{
+			isf_q[i + 9] = add1(isf_q[i + 9], dico23_isf_36b[indice[4] * 7 + i]);       
+		}
+
+		for (i = 0; i < ORDER; i++)
+		{
+			tmp = isf_q[i];
+			isf_q[i] = add1(tmp, mean_isf[i]);   
+			isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));   
+			past_isfq[i] = tmp;           
+		}
+
+
+		if (enc_dec)
+		{
+			for (i = 0; i < M; i++)
+			{
+				for (j = (L_MEANBUF - 1); j > 0; j--)
+				{
+					isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];      
+				}
+				isf_buf[i] = isf_q[i];    
+			}
+		}
+	} else
+	{                                      /* bad frame */
+		for (i = 0; i < M; i++)
+		{
+			L_tmp = (mean_isf[i] << 14);
+			for (j = 0; j < L_MEANBUF; j++)
+			{
+				L_tmp += (isf_buf[j * M + i] << 14);
+			}
+			ref_isf[i] = vo_round(L_tmp);    
+		}
+
+		/* use the past ISFs slightly shifted towards their mean */
+		for (i = 0; i < ORDER; i++)
+		{
+			isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));        
+		}
+
+		/* estimate past quantized residual to be used in next frame */
+		for (i = 0; i < ORDER; i++)
+		{
+			tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU));      /* predicted ISF */
+			past_isfq[i] = vo_sub(isf_q[i], tmp);  
+			past_isfq[i] = past_isfq[i] >> 1;         /* past_isfq[i] *= 0.5 */
+		}
+	}
+
+	Reorder_isf(isf_q, ISF_GAP, ORDER);
+
+	return;
+}
+
+
+/***************************************************************************
+* Function:  Reorder_isf()                                                 *
+*                                                                          *
+* Description: To make sure that the  isfs are properly order and to       *
+*              keep a certain minimum distance between consecutive isfs.   *
+*--------------------------------------------------------------------------*
+*    Argument         description                     in/out               *
+*                                                                          *
+*     isf[]           vector of isfs                    i/o                *
+*     min_dist        minimum required distance         i                  *
+*     n               LPC order                         i                  *
+****************************************************************************/
+
+void Reorder_isf(
+		Word16 * isf,                         /* (i/o) Q15: ISF in the frequency domain (0..0.5) */
+		Word16 min_dist,                      /* (i) Q15  : minimum distance to keep             */
+		Word16 n                              /* (i)      : number of ISF                        */
+		)
+{
+	Word32 i; 
+	Word16 isf_min;
+
+	isf_min = min_dist;                    
+	for (i = 0; i < n - 1; i++)
+	{
+		if(isf[i] < isf_min)
+		{
+			isf[i] = isf_min;              
+		}
+		isf_min = (isf[i] + min_dist);
+	}
+	return;
+}
+
+
+Word16 Sub_VQ(                             /* output: return quantization index     */
+		Word16 * x,                           /* input : ISF residual vector           */
+		Word16 * dico,                        /* input : quantization codebook         */
+		Word16 dim,                           /* input : dimention of vector           */
+		Word16 dico_size,                     /* input : size of quantization codebook */
+		Word32 * distance                     /* output: error of quantization         */
+	     )
+{
+	Word16 temp, *p_dico;
+	Word32 i, j, index;
+	Word32 dist_min, dist;
+
+	dist_min = MAX_32;                     
+	p_dico = dico;                         
+
+	index = 0;                             
+	for (i = 0; i < dico_size; i++)
+	{
+		dist = 0;  
+
+		for (j = 0; j < dim; j++)
+		{
+			temp = x[j] - (*p_dico++);
+			dist += (temp * temp)<<1;
+		}
+
+		if(dist < dist_min)
+		{
+			dist_min = dist;               
+			index = i;                     
+		}
+	}
+
+	*distance = dist_min;                  
+
+	/* Reading the selected vector */
+	p_dico = &dico[index * dim];           
+	for (j = 0; j < dim; j++)
+	{
+		x[j] = *p_dico++;                  
+	}
+
+	return index;
+}
+
+
+static void VQ_stage1(
+		Word16 * x,                           /* input : ISF residual vector           */
+		Word16 * dico,                        /* input : quantization codebook         */
+		Word16 dim,                           /* input : dimention of vector           */
+		Word16 dico_size,                     /* input : size of quantization codebook */
+		Word16 * index,                       /* output: indices of survivors          */
+		Word16 surv                           /* input : number of survivor            */
+		)
+{
+	Word16 temp, *p_dico;
+	Word32 i, j, k, l;
+	Word32 dist_min[N_SURV_MAX], dist;
+
+	dist_min[0] = MAX_32;
+	dist_min[1] = MAX_32;
+	dist_min[2] = MAX_32;
+	dist_min[3] = MAX_32;
+	index[0] = 0;
+	index[1] = 1;
+	index[2] = 2;
+	index[3] = 3;
+
+	p_dico = dico;                         
+
+	for (i = 0; i < dico_size; i++)
+	{
+		dist = 0;                          
+		for (j = 0; j < dim; j++)
+		{
+			temp = x[j] -  (*p_dico++);
+			dist += (temp * temp)<<1;
+		}
+
+		for (k = 0; k < surv; k++)
+		{
+			if(dist < dist_min[k])
+			{
+				for (l = surv - 1; l > k; l--)
+				{
+					dist_min[l] = dist_min[l - 1];      
+					index[l] = index[l - 1];    
+				}
+				dist_min[k] = dist;        
+				index[k] = i;              
+				break;
+			}
+		}
+	}
+	return;
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/random.c b/media/libstagefright/codecs/amrwbenc/src/random.c
index 8baa8bf..b896863 100644
--- a/media/libstagefright/codecs/amrwbenc/src/random.c
+++ b/media/libstagefright/codecs/amrwbenc/src/random.c
@@ -1,33 +1,33 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*       File: random.c                                                 *

-*                                                                      *

-*       Description: Signed 16 bits random generator                   *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-

-Word16 Random(Word16 * seed)

-{

-	/* static Word16 seed = 21845; */

-	*seed = (Word16)(L_add((L_mult(*seed, 31821) >> 1), 13849L));

-	return (*seed);

-}

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*       File: random.c                                                 *
+*                                                                      *
+*       Description: Signed 16 bits random generator                   *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+Word16 Random(Word16 * seed)
+{
+	/* static Word16 seed = 21845; */
+	*seed = (Word16)(L_add((L_mult(*seed, 31821) >> 1), 13849L));
+	return (*seed);
+}
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/residu.c b/media/libstagefright/codecs/amrwbenc/src/residu.c
index 6829882..328aed2 100644
--- a/media/libstagefright/codecs/amrwbenc/src/residu.c
+++ b/media/libstagefright/codecs/amrwbenc/src/residu.c
@@ -1,67 +1,67 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*  File: residu.c                                                      *

-*                                                                      *

-*  Description: Compute the LPC residual by filtering                  *

-*             the input speech through A(z)                            *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-

-void Residu(

-		Word16 a[],                           /* (i) Q12 : prediction coefficients                     */

-		Word16 x[],                           /* (i)     : speech (values x[-m..-1] are needed         */

-		Word16 y[],                           /* (o) x2  : residual signal                             */

-		Word16 lg                             /* (i)     : size of filtering                           */

-		)

-{

-	Word16 i,*p1, *p2;

-	Word32 s;

-	for (i = 0; i < lg; i++)

-	{

-		p1 = a;

-		p2 = &x[i];

-		s  = vo_mult32((*p1++), (*p2--));

-		s += vo_mult32((*p1++), (*p2--));

-		s += vo_mult32((*p1++), (*p2--));

-		s += vo_mult32((*p1++), (*p2--));

-		s += vo_mult32((*p1++), (*p2--));

-		s += vo_mult32((*p1++), (*p2--));

-		s += vo_mult32((*p1++), (*p2--));

-		s += vo_mult32((*p1++), (*p2--));

-		s += vo_mult32((*p1++), (*p2--));

-		s += vo_mult32((*p1++), (*p2--));

-		s += vo_mult32((*p1++), (*p2--));

-		s += vo_mult32((*p1++), (*p2--));

-		s += vo_mult32((*p1++), (*p2--));

-		s += vo_mult32((*p1++), (*p2--));

-		s += vo_mult32((*p1++), (*p2--));

-		s += vo_mult32((*p1++), (*p2--));

-		s += vo_mult32((*p1), (*p2));

-

-		s = L_shl2(s, 5); 

-		y[i] = extract_h(L_add(s, 0x8000));

-	}

-

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*  File: residu.c                                                      *
+*                                                                      *
+*  Description: Compute the LPC residual by filtering                  *
+*             the input speech through A(z)                            *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+void Residu(
+		Word16 a[],                           /* (i) Q12 : prediction coefficients                     */
+		Word16 x[],                           /* (i)     : speech (values x[-m..-1] are needed         */
+		Word16 y[],                           /* (o) x2  : residual signal                             */
+		Word16 lg                             /* (i)     : size of filtering                           */
+		)
+{
+	Word16 i,*p1, *p2;
+	Word32 s;
+	for (i = 0; i < lg; i++)
+	{
+		p1 = a;
+		p2 = &x[i];
+		s  = vo_mult32((*p1++), (*p2--));
+		s += vo_mult32((*p1++), (*p2--));
+		s += vo_mult32((*p1++), (*p2--));
+		s += vo_mult32((*p1++), (*p2--));
+		s += vo_mult32((*p1++), (*p2--));
+		s += vo_mult32((*p1++), (*p2--));
+		s += vo_mult32((*p1++), (*p2--));
+		s += vo_mult32((*p1++), (*p2--));
+		s += vo_mult32((*p1++), (*p2--));
+		s += vo_mult32((*p1++), (*p2--));
+		s += vo_mult32((*p1++), (*p2--));
+		s += vo_mult32((*p1++), (*p2--));
+		s += vo_mult32((*p1++), (*p2--));
+		s += vo_mult32((*p1++), (*p2--));
+		s += vo_mult32((*p1++), (*p2--));
+		s += vo_mult32((*p1++), (*p2--));
+		s += vo_mult32((*p1), (*p2));
+
+		s = L_shl2(s, 5); 
+		y[i] = extract_h(L_add(s, 0x8000));
+	}
+
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/scale.c b/media/libstagefright/codecs/amrwbenc/src/scale.c
index af40121..b203bec 100644
--- a/media/libstagefright/codecs/amrwbenc/src/scale.c
+++ b/media/libstagefright/codecs/amrwbenc/src/scale.c
@@ -1,57 +1,57 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*       File: scale.c                                                  *

-*                                                                      *

-*       Description: Scale signal to get maximum of dynamic            *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-

-void Scale_sig(

-		Word16 x[],                           /* (i/o) : signal to scale               */

-		Word16 lg,                            /* (i)   : size of x[]                   */

-		Word16 exp                            /* (i)   : exponent: x = round(x << exp) */

-	      )

-{

-	Word32 i;

-	Word32 L_tmp;

-	if(exp > 0)

-	{

-		for (i = lg - 1 ; i >= 0; i--)

-		{

-			L_tmp = L_shl2(x[i], 16 + exp);  

-			x[i] = extract_h(L_add(L_tmp, 0x8000));            

-		}

-	}

-	else

-	{

-		exp = -exp;

-		for (i = lg - 1; i >= 0; i--)

-		{

-			L_tmp = x[i] << 16;

-			L_tmp >>= exp; 

-			x[i] = (L_tmp + 0x8000)>>16;            

-		}

-	}

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*       File: scale.c                                                  *
+*                                                                      *
+*       Description: Scale signal to get maximum of dynamic            *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+void Scale_sig(
+		Word16 x[],                           /* (i/o) : signal to scale               */
+		Word16 lg,                            /* (i)   : size of x[]                   */
+		Word16 exp                            /* (i)   : exponent: x = round(x << exp) */
+	      )
+{
+	Word32 i;
+	Word32 L_tmp;
+	if(exp > 0)
+	{
+		for (i = lg - 1 ; i >= 0; i--)
+		{
+			L_tmp = L_shl2(x[i], 16 + exp);  
+			x[i] = extract_h(L_add(L_tmp, 0x8000));            
+		}
+	}
+	else
+	{
+		exp = -exp;
+		for (i = lg - 1; i >= 0; i--)
+		{
+			L_tmp = x[i] << 16;
+			L_tmp >>= exp; 
+			x[i] = (L_tmp + 0x8000)>>16;            
+		}
+	}
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/stream.c b/media/libstagefright/codecs/amrwbenc/src/stream.c
index a708235..bdf0d46 100644
--- a/media/libstagefright/codecs/amrwbenc/src/stream.c
+++ b/media/libstagefright/codecs/amrwbenc/src/stream.c
@@ -1,58 +1,58 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*       File: stream.c                                                 *

-*                                                                      *

-*       Description: VOME API Buffer Operator Implement Code           *

-*                                                                      *

-************************************************************************/

-

-#include "stream.h"

-

-void voAWB_InitFrameBuffer(FrameStream *stream)

-{

-	stream->set_ptr = NULL;

-	stream->frame_ptr_bk = stream->frame_ptr;

-	stream->set_len = 0;

-	stream->framebuffer_len = 0;

-	stream->frame_storelen = 0;	

-}

-

-void voAWB_UpdateFrameBuffer(

-		FrameStream *stream, 

-		VO_MEM_OPERATOR *pMemOP

-		)

-{

-	int  len;

-	len  = MIN(Frame_Maxsize - stream->frame_storelen, stream->set_len);

-	pMemOP->Copy(VO_INDEX_ENC_AMRWB, stream->frame_ptr_bk + stream->frame_storelen , stream->set_ptr, len);

-	stream->set_len -= len;

-	stream->set_ptr += len;

-	stream->framebuffer_len = stream->frame_storelen + len;

-	stream->frame_ptr = stream->frame_ptr_bk;

-	stream->used_len += len;

-}

-

-void voAWB_FlushFrameBuffer(FrameStream *stream)

-{

-	stream->set_ptr = NULL;

-	stream->frame_ptr_bk = stream->frame_ptr;

-	stream->set_len = 0;

-	stream->framebuffer_len = 0;

-	stream->frame_storelen = 0;	

-}

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*       File: stream.c                                                 *
+*                                                                      *
+*       Description: VOME API Buffer Operator Implement Code           *
+*                                                                      *
+************************************************************************/
+
+#include "stream.h"
+
+void voAWB_InitFrameBuffer(FrameStream *stream)
+{
+	stream->set_ptr = NULL;
+	stream->frame_ptr_bk = stream->frame_ptr;
+	stream->set_len = 0;
+	stream->framebuffer_len = 0;
+	stream->frame_storelen = 0;	
+}
+
+void voAWB_UpdateFrameBuffer(
+		FrameStream *stream, 
+		VO_MEM_OPERATOR *pMemOP
+		)
+{
+	int  len;
+	len  = MIN(Frame_Maxsize - stream->frame_storelen, stream->set_len);
+	pMemOP->Copy(VO_INDEX_ENC_AMRWB, stream->frame_ptr_bk + stream->frame_storelen , stream->set_ptr, len);
+	stream->set_len -= len;
+	stream->set_ptr += len;
+	stream->framebuffer_len = stream->frame_storelen + len;
+	stream->frame_ptr = stream->frame_ptr_bk;
+	stream->used_len += len;
+}
+
+void voAWB_FlushFrameBuffer(FrameStream *stream)
+{
+	stream->set_ptr = NULL;
+	stream->frame_ptr_bk = stream->frame_ptr;
+	stream->set_len = 0;
+	stream->framebuffer_len = 0;
+	stream->frame_storelen = 0;	
+}
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/syn_filt.c b/media/libstagefright/codecs/amrwbenc/src/syn_filt.c
index 6c1fb8e..90fafb0 100644
--- a/media/libstagefright/codecs/amrwbenc/src/syn_filt.c
+++ b/media/libstagefright/codecs/amrwbenc/src/syn_filt.c
@@ -1,160 +1,160 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*       File: syn_filt.c                                               *

-*                                                                      *

-*       Description: Do the synthesis filtering 1/A(z)                 *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "math_op.h"

-#include "cnst.h"

-

-void Syn_filt(

-		Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients           */

-		Word16 x[],                           /* (i)     : input signal                             */

-		Word16 y[],                           /* (o)     : output signal                            */

-		Word16 lg,                            /* (i)     : size of filtering                        */

-		Word16 mem[],                         /* (i/o)   : memory associated with this filtering.   */

-		Word16 update                         /* (i)     : 0=no update, 1=update of memory.         */

-	     )

-{

-	Word32 i, a0;

-	Word16 y_buf[L_SUBFR16k + M16k];

-	Word32 L_tmp;

-	Word16 *yy, *p1, *p2;

-	yy = &y_buf[0];                        

-	/* copy initial filter states into synthesis buffer */

-	for (i = 0; i < 16; i++)

-	{

-		*yy++ = mem[i];                    

-	}

-	a0 = (a[0] >> 1);                     /* input / 2 */

-	/* Do the filtering. */

-	for (i = 0; i < lg; i++)

-	{

-		p1 = &a[1];

-		p2 = &yy[i-1];

-		L_tmp  = vo_mult32(a0, x[i]);

-		L_tmp -= vo_mult32((*p1++), (*p2--));

-		L_tmp -= vo_mult32((*p1++), (*p2--));

-		L_tmp -= vo_mult32((*p1++), (*p2--));

-		L_tmp -= vo_mult32((*p1++), (*p2--));

-		L_tmp -= vo_mult32((*p1++), (*p2--));

-		L_tmp -= vo_mult32((*p1++), (*p2--));

-		L_tmp -= vo_mult32((*p1++), (*p2--));

-		L_tmp -= vo_mult32((*p1++), (*p2--));

-		L_tmp -= vo_mult32((*p1++), (*p2--));

-		L_tmp -= vo_mult32((*p1++), (*p2--));

-		L_tmp -= vo_mult32((*p1++), (*p2--));

-		L_tmp -= vo_mult32((*p1++), (*p2--));

-		L_tmp -= vo_mult32((*p1++), (*p2--));

-		L_tmp -= vo_mult32((*p1++), (*p2--));

-		L_tmp -= vo_mult32((*p1++), (*p2--));

-		L_tmp -= vo_mult32((*p1), (*p2));

-

-		L_tmp = L_shl2(L_tmp, 4);

-		y[i] = yy[i] = extract_h(L_add(L_tmp, 0x8000));  

-	}

-	/* Update memory if required */

-	if (update)

-		for (i = 0; i < 16; i++)

-		{

-			mem[i] = yy[lg - 16 + i];

-		}

-	return;

-}

-

-

-void Syn_filt_32(

-		Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients */

-		Word16 m,                             /* (i)     : order of LP filter             */

-		Word16 exc[],                         /* (i) Qnew: excitation (exc[i] >> Qnew)    */

-		Word16 Qnew,                          /* (i)     : exc scaling = 0(min) to 8(max) */

-		Word16 sig_hi[],                      /* (o) /16 : synthesis high                 */

-		Word16 sig_lo[],                      /* (o) /16 : synthesis low                  */

-		Word16 lg                             /* (i)     : size of filtering              */

-		)

-{

-	Word32 i,a0;

-	Word32 L_tmp, L_tmp1;

-	Word16 *p1, *p2, *p3;

-	a0 = a[0] >> (4 + Qnew);          /* input / 16 and >>Qnew */

-	/* Do the filtering. */

-	for (i = 0; i < lg; i++)

-	{

-		L_tmp  = 0; 

-		L_tmp1 = 0;

-		p1 = a;

-		p2 = &sig_lo[i - 1];

-		p3 = &sig_hi[i - 1];

-

-		L_tmp  -= vo_mult32((*p2--), (*p1));

-		L_tmp1 -= vo_mult32((*p3--), (*p1++));

-		L_tmp  -= vo_mult32((*p2--), (*p1));

-		L_tmp1 -= vo_mult32((*p3--), (*p1++));

-		L_tmp  -= vo_mult32((*p2--), (*p1));

-		L_tmp1 -= vo_mult32((*p3--), (*p1++));

-		L_tmp  -= vo_mult32((*p2--), (*p1));

-		L_tmp1 -= vo_mult32((*p3--), (*p1++));

-		L_tmp  -= vo_mult32((*p2--), (*p1));

-		L_tmp1 -= vo_mult32((*p3--), (*p1++));

-		L_tmp  -= vo_mult32((*p2--), (*p1));

-		L_tmp1 -= vo_mult32((*p3--), (*p1++));

-		L_tmp  -= vo_mult32((*p2--), (*p1));

-		L_tmp1 -= vo_mult32((*p3--), (*p1++));

-		L_tmp  -= vo_mult32((*p2--), (*p1));

-		L_tmp1 -= vo_mult32((*p3--), (*p1++));

-		L_tmp  -= vo_mult32((*p2--), (*p1));

-		L_tmp1 -= vo_mult32((*p3--), (*p1++));

-		L_tmp  -= vo_mult32((*p2--), (*p1));

-		L_tmp1 -= vo_mult32((*p3--), (*p1++));

-		L_tmp  -= vo_mult32((*p2--), (*p1));

-		L_tmp1 -= vo_mult32((*p3--), (*p1++));

-		L_tmp  -= vo_mult32((*p2--), (*p1));

-		L_tmp1 -= vo_mult32((*p3--), (*p1++));

-		L_tmp  -= vo_mult32((*p2--), (*p1));

-		L_tmp1 -= vo_mult32((*p3--), (*p1++));

-		L_tmp  -= vo_mult32((*p2--), (*p1));

-		L_tmp1 -= vo_mult32((*p3--), (*p1++));

-		L_tmp  -= vo_mult32((*p2--), (*p1));

-		L_tmp1 -= vo_mult32((*p3--), (*p1++));

-		L_tmp  -= vo_mult32((*p2--), (*p1));

-		L_tmp1 -= vo_mult32((*p3--), (*p1++));

-

-		L_tmp = L_tmp >> 11;      

-		L_tmp += vo_L_mult(exc[i], a0);

-

-		/* sig_hi = bit16 to bit31 of synthesis */

-		L_tmp = L_tmp - (L_tmp1<<1);

-

-		L_tmp = L_tmp >> 3;           /* ai in Q12 */

-		sig_hi[i] = extract_h(L_tmp);      

-

-		/* sig_lo = bit4 to bit15 of synthesis */

-		L_tmp >>= 4;           /* 4 : sig_lo[i] >> 4 */

-		sig_lo[i] = (Word16)((L_tmp - (sig_hi[i] << 13)));  

-	}

-

-	return;

-}

-

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*       File: syn_filt.c                                               *
+*                                                                      *
+*       Description: Do the synthesis filtering 1/A(z)                 *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+#include "cnst.h"
+
+void Syn_filt(
+		Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients           */
+		Word16 x[],                           /* (i)     : input signal                             */
+		Word16 y[],                           /* (o)     : output signal                            */
+		Word16 lg,                            /* (i)     : size of filtering                        */
+		Word16 mem[],                         /* (i/o)   : memory associated with this filtering.   */
+		Word16 update                         /* (i)     : 0=no update, 1=update of memory.         */
+	     )
+{
+	Word32 i, a0;
+	Word16 y_buf[L_SUBFR16k + M16k];
+	Word32 L_tmp;
+	Word16 *yy, *p1, *p2;
+	yy = &y_buf[0];                        
+	/* copy initial filter states into synthesis buffer */
+	for (i = 0; i < 16; i++)
+	{
+		*yy++ = mem[i];                    
+	}
+	a0 = (a[0] >> 1);                     /* input / 2 */
+	/* Do the filtering. */
+	for (i = 0; i < lg; i++)
+	{
+		p1 = &a[1];
+		p2 = &yy[i-1];
+		L_tmp  = vo_mult32(a0, x[i]);
+		L_tmp -= vo_mult32((*p1++), (*p2--));
+		L_tmp -= vo_mult32((*p1++), (*p2--));
+		L_tmp -= vo_mult32((*p1++), (*p2--));
+		L_tmp -= vo_mult32((*p1++), (*p2--));
+		L_tmp -= vo_mult32((*p1++), (*p2--));
+		L_tmp -= vo_mult32((*p1++), (*p2--));
+		L_tmp -= vo_mult32((*p1++), (*p2--));
+		L_tmp -= vo_mult32((*p1++), (*p2--));
+		L_tmp -= vo_mult32((*p1++), (*p2--));
+		L_tmp -= vo_mult32((*p1++), (*p2--));
+		L_tmp -= vo_mult32((*p1++), (*p2--));
+		L_tmp -= vo_mult32((*p1++), (*p2--));
+		L_tmp -= vo_mult32((*p1++), (*p2--));
+		L_tmp -= vo_mult32((*p1++), (*p2--));
+		L_tmp -= vo_mult32((*p1++), (*p2--));
+		L_tmp -= vo_mult32((*p1), (*p2));
+
+		L_tmp = L_shl2(L_tmp, 4);
+		y[i] = yy[i] = extract_h(L_add(L_tmp, 0x8000));  
+	}
+	/* Update memory if required */
+	if (update)
+		for (i = 0; i < 16; i++)
+		{
+			mem[i] = yy[lg - 16 + i];
+		}
+	return;
+}
+
+
+void Syn_filt_32(
+		Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients */
+		Word16 m,                             /* (i)     : order of LP filter             */
+		Word16 exc[],                         /* (i) Qnew: excitation (exc[i] >> Qnew)    */
+		Word16 Qnew,                          /* (i)     : exc scaling = 0(min) to 8(max) */
+		Word16 sig_hi[],                      /* (o) /16 : synthesis high                 */
+		Word16 sig_lo[],                      /* (o) /16 : synthesis low                  */
+		Word16 lg                             /* (i)     : size of filtering              */
+		)
+{
+	Word32 i,a0;
+	Word32 L_tmp, L_tmp1;
+	Word16 *p1, *p2, *p3;
+	a0 = a[0] >> (4 + Qnew);          /* input / 16 and >>Qnew */
+	/* Do the filtering. */
+	for (i = 0; i < lg; i++)
+	{
+		L_tmp  = 0; 
+		L_tmp1 = 0;
+		p1 = a;
+		p2 = &sig_lo[i - 1];
+		p3 = &sig_hi[i - 1];
+
+		L_tmp  -= vo_mult32((*p2--), (*p1));
+		L_tmp1 -= vo_mult32((*p3--), (*p1++));
+		L_tmp  -= vo_mult32((*p2--), (*p1));
+		L_tmp1 -= vo_mult32((*p3--), (*p1++));
+		L_tmp  -= vo_mult32((*p2--), (*p1));
+		L_tmp1 -= vo_mult32((*p3--), (*p1++));
+		L_tmp  -= vo_mult32((*p2--), (*p1));
+		L_tmp1 -= vo_mult32((*p3--), (*p1++));
+		L_tmp  -= vo_mult32((*p2--), (*p1));
+		L_tmp1 -= vo_mult32((*p3--), (*p1++));
+		L_tmp  -= vo_mult32((*p2--), (*p1));
+		L_tmp1 -= vo_mult32((*p3--), (*p1++));
+		L_tmp  -= vo_mult32((*p2--), (*p1));
+		L_tmp1 -= vo_mult32((*p3--), (*p1++));
+		L_tmp  -= vo_mult32((*p2--), (*p1));
+		L_tmp1 -= vo_mult32((*p3--), (*p1++));
+		L_tmp  -= vo_mult32((*p2--), (*p1));
+		L_tmp1 -= vo_mult32((*p3--), (*p1++));
+		L_tmp  -= vo_mult32((*p2--), (*p1));
+		L_tmp1 -= vo_mult32((*p3--), (*p1++));
+		L_tmp  -= vo_mult32((*p2--), (*p1));
+		L_tmp1 -= vo_mult32((*p3--), (*p1++));
+		L_tmp  -= vo_mult32((*p2--), (*p1));
+		L_tmp1 -= vo_mult32((*p3--), (*p1++));
+		L_tmp  -= vo_mult32((*p2--), (*p1));
+		L_tmp1 -= vo_mult32((*p3--), (*p1++));
+		L_tmp  -= vo_mult32((*p2--), (*p1));
+		L_tmp1 -= vo_mult32((*p3--), (*p1++));
+		L_tmp  -= vo_mult32((*p2--), (*p1));
+		L_tmp1 -= vo_mult32((*p3--), (*p1++));
+		L_tmp  -= vo_mult32((*p2--), (*p1));
+		L_tmp1 -= vo_mult32((*p3--), (*p1++));
+
+		L_tmp = L_tmp >> 11;      
+		L_tmp += vo_L_mult(exc[i], a0);
+
+		/* sig_hi = bit16 to bit31 of synthesis */
+		L_tmp = L_tmp - (L_tmp1<<1);
+
+		L_tmp = L_tmp >> 3;           /* ai in Q12 */
+		sig_hi[i] = extract_h(L_tmp);      
+
+		/* sig_lo = bit4 to bit15 of synthesis */
+		L_tmp >>= 4;           /* 4 : sig_lo[i] >> 4 */
+		sig_lo[i] = (Word16)((L_tmp - (sig_hi[i] << 13)));  
+	}
+
+	return;
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/updt_tar.c b/media/libstagefright/codecs/amrwbenc/src/updt_tar.c
index f3e5650..eda2b1c 100644
--- a/media/libstagefright/codecs/amrwbenc/src/updt_tar.c
+++ b/media/libstagefright/codecs/amrwbenc/src/updt_tar.c
@@ -1,49 +1,49 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*       File: updt_tar.c                                               *

-*                                                                      *

-*       Description: Update the target vector for codebook search      *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-

-void Updt_tar(

-		Word16 * x,                           /* (i) Q0  : old target (for pitch search)     */

-		Word16 * x2,                          /* (o) Q0  : new target (for codebook search)  */

-		Word16 * y,                           /* (i) Q0  : filtered adaptive codebook vector */

-		Word16 gain,                          /* (i) Q14 : adaptive codebook gain            */

-		Word16 L                              /* (i)     : subframe size                     */

-	     )

-{

-	Word32 i;

-	Word32 L_tmp;

-

-	for (i = 0; i < L; i++)

-	{

-		L_tmp = x[i] << 15;

-		L_tmp -= (y[i] * gain)<<1;

-		x2[i] = extract_h(L_shl2(L_tmp, 1)); 

-	}

-

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*       File: updt_tar.c                                               *
+*                                                                      *
+*       Description: Update the target vector for codebook search      *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+void Updt_tar(
+		Word16 * x,                           /* (i) Q0  : old target (for pitch search)     */
+		Word16 * x2,                          /* (o) Q0  : new target (for codebook search)  */
+		Word16 * y,                           /* (i) Q0  : filtered adaptive codebook vector */
+		Word16 gain,                          /* (i) Q14 : adaptive codebook gain            */
+		Word16 L                              /* (i)     : subframe size                     */
+	     )
+{
+	Word32 i;
+	Word32 L_tmp;
+
+	for (i = 0; i < L; i++)
+	{
+		L_tmp = x[i] << 15;
+		L_tmp -= (y[i] * gain)<<1;
+		x2[i] = extract_h(L_shl2(L_tmp, 1)); 
+	}
+
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/util.c b/media/libstagefright/codecs/amrwbenc/src/util.c
index 78141dd..76ab1b1 100644
--- a/media/libstagefright/codecs/amrwbenc/src/util.c
+++ b/media/libstagefright/codecs/amrwbenc/src/util.c
@@ -1,74 +1,74 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*       File: util.c                                                   *

-*                                                                      *

-*       Description: Reset and Copy buffer                             *

-*                                                                      *

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-

-/***********************************************************************

-* Function:  Set_zero()                                             *

-* Description: Set vector x[] to zero                               *

-************************************************************************/

-

-void Set_zero(

-		Word16 x[],                           /* (o)    : vector to clear     */

-		Word16 L                              /* (i)    : length of vector    */

-	     )

-{

-	Word32 num = (Word32)L;

-	do{

-		*x++ = 0;

-	}while(--num !=0);

-}

-

-

-/*********************************************************************

-* Function: Copy()                                                   *

-*                                                                    *

-* Description: Copy vector x[] to y[]                                *

-*********************************************************************/

-

-void Copy(

-		Word16 x[],                           /* (i)   : input vector   */

-		Word16 y[],                           /* (o)   : output vector  */

-		Word16 L                              /* (i)   : vector length  */

-	 )

-{

-	Word32	temp1,temp2,num;

-	if(L&1)

-	{

-		temp1 = *x++;

-		*y++ = temp1;

-	}

-	num = (Word32)(L>>1);

-	temp1 = *x++;

-	temp2 = *x++;

-	do{

-		*y++ = temp1;

-		*y++ = temp2;

-		temp1 = *x++;

-		temp2 = *x++;

-	}while(--num!=0);

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*       File: util.c                                                   *
+*                                                                      *
+*       Description: Reset and Copy buffer                             *
+*                                                                      *
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+/***********************************************************************
+* Function:  Set_zero()                                             *
+* Description: Set vector x[] to zero                               *
+************************************************************************/
+
+void Set_zero(
+		Word16 x[],                           /* (o)    : vector to clear     */
+		Word16 L                              /* (i)    : length of vector    */
+	     )
+{
+	Word32 num = (Word32)L;
+	do{
+		*x++ = 0;
+	}while(--num !=0);
+}
+
+
+/*********************************************************************
+* Function: Copy()                                                   *
+*                                                                    *
+* Description: Copy vector x[] to y[]                                *
+*********************************************************************/
+
+void Copy(
+		Word16 x[],                           /* (i)   : input vector   */
+		Word16 y[],                           /* (o)   : output vector  */
+		Word16 L                              /* (i)   : vector length  */
+	 )
+{
+	Word32	temp1,temp2,num;
+	if(L&1)
+	{
+		temp1 = *x++;
+		*y++ = temp1;
+	}
+	num = (Word32)(L>>1);
+	temp1 = *x++;
+	temp2 = *x++;
+	do{
+		*y++ = temp1;
+		*y++ = temp2;
+		temp1 = *x++;
+		temp2 = *x++;
+	}while(--num!=0);
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c b/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c
index d0d99a7..bac00dd 100644
--- a/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c
+++ b/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c
@@ -1,1941 +1,1941 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*      File: voAMRWBEnc.c                                              *

-*                                                                      *

-*      Description: Performs the main encoder routine                  *

-*                   Fixed-point C simulation of AMR WB ACELP coding    *

-*		    algorithm with 20 msspeech frames for              *

-*		    wideband speech signals.                           *

-*                                                                      *

-************************************************************************/

-

-#include <stdio.h>

-#include <stdlib.h>

-#include "typedef.h"

-#include "basic_op.h"

-#include "oper_32b.h"

-#include "math_op.h"

-#include "cnst.h"

-#include "acelp.h"

-#include "cod_main.h"

-#include "bits.h"

-#include "main.h"

-#include "voAMRWB.h"

-#include "mem_align.h"

-#include "cmnMemory.h"

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-/* LPC interpolation coef {0.45, 0.8, 0.96, 1.0}; in Q15 */

-static Word16 interpol_frac[NB_SUBFR] = {14746, 26214, 31457, 32767};

-

-/* isp tables for initialization */

-static Word16 isp_init[M] =

-{

-	32138, 30274, 27246, 23170, 18205, 12540, 6393, 0,

-	-6393, -12540, -18205, -23170, -27246, -30274, -32138, 1475

-};

-

-static Word16 isf_init[M] =

-{

-	1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192,

-	9216, 10240, 11264, 12288, 13312, 14336, 15360, 3840

-};

-

-/* High Band encoding */

-static const Word16 HP_gain[16] =

-{

-	3624, 4673, 5597, 6479, 7425, 8378, 9324, 10264,

-	11210, 12206, 13391, 14844, 16770, 19655, 24289, 32728

-};

-

-/* Private function declaration */

-static Word16 synthesis(

-			Word16 Aq[],                          /* A(z)  : quantized Az               */

-			Word16 exc[],                         /* (i)   : excitation at 12kHz        */

-			Word16 Q_new,                         /* (i)   : scaling performed on exc   */

-			Word16 synth16k[],                    /* (o)   : 16kHz synthesis signal     */

-			Coder_State * st                      /* (i/o) : State structure            */

-			);

-

-/* Codec some parameters initialization */

-void Reset_encoder(void *st, Word16 reset_all)

-{

-	Word16 i;

-	Coder_State *cod_state;

-	cod_state = (Coder_State *) st;

-	Set_zero(cod_state->old_exc, PIT_MAX + L_INTERPOL);

-	Set_zero(cod_state->mem_syn, M);

-	Set_zero(cod_state->past_isfq, M);

-	cod_state->mem_w0 = 0;                 

-	cod_state->tilt_code = 0;              

-	cod_state->first_frame = 1;            

-	Init_gp_clip(cod_state->gp_clip);

-	cod_state->L_gc_thres = 0;             

-	if (reset_all != 0)

-	{

-		/* Static vectors to zero */

-		Set_zero(cod_state->old_speech, L_TOTAL - L_FRAME);

-		Set_zero(cod_state->old_wsp, (PIT_MAX / OPL_DECIM));

-		Set_zero(cod_state->mem_decim2, 3);

-		/* routines initialization */

-		Init_Decim_12k8(cod_state->mem_decim);

-		Init_HP50_12k8(cod_state->mem_sig_in);

-		Init_Levinson(cod_state->mem_levinson);

-		Init_Q_gain2(cod_state->qua_gain);

-		Init_Hp_wsp(cod_state->hp_wsp_mem);

-		/* isp initialization */

-		Copy(isp_init, cod_state->ispold, M);

-		Copy(isp_init, cod_state->ispold_q, M);

-		/* variable initialization */

-		cod_state->mem_preemph = 0;        

-		cod_state->mem_wsp = 0;            

-		cod_state->Q_old = 15;             

-		cod_state->Q_max[0] = 15;          

-		cod_state->Q_max[1] = 15;          

-		cod_state->old_wsp_max = 0;        

-		cod_state->old_wsp_shift = 0;      

-		/* pitch ol initialization */

-		cod_state->old_T0_med = 40;        

-		cod_state->ol_gain = 0;            

-		cod_state->ada_w = 0;              

-		cod_state->ol_wght_flg = 0;        

-		for (i = 0; i < 5; i++)

-		{

-			cod_state->old_ol_lag[i] = 40; 

-		}

-		Set_zero(cod_state->old_hp_wsp, (L_FRAME / 2) / OPL_DECIM + (PIT_MAX / OPL_DECIM));

-		Set_zero(cod_state->mem_syn_hf, M);

-		Set_zero(cod_state->mem_syn_hi, M);

-		Set_zero(cod_state->mem_syn_lo, M);

-		Init_HP50_12k8(cod_state->mem_sig_out);

-		Init_Filt_6k_7k(cod_state->mem_hf);

-		Init_HP400_12k8(cod_state->mem_hp400);

-		Copy(isf_init, cod_state->isfold, M);

-		cod_state->mem_deemph = 0;         

-		cod_state->seed2 = 21845;          

-		Init_Filt_6k_7k(cod_state->mem_hf2);

-		cod_state->gain_alpha = 32767;     

-		cod_state->vad_hist = 0;

-		wb_vad_reset(cod_state->vadSt);

-		dtx_enc_reset(cod_state->dtx_encSt, isf_init);

-	}

-	return;

-}

-

-/*-----------------------------------------------------------------*

-*   Funtion  coder                                                *

-*            ~~~~~                                                *

-*   ->Main coder routine.                                         *

-*                                                                 *

-*-----------------------------------------------------------------*/

-void coder(

-		Word16 * mode,                        /* input :  used mode                             */

-		Word16 speech16k[],                   /* input :  320 new speech samples (at 16 kHz)    */

-		Word16 prms[],                        /* output:  output parameters                     */

-		Word16 * ser_size,                    /* output:  bit rate of the used mode             */

-		void *spe_state,                      /* i/o   :  State structure                       */

-		Word16 allow_dtx                      /* input :  DTX ON/OFF                            */

-	  )

-{

-	/* Coder states */

-	Coder_State *st;

-	/* Speech vector */

-	Word16 old_speech[L_TOTAL];

-	Word16 *new_speech, *speech, *p_window;

-

-	/* Weighted speech vector */

-	Word16 old_wsp[L_FRAME + (PIT_MAX / OPL_DECIM)];

-	Word16 *wsp;

-

-	/* Excitation vector */

-	Word16 old_exc[(L_FRAME + 1) + PIT_MAX + L_INTERPOL];

-	Word16 *exc;

-

-	/* LPC coefficients */

-	Word16 r_h[M + 1], r_l[M + 1];         /* Autocorrelations of windowed speech  */

-	Word16 rc[M];                          /* Reflection coefficients.             */

-	Word16 Ap[M + 1];                      /* A(z) with spectral expansion         */

-	Word16 ispnew[M];                      /* immittance spectral pairs at 4nd sfr */

-	Word16 ispnew_q[M];                    /* quantized ISPs at 4nd subframe       */

-	Word16 isf[M];                         /* ISF (frequency domain) at 4nd sfr    */

-	Word16 *p_A, *p_Aq;                    /* ptr to A(z) for the 4 subframes      */

-	Word16 A[NB_SUBFR * (M + 1)];          /* A(z) unquantized for the 4 subframes */

-	Word16 Aq[NB_SUBFR * (M + 1)];         /* A(z)   quantized for the 4 subframes */

-

-	/* Other vectors */

-	Word16 xn[L_SUBFR];                    /* Target vector for pitch search     */

-	Word16 xn2[L_SUBFR];                   /* Target vector for codebook search  */

-	Word16 dn[L_SUBFR];                    /* Correlation between xn2 and h1     */

-	Word16 cn[L_SUBFR];                    /* Target vector in residual domain   */

-	Word16 h1[L_SUBFR];                    /* Impulse response vector            */

-	Word16 h2[L_SUBFR];                    /* Impulse response vector            */

-	Word16 code[L_SUBFR];                  /* Fixed codebook excitation          */

-	Word16 y1[L_SUBFR];                    /* Filtered adaptive excitation       */

-	Word16 y2[L_SUBFR];                    /* Filtered adaptive excitation       */

-	Word16 error[M + L_SUBFR];             /* error of quantization              */

-	Word16 synth[L_SUBFR];                 /* 12.8kHz synthesis vector           */

-	Word16 exc2[L_FRAME];                  /* excitation vector                  */

-	Word16 buf[L_FRAME];                   /* VAD buffer                         */

-

-	/* Scalars */

-	Word32 i, j, i_subfr, select, pit_flag, clip_gain, vad_flag;

-	Word16 codec_mode;

-	Word16 T_op, T_op2, T0, T0_min, T0_max, T0_frac, index;

-	Word16 gain_pit, gain_code, g_coeff[4], g_coeff2[4];

-	Word16 tmp, gain1, gain2, exp, Q_new, mu, shift, max;

-	Word16 voice_fac;

-	Word16 indice[8];

-	Word32 L_tmp, L_gain_code, L_max, L_tmp1;

-	Word16 code2[L_SUBFR];                         /* Fixed codebook excitation  */

-	Word16 stab_fac, fac, gain_code_lo;

-

-	Word16 corr_gain;

-	Word16 *vo_p0, *vo_p1, *vo_p2, *vo_p3;

-

-	st = (Coder_State *) spe_state;

-

-	*ser_size = nb_of_bits[*mode];         

-	codec_mode = *mode;                    

-

-	/*--------------------------------------------------------------------------*

-	 *          Initialize pointers to speech vector.                           *

-	 *                                                                          *

-	 *                                                                          *

-	 *                    |-------|-------|-------|-------|-------|-------|     *

-	 *                     past sp   sf1     sf2     sf3     sf4    L_NEXT      *

-	 *                    <-------  Total speech buffer (L_TOTAL)   ------>     *

-	 *              old_speech                                                  *

-	 *                    <-------  LPC analysis window (L_WINDOW)  ------>     *

-	 *                    |       <-- present frame (L_FRAME) ---->             *

-	 *                   p_window |       <----- new speech (L_FRAME) ---->     *

-	 *                            |       |                                     *

-	 *                          speech    |                                     *

-	 *                                 new_speech                               *

-	 *--------------------------------------------------------------------------*/

-

-	new_speech = old_speech + L_TOTAL - L_FRAME - L_FILT;         /* New speech     */

-	speech = old_speech + L_TOTAL - L_FRAME - L_NEXT;             /* Present frame  */

-	p_window = old_speech + L_TOTAL - L_WINDOW; 

-

-	exc = old_exc + PIT_MAX + L_INTERPOL;  

-	wsp = old_wsp + (PIT_MAX / OPL_DECIM); 

-

-	/* copy coder memory state into working space */

-	Copy(st->old_speech, old_speech, L_TOTAL - L_FRAME);

-	Copy(st->old_wsp, old_wsp, PIT_MAX / OPL_DECIM);

-	Copy(st->old_exc, old_exc, PIT_MAX + L_INTERPOL);

-

-	/*---------------------------------------------------------------*

-	 * Down sampling signal from 16kHz to 12.8kHz                    *

-	 * -> The signal is extended by L_FILT samples (padded to zero)  *

-	 * to avoid additional delay (L_FILT samples) in the coder.      *

-	 * The last L_FILT samples are approximated after decimation and *

-	 * are used (and windowed) only in autocorrelations.             *

-	 *---------------------------------------------------------------*/

-

-	Decim_12k8(speech16k, L_FRAME16k, new_speech, st->mem_decim);

-

-	/* last L_FILT samples for autocorrelation window */

-	Copy(st->mem_decim, code, 2 * L_FILT16k);

-	Set_zero(error, L_FILT16k);            /* set next sample to zero */

-	Decim_12k8(error, L_FILT16k, new_speech + L_FRAME, code);

-

-	/*---------------------------------------------------------------*

-	 * Perform 50Hz HP filtering of input signal.                    *

-	 *---------------------------------------------------------------*/

-

-	HP50_12k8(new_speech, L_FRAME, st->mem_sig_in);

-

-	/* last L_FILT samples for autocorrelation window */

-	Copy(st->mem_sig_in, code, 6);

-	HP50_12k8(new_speech + L_FRAME, L_FILT, code);

-

-	/*---------------------------------------------------------------*

-	 * Perform fixed preemphasis through 1 - g z^-1                  *

-	 * Scale signal to get maximum of precision in filtering         *

-	 *---------------------------------------------------------------*/

-

-	mu = PREEMPH_FAC >> 1;              /* Q15 --> Q14 */

-

-	/* get max of new preemphased samples (L_FRAME+L_FILT) */

-	L_tmp = new_speech[0] << 15;

-	L_tmp -= (st->mem_preemph * mu)<<1;

-	L_max = L_abs(L_tmp);

-

-	for (i = 1; i < L_FRAME + L_FILT; i++)

-	{

-		L_tmp = new_speech[i] << 15;

-		L_tmp -= (new_speech[i - 1] * mu)<<1;

-		L_tmp = L_abs(L_tmp);

-		if(L_tmp > L_max)

-		{

-			L_max = L_tmp;                 

-		}

-	}

-

-	/* get scaling factor for new and previous samples */

-	/* limit scaling to Q_MAX to keep dynamic for ringing in low signal */

-	/* limit scaling to Q_MAX also to avoid a[0]<1 in syn_filt_32 */

-	tmp = extract_h(L_max);

-	if (tmp == 0)

-	{

-		shift = Q_MAX;                     

-	} else

-	{

-		shift = norm_s(tmp) - 1;

-		if (shift < 0)

-		{

-			shift = 0;                     

-		}

-		if (shift > Q_MAX)

-		{

-			shift = Q_MAX;                 

-		}

-	}

-	Q_new = shift;                         

-	if (Q_new > st->Q_max[0])

-	{

-		Q_new = st->Q_max[0];              

-	}

-	if (Q_new > st->Q_max[1])

-	{

-		Q_new = st->Q_max[1];              

-	}

-	exp = (Q_new - st->Q_old);

-	st->Q_old = Q_new;                     

-	st->Q_max[1] = st->Q_max[0];           

-	st->Q_max[0] = shift;                  

-

-	/* preemphasis with scaling (L_FRAME+L_FILT) */

-	tmp = new_speech[L_FRAME - 1];         

-

-	for (i = L_FRAME + L_FILT - 1; i > 0; i--)

-	{

-		L_tmp = new_speech[i] << 15;

-		L_tmp -= (new_speech[i - 1] * mu)<<1;

-		L_tmp = (L_tmp << Q_new);

-		new_speech[i] = vo_round(L_tmp);      

-	}

-

-	L_tmp = new_speech[0] << 15;

-	L_tmp -= (st->mem_preemph * mu)<<1;

-	L_tmp = (L_tmp << Q_new);

-	new_speech[0] = vo_round(L_tmp);          

-

-	st->mem_preemph = tmp;                 

-

-	/* scale previous samples and memory */

-

-	Scale_sig(old_speech, L_TOTAL - L_FRAME - L_FILT, exp);

-	Scale_sig(old_exc, PIT_MAX + L_INTERPOL, exp);

-	Scale_sig(st->mem_syn, M, exp);

-	Scale_sig(st->mem_decim2, 3, exp);

-	Scale_sig(&(st->mem_wsp), 1, exp);

-	Scale_sig(&(st->mem_w0), 1, exp);

-

-	/*------------------------------------------------------------------------*

-	 *  Call VAD                                                              *

-	 *  Preemphesis scale down signal in low frequency and keep dynamic in HF.*

-	 *  Vad work slightly in futur (new_speech = speech + L_NEXT - L_FILT).   *

-	 *------------------------------------------------------------------------*/

-	Copy(new_speech, buf, L_FRAME);

-

-#ifdef ASM_OPT        /* asm optimization branch */

-	Scale_sig_opt(buf, L_FRAME, 1 - Q_new);

-#else

-	Scale_sig(buf, L_FRAME, 1 - Q_new);

-#endif

-

-	vad_flag = wb_vad(st->vadSt, buf);          /* Voice Activity Detection */ 

-	if (vad_flag == 0)

-	{

-		st->vad_hist = (st->vad_hist + 1);        

-	} else

-	{

-		st->vad_hist = 0;             

-	}

-

-	/* DTX processing */

-	if (allow_dtx != 0)

-	{

-		/* Note that mode may change here */

-		tx_dtx_handler(st->dtx_encSt, vad_flag, mode);

-		*ser_size = nb_of_bits[*mode]; 

-	}

-

-	if(*mode != MRDTX)

-	{

-		Parm_serial(vad_flag, 1, &prms);

-	}

-	/*------------------------------------------------------------------------*

-	 *  Perform LPC analysis                                                  *

-	 *  ~~~~~~~~~~~~~~~~~~~~                                                  *

-	 *   - autocorrelation + lag windowing                                    *

-	 *   - Levinson-durbin algorithm to find a[]                              *

-	 *   - convert a[] to isp[]                                               *

-	 *   - convert isp[] to isf[] for quantization                            *

-	 *   - quantize and code the isf[]                                        *

-	 *   - convert isf[] to isp[] for interpolation                           *

-	 *   - find the interpolated ISPs and convert to a[] for the 4 subframes  *

-	 *------------------------------------------------------------------------*/

-

-	/* LP analysis centered at 4nd subframe */

-	Autocorr(p_window, M, r_h, r_l);                        /* Autocorrelations */

-	Lag_window(r_h, r_l);                                   /* Lag windowing    */

-	Levinson(r_h, r_l, A, rc, st->mem_levinson);            /* Levinson Durbin  */

-	Az_isp(A, ispnew, st->ispold);                          /* From A(z) to ISP */

-

-	/* Find the interpolated ISPs and convert to a[] for all subframes */

-	Int_isp(st->ispold, ispnew, interpol_frac, A);

-

-	/* update ispold[] for the next frame */

-	Copy(ispnew, st->ispold, M);

-

-	/* Convert ISPs to frequency domain 0..6400 */

-	Isp_isf(ispnew, isf, M);

-

-	/* check resonance for pitch clipping algorithm */

-	Gp_clip_test_isf(isf, st->gp_clip);

-

-	/*----------------------------------------------------------------------*

-	 *  Perform PITCH_OL analysis                                           *

-	 *  ~~~~~~~~~~~~~~~~~~~~~~~~~                                           *

-	 * - Find the residual res[] for the whole speech frame                 *

-	 * - Find the weighted input speech wsp[] for the whole speech frame    *

-	 * - scale wsp[] to avoid overflow in pitch estimation                  *

-	 * - Find open loop pitch lag for whole speech frame                    *

-	 *----------------------------------------------------------------------*/

-	p_A = A;                             

-	for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)

-	{

-		/* Weighting of LPC coefficients */

-		Weight_a(p_A, Ap, GAMMA1, M);

-

-#ifdef ASM_OPT                    /* asm optimization branch */

-		Residu_opt(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR);

-#else

-		Residu(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR);

-#endif

-

-		p_A += (M + 1);                    

-	}

-

-	Deemph2(wsp, TILT_FAC, L_FRAME, &(st->mem_wsp));

-

-	/* find maximum value on wsp[] for 12 bits scaling */

-	max = 0;                              

-	for (i = 0; i < L_FRAME; i++)

-	{

-		tmp = abs_s(wsp[i]);

-		if(tmp > max)

-		{

-			max = tmp;                     

-		}

-	}

-	tmp = st->old_wsp_max;                 

-	if(max > tmp)

-	{

-		tmp = max;                         /* tmp = max(wsp_max, old_wsp_max) */

-	}

-	st->old_wsp_max = max;                

-

-	shift = norm_s(tmp) - 3;

-	if (shift > 0)

-	{

-		shift = 0;                         /* shift = 0..-3 */

-	}

-	/* decimation of wsp[] to search pitch in LF and to reduce complexity */

-	LP_Decim2(wsp, L_FRAME, st->mem_decim2);

-

-	/* scale wsp[] in 12 bits to avoid overflow */

-#ifdef  ASM_OPT                  /* asm optimization branch */

-	Scale_sig_opt(wsp, L_FRAME / OPL_DECIM, shift);

-#else

-	Scale_sig(wsp, L_FRAME / OPL_DECIM, shift);

-#endif

-	/* scale old_wsp (warning: exp must be Q_new-Q_old) */

-	exp = exp + (shift - st->old_wsp_shift);

-	st->old_wsp_shift = shift;

-

-	Scale_sig(old_wsp, PIT_MAX / OPL_DECIM, exp);

-	Scale_sig(st->old_hp_wsp, PIT_MAX / OPL_DECIM, exp);

-

-	scale_mem_Hp_wsp(st->hp_wsp_mem, exp);

-

-	/* Find open loop pitch lag for whole speech frame */

-

-	if(*ser_size == NBBITS_7k)

-	{

-		/* Find open loop pitch lag for whole speech frame */

-		T_op = Pitch_med_ol(wsp, st, L_FRAME / OPL_DECIM);

-	} else

-	{

-		/* Find open loop pitch lag for first 1/2 frame */

-		T_op = Pitch_med_ol(wsp, st, (L_FRAME/2) / OPL_DECIM);

-	}

-

-	if(st->ol_gain > 19661)       /* 0.6 in Q15 */

-	{

-		st->old_T0_med = Med_olag(T_op, st->old_ol_lag);       

-		st->ada_w = 32767;                 

-	} else

-	{

-		st->ada_w = vo_mult(st->ada_w, 29491);

-	}

-

-	if(st->ada_w < 26214)

-		st->ol_wght_flg = 0;

-	else

-		st->ol_wght_flg = 1;

-

-	wb_vad_tone_detection(st->vadSt, st->ol_gain);

-	T_op *= OPL_DECIM;                     

-

-	if(*ser_size != NBBITS_7k)

-	{

-		/* Find open loop pitch lag for second 1/2 frame */

-		T_op2 = Pitch_med_ol(wsp + ((L_FRAME / 2) / OPL_DECIM), st, (L_FRAME/2) / OPL_DECIM);

-

-		if(st->ol_gain > 19661)   /* 0.6 in Q15 */

-		{

-			st->old_T0_med = Med_olag(T_op2, st->old_ol_lag);  

-			st->ada_w = 32767;             

-		} else

-		{

-			st->ada_w = mult(st->ada_w, 29491); 

-		}

-

-		if(st->ada_w < 26214)

-			st->ol_wght_flg = 0;

-		else

-			st->ol_wght_flg = 1;

-

-		wb_vad_tone_detection(st->vadSt, st->ol_gain);

-

-		T_op2 *= OPL_DECIM;                

-

-	} else

-	{

-		T_op2 = T_op;                      

-	}

-	/*----------------------------------------------------------------------*

-	 *                              DTX-CNG                                 *

-	 *----------------------------------------------------------------------*/

-	if(*mode == MRDTX)            /* CNG mode */

-	{

-		/* Buffer isf's and energy */

-#ifdef ASM_OPT                   /* asm optimization branch */

-		Residu_opt(&A[3 * (M + 1)], speech, exc, L_FRAME);

-#else

-		Residu(&A[3 * (M + 1)], speech, exc, L_FRAME);

-#endif

-

-		for (i = 0; i < L_FRAME; i++)

-		{

-			exc2[i] = shr(exc[i], Q_new);  

-		}

-

-		L_tmp = 0;                         

-		for (i = 0; i < L_FRAME; i++)

-			L_tmp += (exc2[i] * exc2[i])<<1;

-

-		L_tmp >>= 1;

-

-		dtx_buffer(st->dtx_encSt, isf, L_tmp, codec_mode);

-

-		/* Quantize and code the ISFs */

-		dtx_enc(st->dtx_encSt, isf, exc2, &prms);

-

-		/* Convert ISFs to the cosine domain */

-		Isf_isp(isf, ispnew_q, M);

-		Isp_Az(ispnew_q, Aq, M, 0);

-

-		for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)

-		{

-			corr_gain = synthesis(Aq, &exc2[i_subfr], 0, &speech16k[i_subfr * 5 / 4], st);

-		}

-		Copy(isf, st->isfold, M);

-

-		/* reset speech coder memories */

-		Reset_encoder(st, 0);

-

-		/*--------------------------------------------------*

-		 * Update signal for next frame.                    *

-		 * -> save past of speech[] and wsp[].              *

-		 *--------------------------------------------------*/

-

-		Copy(&old_speech[L_FRAME], st->old_speech, L_TOTAL - L_FRAME);

-		Copy(&old_wsp[L_FRAME / OPL_DECIM], st->old_wsp, PIT_MAX / OPL_DECIM);

-

-		return;

-	}

-	/*----------------------------------------------------------------------*

-	 *                               ACELP                                  *

-	 *----------------------------------------------------------------------*/

-

-	/* Quantize and code the ISFs */

-

-	if (*ser_size <= NBBITS_7k)

-	{

-		Qpisf_2s_36b(isf, isf, st->past_isfq, indice, 4);

-

-		Parm_serial(indice[0], 8, &prms);

-		Parm_serial(indice[1], 8, &prms);

-		Parm_serial(indice[2], 7, &prms);

-		Parm_serial(indice[3], 7, &prms);

-		Parm_serial(indice[4], 6, &prms);

-	} else

-	{

-		Qpisf_2s_46b(isf, isf, st->past_isfq, indice, 4);

-

-		Parm_serial(indice[0], 8, &prms);

-		Parm_serial(indice[1], 8, &prms);

-		Parm_serial(indice[2], 6, &prms);

-		Parm_serial(indice[3], 7, &prms);

-		Parm_serial(indice[4], 7, &prms);

-		Parm_serial(indice[5], 5, &prms);

-		Parm_serial(indice[6], 5, &prms);

-	}

-

-	/* Check stability on isf : distance between old isf and current isf */

-

-	L_tmp = 0;                           

-	for (i = 0; i < M - 1; i++)

-	{

-		tmp = vo_sub(isf[i], st->isfold[i]);

-		L_tmp += (tmp * tmp)<<1;

-	}

-

-	tmp = extract_h(L_shl2(L_tmp, 8)); 

-

-	tmp = vo_mult(tmp, 26214);                /* tmp = L_tmp*0.8/256 */

-	tmp = vo_sub(20480, tmp);                 /* 1.25 - tmp (in Q14) */

-

-	stab_fac = shl(tmp, 1); 

-

-	if (stab_fac < 0)

-	{

-		stab_fac = 0;                      

-	}

-	Copy(isf, st->isfold, M);

-

-	/* Convert ISFs to the cosine domain */

-	Isf_isp(isf, ispnew_q, M);

-

-	if (st->first_frame != 0)

-	{

-		st->first_frame = 0;              

-		Copy(ispnew_q, st->ispold_q, M);

-	}

-	/* Find the interpolated ISPs and convert to a[] for all subframes */

-

-	Int_isp(st->ispold_q, ispnew_q, interpol_frac, Aq);

-

-	/* update ispold[] for the next frame */

-	Copy(ispnew_q, st->ispold_q, M);

-

-	p_Aq = Aq;

-	for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)

-	{

-#ifdef ASM_OPT               /* asm optimization branch */

-		Residu_opt(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);

-#else

-		Residu(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);

-#endif

-		p_Aq += (M + 1);                   

-	}

-

-	/* Buffer isf's and energy for dtx on non-speech frame */

-	if (vad_flag == 0)

-	{

-		for (i = 0; i < L_FRAME; i++)

-		{

-			exc2[i] = exc[i] >> Q_new;

-		}

-		L_tmp = 0;                         

-		for (i = 0; i < L_FRAME; i++)

-			L_tmp += (exc2[i] * exc2[i])<<1;

-		L_tmp >>= 1;

-

-		dtx_buffer(st->dtx_encSt, isf, L_tmp, codec_mode);

-	}

-	/* range for closed loop pitch search in 1st subframe */

-

-	T0_min = T_op - 8;

-	if (T0_min < PIT_MIN)

-	{

-		T0_min = PIT_MIN;                  

-	}

-	T0_max = (T0_min + 15);

-

-	if(T0_max > PIT_MAX)

-	{

-		T0_max = PIT_MAX;                  

-		T0_min = T0_max - 15;          

-	}

-	/*------------------------------------------------------------------------*

-	 *          Loop for every subframe in the analysis frame                 *

-	 *------------------------------------------------------------------------*

-	 *  To find the pitch and innovation parameters. The subframe size is     *

-	 *  L_SUBFR and the loop is repeated L_FRAME/L_SUBFR times.               *

-	 *     - compute the target signal for pitch search                       *

-	 *     - compute impulse response of weighted synthesis filter (h1[])     *

-	 *     - find the closed-loop pitch parameters                            *

-	 *     - encode the pitch dealy                                           *

-	 *     - find 2 lt prediction (with / without LP filter for lt pred)      *

-	 *     - find 2 pitch gains and choose the best lt prediction.            *

-	 *     - find target vector for codebook search                           *

-	 *     - update the impulse response h1[] for codebook search             *

-	 *     - correlation between target vector and impulse response           *

-	 *     - codebook search and encoding                                     *

-	 *     - VQ of pitch and codebook gains                                   *

-	 *     - find voicing factor and tilt of code for next subframe.          *

-	 *     - update states of weighting filter                                *

-	 *     - find excitation and synthesis speech                             *

-	 *------------------------------------------------------------------------*/

-	p_A = A;                               

-	p_Aq = Aq;                             

-	for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)

-	{

-		pit_flag = i_subfr;                

-		if ((i_subfr == 2 * L_SUBFR) && (*ser_size > NBBITS_7k))

-		{

-			pit_flag = 0;                 

-			/* range for closed loop pitch search in 3rd subframe */

-			T0_min = (T_op2 - 8);

-

-			if (T0_min < PIT_MIN)

-			{

-				T0_min = PIT_MIN;          

-			}

-			T0_max = (T0_min + 15);

-			if (T0_max > PIT_MAX)

-			{

-				T0_max = PIT_MAX;         

-				T0_min = (T0_max - 15);

-			}

-		}

-		/*-----------------------------------------------------------------------*

-		 *                                                                       *

-		 *        Find the target vector for pitch search:                       *

-		 *        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                        *

-		 *                                                                       *

-		 *             |------|  res[n]                                          *

-		 * speech[n]---| A(z) |--------                                          *

-		 *             |------|       |   |--------| error[n]  |------|          *

-		 *                   zero -- (-)--| 1/A(z) |-----------| W(z) |-- target *

-		 *                   exc          |--------|           |------|          *

-		 *                                                                       *

-		 * Instead of subtracting the zero-input response of filters from        *

-		 * the weighted input speech, the above configuration is used to         *

-		 * compute the target vector.                                            *

-		 *                                                                       *

-		 *-----------------------------------------------------------------------*/

-

-		for (i = 0; i < M; i++)

-		{

-			error[i] = vo_sub(speech[i + i_subfr - M], st->mem_syn[i]);

-		}

-

-#ifdef ASM_OPT              /* asm optimization branch */

-		Residu_opt(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);

-#else

-		Residu(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);

-#endif

-		Syn_filt(p_Aq, &exc[i_subfr], error + M, L_SUBFR, error, 0);

-		Weight_a(p_A, Ap, GAMMA1, M);

-

-#ifdef ASM_OPT             /* asm optimization branch */

-		Residu_opt(Ap, error + M, xn, L_SUBFR);

-#else

-		Residu(Ap, error + M, xn, L_SUBFR);

-#endif

-		Deemph2(xn, TILT_FAC, L_SUBFR, &(st->mem_w0));

-

-		/*----------------------------------------------------------------------*

-		 * Find approx. target in residual domain "cn[]" for inovation search.  *

-		 *----------------------------------------------------------------------*/

-		/* first half: xn[] --> cn[] */

-		Set_zero(code, M);

-		Copy(xn, code + M, L_SUBFR / 2);

-		tmp = 0;                          

-		Preemph2(code + M, TILT_FAC, L_SUBFR / 2, &tmp);

-		Weight_a(p_A, Ap, GAMMA1, M);

-		Syn_filt(Ap,code + M, code + M, L_SUBFR / 2, code, 0);

-

-#ifdef ASM_OPT                /* asm optimization branch */

-		Residu_opt(p_Aq,code + M, cn, L_SUBFR / 2);

-#else

-		Residu(p_Aq,code + M, cn, L_SUBFR / 2);

-#endif

-

-		/* second half: res[] --> cn[] (approximated and faster) */

-		Copy(&exc[i_subfr + (L_SUBFR / 2)], cn + (L_SUBFR / 2), L_SUBFR / 2);

-

-		/*---------------------------------------------------------------*

-		 * Compute impulse response, h1[], of weighted synthesis filter  * 

-		 *---------------------------------------------------------------*/

-

-		Set_zero(error, M + L_SUBFR);

-		Weight_a(p_A, error + M, GAMMA1, M);

-

-		vo_p0 = error+M;

-		vo_p3 = h1;

-		for (i = 0; i < L_SUBFR; i++)

-		{

-			L_tmp = *vo_p0 << 14;        /* x4 (Q12 to Q14) */

-			vo_p1 = p_Aq + 1;

-			vo_p2 = vo_p0-1;

-			for (j = 1; j <= M/4; j++)

-			{

-				L_tmp -= *vo_p1++ * *vo_p2--;

-				L_tmp -= *vo_p1++ * *vo_p2--;

-				L_tmp -= *vo_p1++ * *vo_p2--;

-				L_tmp -= *vo_p1++ * *vo_p2--;

-			}

-			*vo_p3++ = *vo_p0++ = vo_round((L_tmp <<4));

-		}

-		/* deemph without division by 2 -> Q14 to Q15 */

-		tmp = 0; 

-		Deemph2(h1, TILT_FAC, L_SUBFR, &tmp);   /* h1 in Q14 */

-

-		/* h2 in Q12 for codebook search */

-		Copy(h1, h2, L_SUBFR);

-

-		/*---------------------------------------------------------------*

-		 * scale xn[] and h1[] to avoid overflow in dot_product12()      *

-		 *---------------------------------------------------------------*/

-#ifdef  ASM_OPT                  /* asm optimization branch */

-		Scale_sig_opt(h2, L_SUBFR, -2);

-		Scale_sig_opt(xn, L_SUBFR, shift);     /* scaling of xn[] to limit dynamic at 12 bits */

-		Scale_sig_opt(h1, L_SUBFR, 1 + shift);  /* set h1[] in Q15 with scaling for convolution */

-#else

-		Scale_sig(h2, L_SUBFR, -2);

-		Scale_sig(xn, L_SUBFR, shift);     /* scaling of xn[] to limit dynamic at 12 bits */

-		Scale_sig(h1, L_SUBFR, 1 + shift);  /* set h1[] in Q15 with scaling for convolution */

-#endif

-		/*----------------------------------------------------------------------*

-		 *                 Closed-loop fractional pitch search                  *

-		 *----------------------------------------------------------------------*/

-		/* find closed loop fractional pitch  lag */

-		if(*ser_size <= NBBITS_9k)

-		{

-			T0 = Pitch_fr4(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac,

-					pit_flag, PIT_MIN, PIT_FR1_8b, L_SUBFR);

-

-			/* encode pitch lag */

-			if (pit_flag == 0)             /* if 1st/3rd subframe */

-			{

-				/*--------------------------------------------------------------*

-				 * The pitch range for the 1st/3rd subframe is encoded with     *

-				 * 8 bits and is divided as follows:                            *

-				 *   PIT_MIN to PIT_FR1-1  resolution 1/2 (frac = 0 or 2)       *

-				 *   PIT_FR1 to PIT_MAX    resolution 1   (frac = 0)            *

-				 *--------------------------------------------------------------*/

-				if (T0 < PIT_FR1_8b)

-				{

-					index = ((T0 << 1) + (T0_frac >> 1) - (PIT_MIN<<1));

-				} else

-				{

-					index = ((T0 - PIT_FR1_8b) + ((PIT_FR1_8b - PIT_MIN)*2));

-				}

-

-				Parm_serial(index, 8, &prms);

-

-				/* find T0_min and T0_max for subframe 2 and 4 */

-				T0_min = (T0 - 8);

-				if (T0_min < PIT_MIN)

-				{

-					T0_min = PIT_MIN;

-				}

-				T0_max = T0_min + 15;

-				if (T0_max > PIT_MAX)

-				{

-					T0_max = PIT_MAX;

-					T0_min = (T0_max - 15);

-				}

-			} else

-			{                              /* if subframe 2 or 4 */

-				/*--------------------------------------------------------------*

-				 * The pitch range for subframe 2 or 4 is encoded with 5 bits:  *

-				 *   T0_min  to T0_max     resolution 1/2 (frac = 0 or 2)       *

-				 *--------------------------------------------------------------*/

-				i = (T0 - T0_min);

-				index = (i << 1) + (T0_frac >> 1);

-

-				Parm_serial(index, 5, &prms);

-			}

-		} else

-		{

-			T0 = Pitch_fr4(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac,

-					pit_flag, PIT_FR2, PIT_FR1_9b, L_SUBFR);

-

-			/* encode pitch lag */

-			if (pit_flag == 0)             /* if 1st/3rd subframe */

-			{

-				/*--------------------------------------------------------------*

-				 * The pitch range for the 1st/3rd subframe is encoded with     *

-				 * 9 bits and is divided as follows:                            *

-				 *   PIT_MIN to PIT_FR2-1  resolution 1/4 (frac = 0,1,2 or 3)   *

-				 *   PIT_FR2 to PIT_FR1-1  resolution 1/2 (frac = 0 or 1)       *

-				 *   PIT_FR1 to PIT_MAX    resolution 1   (frac = 0)            *

-				 *--------------------------------------------------------------*/

-

-				if (T0 < PIT_FR2)

-				{

-					index = ((T0 << 2) + T0_frac) - (PIT_MIN << 2);

-				} else if(T0 < PIT_FR1_9b)

-				{

-					index = ((((T0 << 1) + (T0_frac >> 1)) - (PIT_FR2<<1)) + ((PIT_FR2 - PIT_MIN)<<2));

-				} else

-				{

-					index = (((T0 - PIT_FR1_9b) + ((PIT_FR2 - PIT_MIN)<<2)) + ((PIT_FR1_9b - PIT_FR2)<<1));

-				}

-

-				Parm_serial(index, 9, &prms);

-

-				/* find T0_min and T0_max for subframe 2 and 4 */

-

-				T0_min = (T0 - 8);

-				if (T0_min < PIT_MIN)

-				{

-					T0_min = PIT_MIN; 

-				}

-				T0_max = T0_min + 15;

-

-				if (T0_max > PIT_MAX)

-				{

-					T0_max = PIT_MAX;

-					T0_min = (T0_max - 15);

-				}

-			} else

-			{                              /* if subframe 2 or 4 */

-				/*--------------------------------------------------------------*

-				 * The pitch range for subframe 2 or 4 is encoded with 6 bits:  *

-				 *   T0_min  to T0_max     resolution 1/4 (frac = 0,1,2 or 3)   *

-				 *--------------------------------------------------------------*/

-				i = (T0 - T0_min);

-				index = (i << 2) + T0_frac;

-				Parm_serial(index, 6, &prms);

-			}

-		}

-

-		/*-----------------------------------------------------------------*

-		 * Gain clipping test to avoid unstable synthesis on frame erasure *

-		 *-----------------------------------------------------------------*/

-

-		clip_gain = 0;

-		if((st->gp_clip[0] < 154) && (st->gp_clip[1] > 14746))

-			clip_gain = 1;

-

-		/*-----------------------------------------------------------------*

-		 * - find unity gain pitch excitation (adaptive codebook entry)    *

-		 *   with fractional interpolation.                                *

-		 * - find filtered pitch exc. y1[]=exc[] convolved with h1[])      *

-		 * - compute pitch gain1                                           *

-		 *-----------------------------------------------------------------*/

-		/* find pitch exitation */

-#ifdef ASM_OPT                  /* asm optimization branch */

-		pred_lt4_asm(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1);

-#else

-		Pred_lt4(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1);

-#endif

-		if (*ser_size > NBBITS_9k)

-		{

-#ifdef ASM_OPT                   /* asm optimization branch */

-			Convolve_asm(&exc[i_subfr], h1, y1, L_SUBFR);

-#else

-			Convolve(&exc[i_subfr], h1, y1, L_SUBFR);

-#endif 

-			gain1 = G_pitch(xn, y1, g_coeff, L_SUBFR);

-			/* clip gain if necessary to avoid problem at decoder */

-			if ((clip_gain != 0) && (gain1 > GP_CLIP))

-			{

-				gain1 = GP_CLIP; 

-			}

-			/* find energy of new target xn2[] */

-			Updt_tar(xn, dn, y1, gain1, L_SUBFR);       /* dn used temporary */

-		} else

-		{

-			gain1 = 0; 

-		}

-		/*-----------------------------------------------------------------*

-		 * - find pitch excitation filtered by 1st order LP filter.        *

-		 * - find filtered pitch exc. y2[]=exc[] convolved with h1[])      *

-		 * - compute pitch gain2                                           *

-		 *-----------------------------------------------------------------*/

-		/* find pitch excitation with lp filter */

-		vo_p0 = exc + i_subfr-1;

-		vo_p1 = code;

-		/* find pitch excitation with lp filter */

-		for (i = 0; i < L_SUBFR/2; i++)

-		{

-			L_tmp = 5898 * *vo_p0++;

-			L_tmp1 = 5898 * *vo_p0;

-			L_tmp += 20972 * *vo_p0++;

-			L_tmp1 += 20972 * *vo_p0++;

-			L_tmp1 += 5898 * *vo_p0--;

-			L_tmp += 5898 * *vo_p0;

-			*vo_p1++ = (L_tmp + 0x4000)>>15;

-			*vo_p1++ = (L_tmp1 + 0x4000)>>15;

-		}

-

-#ifdef ASM_OPT                 /* asm optimization branch */

-		Convolve_asm(code, h1, y2, L_SUBFR);

-#else

-		Convolve(code, h1, y2, L_SUBFR);

-#endif 

-

-		gain2 = G_pitch(xn, y2, g_coeff2, L_SUBFR);

-

-		/* clip gain if necessary to avoid problem at decoder */

-		if ((clip_gain != 0) && (gain2 > GP_CLIP))

-		{

-			gain2 = GP_CLIP;

-		}

-		/* find energy of new target xn2[] */

-		Updt_tar(xn, xn2, y2, gain2, L_SUBFR);

-		/*-----------------------------------------------------------------*

-		 * use the best prediction (minimise quadratic error).             *

-		 *-----------------------------------------------------------------*/

-		select = 0; 

-		if(*ser_size > NBBITS_9k)

-		{

-			L_tmp = 0L;

-			vo_p0 = dn;

-			vo_p1 = xn2;

-			for (i = 0; i < L_SUBFR/2; i++)

-			{

-				L_tmp += *vo_p0 * *vo_p0;

-				vo_p0++;

-				L_tmp -= *vo_p1 * *vo_p1;

-				vo_p1++;

-				L_tmp += *vo_p0 * *vo_p0;

-				vo_p0++;

-				L_tmp -= *vo_p1 * *vo_p1;

-				vo_p1++;

-			}

-

-			if (L_tmp <= 0)

-			{

-				select = 1; 

-			}

-			Parm_serial(select, 1, &prms);

-		}

-		if (select == 0)

-		{

-			/* use the lp filter for pitch excitation prediction */

-			gain_pit = gain2;

-			Copy(code, &exc[i_subfr], L_SUBFR);

-			Copy(y2, y1, L_SUBFR);

-			Copy(g_coeff2, g_coeff, 4);

-		} else

-		{

-			/* no filter used for pitch excitation prediction */

-			gain_pit = gain1;

-			Copy(dn, xn2, L_SUBFR);        /* target vector for codebook search */

-		}

-		/*-----------------------------------------------------------------*

-		 * - update cn[] for codebook search                               *

-		 *-----------------------------------------------------------------*/

-		Updt_tar(cn, cn, &exc[i_subfr], gain_pit, L_SUBFR);

-

-#ifdef  ASM_OPT                           /* asm optimization branch */

-		Scale_sig_opt(cn, L_SUBFR, shift);     /* scaling of cn[] to limit dynamic at 12 bits */

-#else

-		Scale_sig(cn, L_SUBFR, shift);     /* scaling of cn[] to limit dynamic at 12 bits */

-#endif

-		/*-----------------------------------------------------------------*

-		 * - include fixed-gain pitch contribution into impulse resp. h1[] *

-		 *-----------------------------------------------------------------*/

-		tmp = 0;

-		Preemph(h2, st->tilt_code, L_SUBFR, &tmp);

-

-		if (T0_frac > 2)

-			T0 = (T0 + 1);

-		Pit_shrp(h2, T0, PIT_SHARP, L_SUBFR);

-		/*-----------------------------------------------------------------*

-		 * - Correlation between target xn2[] and impulse response h1[]    *

-		 * - Innovative codebook search                                    *

-		 *-----------------------------------------------------------------*/

-		cor_h_x(h2, xn2, dn);

-		if (*ser_size <= NBBITS_7k)

-		{

-			ACELP_2t64_fx(dn, cn, h2, code, y2, indice);

-

-			Parm_serial(indice[0], 12, &prms);

-		} else if(*ser_size <= NBBITS_9k)

-		{

-			ACELP_4t64_fx(dn, cn, h2, code, y2, 20, *ser_size, indice);

-

-			Parm_serial(indice[0], 5, &prms);

-			Parm_serial(indice[1], 5, &prms);

-			Parm_serial(indice[2], 5, &prms);

-			Parm_serial(indice[3], 5, &prms);

-		} else if(*ser_size <= NBBITS_12k)

-		{

-			ACELP_4t64_fx(dn, cn, h2, code, y2, 36, *ser_size, indice);

-

-			Parm_serial(indice[0], 9, &prms);

-			Parm_serial(indice[1], 9, &prms);

-			Parm_serial(indice[2], 9, &prms);

-			Parm_serial(indice[3], 9, &prms);

-		} else if(*ser_size <= NBBITS_14k)

-		{

-			ACELP_4t64_fx(dn, cn, h2, code, y2, 44, *ser_size, indice);

-

-			Parm_serial(indice[0], 13, &prms);

-			Parm_serial(indice[1], 13, &prms);

-			Parm_serial(indice[2], 9, &prms);

-			Parm_serial(indice[3], 9, &prms);

-		} else if(*ser_size <= NBBITS_16k)

-		{

-			ACELP_4t64_fx(dn, cn, h2, code, y2, 52, *ser_size, indice);

-

-			Parm_serial(indice[0], 13, &prms);

-			Parm_serial(indice[1], 13, &prms);

-			Parm_serial(indice[2], 13, &prms);

-			Parm_serial(indice[3], 13, &prms);

-		} else if(*ser_size <= NBBITS_18k)

-		{

-			ACELP_4t64_fx(dn, cn, h2, code, y2, 64, *ser_size, indice);

-

-			Parm_serial(indice[0], 2, &prms);

-			Parm_serial(indice[1], 2, &prms);

-			Parm_serial(indice[2], 2, &prms);

-			Parm_serial(indice[3], 2, &prms);

-			Parm_serial(indice[4], 14, &prms);

-			Parm_serial(indice[5], 14, &prms);

-			Parm_serial(indice[6], 14, &prms);

-			Parm_serial(indice[7], 14, &prms);

-		} else if(*ser_size <= NBBITS_20k)

-		{

-			ACELP_4t64_fx(dn, cn, h2, code, y2, 72, *ser_size, indice);

-

-			Parm_serial(indice[0], 10, &prms);

-			Parm_serial(indice[1], 10, &prms);

-			Parm_serial(indice[2], 2, &prms);

-			Parm_serial(indice[3], 2, &prms);

-			Parm_serial(indice[4], 10, &prms);

-			Parm_serial(indice[5], 10, &prms);

-			Parm_serial(indice[6], 14, &prms);

-			Parm_serial(indice[7], 14, &prms);

-		} else

-		{

-			ACELP_4t64_fx(dn, cn, h2, code, y2, 88, *ser_size, indice);

-

-			Parm_serial(indice[0], 11, &prms);

-			Parm_serial(indice[1], 11, &prms);

-			Parm_serial(indice[2], 11, &prms);

-			Parm_serial(indice[3], 11, &prms);

-			Parm_serial(indice[4], 11, &prms);

-			Parm_serial(indice[5], 11, &prms);

-			Parm_serial(indice[6], 11, &prms);

-			Parm_serial(indice[7], 11, &prms);

-		}

-		/*-------------------------------------------------------*

-		 * - Add the fixed-gain pitch contribution to code[].    *

-		 *-------------------------------------------------------*/

-		tmp = 0; 

-		Preemph(code, st->tilt_code, L_SUBFR, &tmp);

-		Pit_shrp(code, T0, PIT_SHARP, L_SUBFR);

-		/*----------------------------------------------------------*

-		 *  - Compute the fixed codebook gain                       *

-		 *  - quantize fixed codebook gain                          *

-		 *----------------------------------------------------------*/

-		if(*ser_size <= NBBITS_9k)

-		{

-			index = Q_gain2(xn, y1, Q_new + shift, y2, code, g_coeff, L_SUBFR, 6,

-					&gain_pit, &L_gain_code, clip_gain, st->qua_gain);

-			Parm_serial(index, 6, &prms);

-		} else

-		{

-			index = Q_gain2(xn, y1, Q_new + shift, y2, code, g_coeff, L_SUBFR, 7,

-					&gain_pit, &L_gain_code, clip_gain, st->qua_gain);

-			Parm_serial(index, 7, &prms);

-		}

-		/* test quantized gain of pitch for pitch clipping algorithm */

-		Gp_clip_test_gain_pit(gain_pit, st->gp_clip);

-

-		L_tmp = L_shl(L_gain_code, Q_new); 

-		gain_code = extract_h(L_add(L_tmp, 0x8000));

-

-		/*----------------------------------------------------------*

-		 * Update parameters for the next subframe.                 *

-		 * - tilt of code: 0.0 (unvoiced) to 0.5 (voiced)           *

-		 *----------------------------------------------------------*/

-		/* find voice factor in Q15 (1=voiced, -1=unvoiced) */

-		Copy(&exc[i_subfr], exc2, L_SUBFR);

-

-#ifdef ASM_OPT                           /* asm optimization branch */

-		Scale_sig_opt(exc2, L_SUBFR, shift);

-#else

-		Scale_sig(exc2, L_SUBFR, shift);

-#endif

-		voice_fac = voice_factor(exc2, shift, gain_pit, code, gain_code, L_SUBFR);

-		/* tilt of code for next subframe: 0.5=voiced, 0=unvoiced */

-		st->tilt_code = ((voice_fac >> 2) + 8192);

-		/*------------------------------------------------------*

-		 * - Update filter's memory "mem_w0" for finding the    *

-		 *   target vector in the next subframe.                *

-		 * - Find the total excitation                          *

-		 * - Find synthesis speech to update mem_syn[].         *

-		 *------------------------------------------------------*/

-

-		/* y2 in Q9, gain_pit in Q14 */

-		L_tmp = (gain_code * y2[L_SUBFR - 1])<<1;

-		L_tmp = L_shl(L_tmp, (5 + shift));

-		L_tmp = L_negate(L_tmp);

-		L_tmp += (xn[L_SUBFR - 1] * 16384)<<1;

-		L_tmp -= (y1[L_SUBFR - 1] * gain_pit)<<1;

-		L_tmp = L_shl(L_tmp, (1 - shift));

-		st->mem_w0 = extract_h(L_add(L_tmp, 0x8000));

-

-		if (*ser_size >= NBBITS_24k)

-			Copy(&exc[i_subfr], exc2, L_SUBFR);

-

-		for (i = 0; i < L_SUBFR; i++)

-		{

-			/* code in Q9, gain_pit in Q14 */

-			L_tmp = (gain_code * code[i])<<1;

-			L_tmp = (L_tmp << 5);

-			L_tmp += (exc[i + i_subfr] * gain_pit)<<1;

-			L_tmp = L_shl2(L_tmp, 1); 

-			exc[i + i_subfr] = extract_h(L_add(L_tmp, 0x8000));

-		}

-

-		Syn_filt(p_Aq,&exc[i_subfr], synth, L_SUBFR, st->mem_syn, 1);

-

-		if(*ser_size >= NBBITS_24k)

-		{

-			/*------------------------------------------------------------*

-			 * phase dispersion to enhance noise in low bit rate          *

-			 *------------------------------------------------------------*/

-			/* L_gain_code in Q16 */

-			VO_L_Extract(L_gain_code, &gain_code, &gain_code_lo);

-

-			/*------------------------------------------------------------*

-			 * noise enhancer                                             *

-			 * ~~~~~~~~~~~~~~                                             *

-			 * - Enhance excitation on noise. (modify gain of code)       *

-			 *   If signal is noisy and LPC filter is stable, move gain   *

-			 *   of code 1.5 dB toward gain of code threshold.            *

-			 *   This decrease by 3 dB noise energy variation.            *

-			 *------------------------------------------------------------*/

-			tmp = (16384 - (voice_fac >> 1));        /* 1=unvoiced, 0=voiced */

-			fac = vo_mult(stab_fac, tmp);

-			L_tmp = L_gain_code; 

-			if(L_tmp < st->L_gc_thres)

-			{

-				L_tmp = vo_L_add(L_tmp, Mpy_32_16(gain_code, gain_code_lo, 6226));

-				if(L_tmp > st->L_gc_thres)

-				{

-					L_tmp = st->L_gc_thres;

-				}

-			} else

-			{

-				L_tmp = Mpy_32_16(gain_code, gain_code_lo, 27536);

-				if(L_tmp < st->L_gc_thres)

-				{

-					L_tmp = st->L_gc_thres;

-				}

-			}

-			st->L_gc_thres = L_tmp;

-

-			L_gain_code = Mpy_32_16(gain_code, gain_code_lo, (32767 - fac));

-			VO_L_Extract(L_tmp, &gain_code, &gain_code_lo);

-			L_gain_code = vo_L_add(L_gain_code, Mpy_32_16(gain_code, gain_code_lo, fac));

-

-			/*------------------------------------------------------------*

-			 * pitch enhancer                                             *

-			 * ~~~~~~~~~~~~~~                                             *

-			 * - Enhance excitation on voice. (HP filtering of code)      *

-			 *   On voiced signal, filtering of code by a smooth fir HP   *

-			 *   filter to decrease energy of code in low frequency.      *

-			 *------------------------------------------------------------*/

-

-			tmp = ((voice_fac >> 3) + 4096); /* 0.25=voiced, 0=unvoiced */

-

-			L_tmp = L_deposit_h(code[0]);

-			L_tmp -= (code[1] * tmp)<<1;

-			code2[0] = vo_round(L_tmp); 

-

-			for (i = 1; i < L_SUBFR - 1; i++)

-			{

-				L_tmp = L_deposit_h(code[i]);

-				L_tmp -= (code[i + 1] * tmp)<<1;

-				L_tmp -= (code[i - 1] * tmp)<<1;

-				code2[i] = vo_round(L_tmp); 

-			}

-

-			L_tmp = L_deposit_h(code[L_SUBFR - 1]);

-			L_tmp -= (code[L_SUBFR - 2] * tmp)<<1;

-			code2[L_SUBFR - 1] = vo_round(L_tmp); 

-

-			/* build excitation */

-			gain_code = vo_round(L_shl(L_gain_code, Q_new));

-

-			for (i = 0; i < L_SUBFR; i++)

-			{

-				L_tmp = (code2[i] * gain_code)<<1;

-				L_tmp = (L_tmp << 5);

-				L_tmp += (exc2[i] * gain_pit)<<1;

-				L_tmp = (L_tmp << 1);

-				exc2[i] = vo_round(L_tmp);

-			}

-

-			corr_gain = synthesis(p_Aq, exc2, Q_new, &speech16k[i_subfr * 5 / 4], st);

-			Parm_serial(corr_gain, 4, &prms);

-		}

-		p_A += (M + 1);

-		p_Aq += (M + 1);

-	}                                      /* end of subframe loop */

-

-	/*--------------------------------------------------*

-	 * Update signal for next frame.                    *

-	 * -> save past of speech[], wsp[] and exc[].       *

-	 *--------------------------------------------------*/

-	Copy(&old_speech[L_FRAME], st->old_speech, L_TOTAL - L_FRAME);

-	Copy(&old_wsp[L_FRAME / OPL_DECIM], st->old_wsp, PIT_MAX / OPL_DECIM);

-	Copy(&old_exc[L_FRAME], st->old_exc, PIT_MAX + L_INTERPOL);

-	return;

-}

-

-/*-----------------------------------------------------*

-* Function synthesis()                                *

-*                                                     *

-* Synthesis of signal at 16kHz with HF extension.     *

-*                                                     *

-*-----------------------------------------------------*/

-

-static Word16 synthesis(

-		Word16 Aq[],                          /* A(z)  : quantized Az               */

-		Word16 exc[],                         /* (i)   : excitation at 12kHz        */

-		Word16 Q_new,                         /* (i)   : scaling performed on exc   */

-		Word16 synth16k[],                    /* (o)   : 16kHz synthesis signal     */

-		Coder_State * st                      /* (i/o) : State structure            */

-		)

-{

-	Word16 fac, tmp, exp;

-	Word16 ener, exp_ener;

-	Word32 L_tmp, i;

-

-	Word16 synth_hi[M + L_SUBFR], synth_lo[M + L_SUBFR];

-	Word16 synth[L_SUBFR];

-	Word16 HF[L_SUBFR16k];                 /* High Frequency vector      */

-	Word16 Ap[M + 1];

-

-	Word16 HF_SP[L_SUBFR16k];              /* High Frequency vector (from original signal) */

-

-	Word16 HP_est_gain, HP_calc_gain, HP_corr_gain;

-	Word16 dist_min, dist;

-	Word16 HP_gain_ind = 0;

-	Word16 gain1, gain2;

-	Word16 weight1, weight2;

-

-	/*------------------------------------------------------------*

-	 * speech synthesis                                           *

-	 * ~~~~~~~~~~~~~~~~                                           *

-	 * - Find synthesis speech corresponding to exc2[].           *

-	 * - Perform fixed deemphasis and hp 50hz filtering.          *

-	 * - Oversampling from 12.8kHz to 16kHz.                      *

-	 *------------------------------------------------------------*/

-	Copy(st->mem_syn_hi, synth_hi, M);

-	Copy(st->mem_syn_lo, synth_lo, M);

-

-#ifdef ASM_OPT                 /* asm optimization branch */

-	Syn_filt_32_asm(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR);

-#else

-	Syn_filt_32(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR);

-#endif

-

-	Copy(synth_hi + L_SUBFR, st->mem_syn_hi, M);

-	Copy(synth_lo + L_SUBFR, st->mem_syn_lo, M);

-

-#ifdef ASM_OPT                 /* asm optimization branch */

-	Deemph_32_asm(synth_hi + M, synth_lo + M, synth, &(st->mem_deemph));

-#else

-	Deemph_32(synth_hi + M, synth_lo + M, synth, PREEMPH_FAC, L_SUBFR, &(st->mem_deemph));

-#endif

-

-	HP50_12k8(synth, L_SUBFR, st->mem_sig_out);

-

-	/* Original speech signal as reference for high band gain quantisation */

-	for (i = 0; i < L_SUBFR16k; i++)

-	{

-		HF_SP[i] = synth16k[i]; 

-	}

-

-	/*------------------------------------------------------*

-	 * HF noise synthesis                                   *

-	 * ~~~~~~~~~~~~~~~~~~                                   *

-	 * - Generate HF noise between 5.5 and 7.5 kHz.         *

-	 * - Set energy of noise according to synthesis tilt.   *

-	 *     tilt > 0.8 ==> - 14 dB (voiced)                  *

-	 *     tilt   0.5 ==> - 6 dB  (voiced or noise)         *

-	 *     tilt < 0.0 ==>   0 dB  (noise)                   *

-	 *------------------------------------------------------*/

-	/* generate white noise vector */

-	for (i = 0; i < L_SUBFR16k; i++)

-	{

-		HF[i] = Random(&(st->seed2))>>3;

-	}

-	/* energy of excitation */

-#ifdef ASM_OPT                    /* asm optimization branch */

-	Scale_sig_opt(exc, L_SUBFR, -3);

-	Q_new = Q_new - 3;

-	ener = extract_h(Dot_product12_asm(exc, exc, L_SUBFR, &exp_ener));

-#else

-	Scale_sig(exc, L_SUBFR, -3);

-	Q_new = Q_new - 3;

-	ener = extract_h(Dot_product12(exc, exc, L_SUBFR, &exp_ener));

-#endif

-

-	exp_ener = exp_ener - (Q_new + Q_new);

-	/* set energy of white noise to energy of excitation */

-#ifdef ASM_OPT              /* asm optimization branch */

-	tmp = extract_h(Dot_product12_asm(HF, HF, L_SUBFR16k, &exp));

-#else

-	tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp));

-#endif

-

-	if(tmp > ener)

-	{

-		tmp = (tmp >> 1);                 /* Be sure tmp < ener */

-		exp = (exp + 1);

-	}

-	L_tmp = L_deposit_h(div_s(tmp, ener)); /* result is normalized */

-	exp = (exp - exp_ener);

-	Isqrt_n(&L_tmp, &exp);

-	L_tmp = L_shl(L_tmp, (exp + 1));       /* L_tmp x 2, L_tmp in Q31 */

-	tmp = extract_h(L_tmp);                /* tmp = 2 x sqrt(ener_exc/ener_hf) */

-

-	for (i = 0; i < L_SUBFR16k; i++)

-	{

-		HF[i] = vo_mult(HF[i], tmp);

-	}

-

-	/* find tilt of synthesis speech (tilt: 1=voiced, -1=unvoiced) */

-	HP400_12k8(synth, L_SUBFR, st->mem_hp400);

-

-	L_tmp = 1L;

-	for (i = 0; i < L_SUBFR; i++)

-		L_tmp += (synth[i] * synth[i])<<1;

-

-	exp = norm_l(L_tmp);

-	ener = extract_h(L_tmp << exp);   /* ener = r[0] */

-

-	L_tmp = 1L;

-	for (i = 1; i < L_SUBFR; i++)

-		L_tmp +=(synth[i] * synth[i - 1])<<1;

-

-	tmp = extract_h(L_tmp << exp);    /* tmp = r[1] */

-

-	if (tmp > 0)

-	{

-		fac = div_s(tmp, ener);

-	} else

-	{

-		fac = 0; 

-	}

-

-	/* modify energy of white noise according to synthesis tilt */

-	gain1 = 32767 - fac;

-	gain2 = vo_mult(gain1, 20480);

-	gain2 = shl(gain2, 1);

-

-	if (st->vad_hist > 0)

-	{

-		weight1 = 0;

-		weight2 = 32767;

-	} else

-	{

-		weight1 = 32767;

-		weight2 = 0;

-	}

-	tmp = vo_mult(weight1, gain1);

-	tmp = add1(tmp, vo_mult(weight2, gain2));

-

-	if (tmp != 0)

-	{

-		tmp = (tmp + 1);

-	}

-	HP_est_gain = tmp;

-

-	if(HP_est_gain < 3277)

-	{

-		HP_est_gain = 3277;                /* 0.1 in Q15 */

-	}

-	/* synthesis of noise: 4.8kHz..5.6kHz --> 6kHz..7kHz */

-	Weight_a(Aq, Ap, 19661, M);            /* fac=0.6 */

-

-#ifdef ASM_OPT                /* asm optimization branch */

-	Syn_filt_asm(Ap, HF, HF, st->mem_syn_hf);

-	/* noise High Pass filtering (1ms of delay) */

-	Filt_6k_7k_asm(HF, L_SUBFR16k, st->mem_hf);

-	/* filtering of the original signal */

-	Filt_6k_7k_asm(HF_SP, L_SUBFR16k, st->mem_hf2);

-

-	/* check the gain difference */

-	Scale_sig_opt(HF_SP, L_SUBFR16k, -1);

-	ener = extract_h(Dot_product12_asm(HF_SP, HF_SP, L_SUBFR16k, &exp_ener));

-	/* set energy of white noise to energy of excitation */

-	tmp = extract_h(Dot_product12_asm(HF, HF, L_SUBFR16k, &exp));

-#else

-	Syn_filt(Ap, HF, HF, L_SUBFR16k, st->mem_syn_hf, 1);

-	/* noise High Pass filtering (1ms of delay) */

-	Filt_6k_7k(HF, L_SUBFR16k, st->mem_hf);

-	/* filtering of the original signal */

-	Filt_6k_7k(HF_SP, L_SUBFR16k, st->mem_hf2);

-	/* check the gain difference */

-	Scale_sig(HF_SP, L_SUBFR16k, -1);

-	ener = extract_h(Dot_product12(HF_SP, HF_SP, L_SUBFR16k, &exp_ener));

-	/* set energy of white noise to energy of excitation */

-	tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp));

-#endif

-

-	if (tmp > ener)

-	{

-		tmp = (tmp >> 1);                 /* Be sure tmp < ener */

-		exp = (exp + 1);

-	}

-	L_tmp = L_deposit_h(div_s(tmp, ener)); /* result is normalized */

-	exp = vo_sub(exp, exp_ener);

-	Isqrt_n(&L_tmp, &exp);

-	L_tmp = L_shl(L_tmp, exp);             /* L_tmp, L_tmp in Q31 */

-	HP_calc_gain = extract_h(L_tmp);       /* tmp = sqrt(ener_input/ener_hf) */

-

-	/* st->gain_alpha *= st->dtx_encSt->dtxHangoverCount/7 */

-	L_tmp = (vo_L_mult(st->dtx_encSt->dtxHangoverCount, 4681) << 15);

-	st->gain_alpha = vo_mult(st->gain_alpha, extract_h(L_tmp));

-

-	if(st->dtx_encSt->dtxHangoverCount > 6)

-		st->gain_alpha = 32767;

-	HP_est_gain = HP_est_gain >> 1;     /* From Q15 to Q14 */

-	HP_corr_gain = add1(vo_mult(HP_calc_gain, st->gain_alpha), vo_mult((32767 - st->gain_alpha), HP_est_gain));

-

-	/* Quantise the correction gain */

-	dist_min = 32767;

-	for (i = 0; i < 16; i++)

-	{

-		dist = vo_mult((HP_corr_gain - HP_gain[i]), (HP_corr_gain - HP_gain[i]));

-		if (dist_min > dist)

-		{

-			dist_min = dist;

-			HP_gain_ind = i;

-		}

-	}

-	HP_corr_gain = HP_gain[HP_gain_ind];

-	/* return the quantised gain index when using the highest mode, otherwise zero */

-	return (HP_gain_ind);

-}

-

-/*************************************************

-*

-* Breif: Codec main function 

-*

-**************************************************/

-

-int AMR_Enc_Encode(HAMRENC hCodec)

-{

-	Word32 i;

-	Coder_State *gData = (Coder_State*)hCodec;

-	Word16 *signal;

-	Word16 packed_size = 0;

-	Word16 prms[NB_BITS_MAX];

-	Word16 coding_mode = 0, nb_bits, allow_dtx, mode, reset_flag;

-	mode = gData->mode;

-	coding_mode = gData->mode;

-	nb_bits = nb_of_bits[mode];

-	signal = (Word16 *)gData->inputStream;

-	allow_dtx = gData->allow_dtx;

-

-	/* check for homing frame */

-	reset_flag = encoder_homing_frame_test(signal);

-

-	for (i = 0; i < L_FRAME16k; i++)   /* Delete the 2 LSBs (14-bit input) */

-	{

-		*(signal + i) = (Word16) (*(signal + i) & 0xfffC);

-	}

-

-	coder(&coding_mode, signal, prms, &nb_bits, gData, allow_dtx);

-	packed_size = PackBits(prms, coding_mode, mode, gData);

-	if (reset_flag != 0)

-	{

-		Reset_encoder(gData, 1);

-	}

-	return packed_size;

-}

-

-/***************************************************************************

-*

-*Brief: Codec API function --- Initialize the codec and return a codec handle

-*

-***************************************************************************/

-

-VO_U32 VO_API voAMRWB_Init(VO_HANDLE * phCodec,                   /* o: the audio codec handle */

-						   VO_AUDIO_CODINGTYPE vType,             /* i: Codec Type ID */

-						   VO_CODEC_INIT_USERDATA * pUserData     /* i: init Parameters */

-						   )

-{

-	Coder_State *st;

-	FrameStream *stream;

-#ifdef USE_DEAULT_MEM

-	VO_MEM_OPERATOR voMemoprator;

-#endif

-	VO_MEM_OPERATOR *pMemOP;

-	int interMem = 0;

-

-	if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL )

-	{

-#ifdef USE_DEAULT_MEM

-		voMemoprator.Alloc = cmnMemAlloc;

-		voMemoprator.Copy = cmnMemCopy;

-		voMemoprator.Free = cmnMemFree;

-		voMemoprator.Set = cmnMemSet;

-		voMemoprator.Check = cmnMemCheck;

-		interMem = 1;

-		pMemOP = &voMemoprator;

-#else

-		*phCodec = NULL;

-		return VO_ERR_INVALID_ARG;

-#endif

-	}

-	else

-	{

-		pMemOP = (VO_MEM_OPERATOR *)pUserData->memData;

-	} 

-	/*-------------------------------------------------------------------------*

-	 * Memory allocation for coder state.                                      *

-	 *-------------------------------------------------------------------------*/

-	if ((st = (Coder_State *)mem_malloc(pMemOP, sizeof(Coder_State), 32, VO_INDEX_ENC_AMRWB)) == NULL)

-	{

-		return VO_ERR_OUTOF_MEMORY;

-	}

-

-	st->vadSt = NULL;                      

-	st->dtx_encSt = NULL;                  

-	st->sid_update_counter = 3;

-	st->sid_handover_debt = 0;

-	st->prev_ft = TX_SPEECH;

-	st->inputStream = NULL;

-	st->inputSize = 0;

-

-	/* Default setting */

-	st->mode = VOAMRWB_MD2385;                        /* bit rate 23.85kbps */

-	st->frameType = VOAMRWB_RFC3267;                  /* frame type: RFC3267 */

-	st->allow_dtx = 0;                                /* disable DTX mode */

-

-	st->outputStream = NULL;

-	st->outputSize = 0;

-

-	st->stream = (FrameStream *)mem_malloc(pMemOP, sizeof(FrameStream), 32, VO_INDEX_ENC_AMRWB);

-	if(st->stream == NULL)

-		return VO_ERR_OUTOF_MEMORY;

-

-	st->stream->frame_ptr = (unsigned char *)mem_malloc(pMemOP, Frame_Maxsize, 32, VO_INDEX_ENC_AMRWB);

-	if(st->stream->frame_ptr == NULL)

-		return  VO_ERR_OUTOF_MEMORY;

-

-	stream = st->stream;

-	voAWB_InitFrameBuffer(stream);

-

-	wb_vad_init(&(st->vadSt), pMemOP);

-	dtx_enc_init(&(st->dtx_encSt), isf_init, pMemOP);

-

-	Reset_encoder((void *) st, 1);

-

-	if(interMem)

-	{

-		st->voMemoprator.Alloc = cmnMemAlloc;

-		st->voMemoprator.Copy = cmnMemCopy;

-		st->voMemoprator.Free = cmnMemFree;

-		st->voMemoprator.Set = cmnMemSet;

-		st->voMemoprator.Check = cmnMemCheck;

-		pMemOP = &st->voMemoprator;

-	}

-

-	st->pvoMemop = pMemOP;

-

-	*phCodec = (void *) st;

-

-	return VO_ERR_NONE;

-}

-

-/**********************************************************************************

-*

-* Brief: Codec API function: Input PCM data

-*

-***********************************************************************************/

-

-VO_U32 VO_API voAMRWB_SetInputData(

-		VO_HANDLE hCodec,                   /* i/o: The codec handle which was created by Init function */

-		VO_CODECBUFFER * pInput             /*   i: The input buffer parameter  */

-		)

-{

-	Coder_State  *gData;

-	FrameStream  *stream;

-

-	if(NULL == hCodec)

-	{

-		return VO_ERR_INVALID_ARG;

-	}

-

-	gData = (Coder_State *)hCodec;

-	stream = gData->stream;

-

-	if(NULL == pInput || NULL == pInput->Buffer || 0 > pInput->Length)

-	{

-		return VO_ERR_INVALID_ARG;

-	}

-

-	stream->set_ptr    = pInput->Buffer;

-	stream->set_len    = pInput->Length;

-	stream->frame_ptr  = stream->frame_ptr_bk;

-	stream->used_len   = 0;

-

-	return VO_ERR_NONE;

-}

-

-/**************************************************************************************

-*

-* Brief: Codec API function: Get the compression audio data frame by frame

-*

-***************************************************************************************/

-

-VO_U32 VO_API voAMRWB_GetOutputData(

-		VO_HANDLE hCodec,                    /* i: The Codec Handle which was created by Init function*/

-		VO_CODECBUFFER * pOutput,            /* o: The output audio data */

-		VO_AUDIO_OUTPUTINFO * pAudioFormat   /* o: The encoder module filled audio format and used the input size*/

-		)

-{

-	Coder_State* gData = (Coder_State*)hCodec;

-	VO_MEM_OPERATOR  *pMemOP;

-	FrameStream  *stream = (FrameStream *)gData->stream;

-	pMemOP = (VO_MEM_OPERATOR  *)gData->pvoMemop;

-

-	if(stream->framebuffer_len  < Frame_MaxByte)         /* check the work buffer len */

-	{

-		stream->frame_storelen = stream->framebuffer_len;

-		if(stream->frame_storelen)

-		{

-			pMemOP->Copy(VO_INDEX_ENC_AMRWB, stream->frame_ptr_bk , stream->frame_ptr , stream->frame_storelen);

-		}

-		if(stream->set_len > 0)

-		{

-			voAWB_UpdateFrameBuffer(stream, pMemOP);

-		}

-		if(stream->framebuffer_len < Frame_MaxByte)

-		{

-			if(pAudioFormat)

-				pAudioFormat->InputUsed = stream->used_len;

-			return VO_ERR_INPUT_BUFFER_SMALL;

-		}

-	}

-

-	gData->inputStream = stream->frame_ptr;

-	gData->outputStream = (unsigned short*)pOutput->Buffer;

-

-	gData->outputSize = AMR_Enc_Encode(gData);         /* encoder main function */

-

-	pOutput->Length = gData->outputSize;               /* get the output buffer length */

-	stream->frame_ptr += 640;                          /* update the work buffer ptr */

-	stream->framebuffer_len  -= 640;

-

-	if(pAudioFormat)                                   /* return output audio information */

-	{

-		pAudioFormat->Format.Channels = 1;

-		pAudioFormat->Format.SampleRate = 8000;

-		pAudioFormat->Format.SampleBits = 16;	

-		pAudioFormat->InputUsed = stream->used_len;

-	}

-	return VO_ERR_NONE;

-}

-

-/*************************************************************************

-*

-* Brief: Codec API function---set the data by specified parameter ID

-*

-*************************************************************************/

-

-

-VO_U32 VO_API voAMRWB_SetParam(

-		VO_HANDLE hCodec,   /* i/o: The Codec Handle which was created by Init function */

-		VO_S32 uParamID,    /*   i: The param ID */

-		VO_PTR pData        /*   i: The param value depend on the ID */

-		)

-{

-	Coder_State* gData = (Coder_State*)hCodec;

-	FrameStream *stream = (FrameStream *)(gData->stream);

-	int *lValue = (int*)pData;

-

-	switch(uParamID)

-	{

-		/* setting AMR-WB frame type*/

-		case VO_PID_AMRWB_FRAMETYPE:

-			if(*lValue < VOAMRWB_DEFAULT || *lValue > VOAMRWB_RFC3267)

-				return VO_ERR_WRONG_PARAM_ID; 

-			gData->frameType = *lValue;

-			break;

-		/* setting AMR-WB bit rate */

-		case VO_PID_AMRWB_MODE:

-			{

-				if(*lValue < VOAMRWB_MD66 || *lValue > VOAMRWB_MD2385)

-					return VO_ERR_WRONG_PARAM_ID; 

-				gData->mode = *lValue;

-			}

-			break;

-		/* enable or disable DTX mode */

-		case VO_PID_AMRWB_DTX:

-			gData->allow_dtx = (Word16)(*lValue);

-			break;

-

-		case VO_PID_COMMON_HEADDATA:

-			break;

-        /* flush the work buffer */

-		case VO_PID_COMMON_FLUSH:

-			stream->set_ptr = NULL;

-			stream->frame_storelen = 0;

-			stream->framebuffer_len = 0;

-			stream->set_len = 0;

-			break;

-

-		default:

-			return VO_ERR_WRONG_PARAM_ID;

-	}

-	return VO_ERR_NONE;

-}

-

-/**************************************************************************

-*

-*Brief: Codec API function---Get the data by specified parameter ID

-*

-***************************************************************************/

-

-VO_U32 VO_API voAMRWB_GetParam(

-		VO_HANDLE hCodec,      /* i: The Codec Handle which was created by Init function */

-		VO_S32 uParamID,       /* i: The param ID */

-		VO_PTR pData           /* o: The param value depend on the ID */

-		)

-{

-	int    temp;

-	Coder_State* gData = (Coder_State*)hCodec;

-

-	if (gData==NULL) 

-		return VO_ERR_INVALID_ARG;

-	switch(uParamID)

-	{

-		/* output audio format */

-		case VO_PID_AMRWB_FORMAT:

-			{

-				VO_AUDIO_FORMAT* fmt = (VO_AUDIO_FORMAT*)pData;

-				fmt->Channels   = 1;

-				fmt->SampleRate = 16000;

-				fmt->SampleBits = 16;

-				break;

-			}

-        /* output audio channel number */

-		case VO_PID_AMRWB_CHANNELS:

-			temp = 1;

-			pData = (void *)(&temp);

-			break;

-        /* output audio sample rate */

-		case VO_PID_AMRWB_SAMPLERATE:

-			temp = 16000;

-			pData = (void *)(&temp);

-			break;

-		/* output audio frame type */

-		case VO_PID_AMRWB_FRAMETYPE:

-			temp = gData->frameType;

-			pData = (void *)(&temp);

-			break;

-		/* output audio bit rate */

-		case VO_PID_AMRWB_MODE:

-			temp = gData->mode;

-			pData = (void *)(&temp);

-			break;

-		default:

-			return VO_ERR_WRONG_PARAM_ID;

-	}

-

-	return VO_ERR_NONE;

-}

-

-/***********************************************************************************

-*

-* Brief: Codec API function---Release the codec after all encoder operations are done

-*

-*************************************************************************************/

-

-VO_U32 VO_API voAMRWB_Uninit(VO_HANDLE hCodec           /* i/o: Codec handle pointer */

-							 )

-{

-	Coder_State* gData = (Coder_State*)hCodec;

-	VO_MEM_OPERATOR *pMemOP;

-	pMemOP = gData->pvoMemop;

-

-	if(hCodec)

-	{

-		if(gData->stream)

-		{

-			if(gData->stream->frame_ptr_bk)

-			{

-				mem_free(pMemOP, gData->stream->frame_ptr_bk, VO_INDEX_ENC_AMRWB);

-				gData->stream->frame_ptr_bk = NULL;

-			}

-			mem_free(pMemOP, gData->stream, VO_INDEX_ENC_AMRWB);

-			gData->stream = NULL;

-		}

-		wb_vad_exit(&(((Coder_State *) gData)->vadSt), pMemOP);

-		dtx_enc_exit(&(((Coder_State *) gData)->dtx_encSt), pMemOP);

-

-		mem_free(pMemOP, hCodec, VO_INDEX_ENC_AMRWB);

-		hCodec = NULL;

-	}

-

-	return VO_ERR_NONE;

-}

-

-/********************************************************************************

-*

-* Brief: voGetAMRWBEncAPI gets the API handle of the codec

-*

-********************************************************************************/

-

-VO_S32 VO_API voGetAMRWBEncAPI(

-							   VO_AUDIO_CODECAPI * pEncHandle      /* i/o: Codec handle pointer */

-							   )

-{

-	if(NULL == pEncHandle)

-		return VO_ERR_INVALID_ARG;

-	pEncHandle->Init = voAMRWB_Init;

-	pEncHandle->SetInputData = voAMRWB_SetInputData;

-	pEncHandle->GetOutputData = voAMRWB_GetOutputData;

-	pEncHandle->SetParam = voAMRWB_SetParam;

-	pEncHandle->GetParam = voAMRWB_GetParam;

-	pEncHandle->Uninit = voAMRWB_Uninit;

-

-	return VO_ERR_NONE;

-}

-

-#ifdef __cplusplus

-}

-#endif

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*      File: voAMRWBEnc.c                                              *
+*                                                                      *
+*      Description: Performs the main encoder routine                  *
+*                   Fixed-point C simulation of AMR WB ACELP coding    *
+*		    algorithm with 20 msspeech frames for              *
+*		    wideband speech signals.                           *
+*                                                                      *
+************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "typedef.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "math_op.h"
+#include "cnst.h"
+#include "acelp.h"
+#include "cod_main.h"
+#include "bits.h"
+#include "main.h"
+#include "voAMRWB.h"
+#include "mem_align.h"
+#include "cmnMemory.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* LPC interpolation coef {0.45, 0.8, 0.96, 1.0}; in Q15 */
+static Word16 interpol_frac[NB_SUBFR] = {14746, 26214, 31457, 32767};
+
+/* isp tables for initialization */
+static Word16 isp_init[M] =
+{
+	32138, 30274, 27246, 23170, 18205, 12540, 6393, 0,
+	-6393, -12540, -18205, -23170, -27246, -30274, -32138, 1475
+};
+
+static Word16 isf_init[M] =
+{
+	1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192,
+	9216, 10240, 11264, 12288, 13312, 14336, 15360, 3840
+};
+
+/* High Band encoding */
+static const Word16 HP_gain[16] =
+{
+	3624, 4673, 5597, 6479, 7425, 8378, 9324, 10264,
+	11210, 12206, 13391, 14844, 16770, 19655, 24289, 32728
+};
+
+/* Private function declaration */
+static Word16 synthesis(
+			Word16 Aq[],                          /* A(z)  : quantized Az               */
+			Word16 exc[],                         /* (i)   : excitation at 12kHz        */
+			Word16 Q_new,                         /* (i)   : scaling performed on exc   */
+			Word16 synth16k[],                    /* (o)   : 16kHz synthesis signal     */
+			Coder_State * st                      /* (i/o) : State structure            */
+			);
+
+/* Codec some parameters initialization */
+void Reset_encoder(void *st, Word16 reset_all)
+{
+	Word16 i;
+	Coder_State *cod_state;
+	cod_state = (Coder_State *) st;
+	Set_zero(cod_state->old_exc, PIT_MAX + L_INTERPOL);
+	Set_zero(cod_state->mem_syn, M);
+	Set_zero(cod_state->past_isfq, M);
+	cod_state->mem_w0 = 0;                 
+	cod_state->tilt_code = 0;              
+	cod_state->first_frame = 1;            
+	Init_gp_clip(cod_state->gp_clip);
+	cod_state->L_gc_thres = 0;             
+	if (reset_all != 0)
+	{
+		/* Static vectors to zero */
+		Set_zero(cod_state->old_speech, L_TOTAL - L_FRAME);
+		Set_zero(cod_state->old_wsp, (PIT_MAX / OPL_DECIM));
+		Set_zero(cod_state->mem_decim2, 3);
+		/* routines initialization */
+		Init_Decim_12k8(cod_state->mem_decim);
+		Init_HP50_12k8(cod_state->mem_sig_in);
+		Init_Levinson(cod_state->mem_levinson);
+		Init_Q_gain2(cod_state->qua_gain);
+		Init_Hp_wsp(cod_state->hp_wsp_mem);
+		/* isp initialization */
+		Copy(isp_init, cod_state->ispold, M);
+		Copy(isp_init, cod_state->ispold_q, M);
+		/* variable initialization */
+		cod_state->mem_preemph = 0;        
+		cod_state->mem_wsp = 0;            
+		cod_state->Q_old = 15;             
+		cod_state->Q_max[0] = 15;          
+		cod_state->Q_max[1] = 15;          
+		cod_state->old_wsp_max = 0;        
+		cod_state->old_wsp_shift = 0;      
+		/* pitch ol initialization */
+		cod_state->old_T0_med = 40;        
+		cod_state->ol_gain = 0;            
+		cod_state->ada_w = 0;              
+		cod_state->ol_wght_flg = 0;        
+		for (i = 0; i < 5; i++)
+		{
+			cod_state->old_ol_lag[i] = 40; 
+		}
+		Set_zero(cod_state->old_hp_wsp, (L_FRAME / 2) / OPL_DECIM + (PIT_MAX / OPL_DECIM));
+		Set_zero(cod_state->mem_syn_hf, M);
+		Set_zero(cod_state->mem_syn_hi, M);
+		Set_zero(cod_state->mem_syn_lo, M);
+		Init_HP50_12k8(cod_state->mem_sig_out);
+		Init_Filt_6k_7k(cod_state->mem_hf);
+		Init_HP400_12k8(cod_state->mem_hp400);
+		Copy(isf_init, cod_state->isfold, M);
+		cod_state->mem_deemph = 0;         
+		cod_state->seed2 = 21845;          
+		Init_Filt_6k_7k(cod_state->mem_hf2);
+		cod_state->gain_alpha = 32767;     
+		cod_state->vad_hist = 0;
+		wb_vad_reset(cod_state->vadSt);
+		dtx_enc_reset(cod_state->dtx_encSt, isf_init);
+	}
+	return;
+}
+
+/*-----------------------------------------------------------------*
+*   Funtion  coder                                                *
+*            ~~~~~                                                *
+*   ->Main coder routine.                                         *
+*                                                                 *
+*-----------------------------------------------------------------*/
+void coder(
+		Word16 * mode,                        /* input :  used mode                             */
+		Word16 speech16k[],                   /* input :  320 new speech samples (at 16 kHz)    */
+		Word16 prms[],                        /* output:  output parameters                     */
+		Word16 * ser_size,                    /* output:  bit rate of the used mode             */
+		void *spe_state,                      /* i/o   :  State structure                       */
+		Word16 allow_dtx                      /* input :  DTX ON/OFF                            */
+	  )
+{
+	/* Coder states */
+	Coder_State *st;
+	/* Speech vector */
+	Word16 old_speech[L_TOTAL];
+	Word16 *new_speech, *speech, *p_window;
+
+	/* Weighted speech vector */
+	Word16 old_wsp[L_FRAME + (PIT_MAX / OPL_DECIM)];
+	Word16 *wsp;
+
+	/* Excitation vector */
+	Word16 old_exc[(L_FRAME + 1) + PIT_MAX + L_INTERPOL];
+	Word16 *exc;
+
+	/* LPC coefficients */
+	Word16 r_h[M + 1], r_l[M + 1];         /* Autocorrelations of windowed speech  */
+	Word16 rc[M];                          /* Reflection coefficients.             */
+	Word16 Ap[M + 1];                      /* A(z) with spectral expansion         */
+	Word16 ispnew[M];                      /* immittance spectral pairs at 4nd sfr */
+	Word16 ispnew_q[M];                    /* quantized ISPs at 4nd subframe       */
+	Word16 isf[M];                         /* ISF (frequency domain) at 4nd sfr    */
+	Word16 *p_A, *p_Aq;                    /* ptr to A(z) for the 4 subframes      */
+	Word16 A[NB_SUBFR * (M + 1)];          /* A(z) unquantized for the 4 subframes */
+	Word16 Aq[NB_SUBFR * (M + 1)];         /* A(z)   quantized for the 4 subframes */
+
+	/* Other vectors */
+	Word16 xn[L_SUBFR];                    /* Target vector for pitch search     */
+	Word16 xn2[L_SUBFR];                   /* Target vector for codebook search  */
+	Word16 dn[L_SUBFR];                    /* Correlation between xn2 and h1     */
+	Word16 cn[L_SUBFR];                    /* Target vector in residual domain   */
+	Word16 h1[L_SUBFR];                    /* Impulse response vector            */
+	Word16 h2[L_SUBFR];                    /* Impulse response vector            */
+	Word16 code[L_SUBFR];                  /* Fixed codebook excitation          */
+	Word16 y1[L_SUBFR];                    /* Filtered adaptive excitation       */
+	Word16 y2[L_SUBFR];                    /* Filtered adaptive excitation       */
+	Word16 error[M + L_SUBFR];             /* error of quantization              */
+	Word16 synth[L_SUBFR];                 /* 12.8kHz synthesis vector           */
+	Word16 exc2[L_FRAME];                  /* excitation vector                  */
+	Word16 buf[L_FRAME];                   /* VAD buffer                         */
+
+	/* Scalars */
+	Word32 i, j, i_subfr, select, pit_flag, clip_gain, vad_flag;
+	Word16 codec_mode;
+	Word16 T_op, T_op2, T0, T0_min, T0_max, T0_frac, index;
+	Word16 gain_pit, gain_code, g_coeff[4], g_coeff2[4];
+	Word16 tmp, gain1, gain2, exp, Q_new, mu, shift, max;
+	Word16 voice_fac;
+	Word16 indice[8];
+	Word32 L_tmp, L_gain_code, L_max, L_tmp1;
+	Word16 code2[L_SUBFR];                         /* Fixed codebook excitation  */
+	Word16 stab_fac, fac, gain_code_lo;
+
+	Word16 corr_gain;
+	Word16 *vo_p0, *vo_p1, *vo_p2, *vo_p3;
+
+	st = (Coder_State *) spe_state;
+
+	*ser_size = nb_of_bits[*mode];         
+	codec_mode = *mode;                    
+
+	/*--------------------------------------------------------------------------*
+	 *          Initialize pointers to speech vector.                           *
+	 *                                                                          *
+	 *                                                                          *
+	 *                    |-------|-------|-------|-------|-------|-------|     *
+	 *                     past sp   sf1     sf2     sf3     sf4    L_NEXT      *
+	 *                    <-------  Total speech buffer (L_TOTAL)   ------>     *
+	 *              old_speech                                                  *
+	 *                    <-------  LPC analysis window (L_WINDOW)  ------>     *
+	 *                    |       <-- present frame (L_FRAME) ---->             *
+	 *                   p_window |       <----- new speech (L_FRAME) ---->     *
+	 *                            |       |                                     *
+	 *                          speech    |                                     *
+	 *                                 new_speech                               *
+	 *--------------------------------------------------------------------------*/
+
+	new_speech = old_speech + L_TOTAL - L_FRAME - L_FILT;         /* New speech     */
+	speech = old_speech + L_TOTAL - L_FRAME - L_NEXT;             /* Present frame  */
+	p_window = old_speech + L_TOTAL - L_WINDOW; 
+
+	exc = old_exc + PIT_MAX + L_INTERPOL;  
+	wsp = old_wsp + (PIT_MAX / OPL_DECIM); 
+
+	/* copy coder memory state into working space */
+	Copy(st->old_speech, old_speech, L_TOTAL - L_FRAME);
+	Copy(st->old_wsp, old_wsp, PIT_MAX / OPL_DECIM);
+	Copy(st->old_exc, old_exc, PIT_MAX + L_INTERPOL);
+
+	/*---------------------------------------------------------------*
+	 * Down sampling signal from 16kHz to 12.8kHz                    *
+	 * -> The signal is extended by L_FILT samples (padded to zero)  *
+	 * to avoid additional delay (L_FILT samples) in the coder.      *
+	 * The last L_FILT samples are approximated after decimation and *
+	 * are used (and windowed) only in autocorrelations.             *
+	 *---------------------------------------------------------------*/
+
+	Decim_12k8(speech16k, L_FRAME16k, new_speech, st->mem_decim);
+
+	/* last L_FILT samples for autocorrelation window */
+	Copy(st->mem_decim, code, 2 * L_FILT16k);
+	Set_zero(error, L_FILT16k);            /* set next sample to zero */
+	Decim_12k8(error, L_FILT16k, new_speech + L_FRAME, code);
+
+	/*---------------------------------------------------------------*
+	 * Perform 50Hz HP filtering of input signal.                    *
+	 *---------------------------------------------------------------*/
+
+	HP50_12k8(new_speech, L_FRAME, st->mem_sig_in);
+
+	/* last L_FILT samples for autocorrelation window */
+	Copy(st->mem_sig_in, code, 6);
+	HP50_12k8(new_speech + L_FRAME, L_FILT, code);
+
+	/*---------------------------------------------------------------*
+	 * Perform fixed preemphasis through 1 - g z^-1                  *
+	 * Scale signal to get maximum of precision in filtering         *
+	 *---------------------------------------------------------------*/
+
+	mu = PREEMPH_FAC >> 1;              /* Q15 --> Q14 */
+
+	/* get max of new preemphased samples (L_FRAME+L_FILT) */
+	L_tmp = new_speech[0] << 15;
+	L_tmp -= (st->mem_preemph * mu)<<1;
+	L_max = L_abs(L_tmp);
+
+	for (i = 1; i < L_FRAME + L_FILT; i++)
+	{
+		L_tmp = new_speech[i] << 15;
+		L_tmp -= (new_speech[i - 1] * mu)<<1;
+		L_tmp = L_abs(L_tmp);
+		if(L_tmp > L_max)
+		{
+			L_max = L_tmp;                 
+		}
+	}
+
+	/* get scaling factor for new and previous samples */
+	/* limit scaling to Q_MAX to keep dynamic for ringing in low signal */
+	/* limit scaling to Q_MAX also to avoid a[0]<1 in syn_filt_32 */
+	tmp = extract_h(L_max);
+	if (tmp == 0)
+	{
+		shift = Q_MAX;                     
+	} else
+	{
+		shift = norm_s(tmp) - 1;
+		if (shift < 0)
+		{
+			shift = 0;                     
+		}
+		if (shift > Q_MAX)
+		{
+			shift = Q_MAX;                 
+		}
+	}
+	Q_new = shift;                         
+	if (Q_new > st->Q_max[0])
+	{
+		Q_new = st->Q_max[0];              
+	}
+	if (Q_new > st->Q_max[1])
+	{
+		Q_new = st->Q_max[1];              
+	}
+	exp = (Q_new - st->Q_old);
+	st->Q_old = Q_new;                     
+	st->Q_max[1] = st->Q_max[0];           
+	st->Q_max[0] = shift;                  
+
+	/* preemphasis with scaling (L_FRAME+L_FILT) */
+	tmp = new_speech[L_FRAME - 1];         
+
+	for (i = L_FRAME + L_FILT - 1; i > 0; i--)
+	{
+		L_tmp = new_speech[i] << 15;
+		L_tmp -= (new_speech[i - 1] * mu)<<1;
+		L_tmp = (L_tmp << Q_new);
+		new_speech[i] = vo_round(L_tmp);      
+	}
+
+	L_tmp = new_speech[0] << 15;
+	L_tmp -= (st->mem_preemph * mu)<<1;
+	L_tmp = (L_tmp << Q_new);
+	new_speech[0] = vo_round(L_tmp);          
+
+	st->mem_preemph = tmp;                 
+
+	/* scale previous samples and memory */
+
+	Scale_sig(old_speech, L_TOTAL - L_FRAME - L_FILT, exp);
+	Scale_sig(old_exc, PIT_MAX + L_INTERPOL, exp);
+	Scale_sig(st->mem_syn, M, exp);
+	Scale_sig(st->mem_decim2, 3, exp);
+	Scale_sig(&(st->mem_wsp), 1, exp);
+	Scale_sig(&(st->mem_w0), 1, exp);
+
+	/*------------------------------------------------------------------------*
+	 *  Call VAD                                                              *
+	 *  Preemphesis scale down signal in low frequency and keep dynamic in HF.*
+	 *  Vad work slightly in futur (new_speech = speech + L_NEXT - L_FILT).   *
+	 *------------------------------------------------------------------------*/
+	Copy(new_speech, buf, L_FRAME);
+
+#ifdef ASM_OPT        /* asm optimization branch */
+	Scale_sig_opt(buf, L_FRAME, 1 - Q_new);
+#else
+	Scale_sig(buf, L_FRAME, 1 - Q_new);
+#endif
+
+	vad_flag = wb_vad(st->vadSt, buf);          /* Voice Activity Detection */ 
+	if (vad_flag == 0)
+	{
+		st->vad_hist = (st->vad_hist + 1);        
+	} else
+	{
+		st->vad_hist = 0;             
+	}
+
+	/* DTX processing */
+	if (allow_dtx != 0)
+	{
+		/* Note that mode may change here */
+		tx_dtx_handler(st->dtx_encSt, vad_flag, mode);
+		*ser_size = nb_of_bits[*mode]; 
+	}
+
+	if(*mode != MRDTX)
+	{
+		Parm_serial(vad_flag, 1, &prms);
+	}
+	/*------------------------------------------------------------------------*
+	 *  Perform LPC analysis                                                  *
+	 *  ~~~~~~~~~~~~~~~~~~~~                                                  *
+	 *   - autocorrelation + lag windowing                                    *
+	 *   - Levinson-durbin algorithm to find a[]                              *
+	 *   - convert a[] to isp[]                                               *
+	 *   - convert isp[] to isf[] for quantization                            *
+	 *   - quantize and code the isf[]                                        *
+	 *   - convert isf[] to isp[] for interpolation                           *
+	 *   - find the interpolated ISPs and convert to a[] for the 4 subframes  *
+	 *------------------------------------------------------------------------*/
+
+	/* LP analysis centered at 4nd subframe */
+	Autocorr(p_window, M, r_h, r_l);                        /* Autocorrelations */
+	Lag_window(r_h, r_l);                                   /* Lag windowing    */
+	Levinson(r_h, r_l, A, rc, st->mem_levinson);            /* Levinson Durbin  */
+	Az_isp(A, ispnew, st->ispold);                          /* From A(z) to ISP */
+
+	/* Find the interpolated ISPs and convert to a[] for all subframes */
+	Int_isp(st->ispold, ispnew, interpol_frac, A);
+
+	/* update ispold[] for the next frame */
+	Copy(ispnew, st->ispold, M);
+
+	/* Convert ISPs to frequency domain 0..6400 */
+	Isp_isf(ispnew, isf, M);
+
+	/* check resonance for pitch clipping algorithm */
+	Gp_clip_test_isf(isf, st->gp_clip);
+
+	/*----------------------------------------------------------------------*
+	 *  Perform PITCH_OL analysis                                           *
+	 *  ~~~~~~~~~~~~~~~~~~~~~~~~~                                           *
+	 * - Find the residual res[] for the whole speech frame                 *
+	 * - Find the weighted input speech wsp[] for the whole speech frame    *
+	 * - scale wsp[] to avoid overflow in pitch estimation                  *
+	 * - Find open loop pitch lag for whole speech frame                    *
+	 *----------------------------------------------------------------------*/
+	p_A = A;                             
+	for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+	{
+		/* Weighting of LPC coefficients */
+		Weight_a(p_A, Ap, GAMMA1, M);
+
+#ifdef ASM_OPT                    /* asm optimization branch */
+		Residu_opt(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR);
+#else
+		Residu(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR);
+#endif
+
+		p_A += (M + 1);                    
+	}
+
+	Deemph2(wsp, TILT_FAC, L_FRAME, &(st->mem_wsp));
+
+	/* find maximum value on wsp[] for 12 bits scaling */
+	max = 0;                              
+	for (i = 0; i < L_FRAME; i++)
+	{
+		tmp = abs_s(wsp[i]);
+		if(tmp > max)
+		{
+			max = tmp;                     
+		}
+	}
+	tmp = st->old_wsp_max;                 
+	if(max > tmp)
+	{
+		tmp = max;                         /* tmp = max(wsp_max, old_wsp_max) */
+	}
+	st->old_wsp_max = max;                
+
+	shift = norm_s(tmp) - 3;
+	if (shift > 0)
+	{
+		shift = 0;                         /* shift = 0..-3 */
+	}
+	/* decimation of wsp[] to search pitch in LF and to reduce complexity */
+	LP_Decim2(wsp, L_FRAME, st->mem_decim2);
+
+	/* scale wsp[] in 12 bits to avoid overflow */
+#ifdef  ASM_OPT                  /* asm optimization branch */
+	Scale_sig_opt(wsp, L_FRAME / OPL_DECIM, shift);
+#else
+	Scale_sig(wsp, L_FRAME / OPL_DECIM, shift);
+#endif
+	/* scale old_wsp (warning: exp must be Q_new-Q_old) */
+	exp = exp + (shift - st->old_wsp_shift);
+	st->old_wsp_shift = shift;
+
+	Scale_sig(old_wsp, PIT_MAX / OPL_DECIM, exp);
+	Scale_sig(st->old_hp_wsp, PIT_MAX / OPL_DECIM, exp);
+
+	scale_mem_Hp_wsp(st->hp_wsp_mem, exp);
+
+	/* Find open loop pitch lag for whole speech frame */
+
+	if(*ser_size == NBBITS_7k)
+	{
+		/* Find open loop pitch lag for whole speech frame */
+		T_op = Pitch_med_ol(wsp, st, L_FRAME / OPL_DECIM);
+	} else
+	{
+		/* Find open loop pitch lag for first 1/2 frame */
+		T_op = Pitch_med_ol(wsp, st, (L_FRAME/2) / OPL_DECIM);
+	}
+
+	if(st->ol_gain > 19661)       /* 0.6 in Q15 */
+	{
+		st->old_T0_med = Med_olag(T_op, st->old_ol_lag);       
+		st->ada_w = 32767;                 
+	} else
+	{
+		st->ada_w = vo_mult(st->ada_w, 29491);
+	}
+
+	if(st->ada_w < 26214)
+		st->ol_wght_flg = 0;
+	else
+		st->ol_wght_flg = 1;
+
+	wb_vad_tone_detection(st->vadSt, st->ol_gain);
+	T_op *= OPL_DECIM;                     
+
+	if(*ser_size != NBBITS_7k)
+	{
+		/* Find open loop pitch lag for second 1/2 frame */
+		T_op2 = Pitch_med_ol(wsp + ((L_FRAME / 2) / OPL_DECIM), st, (L_FRAME/2) / OPL_DECIM);
+
+		if(st->ol_gain > 19661)   /* 0.6 in Q15 */
+		{
+			st->old_T0_med = Med_olag(T_op2, st->old_ol_lag);  
+			st->ada_w = 32767;             
+		} else
+		{
+			st->ada_w = mult(st->ada_w, 29491); 
+		}
+
+		if(st->ada_w < 26214)
+			st->ol_wght_flg = 0;
+		else
+			st->ol_wght_flg = 1;
+
+		wb_vad_tone_detection(st->vadSt, st->ol_gain);
+
+		T_op2 *= OPL_DECIM;                
+
+	} else
+	{
+		T_op2 = T_op;                      
+	}
+	/*----------------------------------------------------------------------*
+	 *                              DTX-CNG                                 *
+	 *----------------------------------------------------------------------*/
+	if(*mode == MRDTX)            /* CNG mode */
+	{
+		/* Buffer isf's and energy */
+#ifdef ASM_OPT                   /* asm optimization branch */
+		Residu_opt(&A[3 * (M + 1)], speech, exc, L_FRAME);
+#else
+		Residu(&A[3 * (M + 1)], speech, exc, L_FRAME);
+#endif
+
+		for (i = 0; i < L_FRAME; i++)
+		{
+			exc2[i] = shr(exc[i], Q_new);  
+		}
+
+		L_tmp = 0;                         
+		for (i = 0; i < L_FRAME; i++)
+			L_tmp += (exc2[i] * exc2[i])<<1;
+
+		L_tmp >>= 1;
+
+		dtx_buffer(st->dtx_encSt, isf, L_tmp, codec_mode);
+
+		/* Quantize and code the ISFs */
+		dtx_enc(st->dtx_encSt, isf, exc2, &prms);
+
+		/* Convert ISFs to the cosine domain */
+		Isf_isp(isf, ispnew_q, M);
+		Isp_Az(ispnew_q, Aq, M, 0);
+
+		for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+		{
+			corr_gain = synthesis(Aq, &exc2[i_subfr], 0, &speech16k[i_subfr * 5 / 4], st);
+		}
+		Copy(isf, st->isfold, M);
+
+		/* reset speech coder memories */
+		Reset_encoder(st, 0);
+
+		/*--------------------------------------------------*
+		 * Update signal for next frame.                    *
+		 * -> save past of speech[] and wsp[].              *
+		 *--------------------------------------------------*/
+
+		Copy(&old_speech[L_FRAME], st->old_speech, L_TOTAL - L_FRAME);
+		Copy(&old_wsp[L_FRAME / OPL_DECIM], st->old_wsp, PIT_MAX / OPL_DECIM);
+
+		return;
+	}
+	/*----------------------------------------------------------------------*
+	 *                               ACELP                                  *
+	 *----------------------------------------------------------------------*/
+
+	/* Quantize and code the ISFs */
+
+	if (*ser_size <= NBBITS_7k)
+	{
+		Qpisf_2s_36b(isf, isf, st->past_isfq, indice, 4);
+
+		Parm_serial(indice[0], 8, &prms);
+		Parm_serial(indice[1], 8, &prms);
+		Parm_serial(indice[2], 7, &prms);
+		Parm_serial(indice[3], 7, &prms);
+		Parm_serial(indice[4], 6, &prms);
+	} else
+	{
+		Qpisf_2s_46b(isf, isf, st->past_isfq, indice, 4);
+
+		Parm_serial(indice[0], 8, &prms);
+		Parm_serial(indice[1], 8, &prms);
+		Parm_serial(indice[2], 6, &prms);
+		Parm_serial(indice[3], 7, &prms);
+		Parm_serial(indice[4], 7, &prms);
+		Parm_serial(indice[5], 5, &prms);
+		Parm_serial(indice[6], 5, &prms);
+	}
+
+	/* Check stability on isf : distance between old isf and current isf */
+
+	L_tmp = 0;                           
+	for (i = 0; i < M - 1; i++)
+	{
+		tmp = vo_sub(isf[i], st->isfold[i]);
+		L_tmp += (tmp * tmp)<<1;
+	}
+
+	tmp = extract_h(L_shl2(L_tmp, 8)); 
+
+	tmp = vo_mult(tmp, 26214);                /* tmp = L_tmp*0.8/256 */
+	tmp = vo_sub(20480, tmp);                 /* 1.25 - tmp (in Q14) */
+
+	stab_fac = shl(tmp, 1); 
+
+	if (stab_fac < 0)
+	{
+		stab_fac = 0;                      
+	}
+	Copy(isf, st->isfold, M);
+
+	/* Convert ISFs to the cosine domain */
+	Isf_isp(isf, ispnew_q, M);
+
+	if (st->first_frame != 0)
+	{
+		st->first_frame = 0;              
+		Copy(ispnew_q, st->ispold_q, M);
+	}
+	/* Find the interpolated ISPs and convert to a[] for all subframes */
+
+	Int_isp(st->ispold_q, ispnew_q, interpol_frac, Aq);
+
+	/* update ispold[] for the next frame */
+	Copy(ispnew_q, st->ispold_q, M);
+
+	p_Aq = Aq;
+	for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+	{
+#ifdef ASM_OPT               /* asm optimization branch */
+		Residu_opt(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
+#else
+		Residu(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
+#endif
+		p_Aq += (M + 1);                   
+	}
+
+	/* Buffer isf's and energy for dtx on non-speech frame */
+	if (vad_flag == 0)
+	{
+		for (i = 0; i < L_FRAME; i++)
+		{
+			exc2[i] = exc[i] >> Q_new;
+		}
+		L_tmp = 0;                         
+		for (i = 0; i < L_FRAME; i++)
+			L_tmp += (exc2[i] * exc2[i])<<1;
+		L_tmp >>= 1;
+
+		dtx_buffer(st->dtx_encSt, isf, L_tmp, codec_mode);
+	}
+	/* range for closed loop pitch search in 1st subframe */
+
+	T0_min = T_op - 8;
+	if (T0_min < PIT_MIN)
+	{
+		T0_min = PIT_MIN;                  
+	}
+	T0_max = (T0_min + 15);
+
+	if(T0_max > PIT_MAX)
+	{
+		T0_max = PIT_MAX;                  
+		T0_min = T0_max - 15;          
+	}
+	/*------------------------------------------------------------------------*
+	 *          Loop for every subframe in the analysis frame                 *
+	 *------------------------------------------------------------------------*
+	 *  To find the pitch and innovation parameters. The subframe size is     *
+	 *  L_SUBFR and the loop is repeated L_FRAME/L_SUBFR times.               *
+	 *     - compute the target signal for pitch search                       *
+	 *     - compute impulse response of weighted synthesis filter (h1[])     *
+	 *     - find the closed-loop pitch parameters                            *
+	 *     - encode the pitch dealy                                           *
+	 *     - find 2 lt prediction (with / without LP filter for lt pred)      *
+	 *     - find 2 pitch gains and choose the best lt prediction.            *
+	 *     - find target vector for codebook search                           *
+	 *     - update the impulse response h1[] for codebook search             *
+	 *     - correlation between target vector and impulse response           *
+	 *     - codebook search and encoding                                     *
+	 *     - VQ of pitch and codebook gains                                   *
+	 *     - find voicing factor and tilt of code for next subframe.          *
+	 *     - update states of weighting filter                                *
+	 *     - find excitation and synthesis speech                             *
+	 *------------------------------------------------------------------------*/
+	p_A = A;                               
+	p_Aq = Aq;                             
+	for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+	{
+		pit_flag = i_subfr;                
+		if ((i_subfr == 2 * L_SUBFR) && (*ser_size > NBBITS_7k))
+		{
+			pit_flag = 0;                 
+			/* range for closed loop pitch search in 3rd subframe */
+			T0_min = (T_op2 - 8);
+
+			if (T0_min < PIT_MIN)
+			{
+				T0_min = PIT_MIN;          
+			}
+			T0_max = (T0_min + 15);
+			if (T0_max > PIT_MAX)
+			{
+				T0_max = PIT_MAX;         
+				T0_min = (T0_max - 15);
+			}
+		}
+		/*-----------------------------------------------------------------------*
+		 *                                                                       *
+		 *        Find the target vector for pitch search:                       *
+		 *        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                        *
+		 *                                                                       *
+		 *             |------|  res[n]                                          *
+		 * speech[n]---| A(z) |--------                                          *
+		 *             |------|       |   |--------| error[n]  |------|          *
+		 *                   zero -- (-)--| 1/A(z) |-----------| W(z) |-- target *
+		 *                   exc          |--------|           |------|          *
+		 *                                                                       *
+		 * Instead of subtracting the zero-input response of filters from        *
+		 * the weighted input speech, the above configuration is used to         *
+		 * compute the target vector.                                            *
+		 *                                                                       *
+		 *-----------------------------------------------------------------------*/
+
+		for (i = 0; i < M; i++)
+		{
+			error[i] = vo_sub(speech[i + i_subfr - M], st->mem_syn[i]);
+		}
+
+#ifdef ASM_OPT              /* asm optimization branch */
+		Residu_opt(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
+#else
+		Residu(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
+#endif
+		Syn_filt(p_Aq, &exc[i_subfr], error + M, L_SUBFR, error, 0);
+		Weight_a(p_A, Ap, GAMMA1, M);
+
+#ifdef ASM_OPT             /* asm optimization branch */
+		Residu_opt(Ap, error + M, xn, L_SUBFR);
+#else
+		Residu(Ap, error + M, xn, L_SUBFR);
+#endif
+		Deemph2(xn, TILT_FAC, L_SUBFR, &(st->mem_w0));
+
+		/*----------------------------------------------------------------------*
+		 * Find approx. target in residual domain "cn[]" for inovation search.  *
+		 *----------------------------------------------------------------------*/
+		/* first half: xn[] --> cn[] */
+		Set_zero(code, M);
+		Copy(xn, code + M, L_SUBFR / 2);
+		tmp = 0;                          
+		Preemph2(code + M, TILT_FAC, L_SUBFR / 2, &tmp);
+		Weight_a(p_A, Ap, GAMMA1, M);
+		Syn_filt(Ap,code + M, code + M, L_SUBFR / 2, code, 0);
+
+#ifdef ASM_OPT                /* asm optimization branch */
+		Residu_opt(p_Aq,code + M, cn, L_SUBFR / 2);
+#else
+		Residu(p_Aq,code + M, cn, L_SUBFR / 2);
+#endif
+
+		/* second half: res[] --> cn[] (approximated and faster) */
+		Copy(&exc[i_subfr + (L_SUBFR / 2)], cn + (L_SUBFR / 2), L_SUBFR / 2);
+
+		/*---------------------------------------------------------------*
+		 * Compute impulse response, h1[], of weighted synthesis filter  * 
+		 *---------------------------------------------------------------*/
+
+		Set_zero(error, M + L_SUBFR);
+		Weight_a(p_A, error + M, GAMMA1, M);
+
+		vo_p0 = error+M;
+		vo_p3 = h1;
+		for (i = 0; i < L_SUBFR; i++)
+		{
+			L_tmp = *vo_p0 << 14;        /* x4 (Q12 to Q14) */
+			vo_p1 = p_Aq + 1;
+			vo_p2 = vo_p0-1;
+			for (j = 1; j <= M/4; j++)
+			{
+				L_tmp -= *vo_p1++ * *vo_p2--;
+				L_tmp -= *vo_p1++ * *vo_p2--;
+				L_tmp -= *vo_p1++ * *vo_p2--;
+				L_tmp -= *vo_p1++ * *vo_p2--;
+			}
+			*vo_p3++ = *vo_p0++ = vo_round((L_tmp <<4));
+		}
+		/* deemph without division by 2 -> Q14 to Q15 */
+		tmp = 0; 
+		Deemph2(h1, TILT_FAC, L_SUBFR, &tmp);   /* h1 in Q14 */
+
+		/* h2 in Q12 for codebook search */
+		Copy(h1, h2, L_SUBFR);
+
+		/*---------------------------------------------------------------*
+		 * scale xn[] and h1[] to avoid overflow in dot_product12()      *
+		 *---------------------------------------------------------------*/
+#ifdef  ASM_OPT                  /* asm optimization branch */
+		Scale_sig_opt(h2, L_SUBFR, -2);
+		Scale_sig_opt(xn, L_SUBFR, shift);     /* scaling of xn[] to limit dynamic at 12 bits */
+		Scale_sig_opt(h1, L_SUBFR, 1 + shift);  /* set h1[] in Q15 with scaling for convolution */
+#else
+		Scale_sig(h2, L_SUBFR, -2);
+		Scale_sig(xn, L_SUBFR, shift);     /* scaling of xn[] to limit dynamic at 12 bits */
+		Scale_sig(h1, L_SUBFR, 1 + shift);  /* set h1[] in Q15 with scaling for convolution */
+#endif
+		/*----------------------------------------------------------------------*
+		 *                 Closed-loop fractional pitch search                  *
+		 *----------------------------------------------------------------------*/
+		/* find closed loop fractional pitch  lag */
+		if(*ser_size <= NBBITS_9k)
+		{
+			T0 = Pitch_fr4(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac,
+					pit_flag, PIT_MIN, PIT_FR1_8b, L_SUBFR);
+
+			/* encode pitch lag */
+			if (pit_flag == 0)             /* if 1st/3rd subframe */
+			{
+				/*--------------------------------------------------------------*
+				 * The pitch range for the 1st/3rd subframe is encoded with     *
+				 * 8 bits and is divided as follows:                            *
+				 *   PIT_MIN to PIT_FR1-1  resolution 1/2 (frac = 0 or 2)       *
+				 *   PIT_FR1 to PIT_MAX    resolution 1   (frac = 0)            *
+				 *--------------------------------------------------------------*/
+				if (T0 < PIT_FR1_8b)
+				{
+					index = ((T0 << 1) + (T0_frac >> 1) - (PIT_MIN<<1));
+				} else
+				{
+					index = ((T0 - PIT_FR1_8b) + ((PIT_FR1_8b - PIT_MIN)*2));
+				}
+
+				Parm_serial(index, 8, &prms);
+
+				/* find T0_min and T0_max for subframe 2 and 4 */
+				T0_min = (T0 - 8);
+				if (T0_min < PIT_MIN)
+				{
+					T0_min = PIT_MIN;
+				}
+				T0_max = T0_min + 15;
+				if (T0_max > PIT_MAX)
+				{
+					T0_max = PIT_MAX;
+					T0_min = (T0_max - 15);
+				}
+			} else
+			{                              /* if subframe 2 or 4 */
+				/*--------------------------------------------------------------*
+				 * The pitch range for subframe 2 or 4 is encoded with 5 bits:  *
+				 *   T0_min  to T0_max     resolution 1/2 (frac = 0 or 2)       *
+				 *--------------------------------------------------------------*/
+				i = (T0 - T0_min);
+				index = (i << 1) + (T0_frac >> 1);
+
+				Parm_serial(index, 5, &prms);
+			}
+		} else
+		{
+			T0 = Pitch_fr4(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac,
+					pit_flag, PIT_FR2, PIT_FR1_9b, L_SUBFR);
+
+			/* encode pitch lag */
+			if (pit_flag == 0)             /* if 1st/3rd subframe */
+			{
+				/*--------------------------------------------------------------*
+				 * The pitch range for the 1st/3rd subframe is encoded with     *
+				 * 9 bits and is divided as follows:                            *
+				 *   PIT_MIN to PIT_FR2-1  resolution 1/4 (frac = 0,1,2 or 3)   *
+				 *   PIT_FR2 to PIT_FR1-1  resolution 1/2 (frac = 0 or 1)       *
+				 *   PIT_FR1 to PIT_MAX    resolution 1   (frac = 0)            *
+				 *--------------------------------------------------------------*/
+
+				if (T0 < PIT_FR2)
+				{
+					index = ((T0 << 2) + T0_frac) - (PIT_MIN << 2);
+				} else if(T0 < PIT_FR1_9b)
+				{
+					index = ((((T0 << 1) + (T0_frac >> 1)) - (PIT_FR2<<1)) + ((PIT_FR2 - PIT_MIN)<<2));
+				} else
+				{
+					index = (((T0 - PIT_FR1_9b) + ((PIT_FR2 - PIT_MIN)<<2)) + ((PIT_FR1_9b - PIT_FR2)<<1));
+				}
+
+				Parm_serial(index, 9, &prms);
+
+				/* find T0_min and T0_max for subframe 2 and 4 */
+
+				T0_min = (T0 - 8);
+				if (T0_min < PIT_MIN)
+				{
+					T0_min = PIT_MIN; 
+				}
+				T0_max = T0_min + 15;
+
+				if (T0_max > PIT_MAX)
+				{
+					T0_max = PIT_MAX;
+					T0_min = (T0_max - 15);
+				}
+			} else
+			{                              /* if subframe 2 or 4 */
+				/*--------------------------------------------------------------*
+				 * The pitch range for subframe 2 or 4 is encoded with 6 bits:  *
+				 *   T0_min  to T0_max     resolution 1/4 (frac = 0,1,2 or 3)   *
+				 *--------------------------------------------------------------*/
+				i = (T0 - T0_min);
+				index = (i << 2) + T0_frac;
+				Parm_serial(index, 6, &prms);
+			}
+		}
+
+		/*-----------------------------------------------------------------*
+		 * Gain clipping test to avoid unstable synthesis on frame erasure *
+		 *-----------------------------------------------------------------*/
+
+		clip_gain = 0;
+		if((st->gp_clip[0] < 154) && (st->gp_clip[1] > 14746))
+			clip_gain = 1;
+
+		/*-----------------------------------------------------------------*
+		 * - find unity gain pitch excitation (adaptive codebook entry)    *
+		 *   with fractional interpolation.                                *
+		 * - find filtered pitch exc. y1[]=exc[] convolved with h1[])      *
+		 * - compute pitch gain1                                           *
+		 *-----------------------------------------------------------------*/
+		/* find pitch exitation */
+#ifdef ASM_OPT                  /* asm optimization branch */
+		pred_lt4_asm(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1);
+#else
+		Pred_lt4(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1);
+#endif
+		if (*ser_size > NBBITS_9k)
+		{
+#ifdef ASM_OPT                   /* asm optimization branch */
+			Convolve_asm(&exc[i_subfr], h1, y1, L_SUBFR);
+#else
+			Convolve(&exc[i_subfr], h1, y1, L_SUBFR);
+#endif 
+			gain1 = G_pitch(xn, y1, g_coeff, L_SUBFR);
+			/* clip gain if necessary to avoid problem at decoder */
+			if ((clip_gain != 0) && (gain1 > GP_CLIP))
+			{
+				gain1 = GP_CLIP; 
+			}
+			/* find energy of new target xn2[] */
+			Updt_tar(xn, dn, y1, gain1, L_SUBFR);       /* dn used temporary */
+		} else
+		{
+			gain1 = 0; 
+		}
+		/*-----------------------------------------------------------------*
+		 * - find pitch excitation filtered by 1st order LP filter.        *
+		 * - find filtered pitch exc. y2[]=exc[] convolved with h1[])      *
+		 * - compute pitch gain2                                           *
+		 *-----------------------------------------------------------------*/
+		/* find pitch excitation with lp filter */
+		vo_p0 = exc + i_subfr-1;
+		vo_p1 = code;
+		/* find pitch excitation with lp filter */
+		for (i = 0; i < L_SUBFR/2; i++)
+		{
+			L_tmp = 5898 * *vo_p0++;
+			L_tmp1 = 5898 * *vo_p0;
+			L_tmp += 20972 * *vo_p0++;
+			L_tmp1 += 20972 * *vo_p0++;
+			L_tmp1 += 5898 * *vo_p0--;
+			L_tmp += 5898 * *vo_p0;
+			*vo_p1++ = (L_tmp + 0x4000)>>15;
+			*vo_p1++ = (L_tmp1 + 0x4000)>>15;
+		}
+
+#ifdef ASM_OPT                 /* asm optimization branch */
+		Convolve_asm(code, h1, y2, L_SUBFR);
+#else
+		Convolve(code, h1, y2, L_SUBFR);
+#endif 
+
+		gain2 = G_pitch(xn, y2, g_coeff2, L_SUBFR);
+
+		/* clip gain if necessary to avoid problem at decoder */
+		if ((clip_gain != 0) && (gain2 > GP_CLIP))
+		{
+			gain2 = GP_CLIP;
+		}
+		/* find energy of new target xn2[] */
+		Updt_tar(xn, xn2, y2, gain2, L_SUBFR);
+		/*-----------------------------------------------------------------*
+		 * use the best prediction (minimise quadratic error).             *
+		 *-----------------------------------------------------------------*/
+		select = 0; 
+		if(*ser_size > NBBITS_9k)
+		{
+			L_tmp = 0L;
+			vo_p0 = dn;
+			vo_p1 = xn2;
+			for (i = 0; i < L_SUBFR/2; i++)
+			{
+				L_tmp += *vo_p0 * *vo_p0;
+				vo_p0++;
+				L_tmp -= *vo_p1 * *vo_p1;
+				vo_p1++;
+				L_tmp += *vo_p0 * *vo_p0;
+				vo_p0++;
+				L_tmp -= *vo_p1 * *vo_p1;
+				vo_p1++;
+			}
+
+			if (L_tmp <= 0)
+			{
+				select = 1; 
+			}
+			Parm_serial(select, 1, &prms);
+		}
+		if (select == 0)
+		{
+			/* use the lp filter for pitch excitation prediction */
+			gain_pit = gain2;
+			Copy(code, &exc[i_subfr], L_SUBFR);
+			Copy(y2, y1, L_SUBFR);
+			Copy(g_coeff2, g_coeff, 4);
+		} else
+		{
+			/* no filter used for pitch excitation prediction */
+			gain_pit = gain1;
+			Copy(dn, xn2, L_SUBFR);        /* target vector for codebook search */
+		}
+		/*-----------------------------------------------------------------*
+		 * - update cn[] for codebook search                               *
+		 *-----------------------------------------------------------------*/
+		Updt_tar(cn, cn, &exc[i_subfr], gain_pit, L_SUBFR);
+
+#ifdef  ASM_OPT                           /* asm optimization branch */
+		Scale_sig_opt(cn, L_SUBFR, shift);     /* scaling of cn[] to limit dynamic at 12 bits */
+#else
+		Scale_sig(cn, L_SUBFR, shift);     /* scaling of cn[] to limit dynamic at 12 bits */
+#endif
+		/*-----------------------------------------------------------------*
+		 * - include fixed-gain pitch contribution into impulse resp. h1[] *
+		 *-----------------------------------------------------------------*/
+		tmp = 0;
+		Preemph(h2, st->tilt_code, L_SUBFR, &tmp);
+
+		if (T0_frac > 2)
+			T0 = (T0 + 1);
+		Pit_shrp(h2, T0, PIT_SHARP, L_SUBFR);
+		/*-----------------------------------------------------------------*
+		 * - Correlation between target xn2[] and impulse response h1[]    *
+		 * - Innovative codebook search                                    *
+		 *-----------------------------------------------------------------*/
+		cor_h_x(h2, xn2, dn);
+		if (*ser_size <= NBBITS_7k)
+		{
+			ACELP_2t64_fx(dn, cn, h2, code, y2, indice);
+
+			Parm_serial(indice[0], 12, &prms);
+		} else if(*ser_size <= NBBITS_9k)
+		{
+			ACELP_4t64_fx(dn, cn, h2, code, y2, 20, *ser_size, indice);
+
+			Parm_serial(indice[0], 5, &prms);
+			Parm_serial(indice[1], 5, &prms);
+			Parm_serial(indice[2], 5, &prms);
+			Parm_serial(indice[3], 5, &prms);
+		} else if(*ser_size <= NBBITS_12k)
+		{
+			ACELP_4t64_fx(dn, cn, h2, code, y2, 36, *ser_size, indice);
+
+			Parm_serial(indice[0], 9, &prms);
+			Parm_serial(indice[1], 9, &prms);
+			Parm_serial(indice[2], 9, &prms);
+			Parm_serial(indice[3], 9, &prms);
+		} else if(*ser_size <= NBBITS_14k)
+		{
+			ACELP_4t64_fx(dn, cn, h2, code, y2, 44, *ser_size, indice);
+
+			Parm_serial(indice[0], 13, &prms);
+			Parm_serial(indice[1], 13, &prms);
+			Parm_serial(indice[2], 9, &prms);
+			Parm_serial(indice[3], 9, &prms);
+		} else if(*ser_size <= NBBITS_16k)
+		{
+			ACELP_4t64_fx(dn, cn, h2, code, y2, 52, *ser_size, indice);
+
+			Parm_serial(indice[0], 13, &prms);
+			Parm_serial(indice[1], 13, &prms);
+			Parm_serial(indice[2], 13, &prms);
+			Parm_serial(indice[3], 13, &prms);
+		} else if(*ser_size <= NBBITS_18k)
+		{
+			ACELP_4t64_fx(dn, cn, h2, code, y2, 64, *ser_size, indice);
+
+			Parm_serial(indice[0], 2, &prms);
+			Parm_serial(indice[1], 2, &prms);
+			Parm_serial(indice[2], 2, &prms);
+			Parm_serial(indice[3], 2, &prms);
+			Parm_serial(indice[4], 14, &prms);
+			Parm_serial(indice[5], 14, &prms);
+			Parm_serial(indice[6], 14, &prms);
+			Parm_serial(indice[7], 14, &prms);
+		} else if(*ser_size <= NBBITS_20k)
+		{
+			ACELP_4t64_fx(dn, cn, h2, code, y2, 72, *ser_size, indice);
+
+			Parm_serial(indice[0], 10, &prms);
+			Parm_serial(indice[1], 10, &prms);
+			Parm_serial(indice[2], 2, &prms);
+			Parm_serial(indice[3], 2, &prms);
+			Parm_serial(indice[4], 10, &prms);
+			Parm_serial(indice[5], 10, &prms);
+			Parm_serial(indice[6], 14, &prms);
+			Parm_serial(indice[7], 14, &prms);
+		} else
+		{
+			ACELP_4t64_fx(dn, cn, h2, code, y2, 88, *ser_size, indice);
+
+			Parm_serial(indice[0], 11, &prms);
+			Parm_serial(indice[1], 11, &prms);
+			Parm_serial(indice[2], 11, &prms);
+			Parm_serial(indice[3], 11, &prms);
+			Parm_serial(indice[4], 11, &prms);
+			Parm_serial(indice[5], 11, &prms);
+			Parm_serial(indice[6], 11, &prms);
+			Parm_serial(indice[7], 11, &prms);
+		}
+		/*-------------------------------------------------------*
+		 * - Add the fixed-gain pitch contribution to code[].    *
+		 *-------------------------------------------------------*/
+		tmp = 0; 
+		Preemph(code, st->tilt_code, L_SUBFR, &tmp);
+		Pit_shrp(code, T0, PIT_SHARP, L_SUBFR);
+		/*----------------------------------------------------------*
+		 *  - Compute the fixed codebook gain                       *
+		 *  - quantize fixed codebook gain                          *
+		 *----------------------------------------------------------*/
+		if(*ser_size <= NBBITS_9k)
+		{
+			index = Q_gain2(xn, y1, Q_new + shift, y2, code, g_coeff, L_SUBFR, 6,
+					&gain_pit, &L_gain_code, clip_gain, st->qua_gain);
+			Parm_serial(index, 6, &prms);
+		} else
+		{
+			index = Q_gain2(xn, y1, Q_new + shift, y2, code, g_coeff, L_SUBFR, 7,
+					&gain_pit, &L_gain_code, clip_gain, st->qua_gain);
+			Parm_serial(index, 7, &prms);
+		}
+		/* test quantized gain of pitch for pitch clipping algorithm */
+		Gp_clip_test_gain_pit(gain_pit, st->gp_clip);
+
+		L_tmp = L_shl(L_gain_code, Q_new); 
+		gain_code = extract_h(L_add(L_tmp, 0x8000));
+
+		/*----------------------------------------------------------*
+		 * Update parameters for the next subframe.                 *
+		 * - tilt of code: 0.0 (unvoiced) to 0.5 (voiced)           *
+		 *----------------------------------------------------------*/
+		/* find voice factor in Q15 (1=voiced, -1=unvoiced) */
+		Copy(&exc[i_subfr], exc2, L_SUBFR);
+
+#ifdef ASM_OPT                           /* asm optimization branch */
+		Scale_sig_opt(exc2, L_SUBFR, shift);
+#else
+		Scale_sig(exc2, L_SUBFR, shift);
+#endif
+		voice_fac = voice_factor(exc2, shift, gain_pit, code, gain_code, L_SUBFR);
+		/* tilt of code for next subframe: 0.5=voiced, 0=unvoiced */
+		st->tilt_code = ((voice_fac >> 2) + 8192);
+		/*------------------------------------------------------*
+		 * - Update filter's memory "mem_w0" for finding the    *
+		 *   target vector in the next subframe.                *
+		 * - Find the total excitation                          *
+		 * - Find synthesis speech to update mem_syn[].         *
+		 *------------------------------------------------------*/
+
+		/* y2 in Q9, gain_pit in Q14 */
+		L_tmp = (gain_code * y2[L_SUBFR - 1])<<1;
+		L_tmp = L_shl(L_tmp, (5 + shift));
+		L_tmp = L_negate(L_tmp);
+		L_tmp += (xn[L_SUBFR - 1] * 16384)<<1;
+		L_tmp -= (y1[L_SUBFR - 1] * gain_pit)<<1;
+		L_tmp = L_shl(L_tmp, (1 - shift));
+		st->mem_w0 = extract_h(L_add(L_tmp, 0x8000));
+
+		if (*ser_size >= NBBITS_24k)
+			Copy(&exc[i_subfr], exc2, L_SUBFR);
+
+		for (i = 0; i < L_SUBFR; i++)
+		{
+			/* code in Q9, gain_pit in Q14 */
+			L_tmp = (gain_code * code[i])<<1;
+			L_tmp = (L_tmp << 5);
+			L_tmp += (exc[i + i_subfr] * gain_pit)<<1;
+			L_tmp = L_shl2(L_tmp, 1); 
+			exc[i + i_subfr] = extract_h(L_add(L_tmp, 0x8000));
+		}
+
+		Syn_filt(p_Aq,&exc[i_subfr], synth, L_SUBFR, st->mem_syn, 1);
+
+		if(*ser_size >= NBBITS_24k)
+		{
+			/*------------------------------------------------------------*
+			 * phase dispersion to enhance noise in low bit rate          *
+			 *------------------------------------------------------------*/
+			/* L_gain_code in Q16 */
+			VO_L_Extract(L_gain_code, &gain_code, &gain_code_lo);
+
+			/*------------------------------------------------------------*
+			 * noise enhancer                                             *
+			 * ~~~~~~~~~~~~~~                                             *
+			 * - Enhance excitation on noise. (modify gain of code)       *
+			 *   If signal is noisy and LPC filter is stable, move gain   *
+			 *   of code 1.5 dB toward gain of code threshold.            *
+			 *   This decrease by 3 dB noise energy variation.            *
+			 *------------------------------------------------------------*/
+			tmp = (16384 - (voice_fac >> 1));        /* 1=unvoiced, 0=voiced */
+			fac = vo_mult(stab_fac, tmp);
+			L_tmp = L_gain_code; 
+			if(L_tmp < st->L_gc_thres)
+			{
+				L_tmp = vo_L_add(L_tmp, Mpy_32_16(gain_code, gain_code_lo, 6226));
+				if(L_tmp > st->L_gc_thres)
+				{
+					L_tmp = st->L_gc_thres;
+				}
+			} else
+			{
+				L_tmp = Mpy_32_16(gain_code, gain_code_lo, 27536);
+				if(L_tmp < st->L_gc_thres)
+				{
+					L_tmp = st->L_gc_thres;
+				}
+			}
+			st->L_gc_thres = L_tmp;
+
+			L_gain_code = Mpy_32_16(gain_code, gain_code_lo, (32767 - fac));
+			VO_L_Extract(L_tmp, &gain_code, &gain_code_lo);
+			L_gain_code = vo_L_add(L_gain_code, Mpy_32_16(gain_code, gain_code_lo, fac));
+
+			/*------------------------------------------------------------*
+			 * pitch enhancer                                             *
+			 * ~~~~~~~~~~~~~~                                             *
+			 * - Enhance excitation on voice. (HP filtering of code)      *
+			 *   On voiced signal, filtering of code by a smooth fir HP   *
+			 *   filter to decrease energy of code in low frequency.      *
+			 *------------------------------------------------------------*/
+
+			tmp = ((voice_fac >> 3) + 4096); /* 0.25=voiced, 0=unvoiced */
+
+			L_tmp = L_deposit_h(code[0]);
+			L_tmp -= (code[1] * tmp)<<1;
+			code2[0] = vo_round(L_tmp); 
+
+			for (i = 1; i < L_SUBFR - 1; i++)
+			{
+				L_tmp = L_deposit_h(code[i]);
+				L_tmp -= (code[i + 1] * tmp)<<1;
+				L_tmp -= (code[i - 1] * tmp)<<1;
+				code2[i] = vo_round(L_tmp); 
+			}
+
+			L_tmp = L_deposit_h(code[L_SUBFR - 1]);
+			L_tmp -= (code[L_SUBFR - 2] * tmp)<<1;
+			code2[L_SUBFR - 1] = vo_round(L_tmp); 
+
+			/* build excitation */
+			gain_code = vo_round(L_shl(L_gain_code, Q_new));
+
+			for (i = 0; i < L_SUBFR; i++)
+			{
+				L_tmp = (code2[i] * gain_code)<<1;
+				L_tmp = (L_tmp << 5);
+				L_tmp += (exc2[i] * gain_pit)<<1;
+				L_tmp = (L_tmp << 1);
+				exc2[i] = vo_round(L_tmp);
+			}
+
+			corr_gain = synthesis(p_Aq, exc2, Q_new, &speech16k[i_subfr * 5 / 4], st);
+			Parm_serial(corr_gain, 4, &prms);
+		}
+		p_A += (M + 1);
+		p_Aq += (M + 1);
+	}                                      /* end of subframe loop */
+
+	/*--------------------------------------------------*
+	 * Update signal for next frame.                    *
+	 * -> save past of speech[], wsp[] and exc[].       *
+	 *--------------------------------------------------*/
+	Copy(&old_speech[L_FRAME], st->old_speech, L_TOTAL - L_FRAME);
+	Copy(&old_wsp[L_FRAME / OPL_DECIM], st->old_wsp, PIT_MAX / OPL_DECIM);
+	Copy(&old_exc[L_FRAME], st->old_exc, PIT_MAX + L_INTERPOL);
+	return;
+}
+
+/*-----------------------------------------------------*
+* Function synthesis()                                *
+*                                                     *
+* Synthesis of signal at 16kHz with HF extension.     *
+*                                                     *
+*-----------------------------------------------------*/
+
+static Word16 synthesis(
+		Word16 Aq[],                          /* A(z)  : quantized Az               */
+		Word16 exc[],                         /* (i)   : excitation at 12kHz        */
+		Word16 Q_new,                         /* (i)   : scaling performed on exc   */
+		Word16 synth16k[],                    /* (o)   : 16kHz synthesis signal     */
+		Coder_State * st                      /* (i/o) : State structure            */
+		)
+{
+	Word16 fac, tmp, exp;
+	Word16 ener, exp_ener;
+	Word32 L_tmp, i;
+
+	Word16 synth_hi[M + L_SUBFR], synth_lo[M + L_SUBFR];
+	Word16 synth[L_SUBFR];
+	Word16 HF[L_SUBFR16k];                 /* High Frequency vector      */
+	Word16 Ap[M + 1];
+
+	Word16 HF_SP[L_SUBFR16k];              /* High Frequency vector (from original signal) */
+
+	Word16 HP_est_gain, HP_calc_gain, HP_corr_gain;
+	Word16 dist_min, dist;
+	Word16 HP_gain_ind = 0;
+	Word16 gain1, gain2;
+	Word16 weight1, weight2;
+
+	/*------------------------------------------------------------*
+	 * speech synthesis                                           *
+	 * ~~~~~~~~~~~~~~~~                                           *
+	 * - Find synthesis speech corresponding to exc2[].           *
+	 * - Perform fixed deemphasis and hp 50hz filtering.          *
+	 * - Oversampling from 12.8kHz to 16kHz.                      *
+	 *------------------------------------------------------------*/
+	Copy(st->mem_syn_hi, synth_hi, M);
+	Copy(st->mem_syn_lo, synth_lo, M);
+
+#ifdef ASM_OPT                 /* asm optimization branch */
+	Syn_filt_32_asm(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR);
+#else
+	Syn_filt_32(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR);
+#endif
+
+	Copy(synth_hi + L_SUBFR, st->mem_syn_hi, M);
+	Copy(synth_lo + L_SUBFR, st->mem_syn_lo, M);
+
+#ifdef ASM_OPT                 /* asm optimization branch */
+	Deemph_32_asm(synth_hi + M, synth_lo + M, synth, &(st->mem_deemph));
+#else
+	Deemph_32(synth_hi + M, synth_lo + M, synth, PREEMPH_FAC, L_SUBFR, &(st->mem_deemph));
+#endif
+
+	HP50_12k8(synth, L_SUBFR, st->mem_sig_out);
+
+	/* Original speech signal as reference for high band gain quantisation */
+	for (i = 0; i < L_SUBFR16k; i++)
+	{
+		HF_SP[i] = synth16k[i]; 
+	}
+
+	/*------------------------------------------------------*
+	 * HF noise synthesis                                   *
+	 * ~~~~~~~~~~~~~~~~~~                                   *
+	 * - Generate HF noise between 5.5 and 7.5 kHz.         *
+	 * - Set energy of noise according to synthesis tilt.   *
+	 *     tilt > 0.8 ==> - 14 dB (voiced)                  *
+	 *     tilt   0.5 ==> - 6 dB  (voiced or noise)         *
+	 *     tilt < 0.0 ==>   0 dB  (noise)                   *
+	 *------------------------------------------------------*/
+	/* generate white noise vector */
+	for (i = 0; i < L_SUBFR16k; i++)
+	{
+		HF[i] = Random(&(st->seed2))>>3;
+	}
+	/* energy of excitation */
+#ifdef ASM_OPT                    /* asm optimization branch */
+	Scale_sig_opt(exc, L_SUBFR, -3);
+	Q_new = Q_new - 3;
+	ener = extract_h(Dot_product12_asm(exc, exc, L_SUBFR, &exp_ener));
+#else
+	Scale_sig(exc, L_SUBFR, -3);
+	Q_new = Q_new - 3;
+	ener = extract_h(Dot_product12(exc, exc, L_SUBFR, &exp_ener));
+#endif
+
+	exp_ener = exp_ener - (Q_new + Q_new);
+	/* set energy of white noise to energy of excitation */
+#ifdef ASM_OPT              /* asm optimization branch */
+	tmp = extract_h(Dot_product12_asm(HF, HF, L_SUBFR16k, &exp));
+#else
+	tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp));
+#endif
+
+	if(tmp > ener)
+	{
+		tmp = (tmp >> 1);                 /* Be sure tmp < ener */
+		exp = (exp + 1);
+	}
+	L_tmp = L_deposit_h(div_s(tmp, ener)); /* result is normalized */
+	exp = (exp - exp_ener);
+	Isqrt_n(&L_tmp, &exp);
+	L_tmp = L_shl(L_tmp, (exp + 1));       /* L_tmp x 2, L_tmp in Q31 */
+	tmp = extract_h(L_tmp);                /* tmp = 2 x sqrt(ener_exc/ener_hf) */
+
+	for (i = 0; i < L_SUBFR16k; i++)
+	{
+		HF[i] = vo_mult(HF[i], tmp);
+	}
+
+	/* find tilt of synthesis speech (tilt: 1=voiced, -1=unvoiced) */
+	HP400_12k8(synth, L_SUBFR, st->mem_hp400);
+
+	L_tmp = 1L;
+	for (i = 0; i < L_SUBFR; i++)
+		L_tmp += (synth[i] * synth[i])<<1;
+
+	exp = norm_l(L_tmp);
+	ener = extract_h(L_tmp << exp);   /* ener = r[0] */
+
+	L_tmp = 1L;
+	for (i = 1; i < L_SUBFR; i++)
+		L_tmp +=(synth[i] * synth[i - 1])<<1;
+
+	tmp = extract_h(L_tmp << exp);    /* tmp = r[1] */
+
+	if (tmp > 0)
+	{
+		fac = div_s(tmp, ener);
+	} else
+	{
+		fac = 0; 
+	}
+
+	/* modify energy of white noise according to synthesis tilt */
+	gain1 = 32767 - fac;
+	gain2 = vo_mult(gain1, 20480);
+	gain2 = shl(gain2, 1);
+
+	if (st->vad_hist > 0)
+	{
+		weight1 = 0;
+		weight2 = 32767;
+	} else
+	{
+		weight1 = 32767;
+		weight2 = 0;
+	}
+	tmp = vo_mult(weight1, gain1);
+	tmp = add1(tmp, vo_mult(weight2, gain2));
+
+	if (tmp != 0)
+	{
+		tmp = (tmp + 1);
+	}
+	HP_est_gain = tmp;
+
+	if(HP_est_gain < 3277)
+	{
+		HP_est_gain = 3277;                /* 0.1 in Q15 */
+	}
+	/* synthesis of noise: 4.8kHz..5.6kHz --> 6kHz..7kHz */
+	Weight_a(Aq, Ap, 19661, M);            /* fac=0.6 */
+
+#ifdef ASM_OPT                /* asm optimization branch */
+	Syn_filt_asm(Ap, HF, HF, st->mem_syn_hf);
+	/* noise High Pass filtering (1ms of delay) */
+	Filt_6k_7k_asm(HF, L_SUBFR16k, st->mem_hf);
+	/* filtering of the original signal */
+	Filt_6k_7k_asm(HF_SP, L_SUBFR16k, st->mem_hf2);
+
+	/* check the gain difference */
+	Scale_sig_opt(HF_SP, L_SUBFR16k, -1);
+	ener = extract_h(Dot_product12_asm(HF_SP, HF_SP, L_SUBFR16k, &exp_ener));
+	/* set energy of white noise to energy of excitation */
+	tmp = extract_h(Dot_product12_asm(HF, HF, L_SUBFR16k, &exp));
+#else
+	Syn_filt(Ap, HF, HF, L_SUBFR16k, st->mem_syn_hf, 1);
+	/* noise High Pass filtering (1ms of delay) */
+	Filt_6k_7k(HF, L_SUBFR16k, st->mem_hf);
+	/* filtering of the original signal */
+	Filt_6k_7k(HF_SP, L_SUBFR16k, st->mem_hf2);
+	/* check the gain difference */
+	Scale_sig(HF_SP, L_SUBFR16k, -1);
+	ener = extract_h(Dot_product12(HF_SP, HF_SP, L_SUBFR16k, &exp_ener));
+	/* set energy of white noise to energy of excitation */
+	tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp));
+#endif
+
+	if (tmp > ener)
+	{
+		tmp = (tmp >> 1);                 /* Be sure tmp < ener */
+		exp = (exp + 1);
+	}
+	L_tmp = L_deposit_h(div_s(tmp, ener)); /* result is normalized */
+	exp = vo_sub(exp, exp_ener);
+	Isqrt_n(&L_tmp, &exp);
+	L_tmp = L_shl(L_tmp, exp);             /* L_tmp, L_tmp in Q31 */
+	HP_calc_gain = extract_h(L_tmp);       /* tmp = sqrt(ener_input/ener_hf) */
+
+	/* st->gain_alpha *= st->dtx_encSt->dtxHangoverCount/7 */
+	L_tmp = (vo_L_mult(st->dtx_encSt->dtxHangoverCount, 4681) << 15);
+	st->gain_alpha = vo_mult(st->gain_alpha, extract_h(L_tmp));
+
+	if(st->dtx_encSt->dtxHangoverCount > 6)
+		st->gain_alpha = 32767;
+	HP_est_gain = HP_est_gain >> 1;     /* From Q15 to Q14 */
+	HP_corr_gain = add1(vo_mult(HP_calc_gain, st->gain_alpha), vo_mult((32767 - st->gain_alpha), HP_est_gain));
+
+	/* Quantise the correction gain */
+	dist_min = 32767;
+	for (i = 0; i < 16; i++)
+	{
+		dist = vo_mult((HP_corr_gain - HP_gain[i]), (HP_corr_gain - HP_gain[i]));
+		if (dist_min > dist)
+		{
+			dist_min = dist;
+			HP_gain_ind = i;
+		}
+	}
+	HP_corr_gain = HP_gain[HP_gain_ind];
+	/* return the quantised gain index when using the highest mode, otherwise zero */
+	return (HP_gain_ind);
+}
+
+/*************************************************
+*
+* Breif: Codec main function 
+*
+**************************************************/
+
+int AMR_Enc_Encode(HAMRENC hCodec)
+{
+	Word32 i;
+	Coder_State *gData = (Coder_State*)hCodec;
+	Word16 *signal;
+	Word16 packed_size = 0;
+	Word16 prms[NB_BITS_MAX];
+	Word16 coding_mode = 0, nb_bits, allow_dtx, mode, reset_flag;
+	mode = gData->mode;
+	coding_mode = gData->mode;
+	nb_bits = nb_of_bits[mode];
+	signal = (Word16 *)gData->inputStream;
+	allow_dtx = gData->allow_dtx;
+
+	/* check for homing frame */
+	reset_flag = encoder_homing_frame_test(signal);
+
+	for (i = 0; i < L_FRAME16k; i++)   /* Delete the 2 LSBs (14-bit input) */
+	{
+		*(signal + i) = (Word16) (*(signal + i) & 0xfffC);
+	}
+
+	coder(&coding_mode, signal, prms, &nb_bits, gData, allow_dtx);
+	packed_size = PackBits(prms, coding_mode, mode, gData);
+	if (reset_flag != 0)
+	{
+		Reset_encoder(gData, 1);
+	}
+	return packed_size;
+}
+
+/***************************************************************************
+*
+*Brief: Codec API function --- Initialize the codec and return a codec handle
+*
+***************************************************************************/
+
+VO_U32 VO_API voAMRWB_Init(VO_HANDLE * phCodec,                   /* o: the audio codec handle */
+						   VO_AUDIO_CODINGTYPE vType,             /* i: Codec Type ID */
+						   VO_CODEC_INIT_USERDATA * pUserData     /* i: init Parameters */
+						   )
+{
+	Coder_State *st;
+	FrameStream *stream;
+#ifdef USE_DEAULT_MEM
+	VO_MEM_OPERATOR voMemoprator;
+#endif
+	VO_MEM_OPERATOR *pMemOP;
+	int interMem = 0;
+
+	if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL )
+	{
+#ifdef USE_DEAULT_MEM
+		voMemoprator.Alloc = cmnMemAlloc;
+		voMemoprator.Copy = cmnMemCopy;
+		voMemoprator.Free = cmnMemFree;
+		voMemoprator.Set = cmnMemSet;
+		voMemoprator.Check = cmnMemCheck;
+		interMem = 1;
+		pMemOP = &voMemoprator;
+#else
+		*phCodec = NULL;
+		return VO_ERR_INVALID_ARG;
+#endif
+	}
+	else
+	{
+		pMemOP = (VO_MEM_OPERATOR *)pUserData->memData;
+	} 
+	/*-------------------------------------------------------------------------*
+	 * Memory allocation for coder state.                                      *
+	 *-------------------------------------------------------------------------*/
+	if ((st = (Coder_State *)mem_malloc(pMemOP, sizeof(Coder_State), 32, VO_INDEX_ENC_AMRWB)) == NULL)
+	{
+		return VO_ERR_OUTOF_MEMORY;
+	}
+
+	st->vadSt = NULL;                      
+	st->dtx_encSt = NULL;                  
+	st->sid_update_counter = 3;
+	st->sid_handover_debt = 0;
+	st->prev_ft = TX_SPEECH;
+	st->inputStream = NULL;
+	st->inputSize = 0;
+
+	/* Default setting */
+	st->mode = VOAMRWB_MD2385;                        /* bit rate 23.85kbps */
+	st->frameType = VOAMRWB_RFC3267;                  /* frame type: RFC3267 */
+	st->allow_dtx = 0;                                /* disable DTX mode */
+
+	st->outputStream = NULL;
+	st->outputSize = 0;
+
+	st->stream = (FrameStream *)mem_malloc(pMemOP, sizeof(FrameStream), 32, VO_INDEX_ENC_AMRWB);
+	if(st->stream == NULL)
+		return VO_ERR_OUTOF_MEMORY;
+
+	st->stream->frame_ptr = (unsigned char *)mem_malloc(pMemOP, Frame_Maxsize, 32, VO_INDEX_ENC_AMRWB);
+	if(st->stream->frame_ptr == NULL)
+		return  VO_ERR_OUTOF_MEMORY;
+
+	stream = st->stream;
+	voAWB_InitFrameBuffer(stream);
+
+	wb_vad_init(&(st->vadSt), pMemOP);
+	dtx_enc_init(&(st->dtx_encSt), isf_init, pMemOP);
+
+	Reset_encoder((void *) st, 1);
+
+	if(interMem)
+	{
+		st->voMemoprator.Alloc = cmnMemAlloc;
+		st->voMemoprator.Copy = cmnMemCopy;
+		st->voMemoprator.Free = cmnMemFree;
+		st->voMemoprator.Set = cmnMemSet;
+		st->voMemoprator.Check = cmnMemCheck;
+		pMemOP = &st->voMemoprator;
+	}
+
+	st->pvoMemop = pMemOP;
+
+	*phCodec = (void *) st;
+
+	return VO_ERR_NONE;
+}
+
+/**********************************************************************************
+*
+* Brief: Codec API function: Input PCM data
+*
+***********************************************************************************/
+
+VO_U32 VO_API voAMRWB_SetInputData(
+		VO_HANDLE hCodec,                   /* i/o: The codec handle which was created by Init function */
+		VO_CODECBUFFER * pInput             /*   i: The input buffer parameter  */
+		)
+{
+	Coder_State  *gData;
+	FrameStream  *stream;
+
+	if(NULL == hCodec)
+	{
+		return VO_ERR_INVALID_ARG;
+	}
+
+	gData = (Coder_State *)hCodec;
+	stream = gData->stream;
+
+	if(NULL == pInput || NULL == pInput->Buffer || 0 > pInput->Length)
+	{
+		return VO_ERR_INVALID_ARG;
+	}
+
+	stream->set_ptr    = pInput->Buffer;
+	stream->set_len    = pInput->Length;
+	stream->frame_ptr  = stream->frame_ptr_bk;
+	stream->used_len   = 0;
+
+	return VO_ERR_NONE;
+}
+
+/**************************************************************************************
+*
+* Brief: Codec API function: Get the compression audio data frame by frame
+*
+***************************************************************************************/
+
+VO_U32 VO_API voAMRWB_GetOutputData(
+		VO_HANDLE hCodec,                    /* i: The Codec Handle which was created by Init function*/
+		VO_CODECBUFFER * pOutput,            /* o: The output audio data */
+		VO_AUDIO_OUTPUTINFO * pAudioFormat   /* o: The encoder module filled audio format and used the input size*/
+		)
+{
+	Coder_State* gData = (Coder_State*)hCodec;
+	VO_MEM_OPERATOR  *pMemOP;
+	FrameStream  *stream = (FrameStream *)gData->stream;
+	pMemOP = (VO_MEM_OPERATOR  *)gData->pvoMemop;
+
+	if(stream->framebuffer_len  < Frame_MaxByte)         /* check the work buffer len */
+	{
+		stream->frame_storelen = stream->framebuffer_len;
+		if(stream->frame_storelen)
+		{
+			pMemOP->Copy(VO_INDEX_ENC_AMRWB, stream->frame_ptr_bk , stream->frame_ptr , stream->frame_storelen);
+		}
+		if(stream->set_len > 0)
+		{
+			voAWB_UpdateFrameBuffer(stream, pMemOP);
+		}
+		if(stream->framebuffer_len < Frame_MaxByte)
+		{
+			if(pAudioFormat)
+				pAudioFormat->InputUsed = stream->used_len;
+			return VO_ERR_INPUT_BUFFER_SMALL;
+		}
+	}
+
+	gData->inputStream = stream->frame_ptr;
+	gData->outputStream = (unsigned short*)pOutput->Buffer;
+
+	gData->outputSize = AMR_Enc_Encode(gData);         /* encoder main function */
+
+	pOutput->Length = gData->outputSize;               /* get the output buffer length */
+	stream->frame_ptr += 640;                          /* update the work buffer ptr */
+	stream->framebuffer_len  -= 640;
+
+	if(pAudioFormat)                                   /* return output audio information */
+	{
+		pAudioFormat->Format.Channels = 1;
+		pAudioFormat->Format.SampleRate = 8000;
+		pAudioFormat->Format.SampleBits = 16;	
+		pAudioFormat->InputUsed = stream->used_len;
+	}
+	return VO_ERR_NONE;
+}
+
+/*************************************************************************
+*
+* Brief: Codec API function---set the data by specified parameter ID
+*
+*************************************************************************/
+
+
+VO_U32 VO_API voAMRWB_SetParam(
+		VO_HANDLE hCodec,   /* i/o: The Codec Handle which was created by Init function */
+		VO_S32 uParamID,    /*   i: The param ID */
+		VO_PTR pData        /*   i: The param value depend on the ID */
+		)
+{
+	Coder_State* gData = (Coder_State*)hCodec;
+	FrameStream *stream = (FrameStream *)(gData->stream);
+	int *lValue = (int*)pData;
+
+	switch(uParamID)
+	{
+		/* setting AMR-WB frame type*/
+		case VO_PID_AMRWB_FRAMETYPE:
+			if(*lValue < VOAMRWB_DEFAULT || *lValue > VOAMRWB_RFC3267)
+				return VO_ERR_WRONG_PARAM_ID; 
+			gData->frameType = *lValue;
+			break;
+		/* setting AMR-WB bit rate */
+		case VO_PID_AMRWB_MODE:
+			{
+				if(*lValue < VOAMRWB_MD66 || *lValue > VOAMRWB_MD2385)
+					return VO_ERR_WRONG_PARAM_ID; 
+				gData->mode = *lValue;
+			}
+			break;
+		/* enable or disable DTX mode */
+		case VO_PID_AMRWB_DTX:
+			gData->allow_dtx = (Word16)(*lValue);
+			break;
+
+		case VO_PID_COMMON_HEADDATA:
+			break;
+        /* flush the work buffer */
+		case VO_PID_COMMON_FLUSH:
+			stream->set_ptr = NULL;
+			stream->frame_storelen = 0;
+			stream->framebuffer_len = 0;
+			stream->set_len = 0;
+			break;
+
+		default:
+			return VO_ERR_WRONG_PARAM_ID;
+	}
+	return VO_ERR_NONE;
+}
+
+/**************************************************************************
+*
+*Brief: Codec API function---Get the data by specified parameter ID
+*
+***************************************************************************/
+
+VO_U32 VO_API voAMRWB_GetParam(
+		VO_HANDLE hCodec,      /* i: The Codec Handle which was created by Init function */
+		VO_S32 uParamID,       /* i: The param ID */
+		VO_PTR pData           /* o: The param value depend on the ID */
+		)
+{
+	int    temp;
+	Coder_State* gData = (Coder_State*)hCodec;
+
+	if (gData==NULL) 
+		return VO_ERR_INVALID_ARG;
+	switch(uParamID)
+	{
+		/* output audio format */
+		case VO_PID_AMRWB_FORMAT:
+			{
+				VO_AUDIO_FORMAT* fmt = (VO_AUDIO_FORMAT*)pData;
+				fmt->Channels   = 1;
+				fmt->SampleRate = 16000;
+				fmt->SampleBits = 16;
+				break;
+			}
+        /* output audio channel number */
+		case VO_PID_AMRWB_CHANNELS:
+			temp = 1;
+			pData = (void *)(&temp);
+			break;
+        /* output audio sample rate */
+		case VO_PID_AMRWB_SAMPLERATE:
+			temp = 16000;
+			pData = (void *)(&temp);
+			break;
+		/* output audio frame type */
+		case VO_PID_AMRWB_FRAMETYPE:
+			temp = gData->frameType;
+			pData = (void *)(&temp);
+			break;
+		/* output audio bit rate */
+		case VO_PID_AMRWB_MODE:
+			temp = gData->mode;
+			pData = (void *)(&temp);
+			break;
+		default:
+			return VO_ERR_WRONG_PARAM_ID;
+	}
+
+	return VO_ERR_NONE;
+}
+
+/***********************************************************************************
+*
+* Brief: Codec API function---Release the codec after all encoder operations are done
+*
+*************************************************************************************/
+
+VO_U32 VO_API voAMRWB_Uninit(VO_HANDLE hCodec           /* i/o: Codec handle pointer */
+							 )
+{
+	Coder_State* gData = (Coder_State*)hCodec;
+	VO_MEM_OPERATOR *pMemOP;
+	pMemOP = gData->pvoMemop;
+
+	if(hCodec)
+	{
+		if(gData->stream)
+		{
+			if(gData->stream->frame_ptr_bk)
+			{
+				mem_free(pMemOP, gData->stream->frame_ptr_bk, VO_INDEX_ENC_AMRWB);
+				gData->stream->frame_ptr_bk = NULL;
+			}
+			mem_free(pMemOP, gData->stream, VO_INDEX_ENC_AMRWB);
+			gData->stream = NULL;
+		}
+		wb_vad_exit(&(((Coder_State *) gData)->vadSt), pMemOP);
+		dtx_enc_exit(&(((Coder_State *) gData)->dtx_encSt), pMemOP);
+
+		mem_free(pMemOP, hCodec, VO_INDEX_ENC_AMRWB);
+		hCodec = NULL;
+	}
+
+	return VO_ERR_NONE;
+}
+
+/********************************************************************************
+*
+* Brief: voGetAMRWBEncAPI gets the API handle of the codec
+*
+********************************************************************************/
+
+VO_S32 VO_API voGetAMRWBEncAPI(
+							   VO_AUDIO_CODECAPI * pEncHandle      /* i/o: Codec handle pointer */
+							   )
+{
+	if(NULL == pEncHandle)
+		return VO_ERR_INVALID_ARG;
+	pEncHandle->Init = voAMRWB_Init;
+	pEncHandle->SetInputData = voAMRWB_SetInputData;
+	pEncHandle->GetOutputData = voAMRWB_GetOutputData;
+	pEncHandle->SetParam = voAMRWB_SetParam;
+	pEncHandle->GetParam = voAMRWB_GetParam;
+	pEncHandle->Uninit = voAMRWB_Uninit;
+
+	return VO_ERR_NONE;
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/media/libstagefright/codecs/amrwbenc/src/voicefac.c b/media/libstagefright/codecs/amrwbenc/src/voicefac.c
index 187d774..17e4e55 100644
--- a/media/libstagefright/codecs/amrwbenc/src/voicefac.c
+++ b/media/libstagefright/codecs/amrwbenc/src/voicefac.c
@@ -1,92 +1,92 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*   File: voicefac.c                                                   *

-*                                                                      *

-*   Description: Find the voicing factors (1 = voice to -1 = unvoiced) *

-*                                                                      *                                                 

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-#include "math_op.h"

-

-Word16 voice_factor(                                  /* (o) Q15   : factor (-1=unvoiced to 1=voiced) */

-		Word16 exc[],                         /* (i) Q_exc : pitch excitation                 */

-		Word16 Q_exc,                         /* (i)       : exc format                       */

-		Word16 gain_pit,                      /* (i) Q14   : gain of pitch                    */

-		Word16 code[],                        /* (i) Q9    : Fixed codebook excitation        */

-		Word16 gain_code,                     /* (i) Q0    : gain of code                     */

-		Word16 L_subfr                        /* (i)       : subframe length                  */

-		)

-{

-	Word16 tmp, exp, ener1, exp1, ener2, exp2;

-	Word32 i, L_tmp;

-

-#ifdef ASM_OPT               /* asm optimization branch */

-	ener1 = extract_h(Dot_product12_asm(exc, exc, L_subfr, &exp1));

-#else

-	ener1 = extract_h(Dot_product12(exc, exc, L_subfr, &exp1));

-#endif

-	exp1 = exp1 - (Q_exc + Q_exc);

-	L_tmp = vo_L_mult(gain_pit, gain_pit);

-	exp = norm_l(L_tmp);

-	tmp = extract_h(L_tmp << exp);

-	ener1 = vo_mult(ener1, tmp);

-	exp1 = exp1 - exp - 10;        /* 10 -> gain_pit Q14 to Q9 */

-

-#ifdef ASM_OPT                /* asm optimization branch */

-	ener2 = extract_h(Dot_product12_asm(code, code, L_subfr, &exp2));

-#else

-	ener2 = extract_h(Dot_product12(code, code, L_subfr, &exp2));

-#endif

-

-	exp = norm_s(gain_code);

-	tmp = gain_code << exp;

-	tmp = vo_mult(tmp, tmp);

-	ener2 = vo_mult(ener2, tmp);

-	exp2 = exp2 - (exp + exp);

-

-	i = exp1 - exp2;

-

-	if (i >= 0)

-	{

-		ener1 = ener1 >> 1;

-		ener2 = ener2 >> (i + 1);

-	} else

-	{

-		ener1 = ener1 >> (1 - i);

-		ener2 = ener2 >> 1;

-	}

-

-	tmp = vo_sub(ener1, ener2);

-	ener1 = add1(add1(ener1, ener2), 1);

-

-	if (tmp >= 0)

-	{

-		tmp = div_s(tmp, ener1);

-	} else

-	{

-		tmp = vo_negate(div_s(vo_negate(tmp), ener1));

-	}

-

-	return (tmp);

-}

-

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*   File: voicefac.c                                                   *
+*                                                                      *
+*   Description: Find the voicing factors (1 = voice to -1 = unvoiced) *
+*                                                                      *                                                 
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+
+Word16 voice_factor(                                  /* (o) Q15   : factor (-1=unvoiced to 1=voiced) */
+		Word16 exc[],                         /* (i) Q_exc : pitch excitation                 */
+		Word16 Q_exc,                         /* (i)       : exc format                       */
+		Word16 gain_pit,                      /* (i) Q14   : gain of pitch                    */
+		Word16 code[],                        /* (i) Q9    : Fixed codebook excitation        */
+		Word16 gain_code,                     /* (i) Q0    : gain of code                     */
+		Word16 L_subfr                        /* (i)       : subframe length                  */
+		)
+{
+	Word16 tmp, exp, ener1, exp1, ener2, exp2;
+	Word32 i, L_tmp;
+
+#ifdef ASM_OPT               /* asm optimization branch */
+	ener1 = extract_h(Dot_product12_asm(exc, exc, L_subfr, &exp1));
+#else
+	ener1 = extract_h(Dot_product12(exc, exc, L_subfr, &exp1));
+#endif
+	exp1 = exp1 - (Q_exc + Q_exc);
+	L_tmp = vo_L_mult(gain_pit, gain_pit);
+	exp = norm_l(L_tmp);
+	tmp = extract_h(L_tmp << exp);
+	ener1 = vo_mult(ener1, tmp);
+	exp1 = exp1 - exp - 10;        /* 10 -> gain_pit Q14 to Q9 */
+
+#ifdef ASM_OPT                /* asm optimization branch */
+	ener2 = extract_h(Dot_product12_asm(code, code, L_subfr, &exp2));
+#else
+	ener2 = extract_h(Dot_product12(code, code, L_subfr, &exp2));
+#endif
+
+	exp = norm_s(gain_code);
+	tmp = gain_code << exp;
+	tmp = vo_mult(tmp, tmp);
+	ener2 = vo_mult(ener2, tmp);
+	exp2 = exp2 - (exp + exp);
+
+	i = exp1 - exp2;
+
+	if (i >= 0)
+	{
+		ener1 = ener1 >> 1;
+		ener2 = ener2 >> (i + 1);
+	} else
+	{
+		ener1 = ener1 >> (1 - i);
+		ener2 = ener2 >> 1;
+	}
+
+	tmp = vo_sub(ener1, ener2);
+	ener1 = add1(add1(ener1, ener2), 1);
+
+	if (tmp >= 0)
+	{
+		tmp = div_s(tmp, ener1);
+	} else
+	{
+		tmp = vo_negate(div_s(vo_negate(tmp), ener1));
+	}
+
+	return (tmp);
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/wb_vad.c b/media/libstagefright/codecs/amrwbenc/src/wb_vad.c
index 0126853..7e1d673 100644
--- a/media/libstagefright/codecs/amrwbenc/src/wb_vad.c
+++ b/media/libstagefright/codecs/amrwbenc/src/wb_vad.c
@@ -1,808 +1,808 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*      File: wb_vad.c                                                  *

-*                                                                      *

-*      Description: Voice Activity Detection                           *

-*                                                                      *

-************************************************************************/

-

-#include <stdlib.h>

-#include <stdio.h>

-#include "cnst.h"

-#include "wb_vad.h"

-#include "typedef.h"

-#include "basic_op.h"

-#include "math_op.h"

-#include "wb_vad_c.h"

-#include "mem_align.h"

-

-/******************************************************************************

-*  Calculate Log2 and scale the signal:

-*

-*    ilog2(Word32 in) = -1024*log10(in * 2^-31)/log10(2), where in = [1, 2^31-1]

-*

-*  input   output

-*  32768   16384

-*  1       31744

-*

-* When input is in the range of [1,2^16], max error is 0.0380%.

-*********************************************************************************/

-

-static Word16 ilog2(                       /* return: output value of the log2 */

-		Word16 mant                        /* i: value to be converted */

-		)

-{

-	Word16 ex, ex2, res;

-	Word32 i, l_temp;

-

-	if (mant <= 0)

-	{

-		mant = 1;                         

-	}

-	ex = norm_s(mant);

-	mant = mant << ex;

-

-	for (i = 0; i < 3; i++)

-		mant = vo_mult(mant, mant);

-	l_temp = vo_L_mult(mant, mant);

-

-	ex2 = norm_l(l_temp);

-	mant = extract_h(l_temp << ex2);

-

-	res = (ex + 16) << 10;

-	res = add1(res, (ex2 << 6));

-	res = vo_sub(add1(res, 127), (mant >> 8));

-	return (res);

-}

-

-/******************************************************************************

-*

-*     Function     : filter5

-*     Purpose      : Fifth-order half-band lowpass/highpass filter pair with

-*                    decimation.

-*

-*******************************************************************************/

-

-static void filter5(

-		Word16 * in0,                         /* i/o : input values; output low-pass part  */

-		Word16 * in1,                         /* i/o : input values; output high-pass part */

-		Word16 data[]                         /* i/o : filter memory                       */

-		)

-{

-	Word16 temp0, temp1, temp2;

-

-	temp0 = vo_sub(*in0, vo_mult(COEFF5_1, data[0]));

-	temp1 = add1(data[0], vo_mult(COEFF5_1, temp0));

-	data[0] = temp0;                      

-

-	temp0 = vo_sub(*in1, vo_mult(COEFF5_2, data[1]));

-	temp2 = add1(data[1], vo_mult(COEFF5_2, temp0));

-	data[1] = temp0;                       

-

-	*in0 = extract_h((vo_L_add(temp1, temp2) << 15));   

-	*in1 = extract_h((vo_L_sub(temp1, temp2) << 15));  

-}

-

-/******************************************************************************

-*

-*     Function     : filter3

-*     Purpose      : Third-order half-band lowpass/highpass filter pair with

-*                    decimation.

-*

-*******************************************************************************/

-

-static void filter3(

-		Word16 * in0,                         /* i/o : input values; output low-pass part  */

-		Word16 * in1,                         /* i/o : input values; output high-pass part */

-		Word16 * data                         /* i/o : filter memory                       */

-		)

-{

-	Word16 temp1, temp2;

-

-	temp1 = vo_sub(*in1, vo_mult(COEFF3, *data));

-	temp2 = add1(*data, vo_mult(COEFF3, temp1));

-	*data = temp1;                        

-

-	*in1 = extract_h((vo_L_sub(*in0, temp2) << 15));   

-	*in0 = extract_h((vo_L_add(*in0, temp2) << 15));   

-}

-

-/******************************************************************************

-*

-*     Function   : level_calculation

-*     Purpose    : Calculate signal level in a sub-band. Level is calculated

-*                  by summing absolute values of the input data.

-*

-*                  Signal level calculated from of the end of the frame

-*                  (data[count1 - count2]) is stored to (*sub_level)

-*                  and added to the level of the next frame.

-*

-******************************************************************************/

-

-static Word16 level_calculation(                      /* return: signal level */

-		Word16 data[],                        /* i   : signal buffer                                    */

-		Word16 * sub_level,                   /* i   : level calculated at the end of the previous frame*/

-		                                      /* o   : level of signal calculated from the last         */

-		                                      /*       (count2 - count1) samples                        */

-		Word16 count1,                        /* i   : number of samples to be counted                  */

-		Word16 count2,                        /* i   : number of samples to be counted                  */

-		Word16 ind_m,                         /* i   : step size for the index of the data buffer       */

-		Word16 ind_a,                         /* i   : starting index of the data buffer                */

-		Word16 scale                          /* i   : scaling for the level calculation                */

-		)

-{

-	Word32 i, l_temp1, l_temp2;

-	Word16 level;

-

-	l_temp1 = 0L;                          

-	for (i = count1; i < count2; i++)

-	{

-		l_temp1 += (abs_s(data[ind_m * i + ind_a])<<1);

-	}

-

-	l_temp2 = vo_L_add(l_temp1, L_shl(*sub_level, 16 - scale));

-	*sub_level = extract_h(L_shl(l_temp1, scale));      

-

-	for (i = 0; i < count1; i++)

-	{

-		l_temp2 += (abs_s(data[ind_m * i + ind_a])<<1);

-	}

-	level = extract_h(L_shl2(l_temp2, scale));

-

-	return level;

-}

-

-/******************************************************************************

-*

-*     Function     : filter_bank

-*     Purpose      : Divide input signal into bands and calculate level of

-*                    the signal in each band

-*

-*******************************************************************************/

-

-static void filter_bank(

-		VadVars * st,                         /* i/o : State struct               */

-		Word16 in[],                          /* i   : input frame                */

-		Word16 level[]                        /* o   : signal levels at each band */

-		)

-{

-	Word32 i;

-	Word16 tmp_buf[FRAME_LEN];

-

-	/* shift input 1 bit down for safe scaling */

-	for (i = 0; i < FRAME_LEN; i++)

-	{

-		tmp_buf[i] = in[i] >> 1;       

-	}

-

-	/* run the filter bank */

-	for (i = 0; i < 128; i++)

-	{

-		filter5(&tmp_buf[2 * i], &tmp_buf[2 * i + 1], st->a_data5[0]);

-	}

-	for (i = 0; i < 64; i++)

-	{

-		filter5(&tmp_buf[4 * i], &tmp_buf[4 * i + 2], st->a_data5[1]);

-		filter5(&tmp_buf[4 * i + 1], &tmp_buf[4 * i + 3], st->a_data5[2]);

-	}

-	for (i = 0; i < 32; i++)

-	{

-		filter5(&tmp_buf[8 * i], &tmp_buf[8 * i + 4], st->a_data5[3]);

-		filter5(&tmp_buf[8 * i + 2], &tmp_buf[8 * i + 6], st->a_data5[4]);

-		filter3(&tmp_buf[8 * i + 3], &tmp_buf[8 * i + 7], &st->a_data3[0]);

-	}

-	for (i = 0; i < 16; i++)

-	{

-		filter3(&tmp_buf[16 * i + 0], &tmp_buf[16 * i + 8], &st->a_data3[1]);

-		filter3(&tmp_buf[16 * i + 4], &tmp_buf[16 * i + 12], &st->a_data3[2]);

-		filter3(&tmp_buf[16 * i + 6], &tmp_buf[16 * i + 14], &st->a_data3[3]);

-	}

-

-	for (i = 0; i < 8; i++)

-	{

-		filter3(&tmp_buf[32 * i + 0], &tmp_buf[32 * i + 16], &st->a_data3[4]);

-		filter3(&tmp_buf[32 * i + 8], &tmp_buf[32 * i + 24], &st->a_data3[5]);

-	}

-

-	/* calculate levels in each frequency band */

-

-	/* 4800 - 6400 Hz */

-	level[11] = level_calculation(tmp_buf, &st->sub_level[11], 16, 64, 4, 1, 14);   

-	/* 4000 - 4800 Hz */

-	level[10] = level_calculation(tmp_buf, &st->sub_level[10], 8, 32, 8, 7, 15);   

-	/* 3200 - 4000 Hz */

-	level[9] = level_calculation(tmp_buf, &st->sub_level[9],8, 32, 8, 3, 15);   

-	/* 2400 - 3200 Hz */

-	level[8] = level_calculation(tmp_buf, &st->sub_level[8],8, 32, 8, 2, 15);   

-	/* 2000 - 2400 Hz */

-	level[7] = level_calculation(tmp_buf, &st->sub_level[7],4, 16, 16, 14, 16);       

-	/* 1600 - 2000 Hz */

-	level[6] = level_calculation(tmp_buf, &st->sub_level[6],4, 16, 16, 6, 16);        

-	/* 1200 - 1600 Hz */

-	level[5] = level_calculation(tmp_buf, &st->sub_level[5],4, 16, 16, 4, 16);        

-	/* 800 - 1200 Hz */

-	level[4] = level_calculation(tmp_buf, &st->sub_level[4],4, 16, 16, 12, 16);       

-	/* 600 - 800 Hz */

-	level[3] = level_calculation(tmp_buf, &st->sub_level[3],2, 8, 32, 8, 17); 

-	/* 400 - 600 Hz */

-	level[2] = level_calculation(tmp_buf, &st->sub_level[2],2, 8, 32, 24, 17);        

-	/* 200 - 400 Hz */

-	level[1] = level_calculation(tmp_buf, &st->sub_level[1],2, 8, 32, 16, 17);        

-	/* 0 - 200 Hz */

-	level[0] = level_calculation(tmp_buf, &st->sub_level[0],2, 8, 32, 0, 17); 

-}

-

-/******************************************************************************

-*

-*     Function   : update_cntrl

-*     Purpose    : Control update of the background noise estimate.

-*

-*******************************************************************************/

-

-static void update_cntrl(

-		VadVars * st,                         /* i/o : State structure                    */

-		Word16 level[]                        /* i   : sub-band levels of the input frame */

-		)

-{

-	Word32 i;

-	Word16 num, temp, stat_rat, exp, denom;

-	Word16 alpha;

-

-	/* if a tone has been detected for a while, initialize stat_count */

-	if (sub((Word16) (st->tone_flag & 0x7c00), 0x7c00) == 0)

-	{

-		st->stat_count = STAT_COUNT;      

-	} else

-	{

-		/* if 8 last vad-decisions have been "0", reinitialize stat_count */

-		if ((st->vadreg & 0x7f80) == 0)

-		{

-			st->stat_count = STAT_COUNT;   

-		} else

-		{

-			stat_rat = 0;                  

-			for (i = 0; i < COMPLEN; i++)

-			{

-				if(level[i] > st->ave_level[i])

-				{

-					num = level[i];        

-					denom = st->ave_level[i];   

-				} else

-				{

-					num = st->ave_level[i];

-					denom = level[i];      

-				}

-				/* Limit nimimum value of num and denom to STAT_THR_LEVEL */

-				if(num < STAT_THR_LEVEL)

-				{

-					num = STAT_THR_LEVEL;  

-				}

-				if(denom < STAT_THR_LEVEL)

-				{

-					denom = STAT_THR_LEVEL;

-				}

-				exp = norm_s(denom);

-				denom = denom << exp;

-

-				/* stat_rat = num/denom * 64 */

-				temp = div_s(num >> 1, denom);

-				stat_rat = add1(stat_rat, shr(temp, (8 - exp)));

-			}

-

-			/* compare stat_rat with a threshold and update stat_count */

-			if(stat_rat > STAT_THR)

-			{

-				st->stat_count = STAT_COUNT;    

-			} else

-			{

-				if ((st->vadreg & 0x4000) != 0)

-				{

-

-					if (st->stat_count != 0)

-					{

-						st->stat_count = st->stat_count - 1;       

-					}

-				}

-			}

-		}

-	}

-

-	/* Update average amplitude estimate for stationarity estimation */

-	alpha = ALPHA4;                        

-	if(st->stat_count == STAT_COUNT)

-	{

-		alpha = 32767;                    

-	} else if ((st->vadreg & 0x4000) == 0)

-	{

-		alpha = ALPHA5;                   

-	}

-	for (i = 0; i < COMPLEN; i++)

-	{

-		st->ave_level[i] = add1(st->ave_level[i], vo_mult_r(alpha, vo_sub(level[i], st->ave_level[i])));   

-	}

-}

-

-/******************************************************************************

-*

-*     Function     : hangover_addition

-*     Purpose      : Add hangover after speech bursts

-*

-*******************************************************************************/

-

-static Word16 hangover_addition(                      /* return: VAD_flag indicating final VAD decision */

-		VadVars * st,                         /* i/o : State structure                     */

-		Word16 low_power,                     /* i   : flag power of the input frame    */

-		Word16 hang_len,                      /* i   : hangover length */

-		Word16 burst_len                      /* i   : minimum burst length for hangover addition */

-		)

-{

-	/* if the input power (pow_sum) is lower than a threshold, clear counters and set VAD_flag to "0"         */

-	if (low_power != 0)

-	{

-		st->burst_count = 0;               

-		st->hang_count = 0;                

-		return 0;

-	}

-	/* update the counters (hang_count, burst_count) */

-	if ((st->vadreg & 0x4000) != 0)

-	{

-		st->burst_count = st->burst_count + 1;    

-		if(st->burst_count >= burst_len)

-		{

-			st->hang_count = hang_len;     

-		}

-		return 1;

-	} else

-	{

-		st->burst_count = 0;               

-		if (st->hang_count > 0)

-		{

-			st->hang_count = st->hang_count - 1;    

-			return 1;

-		}

-	}

-	return 0;

-}

-

-/******************************************************************************

-*

-*     Function   : noise_estimate_update

-*     Purpose    : Update of background noise estimate

-*

-*******************************************************************************/

-

-static void noise_estimate_update(

-		VadVars * st,                         /* i/o : State structure                       */

-		Word16 level[]                        /* i   : sub-band levels of the input frame */

-		)

-{

-	Word32 i; 

-	Word16 alpha_up, alpha_down, bckr_add = 2;

-

-	/* Control update of bckr_est[] */

-	update_cntrl(st, level);

-

-	/* Choose update speed */

-	if ((0x7800 & st->vadreg) == 0)

-	{

-		alpha_up = ALPHA_UP1;              

-		alpha_down = ALPHA_DOWN1;          

-	} else

-	{

-		if ((st->stat_count == 0))

-		{

-			alpha_up = ALPHA_UP2;          

-			alpha_down = ALPHA_DOWN2;      

-		} else

-		{

-			alpha_up = 0;                  

-			alpha_down = ALPHA3;           

-			bckr_add = 0;                  

-		}

-	}

-

-	/* Update noise estimate (bckr_est) */

-	for (i = 0; i < COMPLEN; i++)

-	{

-		Word16 temp;

-		temp = (st->old_level[i] - st->bckr_est[i]);

-

-		if (temp < 0)

-		{                                  /* update downwards */

-			st->bckr_est[i] = add1(-2, add(st->bckr_est[i],vo_mult_r(alpha_down, temp))); 

-			/* limit minimum value of the noise estimate to NOISE_MIN */

-			if(st->bckr_est[i] < NOISE_MIN)

-			{

-				st->bckr_est[i] = NOISE_MIN;   

-			}

-		} else

-		{                                  /* update upwards */

-			st->bckr_est[i] = add1(bckr_add, add1(st->bckr_est[i],vo_mult_r(alpha_up, temp)));   

-

-			/* limit maximum value of the noise estimate to NOISE_MAX */

-			if(st->bckr_est[i] > NOISE_MAX)

-			{

-				st->bckr_est[i] = NOISE_MAX;    

-			}

-		}

-	}

-

-	/* Update signal levels of the previous frame (old_level) */

-	for (i = 0; i < COMPLEN; i++)

-	{

-		st->old_level[i] = level[i];      

-	}

-}

-

-/******************************************************************************

-*

-*     Function     : vad_decision

-*     Purpose      : Calculates VAD_flag

-*

-*******************************************************************************/

-

-static Word16 vad_decision(                           /* return value : VAD_flag */

-		VadVars * st,                         /* i/o : State structure                       */

-		Word16 level[COMPLEN],                /* i   : sub-band levels of the input frame */

-		Word32 pow_sum                        /* i   : power of the input frame           */

-		)

-{

-	Word32 i;

-	Word32 L_snr_sum;

-	Word32 L_temp;

-	Word16 vad_thr, temp, noise_level;

-	Word16 low_power_flag;

-	Word16 hang_len, burst_len;

-	Word16 ilog2_speech_level, ilog2_noise_level;

-	Word16 temp2;

-

-	/* Calculate squared sum of the input levels (level) divided by the background noise components

-	 * (bckr_est). */

-	L_snr_sum = 0;                        

-	for (i = 0; i < COMPLEN; i++)

-	{

-		Word16 exp;

-

-		exp = norm_s(st->bckr_est[i]);

-		temp = (st->bckr_est[i] << exp);

-		temp = div_s((level[i] >> 1), temp);

-		temp = shl(temp, (exp - (UNIRSHFT - 1)));

-		L_snr_sum = L_mac(L_snr_sum, temp, temp);

-	}

-

-	/* Calculate average level of estimated background noise */

-	L_temp = 0;                           

-	for (i = 1; i < COMPLEN; i++)          /* ignore lowest band */

-	{

-		L_temp = vo_L_add(L_temp, st->bckr_est[i]);

-	}

-

-	noise_level = extract_h((L_temp << 12));

-	/* if SNR is lower than a threshold (MIN_SPEECH_SNR), and increase speech_level */

-	temp = vo_mult(noise_level, MIN_SPEECH_SNR) << 3;

-

-	if(st->speech_level < temp)

-	{

-		st->speech_level = temp;          

-	}

-	ilog2_noise_level = ilog2(noise_level);

-

-	/* If SNR is very poor, speech_level is probably corrupted by noise level. This is correctred by

-	 * subtracting MIN_SPEECH_SNR*noise_level from speech level */

-	ilog2_speech_level = ilog2(st->speech_level - temp);

-

-	temp = add1(vo_mult(NO_SLOPE, (ilog2_noise_level - NO_P1)), THR_HIGH);

-

-	temp2 = add1(SP_CH_MIN, vo_mult(SP_SLOPE, (ilog2_speech_level - SP_P1)));

-	if (temp2 < SP_CH_MIN)

-	{

-		temp2 = SP_CH_MIN;                 

-	}

-	if (temp2 > SP_CH_MAX)

-	{

-		temp2 = SP_CH_MAX;                 

-	}

-	vad_thr = temp + temp2;

-

-	if(vad_thr < THR_MIN)

-	{

-		vad_thr = THR_MIN;                 

-	}

-	/* Shift VAD decision register */

-	st->vadreg = (st->vadreg >> 1);       

-

-	/* Make intermediate VAD decision */

-	if(L_snr_sum > vo_L_mult(vad_thr, (512 * COMPLEN)))

-	{

-		st->vadreg = (Word16) (st->vadreg | 0x4000); 

-	}

-	/* check if the input power (pow_sum) is lower than a threshold" */

-	if(pow_sum < VAD_POW_LOW)

-	{

-		low_power_flag = 1;               

-	} else

-	{

-		low_power_flag = 0;               

-	}

-	/* Update background noise estimates */

-	noise_estimate_update(st, level);

-

-	/* Calculate values for hang_len and burst_len based on vad_thr */

-	hang_len = add1(vo_mult(HANG_SLOPE, (vad_thr - HANG_P1)), HANG_HIGH);

-	if(hang_len < HANG_LOW)

-	{

-		hang_len = HANG_LOW;              

-	}

-	burst_len = add1(vo_mult(BURST_SLOPE, (vad_thr - BURST_P1)), BURST_HIGH);

-

-	return (hangover_addition(st, low_power_flag, hang_len, burst_len));

-}

-

-/******************************************************************************

-*

-*     Function : Estimate_Speech()

-*     Purpose  : Estimate speech level

-*

-* Maximum signal level is searched and stored to the variable sp_max.

-* The speech frames must locate within SP_EST_COUNT number of frames.

-* Thus, noisy frames having occasional VAD = "1" decisions will not

-* affect to the estimated speech_level.

-*

-*******************************************************************************/

-

-static void Estimate_Speech(

-		VadVars * st,                         /* i/o : State structure    */

-		Word16 in_level                       /* level of the input frame */

-		)

-{

-	Word16 alpha;

-

-	/* if the required activity count cannot be achieved, reset counters */

-	if((st->sp_est_cnt - st->sp_max_cnt) > (SP_EST_COUNT - SP_ACTIVITY_COUNT))

-	{

-		st->sp_est_cnt = 0;                

-		st->sp_max = 0;                    

-		st->sp_max_cnt = 0;                

-	}

-	st->sp_est_cnt += 1; 

-

-	if (((st->vadreg & 0x4000)||(in_level > st->speech_level)) && (in_level > MIN_SPEECH_LEVEL1))

-	{

-		/* update sp_max */

-		if(in_level > st->sp_max)

-		{

-			st->sp_max = in_level;         

-		}

-		st->sp_max_cnt += 1;        

-

-		if(st->sp_max_cnt >= SP_ACTIVITY_COUNT)

-		{

-			Word16 tmp;

-			/* update speech estimate */

-			tmp = (st->sp_max >> 1);      /* scale to get "average" speech level */

-

-			/* select update speed */

-			if(tmp > st->speech_level)

-			{

-				alpha = ALPHA_SP_UP;       

-			} else

-			{

-				alpha = ALPHA_SP_DOWN;    

-			}

-			if(tmp > MIN_SPEECH_LEVEL2)

-			{

-				st->speech_level = add1(st->speech_level, vo_mult_r(alpha, vo_sub(tmp, st->speech_level))); 

-			}

-			/* clear all counters used for speech estimation */

-			st->sp_max = 0;                

-			st->sp_max_cnt = 0;            

-			st->sp_est_cnt = 0;            

-		}

-	}

-}

-

-/******************************************************************************

-*

-*  Function:   wb_vad_init

-*  Purpose:    Allocates state memory and initializes state memory

-*

-*******************************************************************************/

-

-Word16 wb_vad_init(                        /* return: non-zero with error, zero for ok. */

-		VadVars ** state,                     /* i/o : State structure    */

-		VO_MEM_OPERATOR *pMemOP

-		)

-{

-	VadVars *s;

-

-	if (state == (VadVars **) NULL)

-	{

-		fprintf(stderr, "vad_init: invalid parameter\n");

-		return -1;

-	}

-	*state = NULL;

-

-	/* allocate memory */

-	if ((s = (VadVars *) mem_malloc(pMemOP, sizeof(VadVars), 32, VO_INDEX_ENC_AMRWB)) == NULL)

-	{

-		fprintf(stderr, "vad_init: can not malloc state structure\n");

-		return -1;

-	}

-	wb_vad_reset(s);

-

-	*state = s;

-

-	return 0;

-}

-

-/******************************************************************************

-*

-*  Function:   wb_vad_reset

-*  Purpose:    Initializes state memory

-*

-*******************************************************************************/

-

-Word16 wb_vad_reset(                       /* return: non-zero with error, zero for ok. */

-		VadVars * state                       /* i/o : State structure    */

-		)

-{

-	Word32 i, j;

-

-	if (state == (VadVars *) NULL)

-	{

-		fprintf(stderr, "vad_reset: invalid parameter\n");

-		return -1;

-	}

-	state->tone_flag = 0;

-	state->vadreg = 0;

-	state->hang_count = 0;

-	state->burst_count = 0;

-	state->hang_count = 0;

-

-	/* initialize memory used by the filter bank */

-	for (i = 0; i < F_5TH_CNT; i++)

-	{

-		for (j = 0; j < 2; j++)

-		{

-			state->a_data5[i][j] = 0;

-		}

-	}

-

-	for (i = 0; i < F_3TH_CNT; i++)

-	{

-		state->a_data3[i] = 0;

-	}

-

-	/* initialize the rest of the memory */

-	for (i = 0; i < COMPLEN; i++)

-	{

-		state->bckr_est[i] = NOISE_INIT;

-		state->old_level[i] = NOISE_INIT;

-		state->ave_level[i] = NOISE_INIT;

-		state->sub_level[i] = 0;

-	}

-

-	state->sp_est_cnt = 0;

-	state->sp_max = 0;

-	state->sp_max_cnt = 0;

-	state->speech_level = SPEECH_LEVEL_INIT;

-	state->prev_pow_sum = 0;

-	return 0;

-}

-

-/******************************************************************************

-*

-*  Function:   wb_vad_exit

-*  Purpose:    The memory used for state memory is freed

-*

-*******************************************************************************/

-

-void wb_vad_exit(

-		VadVars ** state,                      /* i/o : State structure    */

-		VO_MEM_OPERATOR *pMemOP

-		)

-{

-	if (state == NULL || *state == NULL)

-		return;

-	/* deallocate memory */

-	mem_free(pMemOP, *state, VO_INDEX_ENC_AMRWB);

-	*state = NULL;

-	return;

-}

-

-/******************************************************************************

-*

-*     Function     : wb_vad_tone_detection

-*     Purpose      : Search maximum pitch gain from a frame. Set tone flag if

-*                    pitch gain is high. This is used to detect

-*                    signaling tones and other signals with high pitch gain.

-*

-*******************************************************************************/

-

-void wb_vad_tone_detection(

-		VadVars * st,                         /* i/o : State struct            */

-		Word16 p_gain                         /* pitch gain      */

-		)

-{

-	/* update tone flag */

-	st->tone_flag = (st->tone_flag >> 1);

-

-	/* if (pitch_gain > TONE_THR) set tone flag */

-	if (p_gain > TONE_THR)

-	{

-		st->tone_flag = (Word16) (st->tone_flag | 0x4000);

-	}

-}

-

-/******************************************************************************

-*

-*     Function     : wb_vad

-*     Purpose      : Main program for Voice Activity Detection (VAD) for AMR

-*

-*******************************************************************************/

-

-Word16 wb_vad(                                /* Return value : VAD Decision, 1 = speech, 0 = noise */

-		VadVars * st,                         /* i/o : State structure                 */

-		Word16 in_buf[]                       /* i   : samples of the input frame   */

-	     )

-{

-	Word16 level[COMPLEN];

-	Word32 i;

-	Word16 VAD_flag, temp;

-	Word32 L_temp, pow_sum;

-

-	/* Calculate power of the input frame. */

-	L_temp = 0L;                           

-	for (i = 0; i < FRAME_LEN; i++)

-	{

-		L_temp = L_mac(L_temp, in_buf[i], in_buf[i]);

-	}

-

-	/* pow_sum = power of current frame and previous frame */

-	pow_sum = L_add(L_temp, st->prev_pow_sum);  

-

-	/* save power of current frame for next call */

-	st->prev_pow_sum = L_temp;             

-

-	/* If input power is very low, clear tone flag */

-	if (pow_sum < POW_TONE_THR)

-	{

-		st->tone_flag = (Word16) (st->tone_flag & 0x1fff);      

-	}

-	/* Run the filter bank and calculate signal levels at each band */

-	filter_bank(st, in_buf, level);

-

-	/* compute VAD decision */

-	VAD_flag = vad_decision(st, level, pow_sum);

-

-	/* Calculate input level */

-	L_temp = 0;                          

-	for (i = 1; i < COMPLEN; i++)          /* ignore lowest band */

-	{

-		L_temp = vo_L_add(L_temp, level[i]);

-	}

-

-	temp = extract_h(L_temp << 12);

-

-	Estimate_Speech(st, temp);             /* Estimate speech level */

-	return (VAD_flag);

-}

-

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*      File: wb_vad.c                                                  *
+*                                                                      *
+*      Description: Voice Activity Detection                           *
+*                                                                      *
+************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "cnst.h"
+#include "wb_vad.h"
+#include "typedef.h"
+#include "basic_op.h"
+#include "math_op.h"
+#include "wb_vad_c.h"
+#include "mem_align.h"
+
+/******************************************************************************
+*  Calculate Log2 and scale the signal:
+*
+*    ilog2(Word32 in) = -1024*log10(in * 2^-31)/log10(2), where in = [1, 2^31-1]
+*
+*  input   output
+*  32768   16384
+*  1       31744
+*
+* When input is in the range of [1,2^16], max error is 0.0380%.
+*********************************************************************************/
+
+static Word16 ilog2(                       /* return: output value of the log2 */
+		Word16 mant                        /* i: value to be converted */
+		)
+{
+	Word16 ex, ex2, res;
+	Word32 i, l_temp;
+
+	if (mant <= 0)
+	{
+		mant = 1;                         
+	}
+	ex = norm_s(mant);
+	mant = mant << ex;
+
+	for (i = 0; i < 3; i++)
+		mant = vo_mult(mant, mant);
+	l_temp = vo_L_mult(mant, mant);
+
+	ex2 = norm_l(l_temp);
+	mant = extract_h(l_temp << ex2);
+
+	res = (ex + 16) << 10;
+	res = add1(res, (ex2 << 6));
+	res = vo_sub(add1(res, 127), (mant >> 8));
+	return (res);
+}
+
+/******************************************************************************
+*
+*     Function     : filter5
+*     Purpose      : Fifth-order half-band lowpass/highpass filter pair with
+*                    decimation.
+*
+*******************************************************************************/
+
+static void filter5(
+		Word16 * in0,                         /* i/o : input values; output low-pass part  */
+		Word16 * in1,                         /* i/o : input values; output high-pass part */
+		Word16 data[]                         /* i/o : filter memory                       */
+		)
+{
+	Word16 temp0, temp1, temp2;
+
+	temp0 = vo_sub(*in0, vo_mult(COEFF5_1, data[0]));
+	temp1 = add1(data[0], vo_mult(COEFF5_1, temp0));
+	data[0] = temp0;                      
+
+	temp0 = vo_sub(*in1, vo_mult(COEFF5_2, data[1]));
+	temp2 = add1(data[1], vo_mult(COEFF5_2, temp0));
+	data[1] = temp0;                       
+
+	*in0 = extract_h((vo_L_add(temp1, temp2) << 15));   
+	*in1 = extract_h((vo_L_sub(temp1, temp2) << 15));  
+}
+
+/******************************************************************************
+*
+*     Function     : filter3
+*     Purpose      : Third-order half-band lowpass/highpass filter pair with
+*                    decimation.
+*
+*******************************************************************************/
+
+static void filter3(
+		Word16 * in0,                         /* i/o : input values; output low-pass part  */
+		Word16 * in1,                         /* i/o : input values; output high-pass part */
+		Word16 * data                         /* i/o : filter memory                       */
+		)
+{
+	Word16 temp1, temp2;
+
+	temp1 = vo_sub(*in1, vo_mult(COEFF3, *data));
+	temp2 = add1(*data, vo_mult(COEFF3, temp1));
+	*data = temp1;                        
+
+	*in1 = extract_h((vo_L_sub(*in0, temp2) << 15));   
+	*in0 = extract_h((vo_L_add(*in0, temp2) << 15));   
+}
+
+/******************************************************************************
+*
+*     Function   : level_calculation
+*     Purpose    : Calculate signal level in a sub-band. Level is calculated
+*                  by summing absolute values of the input data.
+*
+*                  Signal level calculated from of the end of the frame
+*                  (data[count1 - count2]) is stored to (*sub_level)
+*                  and added to the level of the next frame.
+*
+******************************************************************************/
+
+static Word16 level_calculation(                      /* return: signal level */
+		Word16 data[],                        /* i   : signal buffer                                    */
+		Word16 * sub_level,                   /* i   : level calculated at the end of the previous frame*/
+		                                      /* o   : level of signal calculated from the last         */
+		                                      /*       (count2 - count1) samples                        */
+		Word16 count1,                        /* i   : number of samples to be counted                  */
+		Word16 count2,                        /* i   : number of samples to be counted                  */
+		Word16 ind_m,                         /* i   : step size for the index of the data buffer       */
+		Word16 ind_a,                         /* i   : starting index of the data buffer                */
+		Word16 scale                          /* i   : scaling for the level calculation                */
+		)
+{
+	Word32 i, l_temp1, l_temp2;
+	Word16 level;
+
+	l_temp1 = 0L;                          
+	for (i = count1; i < count2; i++)
+	{
+		l_temp1 += (abs_s(data[ind_m * i + ind_a])<<1);
+	}
+
+	l_temp2 = vo_L_add(l_temp1, L_shl(*sub_level, 16 - scale));
+	*sub_level = extract_h(L_shl(l_temp1, scale));      
+
+	for (i = 0; i < count1; i++)
+	{
+		l_temp2 += (abs_s(data[ind_m * i + ind_a])<<1);
+	}
+	level = extract_h(L_shl2(l_temp2, scale));
+
+	return level;
+}
+
+/******************************************************************************
+*
+*     Function     : filter_bank
+*     Purpose      : Divide input signal into bands and calculate level of
+*                    the signal in each band
+*
+*******************************************************************************/
+
+static void filter_bank(
+		VadVars * st,                         /* i/o : State struct               */
+		Word16 in[],                          /* i   : input frame                */
+		Word16 level[]                        /* o   : signal levels at each band */
+		)
+{
+	Word32 i;
+	Word16 tmp_buf[FRAME_LEN];
+
+	/* shift input 1 bit down for safe scaling */
+	for (i = 0; i < FRAME_LEN; i++)
+	{
+		tmp_buf[i] = in[i] >> 1;       
+	}
+
+	/* run the filter bank */
+	for (i = 0; i < 128; i++)
+	{
+		filter5(&tmp_buf[2 * i], &tmp_buf[2 * i + 1], st->a_data5[0]);
+	}
+	for (i = 0; i < 64; i++)
+	{
+		filter5(&tmp_buf[4 * i], &tmp_buf[4 * i + 2], st->a_data5[1]);
+		filter5(&tmp_buf[4 * i + 1], &tmp_buf[4 * i + 3], st->a_data5[2]);
+	}
+	for (i = 0; i < 32; i++)
+	{
+		filter5(&tmp_buf[8 * i], &tmp_buf[8 * i + 4], st->a_data5[3]);
+		filter5(&tmp_buf[8 * i + 2], &tmp_buf[8 * i + 6], st->a_data5[4]);
+		filter3(&tmp_buf[8 * i + 3], &tmp_buf[8 * i + 7], &st->a_data3[0]);
+	}
+	for (i = 0; i < 16; i++)
+	{
+		filter3(&tmp_buf[16 * i + 0], &tmp_buf[16 * i + 8], &st->a_data3[1]);
+		filter3(&tmp_buf[16 * i + 4], &tmp_buf[16 * i + 12], &st->a_data3[2]);
+		filter3(&tmp_buf[16 * i + 6], &tmp_buf[16 * i + 14], &st->a_data3[3]);
+	}
+
+	for (i = 0; i < 8; i++)
+	{
+		filter3(&tmp_buf[32 * i + 0], &tmp_buf[32 * i + 16], &st->a_data3[4]);
+		filter3(&tmp_buf[32 * i + 8], &tmp_buf[32 * i + 24], &st->a_data3[5]);
+	}
+
+	/* calculate levels in each frequency band */
+
+	/* 4800 - 6400 Hz */
+	level[11] = level_calculation(tmp_buf, &st->sub_level[11], 16, 64, 4, 1, 14);   
+	/* 4000 - 4800 Hz */
+	level[10] = level_calculation(tmp_buf, &st->sub_level[10], 8, 32, 8, 7, 15);   
+	/* 3200 - 4000 Hz */
+	level[9] = level_calculation(tmp_buf, &st->sub_level[9],8, 32, 8, 3, 15);   
+	/* 2400 - 3200 Hz */
+	level[8] = level_calculation(tmp_buf, &st->sub_level[8],8, 32, 8, 2, 15);   
+	/* 2000 - 2400 Hz */
+	level[7] = level_calculation(tmp_buf, &st->sub_level[7],4, 16, 16, 14, 16);       
+	/* 1600 - 2000 Hz */
+	level[6] = level_calculation(tmp_buf, &st->sub_level[6],4, 16, 16, 6, 16);        
+	/* 1200 - 1600 Hz */
+	level[5] = level_calculation(tmp_buf, &st->sub_level[5],4, 16, 16, 4, 16);        
+	/* 800 - 1200 Hz */
+	level[4] = level_calculation(tmp_buf, &st->sub_level[4],4, 16, 16, 12, 16);       
+	/* 600 - 800 Hz */
+	level[3] = level_calculation(tmp_buf, &st->sub_level[3],2, 8, 32, 8, 17); 
+	/* 400 - 600 Hz */
+	level[2] = level_calculation(tmp_buf, &st->sub_level[2],2, 8, 32, 24, 17);        
+	/* 200 - 400 Hz */
+	level[1] = level_calculation(tmp_buf, &st->sub_level[1],2, 8, 32, 16, 17);        
+	/* 0 - 200 Hz */
+	level[0] = level_calculation(tmp_buf, &st->sub_level[0],2, 8, 32, 0, 17); 
+}
+
+/******************************************************************************
+*
+*     Function   : update_cntrl
+*     Purpose    : Control update of the background noise estimate.
+*
+*******************************************************************************/
+
+static void update_cntrl(
+		VadVars * st,                         /* i/o : State structure                    */
+		Word16 level[]                        /* i   : sub-band levels of the input frame */
+		)
+{
+	Word32 i;
+	Word16 num, temp, stat_rat, exp, denom;
+	Word16 alpha;
+
+	/* if a tone has been detected for a while, initialize stat_count */
+	if (sub((Word16) (st->tone_flag & 0x7c00), 0x7c00) == 0)
+	{
+		st->stat_count = STAT_COUNT;      
+	} else
+	{
+		/* if 8 last vad-decisions have been "0", reinitialize stat_count */
+		if ((st->vadreg & 0x7f80) == 0)
+		{
+			st->stat_count = STAT_COUNT;   
+		} else
+		{
+			stat_rat = 0;                  
+			for (i = 0; i < COMPLEN; i++)
+			{
+				if(level[i] > st->ave_level[i])
+				{
+					num = level[i];        
+					denom = st->ave_level[i];   
+				} else
+				{
+					num = st->ave_level[i];
+					denom = level[i];      
+				}
+				/* Limit nimimum value of num and denom to STAT_THR_LEVEL */
+				if(num < STAT_THR_LEVEL)
+				{
+					num = STAT_THR_LEVEL;  
+				}
+				if(denom < STAT_THR_LEVEL)
+				{
+					denom = STAT_THR_LEVEL;
+				}
+				exp = norm_s(denom);
+				denom = denom << exp;
+
+				/* stat_rat = num/denom * 64 */
+				temp = div_s(num >> 1, denom);
+				stat_rat = add1(stat_rat, shr(temp, (8 - exp)));
+			}
+
+			/* compare stat_rat with a threshold and update stat_count */
+			if(stat_rat > STAT_THR)
+			{
+				st->stat_count = STAT_COUNT;    
+			} else
+			{
+				if ((st->vadreg & 0x4000) != 0)
+				{
+
+					if (st->stat_count != 0)
+					{
+						st->stat_count = st->stat_count - 1;       
+					}
+				}
+			}
+		}
+	}
+
+	/* Update average amplitude estimate for stationarity estimation */
+	alpha = ALPHA4;                        
+	if(st->stat_count == STAT_COUNT)
+	{
+		alpha = 32767;                    
+	} else if ((st->vadreg & 0x4000) == 0)
+	{
+		alpha = ALPHA5;                   
+	}
+	for (i = 0; i < COMPLEN; i++)
+	{
+		st->ave_level[i] = add1(st->ave_level[i], vo_mult_r(alpha, vo_sub(level[i], st->ave_level[i])));   
+	}
+}
+
+/******************************************************************************
+*
+*     Function     : hangover_addition
+*     Purpose      : Add hangover after speech bursts
+*
+*******************************************************************************/
+
+static Word16 hangover_addition(                      /* return: VAD_flag indicating final VAD decision */
+		VadVars * st,                         /* i/o : State structure                     */
+		Word16 low_power,                     /* i   : flag power of the input frame    */
+		Word16 hang_len,                      /* i   : hangover length */
+		Word16 burst_len                      /* i   : minimum burst length for hangover addition */
+		)
+{
+	/* if the input power (pow_sum) is lower than a threshold, clear counters and set VAD_flag to "0"         */
+	if (low_power != 0)
+	{
+		st->burst_count = 0;               
+		st->hang_count = 0;                
+		return 0;
+	}
+	/* update the counters (hang_count, burst_count) */
+	if ((st->vadreg & 0x4000) != 0)
+	{
+		st->burst_count = st->burst_count + 1;    
+		if(st->burst_count >= burst_len)
+		{
+			st->hang_count = hang_len;     
+		}
+		return 1;
+	} else
+	{
+		st->burst_count = 0;               
+		if (st->hang_count > 0)
+		{
+			st->hang_count = st->hang_count - 1;    
+			return 1;
+		}
+	}
+	return 0;
+}
+
+/******************************************************************************
+*
+*     Function   : noise_estimate_update
+*     Purpose    : Update of background noise estimate
+*
+*******************************************************************************/
+
+static void noise_estimate_update(
+		VadVars * st,                         /* i/o : State structure                       */
+		Word16 level[]                        /* i   : sub-band levels of the input frame */
+		)
+{
+	Word32 i; 
+	Word16 alpha_up, alpha_down, bckr_add = 2;
+
+	/* Control update of bckr_est[] */
+	update_cntrl(st, level);
+
+	/* Choose update speed */
+	if ((0x7800 & st->vadreg) == 0)
+	{
+		alpha_up = ALPHA_UP1;              
+		alpha_down = ALPHA_DOWN1;          
+	} else
+	{
+		if ((st->stat_count == 0))
+		{
+			alpha_up = ALPHA_UP2;          
+			alpha_down = ALPHA_DOWN2;      
+		} else
+		{
+			alpha_up = 0;                  
+			alpha_down = ALPHA3;           
+			bckr_add = 0;                  
+		}
+	}
+
+	/* Update noise estimate (bckr_est) */
+	for (i = 0; i < COMPLEN; i++)
+	{
+		Word16 temp;
+		temp = (st->old_level[i] - st->bckr_est[i]);
+
+		if (temp < 0)
+		{                                  /* update downwards */
+			st->bckr_est[i] = add1(-2, add(st->bckr_est[i],vo_mult_r(alpha_down, temp))); 
+			/* limit minimum value of the noise estimate to NOISE_MIN */
+			if(st->bckr_est[i] < NOISE_MIN)
+			{
+				st->bckr_est[i] = NOISE_MIN;   
+			}
+		} else
+		{                                  /* update upwards */
+			st->bckr_est[i] = add1(bckr_add, add1(st->bckr_est[i],vo_mult_r(alpha_up, temp)));   
+
+			/* limit maximum value of the noise estimate to NOISE_MAX */
+			if(st->bckr_est[i] > NOISE_MAX)
+			{
+				st->bckr_est[i] = NOISE_MAX;    
+			}
+		}
+	}
+
+	/* Update signal levels of the previous frame (old_level) */
+	for (i = 0; i < COMPLEN; i++)
+	{
+		st->old_level[i] = level[i];      
+	}
+}
+
+/******************************************************************************
+*
+*     Function     : vad_decision
+*     Purpose      : Calculates VAD_flag
+*
+*******************************************************************************/
+
+static Word16 vad_decision(                           /* return value : VAD_flag */
+		VadVars * st,                         /* i/o : State structure                       */
+		Word16 level[COMPLEN],                /* i   : sub-band levels of the input frame */
+		Word32 pow_sum                        /* i   : power of the input frame           */
+		)
+{
+	Word32 i;
+	Word32 L_snr_sum;
+	Word32 L_temp;
+	Word16 vad_thr, temp, noise_level;
+	Word16 low_power_flag;
+	Word16 hang_len, burst_len;
+	Word16 ilog2_speech_level, ilog2_noise_level;
+	Word16 temp2;
+
+	/* Calculate squared sum of the input levels (level) divided by the background noise components
+	 * (bckr_est). */
+	L_snr_sum = 0;                        
+	for (i = 0; i < COMPLEN; i++)
+	{
+		Word16 exp;
+
+		exp = norm_s(st->bckr_est[i]);
+		temp = (st->bckr_est[i] << exp);
+		temp = div_s((level[i] >> 1), temp);
+		temp = shl(temp, (exp - (UNIRSHFT - 1)));
+		L_snr_sum = L_mac(L_snr_sum, temp, temp);
+	}
+
+	/* Calculate average level of estimated background noise */
+	L_temp = 0;                           
+	for (i = 1; i < COMPLEN; i++)          /* ignore lowest band */
+	{
+		L_temp = vo_L_add(L_temp, st->bckr_est[i]);
+	}
+
+	noise_level = extract_h((L_temp << 12));
+	/* if SNR is lower than a threshold (MIN_SPEECH_SNR), and increase speech_level */
+	temp = vo_mult(noise_level, MIN_SPEECH_SNR) << 3;
+
+	if(st->speech_level < temp)
+	{
+		st->speech_level = temp;          
+	}
+	ilog2_noise_level = ilog2(noise_level);
+
+	/* If SNR is very poor, speech_level is probably corrupted by noise level. This is correctred by
+	 * subtracting MIN_SPEECH_SNR*noise_level from speech level */
+	ilog2_speech_level = ilog2(st->speech_level - temp);
+
+	temp = add1(vo_mult(NO_SLOPE, (ilog2_noise_level - NO_P1)), THR_HIGH);
+
+	temp2 = add1(SP_CH_MIN, vo_mult(SP_SLOPE, (ilog2_speech_level - SP_P1)));
+	if (temp2 < SP_CH_MIN)
+	{
+		temp2 = SP_CH_MIN;                 
+	}
+	if (temp2 > SP_CH_MAX)
+	{
+		temp2 = SP_CH_MAX;                 
+	}
+	vad_thr = temp + temp2;
+
+	if(vad_thr < THR_MIN)
+	{
+		vad_thr = THR_MIN;                 
+	}
+	/* Shift VAD decision register */
+	st->vadreg = (st->vadreg >> 1);       
+
+	/* Make intermediate VAD decision */
+	if(L_snr_sum > vo_L_mult(vad_thr, (512 * COMPLEN)))
+	{
+		st->vadreg = (Word16) (st->vadreg | 0x4000); 
+	}
+	/* check if the input power (pow_sum) is lower than a threshold" */
+	if(pow_sum < VAD_POW_LOW)
+	{
+		low_power_flag = 1;               
+	} else
+	{
+		low_power_flag = 0;               
+	}
+	/* Update background noise estimates */
+	noise_estimate_update(st, level);
+
+	/* Calculate values for hang_len and burst_len based on vad_thr */
+	hang_len = add1(vo_mult(HANG_SLOPE, (vad_thr - HANG_P1)), HANG_HIGH);
+	if(hang_len < HANG_LOW)
+	{
+		hang_len = HANG_LOW;              
+	}
+	burst_len = add1(vo_mult(BURST_SLOPE, (vad_thr - BURST_P1)), BURST_HIGH);
+
+	return (hangover_addition(st, low_power_flag, hang_len, burst_len));
+}
+
+/******************************************************************************
+*
+*     Function : Estimate_Speech()
+*     Purpose  : Estimate speech level
+*
+* Maximum signal level is searched and stored to the variable sp_max.
+* The speech frames must locate within SP_EST_COUNT number of frames.
+* Thus, noisy frames having occasional VAD = "1" decisions will not
+* affect to the estimated speech_level.
+*
+*******************************************************************************/
+
+static void Estimate_Speech(
+		VadVars * st,                         /* i/o : State structure    */
+		Word16 in_level                       /* level of the input frame */
+		)
+{
+	Word16 alpha;
+
+	/* if the required activity count cannot be achieved, reset counters */
+	if((st->sp_est_cnt - st->sp_max_cnt) > (SP_EST_COUNT - SP_ACTIVITY_COUNT))
+	{
+		st->sp_est_cnt = 0;                
+		st->sp_max = 0;                    
+		st->sp_max_cnt = 0;                
+	}
+	st->sp_est_cnt += 1; 
+
+	if (((st->vadreg & 0x4000)||(in_level > st->speech_level)) && (in_level > MIN_SPEECH_LEVEL1))
+	{
+		/* update sp_max */
+		if(in_level > st->sp_max)
+		{
+			st->sp_max = in_level;         
+		}
+		st->sp_max_cnt += 1;        
+
+		if(st->sp_max_cnt >= SP_ACTIVITY_COUNT)
+		{
+			Word16 tmp;
+			/* update speech estimate */
+			tmp = (st->sp_max >> 1);      /* scale to get "average" speech level */
+
+			/* select update speed */
+			if(tmp > st->speech_level)
+			{
+				alpha = ALPHA_SP_UP;       
+			} else
+			{
+				alpha = ALPHA_SP_DOWN;    
+			}
+			if(tmp > MIN_SPEECH_LEVEL2)
+			{
+				st->speech_level = add1(st->speech_level, vo_mult_r(alpha, vo_sub(tmp, st->speech_level))); 
+			}
+			/* clear all counters used for speech estimation */
+			st->sp_max = 0;                
+			st->sp_max_cnt = 0;            
+			st->sp_est_cnt = 0;            
+		}
+	}
+}
+
+/******************************************************************************
+*
+*  Function:   wb_vad_init
+*  Purpose:    Allocates state memory and initializes state memory
+*
+*******************************************************************************/
+
+Word16 wb_vad_init(                        /* return: non-zero with error, zero for ok. */
+		VadVars ** state,                     /* i/o : State structure    */
+		VO_MEM_OPERATOR *pMemOP
+		)
+{
+	VadVars *s;
+
+	if (state == (VadVars **) NULL)
+	{
+		fprintf(stderr, "vad_init: invalid parameter\n");
+		return -1;
+	}
+	*state = NULL;
+
+	/* allocate memory */
+	if ((s = (VadVars *) mem_malloc(pMemOP, sizeof(VadVars), 32, VO_INDEX_ENC_AMRWB)) == NULL)
+	{
+		fprintf(stderr, "vad_init: can not malloc state structure\n");
+		return -1;
+	}
+	wb_vad_reset(s);
+
+	*state = s;
+
+	return 0;
+}
+
+/******************************************************************************
+*
+*  Function:   wb_vad_reset
+*  Purpose:    Initializes state memory
+*
+*******************************************************************************/
+
+Word16 wb_vad_reset(                       /* return: non-zero with error, zero for ok. */
+		VadVars * state                       /* i/o : State structure    */
+		)
+{
+	Word32 i, j;
+
+	if (state == (VadVars *) NULL)
+	{
+		fprintf(stderr, "vad_reset: invalid parameter\n");
+		return -1;
+	}
+	state->tone_flag = 0;
+	state->vadreg = 0;
+	state->hang_count = 0;
+	state->burst_count = 0;
+	state->hang_count = 0;
+
+	/* initialize memory used by the filter bank */
+	for (i = 0; i < F_5TH_CNT; i++)
+	{
+		for (j = 0; j < 2; j++)
+		{
+			state->a_data5[i][j] = 0;
+		}
+	}
+
+	for (i = 0; i < F_3TH_CNT; i++)
+	{
+		state->a_data3[i] = 0;
+	}
+
+	/* initialize the rest of the memory */
+	for (i = 0; i < COMPLEN; i++)
+	{
+		state->bckr_est[i] = NOISE_INIT;
+		state->old_level[i] = NOISE_INIT;
+		state->ave_level[i] = NOISE_INIT;
+		state->sub_level[i] = 0;
+	}
+
+	state->sp_est_cnt = 0;
+	state->sp_max = 0;
+	state->sp_max_cnt = 0;
+	state->speech_level = SPEECH_LEVEL_INIT;
+	state->prev_pow_sum = 0;
+	return 0;
+}
+
+/******************************************************************************
+*
+*  Function:   wb_vad_exit
+*  Purpose:    The memory used for state memory is freed
+*
+*******************************************************************************/
+
+void wb_vad_exit(
+		VadVars ** state,                      /* i/o : State structure    */
+		VO_MEM_OPERATOR *pMemOP
+		)
+{
+	if (state == NULL || *state == NULL)
+		return;
+	/* deallocate memory */
+	mem_free(pMemOP, *state, VO_INDEX_ENC_AMRWB);
+	*state = NULL;
+	return;
+}
+
+/******************************************************************************
+*
+*     Function     : wb_vad_tone_detection
+*     Purpose      : Search maximum pitch gain from a frame. Set tone flag if
+*                    pitch gain is high. This is used to detect
+*                    signaling tones and other signals with high pitch gain.
+*
+*******************************************************************************/
+
+void wb_vad_tone_detection(
+		VadVars * st,                         /* i/o : State struct            */
+		Word16 p_gain                         /* pitch gain      */
+		)
+{
+	/* update tone flag */
+	st->tone_flag = (st->tone_flag >> 1);
+
+	/* if (pitch_gain > TONE_THR) set tone flag */
+	if (p_gain > TONE_THR)
+	{
+		st->tone_flag = (Word16) (st->tone_flag | 0x4000);
+	}
+}
+
+/******************************************************************************
+*
+*     Function     : wb_vad
+*     Purpose      : Main program for Voice Activity Detection (VAD) for AMR
+*
+*******************************************************************************/
+
+Word16 wb_vad(                                /* Return value : VAD Decision, 1 = speech, 0 = noise */
+		VadVars * st,                         /* i/o : State structure                 */
+		Word16 in_buf[]                       /* i   : samples of the input frame   */
+	     )
+{
+	Word16 level[COMPLEN];
+	Word32 i;
+	Word16 VAD_flag, temp;
+	Word32 L_temp, pow_sum;
+
+	/* Calculate power of the input frame. */
+	L_temp = 0L;                           
+	for (i = 0; i < FRAME_LEN; i++)
+	{
+		L_temp = L_mac(L_temp, in_buf[i], in_buf[i]);
+	}
+
+	/* pow_sum = power of current frame and previous frame */
+	pow_sum = L_add(L_temp, st->prev_pow_sum);  
+
+	/* save power of current frame for next call */
+	st->prev_pow_sum = L_temp;             
+
+	/* If input power is very low, clear tone flag */
+	if (pow_sum < POW_TONE_THR)
+	{
+		st->tone_flag = (Word16) (st->tone_flag & 0x1fff);      
+	}
+	/* Run the filter bank and calculate signal levels at each band */
+	filter_bank(st, in_buf, level);
+
+	/* compute VAD decision */
+	VAD_flag = vad_decision(st, level, pow_sum);
+
+	/* Calculate input level */
+	L_temp = 0;                          
+	for (i = 1; i < COMPLEN; i++)          /* ignore lowest band */
+	{
+		L_temp = vo_L_add(L_temp, level[i]);
+	}
+
+	temp = extract_h(L_temp << 12);
+
+	Estimate_Speech(st, temp);             /* Estimate speech level */
+	return (VAD_flag);
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrwbenc/src/weight_a.c b/media/libstagefright/codecs/amrwbenc/src/weight_a.c
index d47be97..8f0fb39 100644
--- a/media/libstagefright/codecs/amrwbenc/src/weight_a.c
+++ b/media/libstagefright/codecs/amrwbenc/src/weight_a.c
@@ -1,48 +1,48 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-

-/***********************************************************************

-*       File: weight_a.c                                               *

-*                                                                      *

-*       Description:Weighting of LPC coefficients                      *

-*	               ap[i] = a[i] * (gamma ** i)                     *

-*                                                                      * 

-************************************************************************/

-

-#include "typedef.h"

-#include "basic_op.h"

-

-void Weight_a(

-		Word16 a[],                           /* (i) Q12 : a[m+1]  LPC coefficients             */

-		Word16 ap[],                          /* (o) Q12 : Spectral expanded LPC coefficients   */

-		Word16 gamma,                         /* (i) Q15 : Spectral expansion factor.           */

-		Word16 m                              /* (i)     : LPC order.                           */

-	     )

-{

-	Word32 num = m - 1, fac;

-	*ap++ = *a++;

-	fac = gamma;

-	do{

-		*ap++ =(Word16)(((vo_L_mult((*a++), fac)) + 0x8000) >> 16);

-		fac = (vo_L_mult(fac, gamma) + 0x8000) >> 16;

-	}while(--num != 0);

-

-	*ap++ = (Word16)(((vo_L_mult((*a++), fac)) + 0x8000) >> 16);

-	return;

-}

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+/***********************************************************************
+*       File: weight_a.c                                               *
+*                                                                      *
+*       Description:Weighting of LPC coefficients                      *
+*	               ap[i] = a[i] * (gamma ** i)                     *
+*                                                                      * 
+************************************************************************/
+
+#include "typedef.h"
+#include "basic_op.h"
+
+void Weight_a(
+		Word16 a[],                           /* (i) Q12 : a[m+1]  LPC coefficients             */
+		Word16 ap[],                          /* (o) Q12 : Spectral expanded LPC coefficients   */
+		Word16 gamma,                         /* (i) Q15 : Spectral expansion factor.           */
+		Word16 m                              /* (i)     : LPC order.                           */
+	     )
+{
+	Word32 num = m - 1, fac;
+	*ap++ = *a++;
+	fac = gamma;
+	do{
+		*ap++ =(Word16)(((vo_L_mult((*a++), fac)) + 0x8000) >> 16);
+		fac = (vo_L_mult(fac, gamma) + 0x8000) >> 16;
+	}while(--num != 0);
+
+	*ap++ = (Word16)(((vo_L_mult((*a++), fac)) + 0x8000) >> 16);
+	return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/common/Config.mk b/media/libstagefright/codecs/common/Config.mk
index 27a17c1..3d754e7 100644
--- a/media/libstagefright/codecs/common/Config.mk
+++ b/media/libstagefright/codecs/common/Config.mk
@@ -1,24 +1,24 @@
-# 

-# This configure file is just for Linux projects against Android

-#

-

-VOPRJ := 

-VONJ :=

-

-# WARNING:

-# Using v7 breaks generic build

-ifeq ($(TARGET_ARCH),arm)

-VOTT := v5

-else

-VOTT := pc

-endif

-

-# Do we also need to check on ARCH_ARM_HAVE_ARMV7A? - probably not

-ifeq ($(ARCH_ARM_HAVE_NEON),true)

-VOTT := v7

-endif

-

-VOTEST := 0

-

-VO_CFLAGS:=-DLINUX 

-

+# 
+# This configure file is just for Linux projects against Android
+#
+
+VOPRJ := 
+VONJ :=
+
+# WARNING:
+# Using v7 breaks generic build
+ifeq ($(TARGET_ARCH),arm)
+VOTT := v5
+else
+VOTT := pc
+endif
+
+# Do we also need to check on ARCH_ARM_HAVE_ARMV7A? - probably not
+ifeq ($(ARCH_ARM_HAVE_NEON),true)
+VOTT := v7
+endif
+
+VOTEST := 0
+
+VO_CFLAGS:=-DLINUX 
+
diff --git a/media/libstagefright/codecs/common/cmnMemory.c b/media/libstagefright/codecs/common/cmnMemory.c
index c17264c..dd7c26d 100644
--- a/media/libstagefright/codecs/common/cmnMemory.c
+++ b/media/libstagefright/codecs/common/cmnMemory.c
@@ -1,73 +1,73 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		cmnMemory.c

-

-	Content:	sample code for memory operator implementation

-

-*******************************************************************************/

-#include "cmnMemory.h"

-

-#include <malloc.h>

-#if defined LINUX

-#include <string.h>

-#endif

-

-//VO_MEM_OPERATOR		g_memOP;

-

-VO_U32 cmnMemAlloc (VO_S32 uID,  VO_MEM_INFO * pMemInfo)

-{

-	if (!pMemInfo)

-		return VO_ERR_INVALID_ARG;

-

-	pMemInfo->VBuffer = malloc (pMemInfo->Size);

-	return 0;

-}

-

-VO_U32 cmnMemFree (VO_S32 uID, VO_PTR pMem)

-{

-	free (pMem);

-	return 0;

-}

-

-VO_U32	cmnMemSet (VO_S32 uID, VO_PTR pBuff, VO_U8 uValue, VO_U32 uSize)

-{

-	memset (pBuff, uValue, uSize);

-	return 0;

-}

-

-VO_U32	cmnMemCopy (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize)

-{

-	memcpy (pDest, pSource, uSize);

-	return 0;

-}

-

-VO_U32	cmnMemCheck (VO_S32 uID, VO_PTR pBuffer, VO_U32 uSize)

-{

-	return 0;

-}

-

-VO_S32 cmnMemCompare (VO_S32 uID, VO_PTR pBuffer1, VO_PTR pBuffer2, VO_U32 uSize)

-{

-	return memcmp(pBuffer1, pBuffer2, uSize);

-}

-

-VO_U32	cmnMemMove (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize)

-{

-	memmove (pDest, pSource, uSize);

-	return 0;

-}

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		cmnMemory.c
+
+	Content:	sample code for memory operator implementation
+
+*******************************************************************************/
+#include "cmnMemory.h"
+
+#include <malloc.h>
+#if defined LINUX
+#include <string.h>
+#endif
+
+//VO_MEM_OPERATOR		g_memOP;
+
+VO_U32 cmnMemAlloc (VO_S32 uID,  VO_MEM_INFO * pMemInfo)
+{
+	if (!pMemInfo)
+		return VO_ERR_INVALID_ARG;
+
+	pMemInfo->VBuffer = malloc (pMemInfo->Size);
+	return 0;
+}
+
+VO_U32 cmnMemFree (VO_S32 uID, VO_PTR pMem)
+{
+	free (pMem);
+	return 0;
+}
+
+VO_U32	cmnMemSet (VO_S32 uID, VO_PTR pBuff, VO_U8 uValue, VO_U32 uSize)
+{
+	memset (pBuff, uValue, uSize);
+	return 0;
+}
+
+VO_U32	cmnMemCopy (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize)
+{
+	memcpy (pDest, pSource, uSize);
+	return 0;
+}
+
+VO_U32	cmnMemCheck (VO_S32 uID, VO_PTR pBuffer, VO_U32 uSize)
+{
+	return 0;
+}
+
+VO_S32 cmnMemCompare (VO_S32 uID, VO_PTR pBuffer1, VO_PTR pBuffer2, VO_U32 uSize)
+{
+	return memcmp(pBuffer1, pBuffer2, uSize);
+}
+
+VO_U32	cmnMemMove (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize)
+{
+	memmove (pDest, pSource, uSize);
+	return 0;
+}
+
diff --git a/media/libstagefright/codecs/common/include/cmnMemory.h b/media/libstagefright/codecs/common/include/cmnMemory.h
index 9315600..0308dfa 100644
--- a/media/libstagefright/codecs/common/include/cmnMemory.h
+++ b/media/libstagefright/codecs/common/include/cmnMemory.h
@@ -1,106 +1,106 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		cmnMemory.h

-

-	Content:	memory operator implementation header file

-

-*******************************************************************************/

-

-#ifndef __cmnMemory_H__

-#define __cmnMemory_H__

-

-#ifdef __cplusplus

-extern "C" {

-#endif /* __cplusplus */

-

-#include <voMem.h>

-

-//extern VO_MEM_OPERATOR	g_memOP;

-

-/**

- * Allocate memory

- * \param uID [in] module ID

- * \param uSize [in] size of memory

- * \return value is the allocated memory address. NULL is failed.

- */

-VO_U32	cmnMemAlloc (VO_S32 uID,  VO_MEM_INFO * pMemInfo);

-

-/**

- * Free up memory

- * \param uID [in] module ID

- * \param pMem [in] address of memory

- * \return value 0, if succeeded.

- */

-VO_U32	cmnMemFree (VO_S32 uID, VO_PTR pBuffer);

-

-/**

- * memory set function

- * \param uID [in] module ID

- * \param pBuff [in/out] address of memory

- * \param uValue [in] the value to be set

- * \param uSize [in] the size to be set

- * \return value 0, if succeeded.

- */

-VO_U32	cmnMemSet (VO_S32 uID, VO_PTR pBuff, VO_U8 uValue, VO_U32 uSize);

-

-/**

- * memory copy function

- * \param uID [in] module ID

- * \param pDest [in/out] address of destination memory

- * \param pSource [in] address of source memory

- * \param uSize [in] the size to be copied

- * \return value 0, if succeeded.

- */

-VO_U32	cmnMemCopy (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize);

-

-/**

- * memory check function

- * \param uID [in] module ID

- * \param pBuff [in] address of buffer to be checked

- * \param uSize [in] the size to be checked

- * \return value 0, if succeeded.

- */

-VO_U32	cmnMemCheck (VO_S32 uID, VO_PTR pBuffer, VO_U32 uSize);

-

-/**

- * memory compare function

- * \param uID [in] module ID

- * \param pBuffer1 [in] address of buffer 1 to be compared

- * \param pBuffer2 [in] address of buffer 2 to be compared

- * \param uSize [in] the size to be compared

- * \return value: same as standard C run-time memcmp() function.

- */

-VO_S32	cmnMemCompare (VO_S32 uID, VO_PTR pBuffer1, VO_PTR pBuffer2, VO_U32 uSize);

-

-/**

- * memory move function

- * \param uID [in] module ID

- * \param pDest [in/out] address of destination memory

- * \param pSource [in] address of source memory

- * \param uSize [in] the size to be moved

- * \return value 0, if succeeded.

- */

-VO_U32	cmnMemMove (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize);

-

-

-#ifdef __cplusplus

-}

-#endif /* __cplusplus */

-

-#endif // __cmnMemory_H__

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		cmnMemory.h
+
+	Content:	memory operator implementation header file
+
+*******************************************************************************/
+
+#ifndef __cmnMemory_H__
+#define __cmnMemory_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include <voMem.h>
+
+//extern VO_MEM_OPERATOR	g_memOP;
+
+/**
+ * Allocate memory
+ * \param uID [in] module ID
+ * \param uSize [in] size of memory
+ * \return value is the allocated memory address. NULL is failed.
+ */
+VO_U32	cmnMemAlloc (VO_S32 uID,  VO_MEM_INFO * pMemInfo);
+
+/**
+ * Free up memory
+ * \param uID [in] module ID
+ * \param pMem [in] address of memory
+ * \return value 0, if succeeded.
+ */
+VO_U32	cmnMemFree (VO_S32 uID, VO_PTR pBuffer);
+
+/**
+ * memory set function
+ * \param uID [in] module ID
+ * \param pBuff [in/out] address of memory
+ * \param uValue [in] the value to be set
+ * \param uSize [in] the size to be set
+ * \return value 0, if succeeded.
+ */
+VO_U32	cmnMemSet (VO_S32 uID, VO_PTR pBuff, VO_U8 uValue, VO_U32 uSize);
+
+/**
+ * memory copy function
+ * \param uID [in] module ID
+ * \param pDest [in/out] address of destination memory
+ * \param pSource [in] address of source memory
+ * \param uSize [in] the size to be copied
+ * \return value 0, if succeeded.
+ */
+VO_U32	cmnMemCopy (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize);
+
+/**
+ * memory check function
+ * \param uID [in] module ID
+ * \param pBuff [in] address of buffer to be checked
+ * \param uSize [in] the size to be checked
+ * \return value 0, if succeeded.
+ */
+VO_U32	cmnMemCheck (VO_S32 uID, VO_PTR pBuffer, VO_U32 uSize);
+
+/**
+ * memory compare function
+ * \param uID [in] module ID
+ * \param pBuffer1 [in] address of buffer 1 to be compared
+ * \param pBuffer2 [in] address of buffer 2 to be compared
+ * \param uSize [in] the size to be compared
+ * \return value: same as standard C run-time memcmp() function.
+ */
+VO_S32	cmnMemCompare (VO_S32 uID, VO_PTR pBuffer1, VO_PTR pBuffer2, VO_U32 uSize);
+
+/**
+ * memory move function
+ * \param uID [in] module ID
+ * \param pDest [in/out] address of destination memory
+ * \param pSource [in] address of source memory
+ * \param uSize [in] the size to be moved
+ * \return value 0, if succeeded.
+ */
+VO_U32	cmnMemMove (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif // __cmnMemory_H__
+
+
diff --git a/media/libstagefright/codecs/common/include/voAAC.h b/media/libstagefright/codecs/common/include/voAAC.h
index d11ed83..9ecb142 100644
--- a/media/libstagefright/codecs/common/include/voAAC.h
+++ b/media/libstagefright/codecs/common/include/voAAC.h
@@ -1,74 +1,74 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		voAAC.h

-

-	Content:	AAC codec APIs & data types

-

-*******************************************************************************/

-

-#ifndef __voAAC_H__

-#define __voAAC_H__

-

-#ifdef __cplusplus

-extern "C" {

-#endif /* __cplusplus */

-

-#include "voAudio.h"

-

-/*!

- * the frame type that the decoder supports

- */

-typedef enum {

-	VOAAC_RAWDATA			= 0,	/*!<contains only raw aac data in a frame*/

-	VOAAC_ADTS				= 1,	/*!<contains ADTS header + raw AAC data in a frame*/

-	VOAAC_FT_MAX			= VO_MAX_ENUM_VALUE

-} VOAACFRAMETYPE;

-

-/*!

- * the structure for AAC encoder input parameter

- */

-typedef  struct {

-  int	  sampleRate;          /*! audio file sample rate */

-  int	  bitRate;             /*! encoder bit rate in bits/sec */

-  short   nChannels;		   /*! number of channels on input (1,2) */

-  short   adtsUsed;			   /*! whether write adts header */

-} AACENC_PARAM;

-

-/* AAC Param ID */

-#define VO_PID_AAC_Mdoule				0x42211000

-#define VO_PID_AAC_ENCPARAM				VO_PID_AAC_Mdoule | 0x0040  /*!< get/set AAC encoder parameter, the parameter is a pointer to AACENC_PARAM */

-

-/* AAC decoder error ID */

-#define VO_ERR_AAC_Mdoule				0x82210000

-#define VO_ERR_AAC_UNSFILEFORMAT		(VO_ERR_AAC_Mdoule | 0xF001)

-#define VO_ERR_AAC_UNSPROFILE			(VO_ERR_AAC_Mdoule | 0xF002)

-

-/**

- * Get audio encoder API interface

- * \param pEncHandle [out] Return the AAC Encoder handle.

- * \retval VO_ERR_OK Succeeded.

- */

-VO_S32 VO_API voGetAACEncAPI (VO_AUDIO_CODECAPI * pEncHandle);

-

-#ifdef __cplusplus

-}

-#endif /* __cplusplus */

-

-#endif // __voAAC_H__

-

-

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		voAAC.h
+
+	Content:	AAC codec APIs & data types
+
+*******************************************************************************/
+
+#ifndef __voAAC_H__
+#define __voAAC_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include "voAudio.h"
+
+/*!
+ * the frame type that the decoder supports
+ */
+typedef enum {
+	VOAAC_RAWDATA			= 0,	/*!<contains only raw aac data in a frame*/
+	VOAAC_ADTS				= 1,	/*!<contains ADTS header + raw AAC data in a frame*/
+	VOAAC_FT_MAX			= VO_MAX_ENUM_VALUE
+} VOAACFRAMETYPE;
+
+/*!
+ * the structure for AAC encoder input parameter
+ */
+typedef  struct {
+  int	  sampleRate;          /*! audio file sample rate */
+  int	  bitRate;             /*! encoder bit rate in bits/sec */
+  short   nChannels;		   /*! number of channels on input (1,2) */
+  short   adtsUsed;			   /*! whether write adts header */
+} AACENC_PARAM;
+
+/* AAC Param ID */
+#define VO_PID_AAC_Mdoule				0x42211000
+#define VO_PID_AAC_ENCPARAM				VO_PID_AAC_Mdoule | 0x0040  /*!< get/set AAC encoder parameter, the parameter is a pointer to AACENC_PARAM */
+
+/* AAC decoder error ID */
+#define VO_ERR_AAC_Mdoule				0x82210000
+#define VO_ERR_AAC_UNSFILEFORMAT		(VO_ERR_AAC_Mdoule | 0xF001)
+#define VO_ERR_AAC_UNSPROFILE			(VO_ERR_AAC_Mdoule | 0xF002)
+
+/**
+ * Get audio encoder API interface
+ * \param pEncHandle [out] Return the AAC Encoder handle.
+ * \retval VO_ERR_OK Succeeded.
+ */
+VO_S32 VO_API voGetAACEncAPI (VO_AUDIO_CODECAPI * pEncHandle);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif // __voAAC_H__
+
+
+
diff --git a/media/libstagefright/codecs/common/include/voAMRWB.h b/media/libstagefright/codecs/common/include/voAMRWB.h
index 8a93eb8..13290c7 100644
--- a/media/libstagefright/codecs/common/include/voAMRWB.h
+++ b/media/libstagefright/codecs/common/include/voAMRWB.h
@@ -1,87 +1,87 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		voAMRWB.h

-

-	Content:	AMR-WB codec APIs & data types

-

-*******************************************************************************/

-#ifndef  __VOAMRWB_H__

-#define  __VOAMRWB_H__

-

-#include  "voAudio.h"

-#ifdef __cplusplus

-extern "C" {

-#endif /* __cplusplus */

-#pragma pack(push, 4)

-

-/*!* the bit rate the codec supports*/

-typedef enum { 

-	VOAMRWB_MDNONE		= -1,	/*!< Invalid mode */

-	VOAMRWB_MD66		= 0,	/*!< 6.60kbps   */

-	VOAMRWB_MD885		= 1,    /*!< 8.85kbps   */       

-	VOAMRWB_MD1265		= 2,	/*!< 12.65kbps  */

-	VOAMRWB_MD1425		= 3,	/*!< 14.25kbps  */

-	VOAMRWB_MD1585		= 4,	/*!< 15.85bps   */

-	VOAMRWB_MD1825		= 5,	/*!< 18.25bps   */

-	VOAMRWB_MD1985		= 6,	/*!< 19.85kbps  */

-	VOAMRWB_MD2305		= 7,    /*!< 23.05kbps  */

-	VOAMRWB_MD2385          = 8,    /*!< 23.85kbps> */	

-	VOAMRWB_N_MODES 	= 9,	/*!< Invalid mode */

-	VOAMRWB_MODE_MAX    = VO_MAX_ENUM_VALUE

-	

-}VOAMRWBMODE;

-

-/*!* the frame format the codec supports*/

-typedef enum {

-	VOAMRWB_DEFAULT  	= 0,	/*!< the frame type is the header (defined in RFC3267) + rawdata*/

-	/*One word (2-byte) for sync word (0x6b21)*/

-	/*One word (2-byte) for frame length N.*/

-	/*N words (2-byte) containing N bits (bit 0 = 0x007f, bit 1 = 0x0081).*/

-	VOAMRWB_ITU         = 1, 

-	/*One word (2-byte) for sync word (0x6b21).*/

-	/*One word (2-byte) to indicate the frame type.*/	

-	/*One word (2-byte) to indicate the mode.*/

-	/*N words  (2-byte) containing N bits (bit 0 = 0xff81, bit 1 = 0x007f).*/

-	VOAMRWB_RFC3267		= 2,	/* see RFC 3267 */  

-    VOAMRWB_TMAX        = VO_MAX_ENUM_VALUE	

-}VOAMRWBFRAMETYPE;

-

-

-#define    VO_PID_AMRWB_Module							0x42261000 

-#define    VO_PID_AMRWB_FORMAT                          (VO_PID_AMRWB_Module | 0x0002)

-#define    VO_PID_AMRWB_CHANNELS                        (VO_PID_AMRWB_Module | 0x0003)

-#define    VO_PID_AMRWB_SAMPLERATE                      (VO_PID_AMRWB_Module | 0x0004)

-#define    VO_PID_AMRWB_FRAMETYPE                       (VO_PID_AMRWB_Module | 0x0005)

-#define    VO_PID_AMRWB_MODE                            (VO_PID_AMRWB_Module | 0x0006)

-#define    VO_PID_AMRWB_DTX                             (VO_PID_AMRWB_Module | 0x0007)

-

-/**

- * Get audio codec API interface

- * \param pEncHandle [out] Return the AMRWB Encoder handle.

- * \retval VO_ERR_OK Succeeded.

- */

-VO_S32 VO_API voGetAMRWBEncAPI(VO_AUDIO_CODECAPI *pEncHandle);

-

-

-#pragma pack(pop)

-#ifdef __cplusplus

-} /* extern "C" */

-#endif /* __cplusplus */

-

-

-#endif   //__VOAMRWB_H__

-

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		voAMRWB.h
+
+	Content:	AMR-WB codec APIs & data types
+
+*******************************************************************************/
+#ifndef  __VOAMRWB_H__
+#define  __VOAMRWB_H__
+
+#include  "voAudio.h"
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+#pragma pack(push, 4)
+
+/*!* the bit rate the codec supports*/
+typedef enum { 
+	VOAMRWB_MDNONE		= -1,	/*!< Invalid mode */
+	VOAMRWB_MD66		= 0,	/*!< 6.60kbps   */
+	VOAMRWB_MD885		= 1,    /*!< 8.85kbps   */       
+	VOAMRWB_MD1265		= 2,	/*!< 12.65kbps  */
+	VOAMRWB_MD1425		= 3,	/*!< 14.25kbps  */
+	VOAMRWB_MD1585		= 4,	/*!< 15.85bps   */
+	VOAMRWB_MD1825		= 5,	/*!< 18.25bps   */
+	VOAMRWB_MD1985		= 6,	/*!< 19.85kbps  */
+	VOAMRWB_MD2305		= 7,    /*!< 23.05kbps  */
+	VOAMRWB_MD2385          = 8,    /*!< 23.85kbps> */	
+	VOAMRWB_N_MODES 	= 9,	/*!< Invalid mode */
+	VOAMRWB_MODE_MAX    = VO_MAX_ENUM_VALUE
+	
+}VOAMRWBMODE;
+
+/*!* the frame format the codec supports*/
+typedef enum {
+	VOAMRWB_DEFAULT  	= 0,	/*!< the frame type is the header (defined in RFC3267) + rawdata*/
+	/*One word (2-byte) for sync word (0x6b21)*/
+	/*One word (2-byte) for frame length N.*/
+	/*N words (2-byte) containing N bits (bit 0 = 0x007f, bit 1 = 0x0081).*/
+	VOAMRWB_ITU         = 1, 
+	/*One word (2-byte) for sync word (0x6b21).*/
+	/*One word (2-byte) to indicate the frame type.*/	
+	/*One word (2-byte) to indicate the mode.*/
+	/*N words  (2-byte) containing N bits (bit 0 = 0xff81, bit 1 = 0x007f).*/
+	VOAMRWB_RFC3267		= 2,	/* see RFC 3267 */  
+    VOAMRWB_TMAX        = VO_MAX_ENUM_VALUE	
+}VOAMRWBFRAMETYPE;
+
+
+#define    VO_PID_AMRWB_Module							0x42261000 
+#define    VO_PID_AMRWB_FORMAT                          (VO_PID_AMRWB_Module | 0x0002)
+#define    VO_PID_AMRWB_CHANNELS                        (VO_PID_AMRWB_Module | 0x0003)
+#define    VO_PID_AMRWB_SAMPLERATE                      (VO_PID_AMRWB_Module | 0x0004)
+#define    VO_PID_AMRWB_FRAMETYPE                       (VO_PID_AMRWB_Module | 0x0005)
+#define    VO_PID_AMRWB_MODE                            (VO_PID_AMRWB_Module | 0x0006)
+#define    VO_PID_AMRWB_DTX                             (VO_PID_AMRWB_Module | 0x0007)
+
+/**
+ * Get audio codec API interface
+ * \param pEncHandle [out] Return the AMRWB Encoder handle.
+ * \retval VO_ERR_OK Succeeded.
+ */
+VO_S32 VO_API voGetAMRWBEncAPI(VO_AUDIO_CODECAPI *pEncHandle);
+
+
+#pragma pack(pop)
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* __cplusplus */
+
+
+#endif   //__VOAMRWB_H__
+
diff --git a/media/libstagefright/codecs/common/include/voAudio.h b/media/libstagefright/codecs/common/include/voAudio.h
index 64c9dfb..21d0cf6 100644
--- a/media/libstagefright/codecs/common/include/voAudio.h
+++ b/media/libstagefright/codecs/common/include/voAudio.h
@@ -1,173 +1,173 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		voAudio.h

-

-	Content:	Audio types and functions

-

-*******************************************************************************/

-

-#ifndef __voAudio_H__

-#define __voAudio_H__

-

-#ifdef __cplusplus

-extern "C" {

-#endif /* __cplusplus */

-

-#include "voIndex.h"

-#include "voMem.h"

-

-#define	VO_PID_AUDIO_BASE			 0x42000000							/*!< The base param ID for AUDIO codec */

-#define	VO_PID_AUDIO_FORMAT			(VO_PID_AUDIO_BASE | 0X0001)		/*!< The format data of audio in track */

-#define	VO_PID_AUDIO_SAMPLEREATE	(VO_PID_AUDIO_BASE | 0X0002)		/*!< The sample rate of audio  */

-#define	VO_PID_AUDIO_CHANNELS		(VO_PID_AUDIO_BASE | 0X0003)		/*!< The channel of audio */

-#define	VO_PID_AUDIO_BITRATE		(VO_PID_AUDIO_BASE | 0X0004)		/*!< The bit rate of audio */

-#define VO_PID_AUDIO_CHANNELMODE	(VO_PID_AUDIO_BASE | 0X0005)		/*!< The channel mode of audio */

-

-#define	VO_ERR_AUDIO_BASE			0x82000000

-#define VO_ERR_AUDIO_UNSCHANNEL		VO_ERR_AUDIO_BASE | 0x0001

-#define VO_ERR_AUDIO_UNSSAMPLERATE	VO_ERR_AUDIO_BASE | 0x0002

-#define VO_ERR_AUDIO_UNSFEATURE		VO_ERR_AUDIO_BASE | 0x0003

-

-

-/**

- *Enumeration used to define the possible audio coding formats.

- */

-typedef enum VO_AUDIO_CODINGTYPE {

-	VO_AUDIO_CodingUnused = 0,  /**< Placeholder value when coding is N/A  */

-	VO_AUDIO_CodingPCM,         /**< Any variant of PCM coding */

-	VO_AUDIO_CodingADPCM,       /**< Any variant of ADPCM encoded data */

-	VO_AUDIO_CodingAMRNB,       /**< Any variant of AMR encoded data */

-	VO_AUDIO_CodingAMRWB,       /**< Any variant of AMR encoded data */

-	VO_AUDIO_CodingAMRWBP,      /**< Any variant of AMR encoded data */

-	VO_AUDIO_CodingQCELP13,     /**< Any variant of QCELP 13kbps encoded data */

-	VO_AUDIO_CodingEVRC,        /**< Any variant of EVRC encoded data */

-	VO_AUDIO_CodingAAC,         /**< Any variant of AAC encoded data, 0xA106 - ISO/MPEG-4 AAC, 0xFF - AAC */

-	VO_AUDIO_CodingAC3,         /**< Any variant of AC3 encoded data */

-	VO_AUDIO_CodingFLAC,        /**< Any variant of FLAC encoded data */

-	VO_AUDIO_CodingMP1,			/**< Any variant of MP1 encoded data */

-	VO_AUDIO_CodingMP3,         /**< Any variant of MP3 encoded data */

-	VO_AUDIO_CodingOGG,         /**< Any variant of OGG encoded data */

-	VO_AUDIO_CodingWMA,         /**< Any variant of WMA encoded data */

-	VO_AUDIO_CodingRA,          /**< Any variant of RA encoded data */

-	VO_AUDIO_CodingMIDI,        /**< Any variant of MIDI encoded data */

-	VO_AUDIO_CodingDRA,         /**< Any variant of dra encoded data */

-	VO_AUDIO_CodingG729,        /**< Any variant of dra encoded data */

-	VO_AUDIO_Coding_MAX		= VO_MAX_ENUM_VALUE

-} VO_AUDIO_CODINGTYPE;

-

-/*!

-* the channel type value

-*/

-typedef enum {

-	VO_CHANNEL_CENTER				= 1,	/*!<center channel*/

-	VO_CHANNEL_FRONT_LEFT			= 1<<1,	/*!<front left channel*/

-	VO_CHANNEL_FRONT_RIGHT			= 1<<2,	/*!<front right channel*/

-	VO_CHANNEL_SIDE_LEFT  			= 1<<3, /*!<side left channel*/

-	VO_CHANNEL_SIDE_RIGHT			= 1<<4, /*!<side right channel*/

-	VO_CHANNEL_BACK_LEFT			= 1<<5,	/*!<back left channel*/

-	VO_CHANNEL_BACK_RIGHT			= 1<<6,	/*!<back right channel*/

-	VO_CHANNEL_BACK_CENTER			= 1<<7,	/*!<back center channel*/

-	VO_CHANNEL_LFE_BASS				= 1<<8,	/*!<low-frequency effects bass channel*/

-	VO_CHANNEL_ALL					= 0xffff,/*!<[default] include all channels */

-	VO_CHANNEL_MAX					= VO_MAX_ENUM_VALUE

-} VO_AUDIO_CHANNELTYPE;

-

-/**

- * General audio format info

- */

-typedef struct

-{

-	VO_S32	SampleRate;  /*!< Sample rate */

-	VO_S32	Channels;    /*!< Channel count */

-	VO_S32	SampleBits;  /*!< Bits per sample */

-} VO_AUDIO_FORMAT;

-

-/**

- * General audio output info

- */

-typedef struct

-{

-	VO_AUDIO_FORMAT	Format;			/*!< Sample rate */

-	VO_U32			InputUsed;		/*!< Channel count */

-	VO_U32			Resever;		/*!< Resevered */

-} VO_AUDIO_OUTPUTINFO;

-

-/**

- * General audio codec function set

- */

-typedef struct VO_AUDIO_CODECAPI

-{

-	/**

-	 * Init the audio codec module and return codec handle

-	 * \param phCodec [OUT] Return the video codec handle

-	 * \param vType	[IN] The codec type if the module support multi codec.

-	 * \param pUserData	[IN] The init param. It is either a memory operator or an allocated memory

-	 * \retval VO_ERR_NONE Succeeded.

-	 */

-	VO_U32 (VO_API * Init) (VO_HANDLE * phCodec, VO_AUDIO_CODINGTYPE vType, VO_CODEC_INIT_USERDATA * pUserData );

-

-	/**

-	 * Set input audio data.

-	 * \param hCodec [IN]] The codec handle which was created by Init function.

-	 * \param pInput [IN] The input buffer param.

-	 * \retval VO_ERR_NONE Succeeded.

-	 */

-	VO_U32 (VO_API * SetInputData) (VO_HANDLE hCodec, VO_CODECBUFFER * pInput);

-

-	/**

-	 * Get the outut audio data

-	 * \param hCodec [IN]] The codec handle which was created by Init function.

-	 * \param pOutBuffer [OUT] The output audio data

-	 * \param pOutInfo [OUT] The codec fills audio format and the input data size used in current call.

-	 *						 pOutInfo->InputUsed is total used input data size in byte.

-	 * \retval  VO_ERR_NONE Succeeded.

-	 *			VO_ERR_INPUT_BUFFER_SMALL. The input was finished or the input data was not enought. Continue to input 

-	 *										data before next call.

-	 */

-	VO_U32 (VO_API * GetOutputData) (VO_HANDLE hCodec, VO_CODECBUFFER * pOutBuffer, VO_AUDIO_OUTPUTINFO * pOutInfo);

-

-	/**

-	 * Set the parameter for the specified param ID.

-	 * \param hCodec [IN]] The codec handle which was created by Init function.

-	 * \param uParamID [IN] The param ID.

-	 * \param pData [IN] The param value.

-	 * \retval VO_ERR_NONE Succeeded.

-	 */

-	VO_U32 (VO_API * SetParam) (VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData);

-

-	/**

-	 * Get the parameter for the specified param ID.

-	 * \param hCodec [IN]] The codec handle which was created by Init function.

-	 * \param uParamID [IN] The param ID.

-	 * \param pData [IN] The param value.

-	 * \retval VO_ERR_NONE Succeeded.

-	 */

-	VO_U32 (VO_API * GetParam) (VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData);

-

-	/**

-	 * Uninit the Codec.

-	 * \param hCodec [IN]] The codec handle which was created by Init function.

-	 * \retval VO_ERR_NONE Succeeded.

-	 */

-	VO_U32 (VO_API * Uninit) (VO_HANDLE hCodec);

-} VO_AUDIO_CODECAPI;

-

-#ifdef __cplusplus

-}

-#endif /* __cplusplus */

-

-#endif // __voAudio_H__

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		voAudio.h
+
+	Content:	Audio types and functions
+
+*******************************************************************************/
+
+#ifndef __voAudio_H__
+#define __voAudio_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include "voIndex.h"
+#include "voMem.h"
+
+#define	VO_PID_AUDIO_BASE			 0x42000000							/*!< The base param ID for AUDIO codec */
+#define	VO_PID_AUDIO_FORMAT			(VO_PID_AUDIO_BASE | 0X0001)		/*!< The format data of audio in track */
+#define	VO_PID_AUDIO_SAMPLEREATE	(VO_PID_AUDIO_BASE | 0X0002)		/*!< The sample rate of audio  */
+#define	VO_PID_AUDIO_CHANNELS		(VO_PID_AUDIO_BASE | 0X0003)		/*!< The channel of audio */
+#define	VO_PID_AUDIO_BITRATE		(VO_PID_AUDIO_BASE | 0X0004)		/*!< The bit rate of audio */
+#define VO_PID_AUDIO_CHANNELMODE	(VO_PID_AUDIO_BASE | 0X0005)		/*!< The channel mode of audio */
+
+#define	VO_ERR_AUDIO_BASE			0x82000000
+#define VO_ERR_AUDIO_UNSCHANNEL		VO_ERR_AUDIO_BASE | 0x0001
+#define VO_ERR_AUDIO_UNSSAMPLERATE	VO_ERR_AUDIO_BASE | 0x0002
+#define VO_ERR_AUDIO_UNSFEATURE		VO_ERR_AUDIO_BASE | 0x0003
+
+
+/**
+ *Enumeration used to define the possible audio coding formats.
+ */
+typedef enum VO_AUDIO_CODINGTYPE {
+	VO_AUDIO_CodingUnused = 0,  /**< Placeholder value when coding is N/A  */
+	VO_AUDIO_CodingPCM,         /**< Any variant of PCM coding */
+	VO_AUDIO_CodingADPCM,       /**< Any variant of ADPCM encoded data */
+	VO_AUDIO_CodingAMRNB,       /**< Any variant of AMR encoded data */
+	VO_AUDIO_CodingAMRWB,       /**< Any variant of AMR encoded data */
+	VO_AUDIO_CodingAMRWBP,      /**< Any variant of AMR encoded data */
+	VO_AUDIO_CodingQCELP13,     /**< Any variant of QCELP 13kbps encoded data */
+	VO_AUDIO_CodingEVRC,        /**< Any variant of EVRC encoded data */
+	VO_AUDIO_CodingAAC,         /**< Any variant of AAC encoded data, 0xA106 - ISO/MPEG-4 AAC, 0xFF - AAC */
+	VO_AUDIO_CodingAC3,         /**< Any variant of AC3 encoded data */
+	VO_AUDIO_CodingFLAC,        /**< Any variant of FLAC encoded data */
+	VO_AUDIO_CodingMP1,			/**< Any variant of MP1 encoded data */
+	VO_AUDIO_CodingMP3,         /**< Any variant of MP3 encoded data */
+	VO_AUDIO_CodingOGG,         /**< Any variant of OGG encoded data */
+	VO_AUDIO_CodingWMA,         /**< Any variant of WMA encoded data */
+	VO_AUDIO_CodingRA,          /**< Any variant of RA encoded data */
+	VO_AUDIO_CodingMIDI,        /**< Any variant of MIDI encoded data */
+	VO_AUDIO_CodingDRA,         /**< Any variant of dra encoded data */
+	VO_AUDIO_CodingG729,        /**< Any variant of dra encoded data */
+	VO_AUDIO_Coding_MAX		= VO_MAX_ENUM_VALUE
+} VO_AUDIO_CODINGTYPE;
+
+/*!
+* the channel type value
+*/
+typedef enum {
+	VO_CHANNEL_CENTER				= 1,	/*!<center channel*/
+	VO_CHANNEL_FRONT_LEFT			= 1<<1,	/*!<front left channel*/
+	VO_CHANNEL_FRONT_RIGHT			= 1<<2,	/*!<front right channel*/
+	VO_CHANNEL_SIDE_LEFT  			= 1<<3, /*!<side left channel*/
+	VO_CHANNEL_SIDE_RIGHT			= 1<<4, /*!<side right channel*/
+	VO_CHANNEL_BACK_LEFT			= 1<<5,	/*!<back left channel*/
+	VO_CHANNEL_BACK_RIGHT			= 1<<6,	/*!<back right channel*/
+	VO_CHANNEL_BACK_CENTER			= 1<<7,	/*!<back center channel*/
+	VO_CHANNEL_LFE_BASS				= 1<<8,	/*!<low-frequency effects bass channel*/
+	VO_CHANNEL_ALL					= 0xffff,/*!<[default] include all channels */
+	VO_CHANNEL_MAX					= VO_MAX_ENUM_VALUE
+} VO_AUDIO_CHANNELTYPE;
+
+/**
+ * General audio format info
+ */
+typedef struct
+{
+	VO_S32	SampleRate;  /*!< Sample rate */
+	VO_S32	Channels;    /*!< Channel count */
+	VO_S32	SampleBits;  /*!< Bits per sample */
+} VO_AUDIO_FORMAT;
+
+/**
+ * General audio output info
+ */
+typedef struct
+{
+	VO_AUDIO_FORMAT	Format;			/*!< Sample rate */
+	VO_U32			InputUsed;		/*!< Channel count */
+	VO_U32			Resever;		/*!< Resevered */
+} VO_AUDIO_OUTPUTINFO;
+
+/**
+ * General audio codec function set
+ */
+typedef struct VO_AUDIO_CODECAPI
+{
+	/**
+	 * Init the audio codec module and return codec handle
+	 * \param phCodec [OUT] Return the video codec handle
+	 * \param vType	[IN] The codec type if the module support multi codec.
+	 * \param pUserData	[IN] The init param. It is either a memory operator or an allocated memory
+	 * \retval VO_ERR_NONE Succeeded.
+	 */
+	VO_U32 (VO_API * Init) (VO_HANDLE * phCodec, VO_AUDIO_CODINGTYPE vType, VO_CODEC_INIT_USERDATA * pUserData );
+
+	/**
+	 * Set input audio data.
+	 * \param hCodec [IN]] The codec handle which was created by Init function.
+	 * \param pInput [IN] The input buffer param.
+	 * \retval VO_ERR_NONE Succeeded.
+	 */
+	VO_U32 (VO_API * SetInputData) (VO_HANDLE hCodec, VO_CODECBUFFER * pInput);
+
+	/**
+	 * Get the outut audio data
+	 * \param hCodec [IN]] The codec handle which was created by Init function.
+	 * \param pOutBuffer [OUT] The output audio data
+	 * \param pOutInfo [OUT] The codec fills audio format and the input data size used in current call.
+	 *						 pOutInfo->InputUsed is total used input data size in byte.
+	 * \retval  VO_ERR_NONE Succeeded.
+	 *			VO_ERR_INPUT_BUFFER_SMALL. The input was finished or the input data was not enought. Continue to input 
+	 *										data before next call.
+	 */
+	VO_U32 (VO_API * GetOutputData) (VO_HANDLE hCodec, VO_CODECBUFFER * pOutBuffer, VO_AUDIO_OUTPUTINFO * pOutInfo);
+
+	/**
+	 * Set the parameter for the specified param ID.
+	 * \param hCodec [IN]] The codec handle which was created by Init function.
+	 * \param uParamID [IN] The param ID.
+	 * \param pData [IN] The param value.
+	 * \retval VO_ERR_NONE Succeeded.
+	 */
+	VO_U32 (VO_API * SetParam) (VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData);
+
+	/**
+	 * Get the parameter for the specified param ID.
+	 * \param hCodec [IN]] The codec handle which was created by Init function.
+	 * \param uParamID [IN] The param ID.
+	 * \param pData [IN] The param value.
+	 * \retval VO_ERR_NONE Succeeded.
+	 */
+	VO_U32 (VO_API * GetParam) (VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData);
+
+	/**
+	 * Uninit the Codec.
+	 * \param hCodec [IN]] The codec handle which was created by Init function.
+	 * \retval VO_ERR_NONE Succeeded.
+	 */
+	VO_U32 (VO_API * Uninit) (VO_HANDLE hCodec);
+} VO_AUDIO_CODECAPI;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif // __voAudio_H__
diff --git a/media/libstagefright/codecs/common/include/voIndex.h b/media/libstagefright/codecs/common/include/voIndex.h
index 541a0db..a409a6e 100644
--- a/media/libstagefright/codecs/common/include/voIndex.h
+++ b/media/libstagefright/codecs/common/include/voIndex.h
@@ -1,193 +1,193 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		voIndex.h

-

-	Content:	module and ID definition

-

-*******************************************************************************/

-

-#ifndef __voIndex_H__

-#define __voIndex_H__

-

-#ifdef __cplusplus

-extern "C" {

-#endif /* __cplusplus */

-

-#include "voType.h"

-

-/* Define the module ID */

-#define _MAKE_SOURCE_ID(id, name) \

-VO_INDEX_SRC_##name = _VO_INDEX_SOURCE | id,

-

-#define _MAKE_CODEC_ID(id, name) \

-VO_INDEX_DEC_##name = _VO_INDEX_DEC | id, \

-VO_INDEX_ENC_##name = _VO_INDEX_ENC | id,

-

-#define _MAKE_EFFECT_ID(id, name) \

-VO_INDEX_EFT_##name = _VO_INDEX_EFFECT | id,

-

-#define _MAKE_SINK_ID(id, name) \

-VO_INDEX_SNK_##name = _VO_INDEX_SINK | id,

-

-#define _MAKE_FILTER_ID(id, name) \

-VO_INDEX_FLT_##name = _VO_INDEX_FILTER | id,

-

-#define _MAKE_OMX_ID(id, name) \

-VO_INDEX_OMX_##name = _VO_INDEX_OMX | id,

-

-#define _MAKE_MFW_ID(id, name) \

-VO_INDEX_MFW_##name = _VO_INDEX_MFW | id,

-

-enum

-{

-	_VO_INDEX_SOURCE		= 0x01000000,

-	_VO_INDEX_DEC			= 0x02000000,

-	_VO_INDEX_ENC			= 0x03000000,

-	_VO_INDEX_EFFECT		= 0x04000000,

-	_VO_INDEX_SINK			= 0x05000000,

-	_VO_INDEX_FILTER		= 0x06000000,

-	_VO_INDEX_OMX			= 0x07000000,

-	_VO_INDEX_MFW			= 0x08000000,

-

-	// define file parser modules

-	_MAKE_SOURCE_ID (0x010000, MP4)

-	_MAKE_SOURCE_ID (0x020000, AVI)

-	_MAKE_SOURCE_ID (0x030000, ASF)

-	_MAKE_SOURCE_ID (0x040000, REAL)

-	_MAKE_SOURCE_ID (0x050000, AUDIO)

-	_MAKE_SOURCE_ID (0x060000, FLASH)

-	_MAKE_SOURCE_ID (0x070000, OGG)

-	_MAKE_SOURCE_ID (0x080000, MKV)

-

-	// define network source modules

-	_MAKE_SOURCE_ID (0x110000, RTSP)

-	_MAKE_SOURCE_ID (0x120000, HTTP)

-

-	// define CMMB source modules

-	_MAKE_SOURCE_ID (0x200000, CMMB)

-	_MAKE_SOURCE_ID (0x210000, CMMB_INNO)

-	_MAKE_SOURCE_ID (0x220000, CMMB_TELE)

-	_MAKE_SOURCE_ID (0x230000, CMMB_SIANO)

-

-	// define DVBT source modules

-	_MAKE_SOURCE_ID (0x300000, DVBT)

-	_MAKE_SOURCE_ID (0x310000, DVBT_DIBCOM)

-

-	// define other source modules

-	_MAKE_SOURCE_ID (0x400000, ID3)

-

-	// define video codec modules

-	_MAKE_CODEC_ID (0x010000, H264)

-	_MAKE_CODEC_ID (0x020000, MPEG4)

-	_MAKE_CODEC_ID (0x030000, H263)

-	_MAKE_CODEC_ID (0x040000, S263)

-	_MAKE_CODEC_ID (0x050000, RV)

-	_MAKE_CODEC_ID (0x060000, WMV)

-	_MAKE_CODEC_ID (0x070000, DIVX3)

-	_MAKE_CODEC_ID (0x080000, MJPEG)

-	_MAKE_CODEC_ID (0x090000, MPEG2)

-	_MAKE_CODEC_ID (0x0A0000, VP6)

-

-	// define audio codec modules

-	_MAKE_CODEC_ID (0x210000, AAC)

-	_MAKE_CODEC_ID (0x220000, MP3)

-	_MAKE_CODEC_ID (0x230000, WMA)

-	_MAKE_CODEC_ID (0x240000, RA)

-	_MAKE_CODEC_ID (0x250000, AMRNB)

-	_MAKE_CODEC_ID (0x260000, AMRWB)

-	_MAKE_CODEC_ID (0x270000, AMRWBP)

-	_MAKE_CODEC_ID (0x280000, QCELP)

-	_MAKE_CODEC_ID (0x290000, EVRC)

-	_MAKE_CODEC_ID (0x2A0000, ADPCM)

-	_MAKE_CODEC_ID (0x2B0000, MIDI)

-	_MAKE_CODEC_ID (0x2C0000, AC3)

-	_MAKE_CODEC_ID (0x2D0000, FLAC)

-	_MAKE_CODEC_ID (0x2E0000, DRA)

-	_MAKE_CODEC_ID (0x2F0000, OGG)

-	_MAKE_CODEC_ID (0x300000, G729)

-

-	// define image codec modules

-	_MAKE_CODEC_ID (0x410000, JPEG)

-	_MAKE_CODEC_ID (0x420000, GIF)

-	_MAKE_CODEC_ID (0x430000, PNG)

-	_MAKE_CODEC_ID (0x440000, TIF)

-

-	// define effect modules

-	_MAKE_EFFECT_ID (0x010000, EQ)

-

-	// define sink modules

-	_MAKE_SINK_ID (0x010000, VIDEO)

-	_MAKE_SINK_ID (0x020000, AUDIO)

-	_MAKE_SINK_ID (0x030000, CCRRR)

-	_MAKE_SINK_ID (0x040000, CCRRV)

-

-	_MAKE_SINK_ID (0x110000, MP4)

-	_MAKE_SINK_ID (0x120000, AVI)

-	_MAKE_SINK_ID (0x130000, AFW)

-

-	// define media frame module ID

-	_MAKE_MFW_ID (0x010000, VOMMPLAY)

-	_MAKE_MFW_ID (0x020000, VOMMREC)

-	_MAKE_MFW_ID (0x030000, VOME)

-};

-

-

-/* define the error ID */

-#define VO_ERR_NONE						0x00000000

-#define VO_ERR_FINISH					0x00000001

-#define VO_ERR_BASE						0X80000000

-#define VO_ERR_FAILED					0x80000001

-#define VO_ERR_OUTOF_MEMORY				0x80000002

-#define VO_ERR_NOT_IMPLEMENT			0x80000003

-#define VO_ERR_INVALID_ARG				0x80000004

-#define VO_ERR_INPUT_BUFFER_SMALL		0x80000005

-#define VO_ERR_OUTPUT_BUFFER_SMALL		0x80000006

-#define VO_ERR_WRONG_STATUS				0x80000007

-#define VO_ERR_WRONG_PARAM_ID			0x80000008

-#define VO_ERR_LICENSE_ERROR			0x80000009

-

-/* xxx is the module ID

-#define VO_ERR_FAILED					0x8xxx0001

-#define VO_ERR_OUTOF_MEMORY				0x8xxx0002

-#define VO_ERR_NOT_IMPLEMENT			0x8xxx0003

-#define VO_ERR_INVALID_ARG				0x8xxx0004

-#define VO_ERR_INPUT_BUFFER_SMALL		0x8xxx0005

-#define VO_ERR_OUTPUT_BUFFER_SMALL		0x8xxx0006

-#define VO_ERR_WRONG_STATUS				0x8xxx0007

-#define VO_ERR_WRONG_PARAM_ID			0x8xxx0008

-#define VO_ERR_LICENSE_ERROR			0x8xxx0009

-// Module own error ID

-#define VO_ERR_Module					0x8xxx0X00

-*/

- 

-#define	VO_PID_COMMON_BASE				 0x40000000						/*!< The base of common param ID */

-#define	VO_PID_COMMON_QUERYMEM			(VO_PID_COMMON_BASE | 0X0001)	/*!< Query the memory needed; Reserved. */

-#define	VO_PID_COMMON_INPUTTYPE			(VO_PID_COMMON_BASE | 0X0002)	/*!< Set or get the input buffer type. VO_INPUT_TYPE */

-#define	VO_PID_COMMON_HASRESOURCE		(VO_PID_COMMON_BASE | 0X0003)	/*!< Query it has resource to be used. VO_U32 *, 1 have, 0 No */

-#define	VO_PID_COMMON_HEADDATA			(VO_PID_COMMON_BASE | 0X0004)	/*!< Decoder track header data. VO_CODECBUFFER * */

-#define	VO_PID_COMMON_FLUSH				(VO_PID_COMMON_BASE | 0X0005)	/*!< Flush the codec buffer. VO_U32 *, 1 Flush, 0 No * */

-

-/*

-// Module Param ID

-#define VO_ID_Mdoule					0x0xxx1000

-*/

-

-#ifdef __cplusplus

-}

-#endif /* __cplusplus */

-

-#endif // __voIndex_H__

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		voIndex.h
+
+	Content:	module and ID definition
+
+*******************************************************************************/
+
+#ifndef __voIndex_H__
+#define __voIndex_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include "voType.h"
+
+/* Define the module ID */
+#define _MAKE_SOURCE_ID(id, name) \
+VO_INDEX_SRC_##name = _VO_INDEX_SOURCE | id,
+
+#define _MAKE_CODEC_ID(id, name) \
+VO_INDEX_DEC_##name = _VO_INDEX_DEC | id, \
+VO_INDEX_ENC_##name = _VO_INDEX_ENC | id,
+
+#define _MAKE_EFFECT_ID(id, name) \
+VO_INDEX_EFT_##name = _VO_INDEX_EFFECT | id,
+
+#define _MAKE_SINK_ID(id, name) \
+VO_INDEX_SNK_##name = _VO_INDEX_SINK | id,
+
+#define _MAKE_FILTER_ID(id, name) \
+VO_INDEX_FLT_##name = _VO_INDEX_FILTER | id,
+
+#define _MAKE_OMX_ID(id, name) \
+VO_INDEX_OMX_##name = _VO_INDEX_OMX | id,
+
+#define _MAKE_MFW_ID(id, name) \
+VO_INDEX_MFW_##name = _VO_INDEX_MFW | id,
+
+enum
+{
+	_VO_INDEX_SOURCE		= 0x01000000,
+	_VO_INDEX_DEC			= 0x02000000,
+	_VO_INDEX_ENC			= 0x03000000,
+	_VO_INDEX_EFFECT		= 0x04000000,
+	_VO_INDEX_SINK			= 0x05000000,
+	_VO_INDEX_FILTER		= 0x06000000,
+	_VO_INDEX_OMX			= 0x07000000,
+	_VO_INDEX_MFW			= 0x08000000,
+
+	// define file parser modules
+	_MAKE_SOURCE_ID (0x010000, MP4)
+	_MAKE_SOURCE_ID (0x020000, AVI)
+	_MAKE_SOURCE_ID (0x030000, ASF)
+	_MAKE_SOURCE_ID (0x040000, REAL)
+	_MAKE_SOURCE_ID (0x050000, AUDIO)
+	_MAKE_SOURCE_ID (0x060000, FLASH)
+	_MAKE_SOURCE_ID (0x070000, OGG)
+	_MAKE_SOURCE_ID (0x080000, MKV)
+
+	// define network source modules
+	_MAKE_SOURCE_ID (0x110000, RTSP)
+	_MAKE_SOURCE_ID (0x120000, HTTP)
+
+	// define CMMB source modules
+	_MAKE_SOURCE_ID (0x200000, CMMB)
+	_MAKE_SOURCE_ID (0x210000, CMMB_INNO)
+	_MAKE_SOURCE_ID (0x220000, CMMB_TELE)
+	_MAKE_SOURCE_ID (0x230000, CMMB_SIANO)
+
+	// define DVBT source modules
+	_MAKE_SOURCE_ID (0x300000, DVBT)
+	_MAKE_SOURCE_ID (0x310000, DVBT_DIBCOM)
+
+	// define other source modules
+	_MAKE_SOURCE_ID (0x400000, ID3)
+
+	// define video codec modules
+	_MAKE_CODEC_ID (0x010000, H264)
+	_MAKE_CODEC_ID (0x020000, MPEG4)
+	_MAKE_CODEC_ID (0x030000, H263)
+	_MAKE_CODEC_ID (0x040000, S263)
+	_MAKE_CODEC_ID (0x050000, RV)
+	_MAKE_CODEC_ID (0x060000, WMV)
+	_MAKE_CODEC_ID (0x070000, DIVX3)
+	_MAKE_CODEC_ID (0x080000, MJPEG)
+	_MAKE_CODEC_ID (0x090000, MPEG2)
+	_MAKE_CODEC_ID (0x0A0000, VP6)
+
+	// define audio codec modules
+	_MAKE_CODEC_ID (0x210000, AAC)
+	_MAKE_CODEC_ID (0x220000, MP3)
+	_MAKE_CODEC_ID (0x230000, WMA)
+	_MAKE_CODEC_ID (0x240000, RA)
+	_MAKE_CODEC_ID (0x250000, AMRNB)
+	_MAKE_CODEC_ID (0x260000, AMRWB)
+	_MAKE_CODEC_ID (0x270000, AMRWBP)
+	_MAKE_CODEC_ID (0x280000, QCELP)
+	_MAKE_CODEC_ID (0x290000, EVRC)
+	_MAKE_CODEC_ID (0x2A0000, ADPCM)
+	_MAKE_CODEC_ID (0x2B0000, MIDI)
+	_MAKE_CODEC_ID (0x2C0000, AC3)
+	_MAKE_CODEC_ID (0x2D0000, FLAC)
+	_MAKE_CODEC_ID (0x2E0000, DRA)
+	_MAKE_CODEC_ID (0x2F0000, OGG)
+	_MAKE_CODEC_ID (0x300000, G729)
+
+	// define image codec modules
+	_MAKE_CODEC_ID (0x410000, JPEG)
+	_MAKE_CODEC_ID (0x420000, GIF)
+	_MAKE_CODEC_ID (0x430000, PNG)
+	_MAKE_CODEC_ID (0x440000, TIF)
+
+	// define effect modules
+	_MAKE_EFFECT_ID (0x010000, EQ)
+
+	// define sink modules
+	_MAKE_SINK_ID (0x010000, VIDEO)
+	_MAKE_SINK_ID (0x020000, AUDIO)
+	_MAKE_SINK_ID (0x030000, CCRRR)
+	_MAKE_SINK_ID (0x040000, CCRRV)
+
+	_MAKE_SINK_ID (0x110000, MP4)
+	_MAKE_SINK_ID (0x120000, AVI)
+	_MAKE_SINK_ID (0x130000, AFW)
+
+	// define media frame module ID
+	_MAKE_MFW_ID (0x010000, VOMMPLAY)
+	_MAKE_MFW_ID (0x020000, VOMMREC)
+	_MAKE_MFW_ID (0x030000, VOME)
+};
+
+
+/* define the error ID */
+#define VO_ERR_NONE						0x00000000
+#define VO_ERR_FINISH					0x00000001
+#define VO_ERR_BASE						0X80000000
+#define VO_ERR_FAILED					0x80000001
+#define VO_ERR_OUTOF_MEMORY				0x80000002
+#define VO_ERR_NOT_IMPLEMENT			0x80000003
+#define VO_ERR_INVALID_ARG				0x80000004
+#define VO_ERR_INPUT_BUFFER_SMALL		0x80000005
+#define VO_ERR_OUTPUT_BUFFER_SMALL		0x80000006
+#define VO_ERR_WRONG_STATUS				0x80000007
+#define VO_ERR_WRONG_PARAM_ID			0x80000008
+#define VO_ERR_LICENSE_ERROR			0x80000009
+
+/* xxx is the module ID
+#define VO_ERR_FAILED					0x8xxx0001
+#define VO_ERR_OUTOF_MEMORY				0x8xxx0002
+#define VO_ERR_NOT_IMPLEMENT			0x8xxx0003
+#define VO_ERR_INVALID_ARG				0x8xxx0004
+#define VO_ERR_INPUT_BUFFER_SMALL		0x8xxx0005
+#define VO_ERR_OUTPUT_BUFFER_SMALL		0x8xxx0006
+#define VO_ERR_WRONG_STATUS				0x8xxx0007
+#define VO_ERR_WRONG_PARAM_ID			0x8xxx0008
+#define VO_ERR_LICENSE_ERROR			0x8xxx0009
+// Module own error ID
+#define VO_ERR_Module					0x8xxx0X00
+*/
+ 
+#define	VO_PID_COMMON_BASE				 0x40000000						/*!< The base of common param ID */
+#define	VO_PID_COMMON_QUERYMEM			(VO_PID_COMMON_BASE | 0X0001)	/*!< Query the memory needed; Reserved. */
+#define	VO_PID_COMMON_INPUTTYPE			(VO_PID_COMMON_BASE | 0X0002)	/*!< Set or get the input buffer type. VO_INPUT_TYPE */
+#define	VO_PID_COMMON_HASRESOURCE		(VO_PID_COMMON_BASE | 0X0003)	/*!< Query it has resource to be used. VO_U32 *, 1 have, 0 No */
+#define	VO_PID_COMMON_HEADDATA			(VO_PID_COMMON_BASE | 0X0004)	/*!< Decoder track header data. VO_CODECBUFFER * */
+#define	VO_PID_COMMON_FLUSH				(VO_PID_COMMON_BASE | 0X0005)	/*!< Flush the codec buffer. VO_U32 *, 1 Flush, 0 No * */
+
+/*
+// Module Param ID
+#define VO_ID_Mdoule					0x0xxx1000
+*/
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif // __voIndex_H__
diff --git a/media/libstagefright/codecs/common/include/voType.h b/media/libstagefright/codecs/common/include/voType.h
index 2669134..70b2e83 100644
--- a/media/libstagefright/codecs/common/include/voType.h
+++ b/media/libstagefright/codecs/common/include/voType.h
@@ -1,221 +1,221 @@
-/*

- ** Copyright 2003-2010, VisualOn, Inc.

- **

- ** Licensed under the Apache License, Version 2.0 (the "License");

- ** you may not use this file except in compliance with the License.

- ** You may obtain a copy of the License at

- **

- **     http://www.apache.org/licenses/LICENSE-2.0

- **

- ** Unless required by applicable law or agreed to in writing, software

- ** distributed under the License is distributed on an "AS IS" BASIS,

- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- ** See the License for the specific language governing permissions and

- ** limitations under the License.

- */

-/*******************************************************************************

-	File:		voType.h

-

-	Content:	data type definition

-

-*******************************************************************************/

-#ifndef __voType_H__

-#define __voType_H__

-

-#ifdef __cplusplus

-extern "C" {

-#endif /* __cplusplus */

-

-#ifdef _WIN32

-#	define VO_API __cdecl

-#	define VO_CBI __stdcall

-#else

-#	define VO_API

-#	define VO_CBI

-#endif //_WIN32

-

-/** VO_IN is used to identify inputs to an VO function.  This designation

-    will also be used in the case of a pointer that points to a parameter

-    that is used as an output. */

-#ifndef VO_IN

-#define VO_IN

-#endif

-

-/** VO_OUT is used to identify outputs from an VO function.  This

-    designation will also be used in the case of a pointer that points

-    to a parameter that is used as an input. */

-#ifndef VO_OUT

-#define VO_OUT

-#endif

-

-/** VO_INOUT is used to identify parameters that may be either inputs or

-    outputs from an VO function at the same time.  This designation will

-    also be used in the case of a pointer that  points to a parameter that

-    is used both as an input and an output. */

-#ifndef VO_INOUT

-#define VO_INOUT

-#endif

-

-#define VO_MAX_ENUM_VALUE	0X7FFFFFFF

-

-/** VO_VOID */

-typedef void VO_VOID;

-

-/** VO_U8 is an 8 bit unsigned quantity that is byte aligned */

-typedef unsigned char VO_U8;

-

-/** VO_BYTE is an 8 bit unsigned quantity that is byte aligned */

-typedef unsigned char VO_BYTE;

-

-/** VO_S8 is an 8 bit signed quantity that is byte aligned */

-typedef signed char VO_S8;

-

-/** VO_CHAR is an 8 bit signed quantity that is byte aligned */

-typedef char VO_CHAR;

-

-/** VO_U16 is a 16 bit unsigned quantity that is 16 bit word aligned */

-typedef unsigned short VO_U16;

-

-/** VO_WCHAR is a 16 bit unsigned quantity that is 16 bit word aligned */

-#if defined _WIN32

-typedef unsigned short VO_WCHAR;

-typedef unsigned short* VO_PWCHAR;

-#elif defined LINUX

-typedef unsigned char VO_WCHAR;

-typedef unsigned char* VO_PWCHAR;

-#endif

-

-/** VO_S16 is a 16 bit signed quantity that is 16 bit word aligned */

-typedef signed short VO_S16;

-

-/** VO_U32 is a 32 bit unsigned quantity that is 32 bit word aligned */

-typedef unsigned long VO_U32;

-

-/** VO_S32 is a 32 bit signed quantity that is 32 bit word aligned */

-typedef signed long VO_S32;

-

-/* Users with compilers that cannot accept the "long long" designation should

-   define the VO_SKIP64BIT macro.  It should be noted that this may cause

-   some components to fail to compile if the component was written to require

-   64 bit integral types.  However, these components would NOT compile anyway

-   since the compiler does not support the way the component was written.

-*/

-#ifndef VO_SKIP64BIT

-#ifdef _WIN32

-/** VO_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */

-typedef unsigned __int64  VO_U64;

-/** VO_S64 is a 64 bit signed quantity that is 64 bit word aligned */

-typedef signed   __int64  VO_S64;

-#else // WIN32

-/** VO_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */

-typedef unsigned long long VO_U64;

-/** VO_S64 is a 64 bit signed quantity that is 64 bit word aligned */

-typedef signed long long VO_S64;

-#endif // WIN32

-#endif // VO_SKIP64BIT

-

-/** The VO_BOOL type is intended to be used to represent a true or a false

-    value when passing parameters to and from the VO core and components.  The

-    VO_BOOL is a 32 bit quantity and is aligned on a 32 bit word boundary.

- */

-typedef enum VO_BOOL {

-    VO_FALSE = 0,

-    VO_TRUE = !VO_FALSE,

-	VO_BOOL_MAX = VO_MAX_ENUM_VALUE

-} VO_BOOL;

-

-/** The VO_PTR type is intended to be used to pass pointers between the VO

-    applications and the VO Core and components.  This is a 32 bit pointer and

-    is aligned on a 32 bit boundary.

- */

-typedef void* VO_PTR;

-

-/** The VO_HANDLE type is intended to be used to pass pointers between the VO

-    applications and the VO Core and components.  This is a 32 bit pointer and

-    is aligned on a 32 bit boundary.

- */

-typedef void* VO_HANDLE;

-

-/** The VO_STRING type is intended to be used to pass "C" type strings between

-    the application and the core and component.  The VO_STRING type is a 32

-    bit pointer to a zero terminated string.  The  pointer is word aligned and

-    the string is byte aligned.

- */

-typedef char* VO_PCHAR;

-

-/** The VO_PBYTE type is intended to be used to pass arrays of bytes such as

-    buffers between the application and the component and core.  The VO_PBYTE

-    type is a 32 bit pointer to a zero terminated string.  The  pointer is word

-    aligned and the string is byte aligned.

- */

-typedef unsigned char* VO_PBYTE;

-

-/** The VO_PTCHAR type is intended to be used to pass arrays of wchar such as

-    unicode char between the application and the component and core.  The VO_PTCHAR

-    type is a 32 bit pointer to a zero terminated string.  The  pointer is word

-    aligned and the string is byte aligned.

- */

-/*

-#if !defined LINUX

-typedef unsigned short* VO_PTCHAR;

-typedef unsigned short* VO_TCHAR;

-#else

-typedef char* VO_PTCHAR;

-typedef char VO_TCHAR;

-#endif

-*/

-

-#ifndef NULL

-#ifdef __cplusplus

-#define NULL    0

-#else

-#define NULL    ((void *)0)

-#endif

-#endif

-

-/**

- * Input stream format, Frame or Stream..

- */

-typedef enum {

-    VO_INPUT_FRAME	= 1,	/*!< Input contains completely frame(s) data. */

-    VO_INPUT_STREAM,		/*!< Input is stream data. */

-	VO_INPUT_STREAM_MAX = VO_MAX_ENUM_VALUE

-} VO_INPUT_TYPE;

-

-

-/**

- * General data buffer, used as input or output.

- */

-typedef struct {

-	VO_PBYTE	Buffer;		/*!< Buffer pointer */

-	VO_U32		Length;		/*!< Buffer size in byte */

-	VO_S64		Time;		/*!< The time of the buffer */

-} VO_CODECBUFFER;

-

-

-/**

- * The init memdata flag.

- */

-typedef enum{

-	VO_IMF_USERMEMOPERATOR		=0,	/*!< memData is  the pointer of memoperator function*/

-	VO_IMF_PREALLOCATEDBUFFER	=1,	/*!< memData is  preallocated memory*/

-	VO_IMF_MAX = VO_MAX_ENUM_VALUE

-}VO_INIT_MEM_FlAG;

-

-

-/**

- * The init memory structure..

- */

-typedef struct{

-	VO_INIT_MEM_FlAG			memflag;	/*!<memory flag  */

-	VO_PTR						memData;	/*!<a pointer to VO_MEM_OPERATOR or a preallocated buffer  */

-	VO_U32						reserved1;	/*!<reserved  */

-	VO_U32						reserved2;	/*!<reserved */

-}VO_CODEC_INIT_USERDATA;

-

-

-#ifdef __cplusplus

-}

-#endif /* __cplusplus */

-

-#endif // __voType_H__

+/*
+ ** Copyright 2003-2010, VisualOn, Inc.
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ **     http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+/*******************************************************************************
+	File:		voType.h
+
+	Content:	data type definition
+
+*******************************************************************************/
+#ifndef __voType_H__
+#define __voType_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#ifdef _WIN32
+#	define VO_API __cdecl
+#	define VO_CBI __stdcall
+#else
+#	define VO_API
+#	define VO_CBI
+#endif //_WIN32
+
+/** VO_IN is used to identify inputs to an VO function.  This designation
+    will also be used in the case of a pointer that points to a parameter
+    that is used as an output. */
+#ifndef VO_IN
+#define VO_IN
+#endif
+
+/** VO_OUT is used to identify outputs from an VO function.  This
+    designation will also be used in the case of a pointer that points
+    to a parameter that is used as an input. */
+#ifndef VO_OUT
+#define VO_OUT
+#endif
+
+/** VO_INOUT is used to identify parameters that may be either inputs or
+    outputs from an VO function at the same time.  This designation will
+    also be used in the case of a pointer that  points to a parameter that
+    is used both as an input and an output. */
+#ifndef VO_INOUT
+#define VO_INOUT
+#endif
+
+#define VO_MAX_ENUM_VALUE	0X7FFFFFFF
+
+/** VO_VOID */
+typedef void VO_VOID;
+
+/** VO_U8 is an 8 bit unsigned quantity that is byte aligned */
+typedef unsigned char VO_U8;
+
+/** VO_BYTE is an 8 bit unsigned quantity that is byte aligned */
+typedef unsigned char VO_BYTE;
+
+/** VO_S8 is an 8 bit signed quantity that is byte aligned */
+typedef signed char VO_S8;
+
+/** VO_CHAR is an 8 bit signed quantity that is byte aligned */
+typedef char VO_CHAR;
+
+/** VO_U16 is a 16 bit unsigned quantity that is 16 bit word aligned */
+typedef unsigned short VO_U16;
+
+/** VO_WCHAR is a 16 bit unsigned quantity that is 16 bit word aligned */
+#if defined _WIN32
+typedef unsigned short VO_WCHAR;
+typedef unsigned short* VO_PWCHAR;
+#elif defined LINUX
+typedef unsigned char VO_WCHAR;
+typedef unsigned char* VO_PWCHAR;
+#endif
+
+/** VO_S16 is a 16 bit signed quantity that is 16 bit word aligned */
+typedef signed short VO_S16;
+
+/** VO_U32 is a 32 bit unsigned quantity that is 32 bit word aligned */
+typedef unsigned long VO_U32;
+
+/** VO_S32 is a 32 bit signed quantity that is 32 bit word aligned */
+typedef signed long VO_S32;
+
+/* Users with compilers that cannot accept the "long long" designation should
+   define the VO_SKIP64BIT macro.  It should be noted that this may cause
+   some components to fail to compile if the component was written to require
+   64 bit integral types.  However, these components would NOT compile anyway
+   since the compiler does not support the way the component was written.
+*/
+#ifndef VO_SKIP64BIT
+#ifdef _WIN32
+/** VO_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */
+typedef unsigned __int64  VO_U64;
+/** VO_S64 is a 64 bit signed quantity that is 64 bit word aligned */
+typedef signed   __int64  VO_S64;
+#else // WIN32
+/** VO_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */
+typedef unsigned long long VO_U64;
+/** VO_S64 is a 64 bit signed quantity that is 64 bit word aligned */
+typedef signed long long VO_S64;
+#endif // WIN32
+#endif // VO_SKIP64BIT
+
+/** The VO_BOOL type is intended to be used to represent a true or a false
+    value when passing parameters to and from the VO core and components.  The
+    VO_BOOL is a 32 bit quantity and is aligned on a 32 bit word boundary.
+ */
+typedef enum VO_BOOL {
+    VO_FALSE = 0,
+    VO_TRUE = !VO_FALSE,
+	VO_BOOL_MAX = VO_MAX_ENUM_VALUE
+} VO_BOOL;
+
+/** The VO_PTR type is intended to be used to pass pointers between the VO
+    applications and the VO Core and components.  This is a 32 bit pointer and
+    is aligned on a 32 bit boundary.
+ */
+typedef void* VO_PTR;
+
+/** The VO_HANDLE type is intended to be used to pass pointers between the VO
+    applications and the VO Core and components.  This is a 32 bit pointer and
+    is aligned on a 32 bit boundary.
+ */
+typedef void* VO_HANDLE;
+
+/** The VO_STRING type is intended to be used to pass "C" type strings between
+    the application and the core and component.  The VO_STRING type is a 32
+    bit pointer to a zero terminated string.  The  pointer is word aligned and
+    the string is byte aligned.
+ */
+typedef char* VO_PCHAR;
+
+/** The VO_PBYTE type is intended to be used to pass arrays of bytes such as
+    buffers between the application and the component and core.  The VO_PBYTE
+    type is a 32 bit pointer to a zero terminated string.  The  pointer is word
+    aligned and the string is byte aligned.
+ */
+typedef unsigned char* VO_PBYTE;
+
+/** The VO_PTCHAR type is intended to be used to pass arrays of wchar such as
+    unicode char between the application and the component and core.  The VO_PTCHAR
+    type is a 32 bit pointer to a zero terminated string.  The  pointer is word
+    aligned and the string is byte aligned.
+ */
+/*
+#if !defined LINUX
+typedef unsigned short* VO_PTCHAR;
+typedef unsigned short* VO_TCHAR;
+#else
+typedef char* VO_PTCHAR;
+typedef char VO_TCHAR;
+#endif
+*/
+
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL    0
+#else
+#define NULL    ((void *)0)
+#endif
+#endif
+
+/**
+ * Input stream format, Frame or Stream..
+ */
+typedef enum {
+    VO_INPUT_FRAME	= 1,	/*!< Input contains completely frame(s) data. */
+    VO_INPUT_STREAM,		/*!< Input is stream data. */
+	VO_INPUT_STREAM_MAX = VO_MAX_ENUM_VALUE
+} VO_INPUT_TYPE;
+
+
+/**
+ * General data buffer, used as input or output.
+ */
+typedef struct {
+	VO_PBYTE	Buffer;		/*!< Buffer pointer */
+	VO_U32		Length;		/*!< Buffer size in byte */
+	VO_S64		Time;		/*!< The time of the buffer */
+} VO_CODECBUFFER;
+
+
+/**
+ * The init memdata flag.
+ */
+typedef enum{
+	VO_IMF_USERMEMOPERATOR		=0,	/*!< memData is  the pointer of memoperator function*/
+	VO_IMF_PREALLOCATEDBUFFER	=1,	/*!< memData is  preallocated memory*/
+	VO_IMF_MAX = VO_MAX_ENUM_VALUE
+}VO_INIT_MEM_FlAG;
+
+
+/**
+ * The init memory structure..
+ */
+typedef struct{
+	VO_INIT_MEM_FlAG			memflag;	/*!<memory flag  */
+	VO_PTR						memData;	/*!<a pointer to VO_MEM_OPERATOR or a preallocated buffer  */
+	VO_U32						reserved1;	/*!<reserved  */
+	VO_U32						reserved2;	/*!<reserved */
+}VO_CODEC_INIT_USERDATA;
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif // __voType_H__
diff --git a/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp b/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
index 13e1662..cffbfb5 100644
--- a/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
+++ b/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
@@ -360,10 +360,14 @@
             mFramesConfigured = true;
         }
 
-        uint32_t timestamp = 0xFFFFFFFF;
+        uint32_t useExtTimestamp = (inHeader->nOffset == 0);
+
+        // decoder deals in ms, OMX in us.
+        uint32_t timestamp =
+            useExtTimestamp ? (inHeader->nTimeStamp + 500) / 1000 : 0xFFFFFFFF;
+
         int32_t bufferSize = inHeader->nFilledLen;
 
-        uint32_t useExtTimestamp = 0;
         if (PVDecodeVideoFrame(
                     mHandle, &bitstream, &timestamp, &bufferSize,
                     &useExtTimestamp,
@@ -379,13 +383,20 @@
             return;
         }
 
-        outHeader->nTimeStamp = inHeader->nTimeStamp;
+        // decoder deals in ms, OMX in us.
+        outHeader->nTimeStamp = timestamp * 1000;
 
-        inInfo->mOwnedByUs = false;
-        inQueue.erase(inQueue.begin());
-        inInfo = NULL;
-        notifyEmptyBufferDone(inHeader);
-        inHeader = NULL;
+        CHECK_LE(bufferSize, inHeader->nFilledLen);
+        inHeader->nOffset += inHeader->nFilledLen - bufferSize;
+        inHeader->nFilledLen = bufferSize;
+
+        if (inHeader->nFilledLen == 0) {
+            inInfo->mOwnedByUs = false;
+            inQueue.erase(inQueue.begin());
+            inInfo = NULL;
+            notifyEmptyBufferDone(inHeader);
+            inHeader = NULL;
+        }
 
         ++mInputBufferCount;
 
diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h
index 835d2bb..a9e8e95 100644
--- a/media/libstagefright/include/AwesomePlayer.h
+++ b/media/libstagefright/include/AwesomePlayer.h
@@ -45,6 +45,7 @@
 class DecryptHandle;
 
 class TimedTextPlayer;
+struct WVMExtractor;
 
 struct AwesomeRenderer : public RefBase {
     AwesomeRenderer() {}
@@ -230,6 +231,9 @@
 
     int64_t mLastVideoTimeUs;
     TimedTextPlayer *mTextPlayer;
+    mutable Mutex mTimedTextLock;
+
+    sp<WVMExtractor> mWVMExtractor;
 
     status_t setDataSource_l(
             const char *uri,
@@ -286,6 +290,8 @@
     void shutdownVideoDecoder_l();
     void setNativeWindow_l(const sp<ANativeWindow> &native);
 
+    bool isStreamingHTTP() const;
+
     AwesomePlayer(const AwesomePlayer &);
     AwesomePlayer &operator=(const AwesomePlayer &);
 };
diff --git a/media/libstagefright/include/SimpleSoftOMXComponent.h b/media/libstagefright/include/SimpleSoftOMXComponent.h
index 2a29a7d..50cd275 100644
--- a/media/libstagefright/include/SimpleSoftOMXComponent.h
+++ b/media/libstagefright/include/SimpleSoftOMXComponent.h
@@ -36,7 +36,7 @@
             OMX_PTR appData,
             OMX_COMPONENTTYPE **component);
 
-    virtual ~SimpleSoftOMXComponent();
+    virtual void prepareForDestruction();
 
     void onMessageReceived(const sp<AMessage> &msg);
 
diff --git a/media/libstagefright/include/SoftOMXComponent.h b/media/libstagefright/include/SoftOMXComponent.h
index 053bc22..a808611 100644
--- a/media/libstagefright/include/SoftOMXComponent.h
+++ b/media/libstagefright/include/SoftOMXComponent.h
@@ -38,6 +38,8 @@
     void setLibHandle(void *libHandle);
     void *libHandle() const;
 
+    virtual void prepareForDestruction() {}
+
 protected:
     virtual ~SoftOMXComponent();
 
diff --git a/media/libstagefright/include/WVMExtractor.h b/media/libstagefright/include/WVMExtractor.h
index 0da45a8..deecd25 100644
--- a/media/libstagefright/include/WVMExtractor.h
+++ b/media/libstagefright/include/WVMExtractor.h
@@ -19,11 +19,21 @@
 #define WVM_EXTRACTOR_H_
 
 #include <media/stagefright/MediaExtractor.h>
+#include <utils/Errors.h>
 
 namespace android {
 
 class DataSource;
 
+class WVMLoadableExtractor : public MediaExtractor {
+public:
+    WVMLoadableExtractor() {}
+    virtual ~WVMLoadableExtractor() {}
+
+    virtual int64_t getCachedDurationUs(status_t *finalStatus) = 0;
+    virtual void setAdaptiveStreamingMode(bool adaptive) = 0;
+};
+
 class WVMExtractor : public MediaExtractor {
 public:
     WVMExtractor(const sp<DataSource> &source);
@@ -33,16 +43,30 @@
     virtual sp<MetaData> getTrackMetaData(size_t index, uint32_t flags);
     virtual sp<MetaData> getMetaData();
 
+    // Return the amount of data cached from the current
+    // playback positiion (in us).
+    // While more data is still being fetched *finalStatus == OK,
+    // Once fetching is completed (no more data available), *finalStatus != OK
+    // If fetching completed normally (i.e. reached EOS instead of IO error)
+    // *finalStatus == ERROR_END_OF_STREAM
+    int64_t getCachedDurationUs(status_t *finalStatus);
+
+    // Set to use adaptive streaming mode by the WV component.
+    // If adaptive == true, adaptive streaming mode will be used.
+    // Default mode is non-adaptive streaming mode.
+    // Should set to use adaptive streaming mode only if widevine:// protocol
+    // is used.
+    void setAdaptiveStreamingMode(bool adaptive);
+
 protected:
     virtual ~WVMExtractor();
 
 private:
     sp<DataSource> mDataSource;
-    sp<MediaExtractor> mImpl;
+    sp<WVMLoadableExtractor> mImpl;
 
     WVMExtractor(const WVMExtractor &);
     WVMExtractor &operator=(const WVMExtractor &);
-
 };
 
 }  // namespace android
diff --git a/media/libstagefright/omx/SimpleSoftOMXComponent.cpp b/media/libstagefright/omx/SimpleSoftOMXComponent.cpp
index 179b2a0..f7330f3 100644
--- a/media/libstagefright/omx/SimpleSoftOMXComponent.cpp
+++ b/media/libstagefright/omx/SimpleSoftOMXComponent.cpp
@@ -45,7 +45,11 @@
             PRIORITY_AUDIO);
 }
 
-SimpleSoftOMXComponent::~SimpleSoftOMXComponent() {
+void SimpleSoftOMXComponent::prepareForDestruction() {
+    // The looper's queue may still contain messages referencing this
+    // object. Make sure those are flushed before returning so that
+    // a subsequent dlunload() does not pull out the rug from under us.
+
     mLooper->unregisterHandler(mHandler->id());
     mLooper->stop();
 }
diff --git a/media/libstagefright/omx/SoftOMXPlugin.cpp b/media/libstagefright/omx/SoftOMXPlugin.cpp
index 6bd6624..04ca39e 100644
--- a/media/libstagefright/omx/SoftOMXPlugin.cpp
+++ b/media/libstagefright/omx/SoftOMXPlugin.cpp
@@ -21,6 +21,7 @@
 #include "SoftOMXPlugin.h"
 #include "include/SoftOMXComponent.h"
 
+#include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/foundation/AString.h>
 
 #include <dlfcn.h>
@@ -126,8 +127,11 @@
         (SoftOMXComponent *)
             ((OMX_COMPONENTTYPE *)component)->pComponentPrivate;
 
+    me->prepareForDestruction();
+
     void *libHandle = me->libHandle();
 
+    CHECK_EQ(me->getStrongCount(), 1);
     me->decStrong(this);
     me = NULL;
 
diff --git a/media/libstagefright/timedtext/Android.mk b/media/libstagefright/timedtext/Android.mk
new file mode 100644
index 0000000..9a6062c
--- /dev/null
+++ b/media/libstagefright/timedtext/Android.mk
@@ -0,0 +1,16 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES:=                 \
+        TimedTextParser.cpp       \
+        TimedTextPlayer.cpp
+
+LOCAL_CFLAGS += -Wno-multichar
+LOCAL_C_INCLUDES:= \
+        $(JNI_H_INCLUDE) \
+        $(TOP)/frameworks/base/media/libstagefright \
+        $(TOP)/frameworks/base/include/media/stagefright/openmax
+
+LOCAL_MODULE:= libstagefright_timedtext
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/media/libstagefright/timedtext/TimedTextParser.cpp b/media/libstagefright/timedtext/TimedTextParser.cpp
new file mode 100644
index 0000000..0bada16
--- /dev/null
+++ b/media/libstagefright/timedtext/TimedTextParser.cpp
@@ -0,0 +1,257 @@
+/*
+ * Copyright (C) 2011 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 "TimedTextParser.h"
+#include <media/stagefright/DataSource.h>
+
+namespace android {
+
+TimedTextParser::TimedTextParser()
+    : mDataSource(NULL),
+      mOffset(0),
+      mIndex(0) {
+}
+
+TimedTextParser::~TimedTextParser() {
+    reset();
+}
+
+status_t TimedTextParser::init(
+        const sp<DataSource> &dataSource, FileType fileType) {
+    mDataSource = dataSource;
+    mFileType = fileType;
+
+    status_t err;
+    if ((err = scanFile()) != OK) {
+        reset();
+        return err;
+    }
+
+    return OK;
+}
+
+void TimedTextParser::reset() {
+    mDataSource.clear();
+    mTextVector.clear();
+    mOffset = 0;
+    mIndex = 0;
+}
+
+// scan the text file to get start/stop time and the
+// offset of each piece of text content
+status_t TimedTextParser::scanFile() {
+    if (mFileType != OUT_OF_BAND_FILE_SRT) {
+        return ERROR_UNSUPPORTED;
+    }
+
+    off64_t offset = 0;
+    int64_t startTimeUs;
+    bool endOfFile = false;
+
+    while (!endOfFile) {
+        TextInfo info;
+        status_t err = getNextInSrtFileFormat(&offset, &startTimeUs, &info);
+
+        if (err != OK) {
+            if (err == ERROR_END_OF_STREAM) {
+                endOfFile = true;
+            } else {
+                return err;
+            }
+        } else {
+            mTextVector.add(startTimeUs, info);
+        }
+    }
+
+    if (mTextVector.isEmpty()) {
+        return ERROR_MALFORMED;
+    }
+    return OK;
+}
+
+// read one line started from *offset and store it into data.
+status_t TimedTextParser::readNextLine(off64_t *offset, AString *data) {
+    char character;
+
+    data->clear();
+
+    while (true) {
+        ssize_t err;
+        if ((err = mDataSource->readAt(*offset, &character, 1)) < 1) {
+            if (err == 0) {
+                return ERROR_END_OF_STREAM;
+            }
+            return ERROR_IO;
+        }
+
+        (*offset) ++;
+
+        // a line could end with CR, LF or CR + LF
+        if (character == 10) {
+            break;
+        } else if (character == 13) {
+            if ((err = mDataSource->readAt(*offset, &character, 1)) < 1) {
+                if (err == 0) { // end of the stream
+                    return OK;
+                }
+                return ERROR_IO;
+            }
+
+            (*offset) ++;
+
+            if (character != 10) {
+                (*offset) --;
+            }
+            break;
+        }
+
+        data->append(character);
+    }
+
+    return OK;
+}
+
+/* SRT format:
+ *  Subtitle number
+ *  Start time --> End time
+ *  Text of subtitle (one or more lines)
+ *  Blank line
+ *
+ * .srt file example:
+ *  1
+ *  00:00:20,000 --> 00:00:24,400
+ *  Altocumulus clouds occur between six thousand
+ *
+ *  2
+ *  00:00:24,600 --> 00:00:27,800
+ *  and twenty thousand feet above ground level.
+ */
+status_t TimedTextParser::getNextInSrtFileFormat(
+        off64_t *offset, int64_t *startTimeUs, TextInfo *info) {
+    AString data;
+    status_t err;
+    if ((err = readNextLine(offset, &data)) != OK) {
+        return err;
+    }
+
+    // to skip the first line
+    if ((err = readNextLine(offset, &data)) != OK) {
+        return err;
+    }
+
+    int hour1, hour2, min1, min2, sec1, sec2, msec1, msec2;
+    // the start time format is: hours:minutes:seconds,milliseconds
+    // 00:00:24,600 --> 00:00:27,800
+    if (sscanf(data.c_str(), "%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d",
+                &hour1, &min1, &sec1, &msec1, &hour2, &min2, &sec2, &msec2) != 8) {
+        return ERROR_MALFORMED;
+    }
+
+    *startTimeUs = ((hour1 * 3600 + min1 * 60 + sec1) * 1000 + msec1) * 1000ll;
+    info->endTimeUs = ((hour2 * 3600 + min2 * 60 + sec2) * 1000 + msec2) * 1000ll;
+    if (info->endTimeUs <= *startTimeUs) {
+        return ERROR_MALFORMED;
+    }
+
+    info->offset = *offset;
+
+    bool needMoreData = true;
+    while (needMoreData) {
+        if ((err = readNextLine(offset, &data)) != OK) {
+            if (err == ERROR_END_OF_STREAM) {
+                needMoreData = false;
+            } else {
+                return err;
+            }
+        }
+
+        if (needMoreData) {
+            data.trim();
+            if (data.empty()) {
+                // it's an empty line used to separate two subtitles
+                needMoreData = false;
+            }
+        }
+    }
+
+    info->textLen = *offset - info->offset;
+
+    return OK;
+}
+
+status_t TimedTextParser::getText(
+        AString *text, int64_t *startTimeUs, int64_t *endTimeUs,
+        const MediaSource::ReadOptions *options) {
+    Mutex::Autolock autoLock(mLock);
+
+    text->clear();
+
+    int64_t seekTimeUs;
+    MediaSource::ReadOptions::SeekMode mode;
+    if (options && options->getSeekTo(&seekTimeUs, &mode)) {
+        int64_t lastEndTimeUs = mTextVector.valueAt(mTextVector.size() - 1).endTimeUs;
+        int64_t firstStartTimeUs = mTextVector.keyAt(0);
+
+        if (seekTimeUs < 0 || seekTimeUs > lastEndTimeUs) {
+            return ERROR_OUT_OF_RANGE;
+        } else if (seekTimeUs < firstStartTimeUs) {
+            mIndex = 0;
+        } else {
+            // binary search
+            ssize_t low = 0;
+            ssize_t high = mTextVector.size() - 1;
+            ssize_t mid = 0;
+            int64_t currTimeUs;
+
+            while (low <= high) {
+                mid = low + (high - low)/2;
+                currTimeUs = mTextVector.keyAt(mid);
+                const int diff = currTimeUs - seekTimeUs;
+
+                if (diff == 0) {
+                    break;
+                } else if (diff < 0) {
+                    low = mid + 1;
+                } else {
+                    if ((high == mid + 1)
+                            && (seekTimeUs < mTextVector.keyAt(high))) {
+                        break;
+                    }
+                    high = mid - 1;
+                }
+            }
+
+            mIndex = mid;
+        }
+    }
+
+    TextInfo info = mTextVector.valueAt(mIndex);
+    *startTimeUs = mTextVector.keyAt(mIndex);
+    *endTimeUs = info.endTimeUs;
+    mIndex ++;
+
+    char *str = new char[info.textLen];
+    if (mDataSource->readAt(info.offset, str, info.textLen) < info.textLen) {
+        delete[] str;
+        return ERROR_IO;
+    }
+
+    text->append(str, info.textLen);
+    delete[] str;
+    return OK;
+}
+
+}  // namespace android
diff --git a/media/libstagefright/timedtext/TimedTextParser.h b/media/libstagefright/timedtext/TimedTextParser.h
new file mode 100644
index 0000000..44774c2
--- /dev/null
+++ b/media/libstagefright/timedtext/TimedTextParser.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2011 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 TIMED_TEXT_PARSER_H_
+
+#define TIMED_TEXT_PARSER_H_
+
+#include <media/MediaPlayerInterface.h>
+#include <media/stagefright/foundation/ABase.h>
+#include <media/stagefright/foundation/AString.h>
+#include <media/stagefright/MediaSource.h>
+
+namespace android {
+
+class DataSource;
+
+class TimedTextParser : public RefBase {
+public:
+    TimedTextParser();
+    virtual ~TimedTextParser();
+
+    enum FileType {
+        OUT_OF_BAND_FILE_SRT = 1,
+    };
+
+    status_t getText(AString *text, int64_t *startTimeUs, int64_t *endTimeUs,
+                     const MediaSource::ReadOptions *options = NULL);
+    status_t init(const sp<DataSource> &dataSource, FileType fileType);
+    void reset();
+
+private:
+    Mutex mLock;
+
+    sp<DataSource> mDataSource;
+    off64_t mOffset;
+
+    struct TextInfo {
+        int64_t endTimeUs;
+        // the offset of the text in the original file
+        off64_t offset;
+        int textLen;
+    };
+
+    int mIndex;
+    FileType mFileType;
+
+    // the key indicated the start time of the text
+    KeyedVector<int64_t, TextInfo> mTextVector;
+
+    status_t getNextInSrtFileFormat(
+            off64_t *offset, int64_t *startTimeUs, TextInfo *info);
+    status_t readNextLine(off64_t *offset, AString *data);
+
+    status_t scanFile();
+
+    DISALLOW_EVIL_CONSTRUCTORS(TimedTextParser);
+};
+
+}  // namespace android
+
+#endif  // TIMED_TEXT_PARSER_H_
+
diff --git a/media/libstagefright/timedtext/TimedTextPlayer.cpp b/media/libstagefright/timedtext/TimedTextPlayer.cpp
new file mode 100644
index 0000000..50bb16d
--- /dev/null
+++ b/media/libstagefright/timedtext/TimedTextPlayer.cpp
@@ -0,0 +1,347 @@
+ /*
+ * Copyright (C) 2011 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.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "TimedTextPlayer"
+#include <utils/Log.h>
+
+#include <binder/IPCThreadState.h>
+#include <media/stagefright/MediaDebug.h>
+#include <media/stagefright/MediaDefs.h>
+#include <media/stagefright/MediaErrors.h>
+#include <media/stagefright/MediaSource.h>
+#include <media/stagefright/MetaData.h>
+#include <media/stagefright/MediaBuffer.h>
+#include <media/stagefright/FileSource.h>
+#include <media/stagefright/Utils.h>
+#include "include/AwesomePlayer.h"
+#include "TimedTextPlayer.h"
+#include "TimedTextParser.h"
+
+namespace android {
+
+struct TimedTextEvent : public TimedEventQueue::Event {
+    TimedTextEvent(
+            TimedTextPlayer *player,
+            void (TimedTextPlayer::*method)())
+        : mPlayer(player),
+          mMethod(method) {
+    }
+
+protected:
+    virtual ~TimedTextEvent() {}
+
+    virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) {
+        (mPlayer->*mMethod)();
+    }
+
+private:
+    TimedTextPlayer *mPlayer;
+    void (TimedTextPlayer::*mMethod)();
+
+    TimedTextEvent(const TimedTextEvent &);
+    TimedTextEvent &operator=(const TimedTextEvent &);
+};
+
+TimedTextPlayer::TimedTextPlayer(
+        AwesomePlayer *observer,
+        const wp<MediaPlayerBase> &listener,
+        TimedEventQueue *queue)
+    : mSource(NULL),
+      mOutOfBandSource(NULL),
+      mSeekTimeUs(0),
+      mStarted(false),
+      mTextEventPending(false),
+      mQueue(queue),
+      mListener(listener),
+      mObserver(observer),
+      mTextBuffer(NULL),
+      mTextParser(NULL),
+      mTextType(kNoText) {
+    mTextEvent = new TimedTextEvent(this, &TimedTextPlayer::onTextEvent);
+}
+
+TimedTextPlayer::~TimedTextPlayer() {
+    if (mStarted) {
+        reset();
+    }
+
+    mTextTrackVector.clear();
+    mTextOutOfBandVector.clear();
+}
+
+status_t TimedTextPlayer::start(uint8_t index) {
+    CHECK(!mStarted);
+
+    if (index >=
+            mTextTrackVector.size() + mTextOutOfBandVector.size()) {
+        LOGE("Incorrect text track index: %d", index);
+        return BAD_VALUE;
+    }
+
+    if (index < mTextTrackVector.size()) { // start an in-band text
+        mSource = mTextTrackVector.itemAt(index);
+
+        status_t err = mSource->start();
+
+        if (err != OK) {
+            return err;
+        }
+        mTextType = kInBandText;
+    } else { // start an out-of-band text
+        OutOfBandText text =
+            mTextOutOfBandVector.itemAt(index - mTextTrackVector.size());
+
+        mOutOfBandSource = text.source;
+        TimedTextParser::FileType fileType = text.type;
+
+        if (mTextParser == NULL) {
+            mTextParser = new TimedTextParser();
+        }
+
+        status_t err;
+        if ((err = mTextParser->init(mOutOfBandSource, fileType)) != OK) {
+            return err;
+        }
+        mTextType = kOutOfBandText;
+    }
+
+    int64_t positionUs;
+    mObserver->getPosition(&positionUs);
+    seekTo(positionUs);
+
+    postTextEvent();
+
+    mStarted = true;
+
+    return OK;
+}
+
+void TimedTextPlayer::pause() {
+    CHECK(mStarted);
+
+    cancelTextEvent();
+}
+
+void TimedTextPlayer::resume() {
+    CHECK(mStarted);
+
+    postTextEvent();
+}
+
+void TimedTextPlayer::reset() {
+    CHECK(mStarted);
+
+    // send an empty text to clear the screen
+    notifyListener(MEDIA_TIMED_TEXT);
+
+    cancelTextEvent();
+
+    mSeeking = false;
+    mStarted = false;
+
+    if (mTextType == kInBandText) {
+        if (mTextBuffer != NULL) {
+            mTextBuffer->release();
+            mTextBuffer = NULL;
+        }
+
+        if (mSource != NULL) {
+            mSource->stop();
+            mSource.clear();
+            mSource = NULL;
+        }
+    } else {
+        if (mTextParser != NULL) {
+            mTextParser.clear();
+            mTextParser = NULL;
+        }
+        if (mOutOfBandSource != NULL) {
+            mOutOfBandSource.clear();
+            mOutOfBandSource = NULL;
+        }
+    }
+}
+
+status_t TimedTextPlayer::seekTo(int64_t time_us) {
+    Mutex::Autolock autoLock(mLock);
+
+    mSeeking = true;
+    mSeekTimeUs = time_us;
+
+    postTextEvent();
+
+    return OK;
+}
+
+status_t TimedTextPlayer::setTimedTextTrackIndex(int32_t index) {
+    if (index >=
+            (int)(mTextTrackVector.size() + mTextOutOfBandVector.size())) {
+        return BAD_VALUE;
+    }
+
+    if (mStarted) {
+        reset();
+    }
+
+    if (index >= 0) {
+        return start(index);
+    }
+    return OK;
+}
+
+void TimedTextPlayer::onTextEvent() {
+    Mutex::Autolock autoLock(mLock);
+
+    if (!mTextEventPending) {
+        return;
+    }
+    mTextEventPending = false;
+
+    MediaSource::ReadOptions options;
+    if (mSeeking) {
+        options.setSeekTo(mSeekTimeUs,
+                MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC);
+        mSeeking = false;
+
+        if (mTextType == kInBandText) {
+            if (mTextBuffer != NULL) {
+                mTextBuffer->release();
+                mTextBuffer = NULL;
+            }
+        } else {
+            mText.clear();
+        }
+
+        notifyListener(MEDIA_TIMED_TEXT); //empty text to clear the screen
+    }
+
+    int64_t positionUs, timeUs;
+    mObserver->getPosition(&positionUs);
+
+    if (mTextType == kInBandText) {
+        if (mTextBuffer != NULL) {
+            uint8_t *tmp = (uint8_t *)(mTextBuffer->data());
+            size_t len = (*tmp) << 8 | (*(tmp + 1));
+
+            notifyListener(MEDIA_TIMED_TEXT,
+                           tmp + 2,
+                           len);
+
+            mTextBuffer->release();
+            mTextBuffer = NULL;
+
+        }
+
+        if (mSource->read(&mTextBuffer, &options) != OK) {
+            return;
+        }
+
+        mTextBuffer->meta_data()->findInt64(kKeyTime, &timeUs);
+    } else {
+        if (mText.size() > 0) {
+            notifyListener(MEDIA_TIMED_TEXT,
+                           mText.c_str(),
+                           mText.size());
+            mText.clear();
+        }
+
+        int64_t endTimeUs;
+        if (mTextParser->getText(
+                    &mText, &timeUs, &endTimeUs, &options) != OK) {
+            return;
+        }
+    }
+
+    //send the text now
+    if (timeUs <= positionUs + 100000ll) {
+        postTextEvent();
+    } else {
+        postTextEvent(timeUs - positionUs - 100000ll);
+    }
+}
+
+void TimedTextPlayer::postTextEvent(int64_t delayUs) {
+    if (mTextEventPending) {
+        return;
+    }
+
+    mTextEventPending = true;
+    mQueue->postEventWithDelay(mTextEvent, delayUs < 0 ? 10000 : delayUs);
+}
+
+void TimedTextPlayer::cancelTextEvent() {
+    mQueue->cancelEvent(mTextEvent->eventID());
+    mTextEventPending = false;
+}
+
+void TimedTextPlayer::addTextSource(sp<MediaSource> source) {
+    Mutex::Autolock autoLock(mLock);
+    mTextTrackVector.add(source);
+}
+
+status_t TimedTextPlayer::setParameter(int key, const Parcel &request) {
+    Mutex::Autolock autoLock(mLock);
+
+    if (key == KEY_PARAMETER_TIMED_TEXT_ADD_OUT_OF_BAND_SOURCE) {
+        String8 uri = request.readString8();
+        KeyedVector<String8, String8> headers;
+
+        // To support local subtitle file only for now
+        if (strncasecmp("file://", uri.string(), 7)) {
+            return INVALID_OPERATION;
+        }
+        sp<DataSource> dataSource =
+            DataSource::CreateFromURI(uri, &headers);
+        status_t err = dataSource->initCheck();
+
+        if (err != OK) {
+            return err;
+        }
+
+        OutOfBandText text;
+        text.source = dataSource;
+        if (uri.getPathExtension() == String8(".srt")) {
+            text.type = TimedTextParser::OUT_OF_BAND_FILE_SRT;
+        } else {
+            return ERROR_UNSUPPORTED;
+        }
+
+        mTextOutOfBandVector.add(text);
+
+        return OK;
+    }
+    return INVALID_OPERATION;
+}
+
+void TimedTextPlayer::notifyListener(
+        int msg, const void *data, size_t size) {
+    if (mListener != NULL) {
+        sp<MediaPlayerBase> listener = mListener.promote();
+
+        if (listener != NULL) {
+            if (size > 0) {
+                mData.freeData();
+                mData.write(data, size);
+
+                listener->sendEvent(msg, 0, 0, &mData);
+            } else { // send an empty timed text to clear the screen
+                listener->sendEvent(msg);
+            }
+        }
+    }
+}
+}
diff --git a/media/libstagefright/include/TimedTextPlayer.h b/media/libstagefright/timedtext/TimedTextPlayer.h
similarity index 77%
rename from media/libstagefright/include/TimedTextPlayer.h
rename to media/libstagefright/timedtext/TimedTextPlayer.h
index ac41b4f..590760b 100644
--- a/media/libstagefright/include/TimedTextPlayer.h
+++ b/media/libstagefright/timedtext/TimedTextPlayer.h
@@ -20,8 +20,10 @@
 
 #include <media/MediaPlayerInterface.h>
 #include <media/stagefright/foundation/ABase.h>
+#include <media/stagefright/foundation/AString.h>
 
 #include "include/TimedEventQueue.h"
+#include "TimedTextParser.h"
 
 namespace android {
 
@@ -50,11 +52,19 @@
     void addTextSource(sp<MediaSource> source);
 
     status_t setTimedTextTrackIndex(int32_t index);
+    status_t setParameter(int key, const Parcel &request);
 
 private:
+    enum TextType {
+        kNoText        = 0,
+        kInBandText    = 1,
+        kOutOfBandText = 2,
+    };
+
     Mutex mLock;
 
     sp<MediaSource> mSource;
+    sp<DataSource> mOutOfBandSource;
 
     bool mSeeking;
     int64_t mSeekTimeUs;
@@ -72,8 +82,21 @@
     MediaBuffer *mTextBuffer;
     Parcel mData;
 
+    // for in-band timed text
     Vector<sp<MediaSource> > mTextTrackVector;
 
+    // for out-of-band timed text
+    struct OutOfBandText {
+        TimedTextParser::FileType type;
+        sp<DataSource> source;
+    };
+    Vector<OutOfBandText > mTextOutOfBandVector;
+
+    sp<TimedTextParser> mTextParser;
+    AString mText;
+
+    TextType mTextType;
+
     void reset();
 
     void onTextEvent();
diff --git a/native/android/configuration.cpp b/native/android/configuration.cpp
index d76164f..687924b 100644
--- a/native/android/configuration.cpp
+++ b/native/android/configuration.cpp
@@ -111,6 +111,18 @@
 
 }
 
+int32_t AConfiguration_getScreenWidthDp(AConfiguration* config) {
+    return config->screenWidthDp;
+}
+
+int32_t AConfiguration_getScreenHeightDp(AConfiguration* config) {
+    return config->screenHeightDp;
+}
+
+int32_t AConfiguration_getSmallestScreenWidthDp(AConfiguration* config) {
+    return config->smallestScreenWidthDp;
+}
+
 // ----------------------------------------------------------------------
 
 void AConfiguration_setMcc(AConfiguration* config, int32_t mcc) {
@@ -186,6 +198,18 @@
 
 }
 
+void AConfiguration_setScreenWidthDp(AConfiguration* config, int32_t value) {
+    config->screenWidthDp = value;
+}
+
+void AConfiguration_setScreenHeightDp(AConfiguration* config, int32_t value) {
+    config->screenHeightDp = value;
+}
+
+void AConfiguration_setSmallestScreenWidthDp(AConfiguration* config, int32_t value) {
+    config->smallestScreenWidthDp = value;
+}
+
 // ----------------------------------------------------------------------
 
 int32_t AConfiguration_diff(AConfiguration* config1, AConfiguration* config2) {
diff --git a/native/include/android/configuration.h b/native/include/android/configuration.h
index 99e8f97..39fef21 100644
--- a/native/include/android/configuration.h
+++ b/native/include/android/configuration.h
@@ -77,11 +77,18 @@
     ACONFIGURATION_UI_MODE_TYPE_NORMAL = 0x01,
     ACONFIGURATION_UI_MODE_TYPE_DESK = 0x02,
     ACONFIGURATION_UI_MODE_TYPE_CAR = 0x03,
+    ACONFIGURATION_UI_MODE_TYPE_TELEVISION = 0x04,
 
     ACONFIGURATION_UI_MODE_NIGHT_ANY = 0x00,
     ACONFIGURATION_UI_MODE_NIGHT_NO = 0x1,
     ACONFIGURATION_UI_MODE_NIGHT_YES = 0x2,
 
+    ACONFIGURATION_SCREEN_WIDTH_DP_ANY = 0x0000,
+
+    ACONFIGURATION_SCREEN_HEIGHT_DP_ANY = 0x0000,
+
+    ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY = 0x0000,
+
     ACONFIGURATION_MCC = 0x0001,
     ACONFIGURATION_MNC = 0x0002,
     ACONFIGURATION_LOCALE = 0x0004,
@@ -95,6 +102,7 @@
     ACONFIGURATION_VERSION = 0x0400,
     ACONFIGURATION_SCREEN_LAYOUT = 0x0800,
     ACONFIGURATION_UI_MODE = 0x1000,
+    ACONFIGURATION_SMALLEST_SCREEN_SIZE = 0x2000,
 };
 
 /**
@@ -286,6 +294,39 @@
 void AConfiguration_setUiModeNight(AConfiguration* config, int32_t uiModeNight);
 
 /**
+ * Return the current configuration screen width in dp units, or
+ * ACONFIGURATION_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the current configuration screen height in dp units, or
+ * ACONFIGURATION_SCREEN_HEIGHT_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenHeightDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenHeightDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the configuration's smallest screen width in dp units, or
+ * ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getSmallestScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's smallest screen width in dp units.
+ */
+void AConfiguration_setSmallestScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
  * Perform a diff between two configurations.  Returns a bit mask of
  * ACONFIGURATION_* constants, each bit set meaning that configuration element
  * is different between them.
diff --git a/obex/javax/obex/PrivateOutputStream.java b/obex/javax/obex/PrivateOutputStream.java
index ca420af..713f4ae 100644
--- a/obex/javax/obex/PrivateOutputStream.java
+++ b/obex/javax/obex/PrivateOutputStream.java
@@ -107,18 +107,15 @@
 
         ensureOpen();
         mParent.ensureNotDone();
-        if (count < mMaxPacketSize) {
-            mArray.write(buffer, offset, count);
-        } else {
-            while (remainLength >= mMaxPacketSize) {
-                mArray.write(buffer, offset1, mMaxPacketSize);
-                offset1 += mMaxPacketSize;
-                remainLength = count - offset1;
-                mParent.continueOperation(true, false);
-            }
-            if (remainLength > 0) {
-                mArray.write(buffer, offset1, remainLength);
-            }
+        while ((mArray.size() + remainLength) >= mMaxPacketSize) {
+            int bufferLeft = mMaxPacketSize - mArray.size();
+            mArray.write(buffer, offset1, bufferLeft);
+            offset1 += bufferLeft;
+            remainLength -= bufferLeft;
+            mParent.continueOperation(true, false);
+        }
+        if (remainLength > 0) {
+            mArray.write(buffer, offset1, remainLength);
         }
     }
 
diff --git a/opengl/libs/Android.mk b/opengl/libs/Android.mk
index 0747efb..ff45edc 100644
--- a/opengl/libs/Android.mk
+++ b/opengl/libs/Android.mk
@@ -7,10 +7,13 @@
 include $(CLEAR_VARS)
 
 LOCAL_SRC_FILES:= 	       \
+	EGL/egl_tls.cpp        \
+	EGL/egl_display.cpp    \
+	EGL/egl_object.cpp     \
 	EGL/egl.cpp 	       \
+	EGL/eglApi.cpp 	       \
 	EGL/trace.cpp              \
 	EGL/getProcAddress.cpp.arm \
-	EGL/hooks.cpp 	       \
 	EGL/Loader.cpp 	       \
 #
 
diff --git a/opengl/libs/EGL/Loader.cpp b/opengl/libs/EGL/Loader.cpp
index da26229..e94e50e 100644
--- a/opengl/libs/EGL/Loader.cpp
+++ b/opengl/libs/EGL/Loader.cpp
@@ -26,11 +26,10 @@
 
 #include <EGL/egl.h>
 
-#include "hooks.h"
-#include "egl_impl.h"
-
-#include "Loader.h"
+#include "egldefs.h"
 #include "glesv2dbg.h"
+#include "hooks.h"
+#include "Loader.h"
 
 // ----------------------------------------------------------------------------
 namespace android {
diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp
index aabba28..b11db32 100644
--- a/opengl/libs/EGL/egl.cpp
+++ b/opengl/libs/EGL/egl.cpp
@@ -17,14 +17,9 @@
 #include <ctype.h>
 #include <stdlib.h>
 #include <string.h>
-#include <errno.h>
-#include <dlfcn.h>
 
-#include <sys/ioctl.h>
-
-#ifdef HAVE_ANDROID_OS
-#include <linux/android_pmem.h>
-#endif
+#include <hardware/gralloc.h>
+#include <system/window.h>
 
 #include <EGL/egl.h>
 #include <EGL/eglext.h>
@@ -36,266 +31,42 @@
 #include <cutils/properties.h>
 #include <cutils/memory.h>
 
-#include <utils/SortedVector.h>
-#include <utils/KeyedVector.h>
 #include <utils/String8.h>
 
-#include <ui/egl/android_natives.h>
-
-#include "hooks.h"
+#include "egldefs.h"
 #include "egl_impl.h"
-#include "Loader.h"
-#include "glesv2dbg.h"
 #include "egl_tls.h"
+#include "glesv2dbg.h"
+#include "hooks.h"
+#include "Loader.h"
 
-#define setError(_e, _r) setErrorEtc(__FUNCTION__, __LINE__, _e, _r)
+#include "egl_display.h"
+#include "egl_object.h"
 
 // ----------------------------------------------------------------------------
 namespace android {
 // ----------------------------------------------------------------------------
 
-#define VERSION_MAJOR 1
-#define VERSION_MINOR 4
-static char const * const gVendorString     = "Android";
-static char const * const gVersionString    = "1.4 Android META-EGL";
-static char const * const gClientApiString  = "OpenGL ES";
-static char const * const gExtensionString  =
-        "EGL_KHR_image "
-        "EGL_KHR_image_base "
-        "EGL_KHR_image_pixmap "
-        "EGL_KHR_gl_texture_2D_image "
-        "EGL_KHR_gl_texture_cubemap_image "
-        "EGL_KHR_gl_renderbuffer_image "
-        "EGL_KHR_fence_sync "
-        "EGL_ANDROID_image_native_buffer "
-        "EGL_ANDROID_swap_rectangle "
-        ;
+egl_connection_t gEGLImpl[IMPL_NUM_IMPLEMENTATIONS];
+gl_hooks_t gHooks[2][IMPL_NUM_IMPLEMENTATIONS];
+gl_hooks_t gHooksNoContext;
+pthread_key_t gGLWrapperKey = -1;
 
 // ----------------------------------------------------------------------------
 
-class egl_object_t;
-struct egl_display_t;
-static egl_display_t* get_display(EGLDisplay dpy);
-
-struct egl_config_t {
-    egl_config_t() {}
-    egl_config_t(int impl, EGLConfig config)
-        : impl(impl), config(config), configId(0), implConfigId(0) { }
-    int         impl;           // the implementation this config is for
-    EGLConfig   config;         // the implementation's EGLConfig
-    EGLint      configId;       // our CONFIG_ID
-    EGLint      implConfigId;   // the implementation's CONFIG_ID
-    inline bool operator < (const egl_config_t& rhs) const {
-        if (impl < rhs.impl) return true;
-        if (impl > rhs.impl) return false;
-        return config < rhs.config;
-    }
-};
-
-struct egl_display_t {
-    enum { NOT_INITIALIZED, INITIALIZED, TERMINATED };
-
-    struct strings_t {
-        char const * vendor;
-        char const * version;
-        char const * clientApi;
-        char const * extensions;
-    };
-
-    struct DisplayImpl {
-        DisplayImpl() : dpy(EGL_NO_DISPLAY), config(0),
-                        state(NOT_INITIALIZED), numConfigs(0) { }
-        EGLDisplay  dpy;
-        EGLConfig*  config;
-        EGLint      state;
-        EGLint      numConfigs;
-        strings_t   queryString;
-    };
-
-    uint32_t        magic;
-    DisplayImpl     disp[IMPL_NUM_IMPLEMENTATIONS];
-    EGLint          numTotalConfigs;
-    egl_config_t*   configs;
-    uint32_t        refs;
-    Mutex           lock;
-
-    SortedVector<egl_object_t*> objects;
-
-    egl_display_t() : magic('_dpy'), numTotalConfigs(0), configs(0), refs(0) { }
-    ~egl_display_t() { magic = 0; }
-    inline bool isReady() const { return (refs > 0); }
-    inline bool isValid() const { return magic == '_dpy'; }
-    inline bool isAlive() const { return isValid(); }
-};
-
-class egl_object_t {
-    egl_display_t *display;
-            volatile int32_t  terminated;
-    mutable volatile int32_t  count;
-
-public:
-    egl_object_t(EGLDisplay dpy) : display(get_display(dpy)), terminated(0), count(1) {
-        Mutex::Autolock _l(display->lock);
-        display->objects.add(this);
-    }
-
-    inline bool isAlive() const { return !terminated; }
-
-private:
-    bool get() {
-        Mutex::Autolock _l(display->lock);
-        if (display->objects.indexOf(this) >= 0) {
-            android_atomic_inc(&count);
-            return true;
-        }
-        return false;
-    }
-
-    bool put() {
-        Mutex::Autolock _l(display->lock);
-        if (android_atomic_dec(&count) == 1) {
-            display->objects.remove(this);
-            return true;
-        }
-        return false;
-    }    
-
-public:
-    template <typename N, typename T>
-    struct LocalRef {
-        N* ref;
-        LocalRef(T o) : ref(0) {
-            N* native = reinterpret_cast<N*>(o);
-            if (o && native->get()) {
-                ref = native;
-            }
-        }
-        ~LocalRef() { 
-            if (ref && ref->put()) {
-                delete ref;
-            }
-        }
-        inline N* get() {
-            return ref;
-        }
-        void acquire() const {
-            if (ref) {
-                android_atomic_inc(&ref->count);
-            }
-        }
-        void release() const {
-            if (ref) {
-                int32_t c = android_atomic_dec(&ref->count);
-                // ref->count cannot be 1 prior atomic_dec because we have
-                // a reference, and if we have one, it means there was
-                // already one before us.
-                LOGE_IF(c==1, "refcount is now 0 in release()");
-            }
-        }
-        void terminate() {
-            if (ref) {
-                ref->terminated = 1;
-                release();
-            }
-        }
-    };
-};
-
-struct egl_surface_t : public egl_object_t
-{
-    typedef egl_object_t::LocalRef<egl_surface_t, EGLSurface> Ref;
-
-    egl_surface_t(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win,
-            EGLSurface surface, int impl, egl_connection_t const* cnx)
-      : egl_object_t(dpy), dpy(dpy), surface(surface), config(config), win(win), impl(impl), cnx(cnx) {
-    }
-    ~egl_surface_t() {
-    }
-    EGLDisplay                  dpy;
-    EGLSurface                  surface;
-    EGLConfig                   config;
-    sp<ANativeWindow>           win;
-    int                         impl;
-    egl_connection_t const*     cnx;
-};
-
-struct egl_context_t : public egl_object_t
-{
-    typedef egl_object_t::LocalRef<egl_context_t, EGLContext> Ref;
-
-    egl_context_t(EGLDisplay dpy, EGLContext context, EGLConfig config,
-            int impl, egl_connection_t const* cnx, int version)
-    : egl_object_t(dpy), dpy(dpy), context(context), config(config), read(0), draw(0),
-      impl(impl), cnx(cnx), version(version)
-    {
-    }
-    ~egl_context_t()
-    {
-    }
-    EGLDisplay                  dpy;
-    EGLContext                  context;
-    EGLConfig                   config;
-    EGLSurface                  read;
-    EGLSurface                  draw;
-    int                         impl;
-    egl_connection_t const*     cnx;
-    int                         version;
-};
-
-struct egl_image_t : public egl_object_t
-{
-    typedef egl_object_t::LocalRef<egl_image_t, EGLImageKHR> Ref;
-
-    egl_image_t(EGLDisplay dpy, EGLContext context)
-        : egl_object_t(dpy), dpy(dpy), context(context)
-    {
-        memset(images, 0, sizeof(images));
-    }
-    EGLDisplay dpy;
-    EGLContext context;
-    EGLImageKHR images[IMPL_NUM_IMPLEMENTATIONS];
-};
-
-struct egl_sync_t : public egl_object_t
-{
-    typedef egl_object_t::LocalRef<egl_sync_t, EGLSyncKHR> Ref;
-
-    egl_sync_t(EGLDisplay dpy, EGLContext context, EGLSyncKHR sync)
-        : egl_object_t(dpy), dpy(dpy), context(context), sync(sync)
-    {
-    }
-    EGLDisplay dpy;
-    EGLContext context;
-    EGLSyncKHR sync;
-};
-
-typedef egl_surface_t::Ref  SurfaceRef;
-typedef egl_context_t::Ref  ContextRef;
-typedef egl_image_t::Ref    ImageRef;
-typedef egl_sync_t::Ref     SyncRef;
-
-// ----------------------------------------------------------------------------
-
-static egl_connection_t gEGLImpl[IMPL_NUM_IMPLEMENTATIONS];
-static egl_display_t gDisplay[NUM_DISPLAYS];
-static pthread_mutex_t gThreadLocalStorageKeyMutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_key_t gEGLThreadLocalStorageKey = -1;
-
-// ----------------------------------------------------------------------------
-
-EGLAPI gl_hooks_t gHooks[2][IMPL_NUM_IMPLEMENTATIONS];
-EGLAPI gl_hooks_t gHooksNoContext;
-EGLAPI pthread_key_t gGLWrapperKey = -1;
-
 #if EGL_TRACE
 
 EGLAPI pthread_key_t gGLTraceKey = -1;
 
 // ----------------------------------------------------------------------------
 
-static int gEGLTraceLevel, gEGLDebugLevel;
-static int gEGLApplicationTraceLevel;
-extern EGLAPI gl_hooks_t gHooksTrace, gHooksDebug;
+int gEGLDebugLevel;
+
+static int sEGLTraceLevel;
+static int sEGLApplicationTraceLevel;
+
+extern gl_hooks_t gHooksTrace;
+extern gl_hooks_t gHooksDebug;
 
 static inline void setGlTraceThreadSpecific(gl_hooks_t const *value) {
     pthread_setspecific(gGLTraceKey, value);
@@ -305,12 +76,12 @@
     return static_cast<gl_hooks_t*>(pthread_getspecific(gGLTraceKey));
 }
 
-static void initEglTraceLevel() {
+void initEglTraceLevel() {
     char value[PROPERTY_VALUE_MAX];
     property_get("debug.egl.trace", value, "0");
     int propertyLevel = atoi(value);
-    int applicationLevel = gEGLApplicationTraceLevel;
-    gEGLTraceLevel = propertyLevel > applicationLevel ? propertyLevel : applicationLevel;
+    int applicationLevel = sEGLApplicationTraceLevel;
+    sEGLTraceLevel = propertyLevel > applicationLevel ? propertyLevel : applicationLevel;
 
     property_get("debug.egl.debug_proc", value, "");
     long pid = getpid();
@@ -323,12 +94,12 @@
         if (fgets(cmdline, sizeof(cmdline) - 1, file))
         {
             if (!strcmp(value, cmdline))
-                gEGLDebugLevel = 1;
+                sEGLTraceLevel = 1;
         }
         fclose(file);
     }
 
-    if (gEGLDebugLevel > 0)
+    if (sEGLTraceLevel > 0)
     {
         property_get("debug.egl.debug_port", value, "5039");
         const unsigned short port = (unsigned short)atoi(value);
@@ -341,11 +112,11 @@
     }
 }
 
-static void setGLHooksThreadSpecific(gl_hooks_t const *value) {
-    if (gEGLTraceLevel > 0) {
+void setGLHooksThreadSpecific(gl_hooks_t const *value) {
+    if (sEGLTraceLevel > 0) {
         setGlTraceThreadSpecific(value);
         setGlThreadSpecific(&gHooksTrace);
-    } else if (gEGLDebugLevel > 0 && value != &gHooksNoContext) {
+    } else if (sEGLTraceLevel > 0 && value != &gHooksNoContext) {
         setGlTraceThreadSpecific(value);
         setGlThreadSpecific(&gHooksDebug);
     } else {
@@ -359,186 +130,21 @@
  */
 extern "C"
 void setGLTraceLevel(int level) {
-    gEGLApplicationTraceLevel = level;
+    sEGLApplicationTraceLevel = level;
 }
 
 #else
 
-static inline void setGLHooksThreadSpecific(gl_hooks_t const *value) {
+void setGLHooksThreadSpecific(gl_hooks_t const *value) {
     setGlThreadSpecific(value);
 }
 
 #endif
 
-// ----------------------------------------------------------------------------
-
-static __attribute__((noinline))
-const char *egl_strerror(EGLint err)
-{
-    switch (err){
-        case EGL_SUCCESS:               return "EGL_SUCCESS";
-        case EGL_NOT_INITIALIZED:       return "EGL_NOT_INITIALIZED";
-        case EGL_BAD_ACCESS:            return "EGL_BAD_ACCESS";
-        case EGL_BAD_ALLOC:             return "EGL_BAD_ALLOC";
-        case EGL_BAD_ATTRIBUTE:         return "EGL_BAD_ATTRIBUTE";
-        case EGL_BAD_CONFIG:            return "EGL_BAD_CONFIG";
-        case EGL_BAD_CONTEXT:           return "EGL_BAD_CONTEXT";
-        case EGL_BAD_CURRENT_SURFACE:   return "EGL_BAD_CURRENT_SURFACE";
-        case EGL_BAD_DISPLAY:           return "EGL_BAD_DISPLAY";
-        case EGL_BAD_MATCH:             return "EGL_BAD_MATCH";
-        case EGL_BAD_NATIVE_PIXMAP:     return "EGL_BAD_NATIVE_PIXMAP";
-        case EGL_BAD_NATIVE_WINDOW:     return "EGL_BAD_NATIVE_WINDOW";
-        case EGL_BAD_PARAMETER:         return "EGL_BAD_PARAMETER";
-        case EGL_BAD_SURFACE:           return "EGL_BAD_SURFACE";
-        case EGL_CONTEXT_LOST:          return "EGL_CONTEXT_LOST";
-        default: return "UNKNOWN";
-    }
-}
-
-static __attribute__((noinline))
-void clearTLS() {
-    if (gEGLThreadLocalStorageKey != -1) {
-        tls_t* tls = (tls_t*)pthread_getspecific(gEGLThreadLocalStorageKey);
-        if (tls) {
-            delete tls;
-            pthread_setspecific(gEGLThreadLocalStorageKey, 0);
-        }
-    }
-}
-
-static tls_t* getTLS()
-{
-    tls_t* tls = (tls_t*)pthread_getspecific(gEGLThreadLocalStorageKey);
-    if (tls == 0) {
-        tls = new tls_t;
-        pthread_setspecific(gEGLThreadLocalStorageKey, tls);
-    }
-    return tls;
-}
-
-static inline void clearError() {
-    // This must clear the error from all the underlying EGL implementations as
-    // well as the EGL wrapper layer.
-    eglGetError();
-}
-
-template<typename T>
-static __attribute__((noinline))
-T setErrorEtc(const char* caller, int line, EGLint error, T returnValue) {
-    if (gEGLThreadLocalStorageKey == -1) {
-        pthread_mutex_lock(&gThreadLocalStorageKeyMutex);
-        if (gEGLThreadLocalStorageKey == -1)
-            pthread_key_create(&gEGLThreadLocalStorageKey, NULL);
-        pthread_mutex_unlock(&gThreadLocalStorageKeyMutex);
-    }
-    tls_t* tls = getTLS();
-    if (tls->error != error) {
-        LOGE("%s:%d error %x (%s)", caller, line, error, egl_strerror(error));
-        tls->error = error;
-    }
-    return returnValue;
-}
-
-static __attribute__((noinline))
-GLint getError() {
-    if (gEGLThreadLocalStorageKey == -1)
-        return EGL_SUCCESS;
-    tls_t* tls = (tls_t*)pthread_getspecific(gEGLThreadLocalStorageKey);
-    if (!tls) return EGL_SUCCESS;
-    GLint error = tls->error;
-    tls->error = EGL_SUCCESS;
-    return error;
-}
-
-static __attribute__((noinline))
-void setContext(EGLContext ctx) {
-    if (gEGLThreadLocalStorageKey == -1) {
-        pthread_mutex_lock(&gThreadLocalStorageKeyMutex);
-        if (gEGLThreadLocalStorageKey == -1)
-            pthread_key_create(&gEGLThreadLocalStorageKey, NULL);
-        pthread_mutex_unlock(&gThreadLocalStorageKeyMutex);
-    }
-    tls_t* tls = getTLS();
-    tls->ctx = ctx;
-}
-
-static __attribute__((noinline))
-EGLContext getContext() {
-    if (gEGLThreadLocalStorageKey == -1)
-        return EGL_NO_CONTEXT;
-    tls_t* tls = (tls_t*)pthread_getspecific(gEGLThreadLocalStorageKey);
-    if (!tls) return EGL_NO_CONTEXT;
-    return tls->ctx;
-}
-
 /*****************************************************************************/
 
-template<typename T>
-static __attribute__((noinline))
-int binarySearch(
-        T const sortedArray[], int first, int last, T key)
-{
-    while (first <= last) {
-        int mid = (first + last) / 2;
-        if (sortedArray[mid] < key) {
-            first = mid + 1;
-        } else if (key < sortedArray[mid]) { 
-            last = mid - 1;
-        } else {
-            return mid;
-        }
-    }
-    return -1;
-}
-
-static int cmp_configs(const void* a, const void *b)
-{
-    const egl_config_t& c0 = *(egl_config_t const *)a;
-    const egl_config_t& c1 = *(egl_config_t const *)b;
-    return c0<c1 ? -1 : (c1<c0 ? 1 : 0);
-}
-
-struct extention_map_t {
-    const char* name;
-    __eglMustCastToProperFunctionPointerType address;
-};
-
-static const extention_map_t gExtentionMap[] = {
-    { "eglLockSurfaceKHR",  
-            (__eglMustCastToProperFunctionPointerType)&eglLockSurfaceKHR }, 
-    { "eglUnlockSurfaceKHR", 
-            (__eglMustCastToProperFunctionPointerType)&eglUnlockSurfaceKHR }, 
-    { "eglCreateImageKHR",  
-            (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR }, 
-    { "eglDestroyImageKHR", 
-            (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR }, 
-    { "eglSetSwapRectangleANDROID", 
-            (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID }, 
-};
-
-extern const __eglMustCastToProperFunctionPointerType gExtensionForwarders[MAX_NUMBER_OF_GL_EXTENSIONS];
-
-// accesses protected by gInitDriverMutex
-static DefaultKeyedVector<String8, __eglMustCastToProperFunctionPointerType> gGLExtentionMap;
-static int gGLExtentionSlot = 0;
-
-static void(*findProcAddress(const char* name,
-        const extention_map_t* map, size_t n))() 
-{
-    for (uint32_t i=0 ; i<n ; i++) {
-        if (!strcmp(name, map[i].name)) {
-            return map[i].address;
-        }
-    }
-    return NULL;
-}
-
-// ----------------------------------------------------------------------------
-
 static int gl_no_context() {
-    tls_t* tls = getTLS();
-    if (tls->logCallWithNoContext == EGL_TRUE) {
-        tls->logCallWithNoContext = EGL_FALSE;
+    if (egl_tls_t::logNoContextCall()) {
         LOGE("call to OpenGL ES API with no current context "
              "(logged once per thread)");
     }
@@ -566,55 +172,23 @@
 static pthread_once_t once_control = PTHREAD_ONCE_INIT;
 static int sEarlyInitState = pthread_once(&once_control, &early_egl_init);
 
+// ----------------------------------------------------------------------------
 
-static inline
-egl_display_t* get_display(EGLDisplay dpy)
-{
-    uintptr_t index = uintptr_t(dpy)-1U;
-    return (index >= NUM_DISPLAYS) ? NULL : &gDisplay[index];
-}
-
-template<typename NATIVE, typename EGL>
-static inline NATIVE* egl_to_native_cast(EGL arg) {
-    return reinterpret_cast<NATIVE*>(arg);
-}
-
-static inline
-egl_surface_t* get_surface(EGLSurface surface) {
-    return egl_to_native_cast<egl_surface_t>(surface);
-}
-
-static inline
-egl_context_t* get_context(EGLContext context) {
-    return egl_to_native_cast<egl_context_t>(context);
-}
-
-static inline
-egl_image_t* get_image(EGLImageKHR image) {
-    return egl_to_native_cast<egl_image_t>(image);
-}
-
-static inline
-egl_sync_t* get_sync(EGLSyncKHR sync) {
-    return egl_to_native_cast<egl_sync_t>(sync);
-}
-
-static inline
-egl_display_t* validate_display(EGLDisplay dpy)
-{
+egl_display_t* validate_display(EGLDisplay dpy) {
     egl_display_t * const dp = get_display(dpy);
-    if (!dp) return setError(EGL_BAD_DISPLAY, (egl_display_t*)NULL);
-    if (!dp->isReady()) return setError(EGL_NOT_INITIALIZED, (egl_display_t*)NULL);
+    if (!dp)
+        return setError(EGL_BAD_DISPLAY, (egl_display_t*)NULL);
+    if (!dp->isReady())
+        return setError(EGL_NOT_INITIALIZED, (egl_display_t*)NULL);
 
     return dp;
 }
 
-static egl_connection_t* validate_display_config(
-        EGLDisplay dpy, EGLConfig config,
-        egl_display_t const*& dp)
-{
+egl_connection_t* validate_display_config(EGLDisplay dpy, EGLConfig config,
+        egl_display_t const*& dp) {
     dp = validate_display(dpy);
-    if (!dp) return (egl_connection_t*) NULL;
+    if (!dp)
+        return (egl_connection_t*) NULL;
 
     if (intptr_t(config) >= dp->numTotalConfigs) {
         return setError(EGL_BAD_CONFIG, (egl_connection_t*)NULL);
@@ -626,41 +200,26 @@
     return cnx;
 }
 
-static EGLBoolean validate_display_context(EGLDisplay dpy, EGLContext ctx)
-{
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-    if (!dp->isAlive())
-        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
-    if (!get_context(ctx)->isAlive())
-        return setError(EGL_BAD_CONTEXT, EGL_FALSE);
-    return EGL_TRUE;
-}
-
-static EGLBoolean validate_display_surface(EGLDisplay dpy, EGLSurface surface)
-{
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-    if (!dp->isAlive())
-        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
-    if (!get_surface(surface)->isAlive())
-        return setError(EGL_BAD_SURFACE, EGL_FALSE);
-    return EGL_TRUE;
-}
+// ----------------------------------------------------------------------------
 
 EGLImageKHR egl_get_image_for_current_context(EGLImageKHR image)
 {
     ImageRef _i(image);
-    if (!_i.get()) return EGL_NO_IMAGE_KHR;
-    
-    EGLContext context = getContext();
+    if (!_i.get())
+        return EGL_NO_IMAGE_KHR;
+
+    EGLContext context = egl_tls_t::getContext();
     if (context == EGL_NO_CONTEXT || image == EGL_NO_IMAGE_KHR)
         return EGL_NO_IMAGE_KHR;
-    
+
     egl_context_t const * const c = get_context(context);
-    if (!c->isAlive())
+    if (c == NULL) // this should never happen
         return EGL_NO_IMAGE_KHR;
 
+    // here we don't validate the context because if it's been marked for
+    // termination, this call should still succeed since it's internal to
+    // EGL.
+
     egl_image_t const * const i = get_image(image);
     return i->images[c->impl];
 }
@@ -671,10 +230,7 @@
 //    d->disp[]
 //    egl_init_drivers_locked()
 //
-static pthread_mutex_t gInitDriverMutex = PTHREAD_MUTEX_INITIALIZER;
-
-EGLBoolean egl_init_drivers_locked()
-{
+static EGLBoolean egl_init_drivers_locked() {
     if (sEarlyInitState) {
         // initialized by static ctor. should be set here.
         return EGL_FALSE;
@@ -682,28 +238,15 @@
 
     // get our driver loader
     Loader& loader(Loader::getInstance());
-    
-    // dynamically load all our EGL implementations for all displays
-    // and retrieve the corresponding EGLDisplay
-    // if that fails, don't use this driver.
-    // TODO: currently we only deal with EGL_DEFAULT_DISPLAY
+
+    // dynamically load all our EGL implementations
     egl_connection_t* cnx;
-    egl_display_t* d = &gDisplay[0];
 
     cnx = &gEGLImpl[IMPL_SOFTWARE];
     if (cnx->dso == 0) {
         cnx->hooks[GLESv1_INDEX] = &gHooks[GLESv1_INDEX][IMPL_SOFTWARE];
         cnx->hooks[GLESv2_INDEX] = &gHooks[GLESv2_INDEX][IMPL_SOFTWARE];
         cnx->dso = loader.open(EGL_DEFAULT_DISPLAY, 0, cnx);
-        if (cnx->dso) {
-            EGLDisplay dpy = cnx->egl.eglGetDisplay(EGL_DEFAULT_DISPLAY);
-            LOGE_IF(dpy==EGL_NO_DISPLAY, "No EGLDisplay for software EGL!");
-            d->disp[IMPL_SOFTWARE].dpy = dpy; 
-            if (dpy == EGL_NO_DISPLAY) {
-                loader.close(cnx->dso);
-                cnx->dso = NULL;
-            }
-        }
     }
 
     cnx = &gEGLImpl[IMPL_HARDWARE];
@@ -714,15 +257,6 @@
             cnx->hooks[GLESv1_INDEX] = &gHooks[GLESv1_INDEX][IMPL_HARDWARE];
             cnx->hooks[GLESv2_INDEX] = &gHooks[GLESv2_INDEX][IMPL_HARDWARE];
             cnx->dso = loader.open(EGL_DEFAULT_DISPLAY, 1, cnx);
-            if (cnx->dso) {
-                EGLDisplay dpy = cnx->egl.eglGetDisplay(EGL_DEFAULT_DISPLAY);
-                LOGE_IF(dpy==EGL_NO_DISPLAY, "No EGLDisplay for hardware EGL!");
-                d->disp[IMPL_HARDWARE].dpy = dpy; 
-                if (dpy == EGL_NO_DISPLAY) {
-                    loader.close(cnx->dso);
-                    cnx->dso = NULL;
-                }
-            }
         } else {
             LOGD("3D hardware acceleration is disabled");
         }
@@ -735,1499 +269,82 @@
     return EGL_TRUE;
 }
 
-EGLBoolean egl_init_drivers()
-{
+static pthread_mutex_t sInitDriverMutex = PTHREAD_MUTEX_INITIALIZER;
+
+EGLBoolean egl_init_drivers() {
     EGLBoolean res;
-    pthread_mutex_lock(&gInitDriverMutex);
+    pthread_mutex_lock(&sInitDriverMutex);
     res = egl_init_drivers_locked();
-    pthread_mutex_unlock(&gInitDriverMutex);
+    pthread_mutex_unlock(&sInitDriverMutex);
     return res;
 }
 
+void gl_unimplemented() {
+    LOGE("called unimplemented OpenGL ES API");
+}
+
+// ----------------------------------------------------------------------------
+
+#if USE_FAST_TLS_KEY
+
+// We have a dedicated TLS slot in bionic
+static inline gl_hooks_t const * volatile * get_tls_hooks() {
+    volatile void *tls_base = __get_tls();
+    gl_hooks_t const * volatile * tls_hooks =
+            reinterpret_cast<gl_hooks_t const * volatile *>(tls_base);
+    return tls_hooks;
+}
+
+void setGlThreadSpecific(gl_hooks_t const *value) {
+    gl_hooks_t const * volatile * tls_hooks = get_tls_hooks();
+    tls_hooks[TLS_SLOT_OPENGL_API] = value;
+}
+
+gl_hooks_t const* getGlThreadSpecific() {
+    gl_hooks_t const * volatile * tls_hooks = get_tls_hooks();
+    gl_hooks_t const* hooks = tls_hooks[TLS_SLOT_OPENGL_API];
+    if (hooks) return hooks;
+    return &gHooksNoContext;
+}
+
+#else
+
+void setGlThreadSpecific(gl_hooks_t const *value) {
+    pthread_setspecific(gGLWrapperKey, value);
+}
+
+gl_hooks_t const* getGlThreadSpecific() {
+    gl_hooks_t const* hooks =  static_cast<gl_hooks_t*>(pthread_getspecific(gGLWrapperKey));
+    if (hooks) return hooks;
+    return &gHooksNoContext;
+}
+
+#endif
+
+// ----------------------------------------------------------------------------
+// GL / EGL hooks
+// ----------------------------------------------------------------------------
+
+#undef GL_ENTRY
+#undef EGL_ENTRY
+#define GL_ENTRY(_r, _api, ...) #_api,
+#define EGL_ENTRY(_r, _api, ...) #_api,
+
+char const * const gl_names[] = {
+    #include "entries.in"
+    NULL
+};
+
+char const * const egl_names[] = {
+    #include "egl_entries.in"
+    NULL
+};
+
+#undef GL_ENTRY
+#undef EGL_ENTRY
+
+
 // ----------------------------------------------------------------------------
 }; // namespace android
 // ----------------------------------------------------------------------------
 
-using namespace android;
-
-EGLDisplay eglGetDisplay(NativeDisplayType display)
-{
-    clearError();
-
-    uint32_t index = uint32_t(display);
-    if (index >= NUM_DISPLAYS) {
-        return setError(EGL_BAD_PARAMETER, EGL_NO_DISPLAY);
-    }
-
-    if (egl_init_drivers() == EGL_FALSE) {
-        return setError(EGL_BAD_PARAMETER, EGL_NO_DISPLAY);
-    }
-    
-    EGLDisplay dpy = EGLDisplay(uintptr_t(display) + 1LU);
-    return dpy;
-}
-
-// ----------------------------------------------------------------------------
-// Initialization
-// ----------------------------------------------------------------------------
-
-EGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
-{
-    clearError();
-
-    egl_display_t * const dp = get_display(dpy);
-    if (!dp) return setError(EGL_BAD_DISPLAY, EGL_FALSE);
-
-    Mutex::Autolock _l(dp->lock);
-
-    if (dp->refs > 0) {
-        if (major != NULL) *major = VERSION_MAJOR;
-        if (minor != NULL) *minor = VERSION_MINOR;
-        dp->refs++;
-        return EGL_TRUE;
-    }
-
-#if EGL_TRACE
-
-    // Called both at early_init time and at this time. (Early_init is pre-zygote, so
-    // the information from that call may be stale.)
-    initEglTraceLevel();
-
-#endif
-
-    setGLHooksThreadSpecific(&gHooksNoContext);
-
-    // initialize each EGL and
-    // build our own extension string first, based on the extension we know
-    // and the extension supported by our client implementation
-    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
-        egl_connection_t* const cnx = &gEGLImpl[i];
-        cnx->major = -1;
-        cnx->minor = -1;
-        if (!cnx->dso) 
-            continue;
-
-#if defined(ADRENO130)
-#warning "Adreno-130 eglInitialize() workaround"
-        /*
-         * The ADRENO 130 driver returns a different EGLDisplay each time
-         * eglGetDisplay() is called, but also makes the EGLDisplay invalid
-         * after eglTerminate() has been called, so that eglInitialize() 
-         * cannot be called again. Therefore, we need to make sure to call
-         * eglGetDisplay() before calling eglInitialize();
-         */
-        if (i == IMPL_HARDWARE) {
-            dp->disp[i].dpy =
-                cnx->egl.eglGetDisplay(EGL_DEFAULT_DISPLAY);
-        }
-#endif
-
-
-        EGLDisplay idpy = dp->disp[i].dpy;
-        if (cnx->egl.eglInitialize(idpy, &cnx->major, &cnx->minor)) {
-            //LOGD("initialized %d dpy=%p, ver=%d.%d, cnx=%p",
-            //        i, idpy, cnx->major, cnx->minor, cnx);
-
-            // display is now initialized
-            dp->disp[i].state = egl_display_t::INITIALIZED;
-
-            // get the query-strings for this display for each implementation
-            dp->disp[i].queryString.vendor =
-                cnx->egl.eglQueryString(idpy, EGL_VENDOR);
-            dp->disp[i].queryString.version =
-                cnx->egl.eglQueryString(idpy, EGL_VERSION);
-            dp->disp[i].queryString.extensions =
-                    cnx->egl.eglQueryString(idpy, EGL_EXTENSIONS);
-            dp->disp[i].queryString.clientApi =
-                cnx->egl.eglQueryString(idpy, EGL_CLIENT_APIS);
-
-        } else {
-            LOGW("%d: eglInitialize(%p) failed (%s)", i, idpy,
-                    egl_strerror(cnx->egl.eglGetError()));
-        }
-    }
-
-    EGLBoolean res = EGL_FALSE;
-    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
-        egl_connection_t* const cnx = &gEGLImpl[i];
-        if (cnx->dso && cnx->major>=0 && cnx->minor>=0) {
-            EGLint n;
-            if (cnx->egl.eglGetConfigs(dp->disp[i].dpy, 0, 0, &n)) {
-                dp->disp[i].config = (EGLConfig*)malloc(sizeof(EGLConfig)*n);
-                if (dp->disp[i].config) {
-                    if (cnx->egl.eglGetConfigs(
-                            dp->disp[i].dpy, dp->disp[i].config, n,
-                            &dp->disp[i].numConfigs))
-                    {
-                        dp->numTotalConfigs += n;
-                        res = EGL_TRUE;
-                    }
-                }
-            }
-        }
-    }
-
-    if (res == EGL_TRUE) {
-        dp->configs = new egl_config_t[ dp->numTotalConfigs ];
-        for (int i=0, k=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
-            egl_connection_t* const cnx = &gEGLImpl[i];
-            if (cnx->dso && cnx->major>=0 && cnx->minor>=0) {
-                for (int j=0 ; j<dp->disp[i].numConfigs ; j++) {
-                    dp->configs[k].impl = i;
-                    dp->configs[k].config = dp->disp[i].config[j];
-                    dp->configs[k].configId = k + 1; // CONFIG_ID start at 1
-                    // store the implementation's CONFIG_ID
-                    cnx->egl.eglGetConfigAttrib(
-                            dp->disp[i].dpy,
-                            dp->disp[i].config[j],
-                            EGL_CONFIG_ID,
-                            &dp->configs[k].implConfigId);
-                    k++;
-                }
-            }
-        }
-
-        // sort our configurations so we can do binary-searches
-        qsort(  dp->configs,
-                dp->numTotalConfigs,
-                sizeof(egl_config_t), cmp_configs);
-
-        dp->refs++;
-        if (major != NULL) *major = VERSION_MAJOR;
-        if (minor != NULL) *minor = VERSION_MINOR;
-        return EGL_TRUE;
-    }
-    return setError(EGL_NOT_INITIALIZED, EGL_FALSE);
-}
-
-EGLBoolean eglTerminate(EGLDisplay dpy)
-{
-    // NOTE: don't unload the drivers b/c some APIs can be called
-    // after eglTerminate() has been called. eglTerminate() only
-    // terminates an EGLDisplay, not a EGL itself.
-
-    clearError();
-
-    egl_display_t* const dp = get_display(dpy);
-    if (!dp) return setError(EGL_BAD_DISPLAY, EGL_FALSE);
-
-    Mutex::Autolock _l(dp->lock);
-
-    if (dp->refs == 0) {
-        return setError(EGL_NOT_INITIALIZED, EGL_FALSE);
-    }
-
-    // this is specific to Android, display termination is ref-counted.
-    if (dp->refs > 1) {
-        dp->refs--;
-        return EGL_TRUE;
-    }
-
-    EGLBoolean res = EGL_FALSE;
-    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
-        egl_connection_t* const cnx = &gEGLImpl[i];
-        if (cnx->dso && dp->disp[i].state == egl_display_t::INITIALIZED) {
-            if (cnx->egl.eglTerminate(dp->disp[i].dpy) == EGL_FALSE) {
-                LOGW("%d: eglTerminate(%p) failed (%s)", i, dp->disp[i].dpy,
-                        egl_strerror(cnx->egl.eglGetError()));
-            }
-            // REVISIT: it's unclear what to do if eglTerminate() fails
-            free(dp->disp[i].config);
-
-            dp->disp[i].numConfigs = 0;
-            dp->disp[i].config = 0;
-            dp->disp[i].state = egl_display_t::TERMINATED;
-
-            res = EGL_TRUE;
-        }
-    }
-    
-    // TODO: all egl_object_t should be marked for termination
-    
-    dp->refs--;
-    dp->numTotalConfigs = 0;
-    delete [] dp->configs;
-
-    return res;
-}
-
-// ----------------------------------------------------------------------------
-// configuration
-// ----------------------------------------------------------------------------
-
-EGLBoolean eglGetConfigs(   EGLDisplay dpy,
-                            EGLConfig *configs,
-                            EGLint config_size, EGLint *num_config)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    GLint numConfigs = dp->numTotalConfigs;
-    if (!configs) {
-        *num_config = numConfigs;
-        return EGL_TRUE;
-    }
-
-    GLint n = 0;
-    for (intptr_t i=0 ; i<dp->numTotalConfigs && config_size ; i++) {
-        *configs++ = EGLConfig(i);
-        config_size--;
-        n++;
-    }
-    
-    *num_config = n;
-    return EGL_TRUE;
-}
-
-EGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list,
-                            EGLConfig *configs, EGLint config_size,
-                            EGLint *num_config)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    if (num_config==0) {
-        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
-    }
-
-    EGLint n;
-    EGLBoolean res = EGL_FALSE;
-    *num_config = 0;
-
-    
-    // It is unfortunate, but we need to remap the EGL_CONFIG_IDs, 
-    // to do this, we have to go through the attrib_list array once
-    // to figure out both its size and if it contains an EGL_CONFIG_ID
-    // key. If so, the full array is copied and patched.
-    // NOTE: we assume that there can be only one occurrence
-    // of EGL_CONFIG_ID.
-    
-    EGLint patch_index = -1;
-    GLint attr;
-    size_t size = 0;
-    if (attrib_list) {
-        while ((attr=attrib_list[size]) != EGL_NONE) {
-            if (attr == EGL_CONFIG_ID)
-                patch_index = size;
-            size += 2;
-        }
-    }
-    if (patch_index >= 0) {
-        size += 2; // we need copy the sentinel as well
-        EGLint* new_list = (EGLint*)malloc(size*sizeof(EGLint));
-        if (new_list == 0)
-            return setError(EGL_BAD_ALLOC, EGL_FALSE);
-        memcpy(new_list, attrib_list, size*sizeof(EGLint));
-
-        // patch the requested EGL_CONFIG_ID
-        bool found = false;
-        EGLConfig ourConfig(0);
-        EGLint& configId(new_list[patch_index+1]);
-        for (intptr_t i=0 ; i<dp->numTotalConfigs ; i++) {
-            if (dp->configs[i].configId == configId) {
-                ourConfig = EGLConfig(i);
-                configId = dp->configs[i].implConfigId;
-                found = true;
-                break;
-            }
-        }
-
-        egl_connection_t* const cnx = &gEGLImpl[dp->configs[intptr_t(ourConfig)].impl];
-        if (found && cnx->dso) {
-            // and switch to the new list
-            attrib_list = const_cast<const EGLint *>(new_list);
-
-            // At this point, the only configuration that can match is
-            // dp->configs[i][index], however, we don't know if it would be
-            // rejected because of the other attributes, so we do have to call
-            // cnx->egl.eglChooseConfig() -- but we don't have to loop
-            // through all the EGLimpl[].
-            // We also know we can only get a single config back, and we know
-            // which one.
-
-            res = cnx->egl.eglChooseConfig(
-                    dp->disp[ dp->configs[intptr_t(ourConfig)].impl ].dpy,
-                    attrib_list, configs, config_size, &n);
-            if (res && n>0) {
-                // n has to be 0 or 1, by construction, and we already know
-                // which config it will return (since there can be only one).
-                if (configs) {
-                    configs[0] = ourConfig;
-                }
-                *num_config = 1;
-            }
-        }
-
-        free(const_cast<EGLint *>(attrib_list));
-        return res;
-    }
-
-
-    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
-        egl_connection_t* const cnx = &gEGLImpl[i];
-        if (cnx->dso) {
-            if (cnx->egl.eglChooseConfig(
-                    dp->disp[i].dpy, attrib_list, configs, config_size, &n)) {
-                if (configs) {
-                    // now we need to convert these client EGLConfig to our
-                    // internal EGLConfig format.
-                    // This is done in O(n Log(n)) time.
-                    for (int j=0 ; j<n ; j++) {
-                        egl_config_t key(i, configs[j]);
-                        intptr_t index = binarySearch<egl_config_t>(
-                                dp->configs, 0, dp->numTotalConfigs, key);
-                        if (index >= 0) {
-                            configs[j] = EGLConfig(index);
-                        } else {
-                            return setError(EGL_BAD_CONFIG, EGL_FALSE);
-                        }
-                    }
-                    configs += n;
-                    config_size -= n;
-                }
-                *num_config += n;
-                res = EGL_TRUE;
-            }
-        }
-    }
-    return res;
-}
-
-EGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
-        EGLint attribute, EGLint *value)
-{
-    clearError();
-
-    egl_display_t const* dp = 0;
-    egl_connection_t* cnx = validate_display_config(dpy, config, dp);
-    if (!cnx) return EGL_FALSE;
-    
-    if (attribute == EGL_CONFIG_ID) {
-        *value = dp->configs[intptr_t(config)].configId;
-        return EGL_TRUE;
-    }
-    return cnx->egl.eglGetConfigAttrib(
-            dp->disp[ dp->configs[intptr_t(config)].impl ].dpy,
-            dp->configs[intptr_t(config)].config, attribute, value);
-}
-
-// ----------------------------------------------------------------------------
-// surfaces
-// ----------------------------------------------------------------------------
-
-EGLSurface eglCreateWindowSurface(  EGLDisplay dpy, EGLConfig config,
-                                    NativeWindowType window,
-                                    const EGLint *attrib_list)
-{
-    clearError();
-
-    egl_display_t const* dp = 0;
-    egl_connection_t* cnx = validate_display_config(dpy, config, dp);
-    if (cnx) {
-        EGLDisplay iDpy = dp->disp[ dp->configs[intptr_t(config)].impl ].dpy;
-        EGLConfig iConfig = dp->configs[intptr_t(config)].config;
-        EGLint format;
-
-        // set the native window's buffers format to match this config
-        if (cnx->egl.eglGetConfigAttrib(iDpy,
-                iConfig, EGL_NATIVE_VISUAL_ID, &format)) {
-            if (format != 0) {
-                native_window_set_buffers_geometry(window, 0, 0, format);
-            }
-        }
-
-        EGLSurface surface = cnx->egl.eglCreateWindowSurface(
-                iDpy, iConfig, window, attrib_list);
-        if (surface != EGL_NO_SURFACE) {
-            egl_surface_t* s = new egl_surface_t(dpy, config, window, surface,
-                    dp->configs[intptr_t(config)].impl, cnx);
-            return s;
-        }
-    }
-    return EGL_NO_SURFACE;
-}
-
-EGLSurface eglCreatePixmapSurface(  EGLDisplay dpy, EGLConfig config,
-                                    NativePixmapType pixmap,
-                                    const EGLint *attrib_list)
-{
-    clearError();
-
-    egl_display_t const* dp = 0;
-    egl_connection_t* cnx = validate_display_config(dpy, config, dp);
-    if (cnx) {
-        EGLSurface surface = cnx->egl.eglCreatePixmapSurface(
-                dp->disp[ dp->configs[intptr_t(config)].impl ].dpy,
-                dp->configs[intptr_t(config)].config, pixmap, attrib_list);
-        if (surface != EGL_NO_SURFACE) {
-            egl_surface_t* s = new egl_surface_t(dpy, config, NULL, surface,
-                    dp->configs[intptr_t(config)].impl, cnx);
-            return s;
-        }
-    }
-    return EGL_NO_SURFACE;
-}
-
-EGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config,
-                                    const EGLint *attrib_list)
-{
-    clearError();
-
-    egl_display_t const* dp = 0;
-    egl_connection_t* cnx = validate_display_config(dpy, config, dp);
-    if (cnx) {
-        EGLSurface surface = cnx->egl.eglCreatePbufferSurface(
-                dp->disp[ dp->configs[intptr_t(config)].impl ].dpy,
-                dp->configs[intptr_t(config)].config, attrib_list);
-        if (surface != EGL_NO_SURFACE) {
-            egl_surface_t* s = new egl_surface_t(dpy, config, NULL, surface,
-                    dp->configs[intptr_t(config)].impl, cnx);
-            return s;
-        }
-    }
-    return EGL_NO_SURFACE;
-}
-                                    
-EGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    SurfaceRef _s(surface);
-    if (!_s.get()) return setError(EGL_BAD_SURFACE, EGL_FALSE);
-
-    if (!validate_display_surface(dpy, surface))
-        return EGL_FALSE;    
-
-    egl_surface_t * const s = get_surface(surface);
-    EGLBoolean result = s->cnx->egl.eglDestroySurface(
-            dp->disp[s->impl].dpy, s->surface);
-    if (result == EGL_TRUE) {
-        if (s->win != NULL) {
-            native_window_set_buffers_geometry(s->win.get(), 0, 0, 0);
-        }
-        _s.terminate();
-    }
-    return result;
-}
-
-EGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface surface,
-                            EGLint attribute, EGLint *value)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    SurfaceRef _s(surface);
-    if (!_s.get()) return setError(EGL_BAD_SURFACE, EGL_FALSE);
-
-    if (!validate_display_surface(dpy, surface))
-        return EGL_FALSE;    
-    egl_surface_t const * const s = get_surface(surface);
-
-    EGLBoolean result(EGL_TRUE);
-    if (attribute == EGL_CONFIG_ID) {
-        // We need to remap EGL_CONFIG_IDs
-        *value = dp->configs[intptr_t(s->config)].configId;
-    } else {
-        result = s->cnx->egl.eglQuerySurface(
-                dp->disp[s->impl].dpy, s->surface, attribute, value);
-    }
-
-    return result;
-}
-
-// ----------------------------------------------------------------------------
-// Contexts
-// ----------------------------------------------------------------------------
-
-EGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,
-                            EGLContext share_list, const EGLint *attrib_list)
-{
-    clearError();
-
-    egl_display_t const* dp = 0;
-    egl_connection_t* cnx = validate_display_config(dpy, config, dp);
-    if (cnx) {
-        if (share_list != EGL_NO_CONTEXT) {
-            egl_context_t* const c = get_context(share_list);
-            share_list = c->context;
-        }
-        EGLContext context = cnx->egl.eglCreateContext(
-                dp->disp[ dp->configs[intptr_t(config)].impl ].dpy,
-                dp->configs[intptr_t(config)].config,
-                share_list, attrib_list);
-        if (context != EGL_NO_CONTEXT) {
-            // figure out if it's a GLESv1 or GLESv2
-            int version = 0;
-            if (attrib_list) {
-                while (*attrib_list != EGL_NONE) {
-                    GLint attr = *attrib_list++;
-                    GLint value = *attrib_list++;
-                    if (attr == EGL_CONTEXT_CLIENT_VERSION) {
-                        if (value == 1) {
-                            version = GLESv1_INDEX;
-                        } else if (value == 2) {
-                            version = GLESv2_INDEX;
-                        }
-                    }
-                };
-            }
-            egl_context_t* c = new egl_context_t(dpy, context, config,
-                    dp->configs[intptr_t(config)].impl, cnx, version);
-            return c;
-        }
-    }
-    return EGL_NO_CONTEXT;
-}
-
-EGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    ContextRef _c(ctx);
-    if (!_c.get()) return setError(EGL_BAD_CONTEXT, EGL_FALSE);
-    
-    if (!validate_display_context(dpy, ctx))
-        return EGL_FALSE;
-    egl_context_t * const c = get_context(ctx);
-    EGLBoolean result = c->cnx->egl.eglDestroyContext(
-            dp->disp[c->impl].dpy, c->context);
-    if (result == EGL_TRUE) {
-        _c.terminate();
-    }
-    return result;
-}
-
-static void loseCurrent(egl_context_t * cur_c)
-{
-    if (cur_c) {
-        egl_surface_t * cur_r = get_surface(cur_c->read);
-        egl_surface_t * cur_d = get_surface(cur_c->draw);
-
-        // by construction, these are either 0 or valid (possibly terminated)
-        // it should be impossible for these to be invalid
-        ContextRef _cur_c(cur_c);
-        SurfaceRef _cur_r(cur_r);
-        SurfaceRef _cur_d(cur_d);
-
-        cur_c->read = NULL;
-        cur_c->draw = NULL;
-
-        _cur_c.release();
-        _cur_r.release();
-        _cur_d.release();
-    }
-}
-
-EGLBoolean eglMakeCurrent(  EGLDisplay dpy, EGLSurface draw,
-                            EGLSurface read, EGLContext ctx)
-{
-    clearError();
-
-    egl_display_t const * const dp = get_display(dpy);
-    if (!dp) return setError(EGL_BAD_DISPLAY, EGL_FALSE);
-
-    /* If ctx is not EGL_NO_CONTEXT, read is not EGL_NO_SURFACE, or draw is not
-       EGL_NO_SURFACE, then an EGL_NOT_INITIALIZED error is generated if dpy is
-       a valid but uninitialized display. */
-    if ( (ctx != EGL_NO_CONTEXT) || (read != EGL_NO_SURFACE) ||
-         (draw != EGL_NO_SURFACE) ) {
-        if (!dp->isReady()) return setError(EGL_NOT_INITIALIZED, EGL_FALSE);
-    }
-
-    // get a reference to the object passed in
-    ContextRef _c(ctx);
-    SurfaceRef _d(draw);
-    SurfaceRef _r(read);
-
-    // validate the context (if not EGL_NO_CONTEXT)
-    if ((ctx != EGL_NO_CONTEXT) && (!validate_display_context(dpy, ctx))) {
-        // EGL_NO_CONTEXT is valid
-        return EGL_FALSE;
-    }
-
-    // these are the underlying implementation's object
-    EGLContext impl_ctx  = EGL_NO_CONTEXT;
-    EGLSurface impl_draw = EGL_NO_SURFACE;
-    EGLSurface impl_read = EGL_NO_SURFACE;
-
-    // these are our objects structs passed in
-    egl_context_t       * c = NULL;
-    egl_surface_t const * d = NULL;
-    egl_surface_t const * r = NULL;
-
-    // these are the current objects structs
-    egl_context_t * cur_c = get_context(getContext());
-    
-    if (ctx != EGL_NO_CONTEXT) {
-        c = get_context(ctx);
-        impl_ctx = c->context;
-    } else {
-        // no context given, use the implementation of the current context
-        if (cur_c == NULL) {
-            // no current context
-            if (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE) {
-                // calling eglMakeCurrent( ..., !=0, !=0, EGL_NO_CONTEXT);
-                return setError(EGL_BAD_MATCH, EGL_FALSE);
-            }
-            // not an error, there is just no current context.
-            return EGL_TRUE;
-        }
-    }
-
-    // retrieve the underlying implementation's draw EGLSurface
-    if (draw != EGL_NO_SURFACE) {
-        d = get_surface(draw);
-        // make sure the EGLContext and EGLSurface passed in are for
-        // the same driver
-        if (c && d->impl != c->impl)
-            return setError(EGL_BAD_MATCH, EGL_FALSE);
-        impl_draw = d->surface;
-    }
-
-    // retrieve the underlying implementation's read EGLSurface
-    if (read != EGL_NO_SURFACE) {
-        r = get_surface(read);
-        // make sure the EGLContext and EGLSurface passed in are for
-        // the same driver
-        if (c && r->impl != c->impl)
-            return setError(EGL_BAD_MATCH, EGL_FALSE);
-        impl_read = r->surface;
-    }
-
-    EGLBoolean result;
-
-    if (c) {
-        result = c->cnx->egl.eglMakeCurrent(
-                dp->disp[c->impl].dpy, impl_draw, impl_read, impl_ctx);
-    } else {
-        result = cur_c->cnx->egl.eglMakeCurrent(
-                dp->disp[cur_c->impl].dpy, impl_draw, impl_read, impl_ctx);
-    }
-
-    if (result == EGL_TRUE) {
-
-        loseCurrent(cur_c);
-
-        if (ctx != EGL_NO_CONTEXT) {
-            setGLHooksThreadSpecific(c->cnx->hooks[c->version]);
-            setContext(ctx);
-            tls_t * const tls = getTLS();
-            if (!tls->dbg && gEGLDebugLevel > 0)
-                tls->dbg = CreateDbgContext(gEGLThreadLocalStorageKey, c->version,
-                                            c->cnx->hooks[c->version]);
-            _c.acquire();
-            _r.acquire();
-            _d.acquire();
-            c->read = read;
-            c->draw = draw;
-        } else {
-            setGLHooksThreadSpecific(&gHooksNoContext);
-            setContext(EGL_NO_CONTEXT);
-        }
-    }
-    return result;
-}
-
-
-EGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx,
-                            EGLint attribute, EGLint *value)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    ContextRef _c(ctx);
-    if (!_c.get()) return setError(EGL_BAD_CONTEXT, EGL_FALSE);
-
-    if (!validate_display_context(dpy, ctx))
-        return EGL_FALSE;    
-    
-    egl_context_t * const c = get_context(ctx);
-
-    EGLBoolean result(EGL_TRUE);
-    if (attribute == EGL_CONFIG_ID) {
-        *value = dp->configs[intptr_t(c->config)].configId;
-    } else {
-        // We need to remap EGL_CONFIG_IDs
-        result = c->cnx->egl.eglQueryContext(
-                dp->disp[c->impl].dpy, c->context, attribute, value);
-    }
-
-    return result;
-}
-
-EGLContext eglGetCurrentContext(void)
-{
-    // could be called before eglInitialize(), but we wouldn't have a context
-    // then, and this function would correctly return EGL_NO_CONTEXT.
-
-    clearError();
-
-    EGLContext ctx = getContext();
-    return ctx;
-}
-
-EGLSurface eglGetCurrentSurface(EGLint readdraw)
-{
-    // could be called before eglInitialize(), but we wouldn't have a context
-    // then, and this function would correctly return EGL_NO_SURFACE.
-
-    clearError();
-
-    EGLContext ctx = getContext();
-    if (ctx) {
-        egl_context_t const * const c = get_context(ctx);
-        if (!c) return setError(EGL_BAD_CONTEXT, EGL_NO_SURFACE);
-        switch (readdraw) {
-            case EGL_READ: return c->read;
-            case EGL_DRAW: return c->draw;            
-            default: return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
-        }
-    }
-    return EGL_NO_SURFACE;
-}
-
-EGLDisplay eglGetCurrentDisplay(void)
-{
-    // could be called before eglInitialize(), but we wouldn't have a context
-    // then, and this function would correctly return EGL_NO_DISPLAY.
-
-    clearError();
-
-    EGLContext ctx = getContext();
-    if (ctx) {
-        egl_context_t const * const c = get_context(ctx);
-        if (!c) return setError(EGL_BAD_CONTEXT, EGL_NO_SURFACE);
-        return c->dpy;
-    }
-    return EGL_NO_DISPLAY;
-}
-
-EGLBoolean eglWaitGL(void)
-{
-    // could be called before eglInitialize(), but we wouldn't have a context
-    // then, and this function would return GL_TRUE, which isn't wrong.
-
-    clearError();
-
-    EGLBoolean res = EGL_TRUE;
-    EGLContext ctx = getContext();
-    if (ctx) {
-        egl_context_t const * const c = get_context(ctx);
-        if (!c) return setError(EGL_BAD_CONTEXT, EGL_FALSE);
-        if (uint32_t(c->impl)>=2)
-            return setError(EGL_BAD_CONTEXT, EGL_FALSE);
-        egl_connection_t* const cnx = &gEGLImpl[c->impl];
-        if (!cnx->dso) 
-            return setError(EGL_BAD_CONTEXT, EGL_FALSE);
-        res = cnx->egl.eglWaitGL();
-    }
-    return res;
-}
-
-EGLBoolean eglWaitNative(EGLint engine)
-{
-    // could be called before eglInitialize(), but we wouldn't have a context
-    // then, and this function would return GL_TRUE, which isn't wrong.
-
-    clearError();
-
-    EGLBoolean res = EGL_TRUE;
-    EGLContext ctx = getContext();
-    if (ctx) {
-        egl_context_t const * const c = get_context(ctx);
-        if (!c) return setError(EGL_BAD_CONTEXT, EGL_FALSE);
-        if (uint32_t(c->impl)>=2)
-            return setError(EGL_BAD_CONTEXT, EGL_FALSE);
-        egl_connection_t* const cnx = &gEGLImpl[c->impl];
-        if (!cnx->dso) 
-            return setError(EGL_BAD_CONTEXT, EGL_FALSE);
-        res = cnx->egl.eglWaitNative(engine);
-    }
-    return res;
-}
-
-EGLint eglGetError(void)
-{
-    EGLint result = EGL_SUCCESS;
-    EGLint err;
-    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
-        err = EGL_SUCCESS;
-        egl_connection_t* const cnx = &gEGLImpl[i];
-        if (cnx->dso)
-            err = cnx->egl.eglGetError();
-        if (err!=EGL_SUCCESS && result==EGL_SUCCESS)
-            result = err;
-    }
-    err = getError();
-    if (result == EGL_SUCCESS)
-        result = err;
-    return result;
-}
-
-// Note: Similar implementations of these functions also exist in
-// gl2.cpp and gl.cpp, and are used by applications that call the
-// exported entry points directly.
-typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image);
-typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image);
-
-static PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES_impl = NULL;
-static PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC glEGLImageTargetRenderbufferStorageOES_impl = NULL;
-
-static void glEGLImageTargetTexture2DOES_wrapper(GLenum target, GLeglImageOES image)
-{
-    GLeglImageOES implImage =
-        (GLeglImageOES)egl_get_image_for_current_context((EGLImageKHR)image);
-    glEGLImageTargetTexture2DOES_impl(target, implImage);
-}
-
-static void glEGLImageTargetRenderbufferStorageOES_wrapper(GLenum target, GLeglImageOES image)
-{
-    GLeglImageOES implImage =
-        (GLeglImageOES)egl_get_image_for_current_context((EGLImageKHR)image);
-    glEGLImageTargetRenderbufferStorageOES_impl(target, implImage);
-}
-
-__eglMustCastToProperFunctionPointerType eglGetProcAddress(const char *procname)
-{
-    // eglGetProcAddress() could be the very first function called
-    // in which case we must make sure we've initialized ourselves, this
-    // happens the first time egl_get_display() is called.
-
-    clearError();
-
-    if (egl_init_drivers() == EGL_FALSE) {
-        setError(EGL_BAD_PARAMETER, NULL);
-        return  NULL;
-    }
-
-    __eglMustCastToProperFunctionPointerType addr;
-    addr = findProcAddress(procname, gExtentionMap, NELEM(gExtentionMap));
-    if (addr) return addr;
-
-    // this protects accesses to gGLExtentionMap and gGLExtentionSlot
-    pthread_mutex_lock(&gInitDriverMutex);
-
-        /*
-         * Since eglGetProcAddress() is not associated to anything, it needs
-         * to return a function pointer that "works" regardless of what
-         * the current context is.
-         *
-         * For this reason, we return a "forwarder", a small stub that takes
-         * care of calling the function associated with the context
-         * currently bound.
-         *
-         * We first look for extensions we've already resolved, if we're seeing
-         * this extension for the first time, we go through all our
-         * implementations and call eglGetProcAddress() and record the
-         * result in the appropriate implementation hooks and return the
-         * address of the forwarder corresponding to that hook set.
-         *
-         */
-
-        const String8 name(procname);
-        addr = gGLExtentionMap.valueFor(name);
-        const int slot = gGLExtentionSlot;
-
-        LOGE_IF(slot >= MAX_NUMBER_OF_GL_EXTENSIONS,
-                "no more slots for eglGetProcAddress(\"%s\")",
-                procname);
-
-        if (!addr && (slot < MAX_NUMBER_OF_GL_EXTENSIONS)) {
-            bool found = false;
-            for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
-                egl_connection_t* const cnx = &gEGLImpl[i];
-                if (cnx->dso && cnx->egl.eglGetProcAddress) {
-                    found = true;
-                    // Extensions are independent of the bound context
-                    cnx->hooks[GLESv1_INDEX]->ext.extensions[slot] =
-                    cnx->hooks[GLESv2_INDEX]->ext.extensions[slot] =
-#if EGL_TRACE
-                    gHooksDebug.ext.extensions[slot] = gHooksTrace.ext.extensions[slot] =
-#endif
-                            cnx->egl.eglGetProcAddress(procname);
-                }
-            }
-            if (found) {
-                addr = gExtensionForwarders[slot];
-
-                if (!strcmp(procname, "glEGLImageTargetTexture2DOES")) {
-                    glEGLImageTargetTexture2DOES_impl = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)addr;
-                    addr = (__eglMustCastToProperFunctionPointerType)glEGLImageTargetTexture2DOES_wrapper;
-                }
-                if (!strcmp(procname, "glEGLImageTargetRenderbufferStorageOES")) {
-                    glEGLImageTargetRenderbufferStorageOES_impl = (PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC)addr;
-                    addr = (__eglMustCastToProperFunctionPointerType)glEGLImageTargetRenderbufferStorageOES_wrapper;
-                }
-
-                gGLExtentionMap.add(name, addr);
-                gGLExtentionSlot++;
-            }
-        }
-
-    pthread_mutex_unlock(&gInitDriverMutex);
-    return addr;
-}
-
-EGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
-{
-    EGLBoolean Debug_eglSwapBuffers(EGLDisplay dpy, EGLSurface draw);
-    if (gEGLDebugLevel > 0)
-        Debug_eglSwapBuffers(dpy, draw);
-
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    SurfaceRef _s(draw);
-    if (!_s.get()) return setError(EGL_BAD_SURFACE, EGL_FALSE);
-
-    if (!validate_display_surface(dpy, draw))
-        return EGL_FALSE;    
-    egl_surface_t const * const s = get_surface(draw);
-    return s->cnx->egl.eglSwapBuffers(dp->disp[s->impl].dpy, s->surface);
-}
-
-EGLBoolean eglCopyBuffers(  EGLDisplay dpy, EGLSurface surface,
-                            NativePixmapType target)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    SurfaceRef _s(surface);
-    if (!_s.get()) return setError(EGL_BAD_SURFACE, EGL_FALSE);
-
-    if (!validate_display_surface(dpy, surface))
-        return EGL_FALSE;    
-    egl_surface_t const * const s = get_surface(surface);
-    return s->cnx->egl.eglCopyBuffers(
-            dp->disp[s->impl].dpy, s->surface, target);
-}
-
-const char* eglQueryString(EGLDisplay dpy, EGLint name)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return (const char *) NULL;
-
-    switch (name) {
-        case EGL_VENDOR:
-            return gVendorString;
-        case EGL_VERSION:
-            return gVersionString;
-        case EGL_EXTENSIONS:
-            return gExtensionString;
-        case EGL_CLIENT_APIS:
-            return gClientApiString;
-    }
-    return setError(EGL_BAD_PARAMETER, (const char *)0);
-}
-
-
-// ----------------------------------------------------------------------------
-// EGL 1.1
-// ----------------------------------------------------------------------------
-
-EGLBoolean eglSurfaceAttrib(
-        EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    SurfaceRef _s(surface);
-    if (!_s.get()) return setError(EGL_BAD_SURFACE, EGL_FALSE);
-
-    if (!validate_display_surface(dpy, surface))
-        return EGL_FALSE;    
-    egl_surface_t const * const s = get_surface(surface);
-    if (s->cnx->egl.eglSurfaceAttrib) {
-        return s->cnx->egl.eglSurfaceAttrib(
-                dp->disp[s->impl].dpy, s->surface, attribute, value);
-    }
-    return setError(EGL_BAD_SURFACE, EGL_FALSE);
-}
-
-EGLBoolean eglBindTexImage(
-        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    SurfaceRef _s(surface);
-    if (!_s.get()) return setError(EGL_BAD_SURFACE, EGL_FALSE);
-
-    if (!validate_display_surface(dpy, surface))
-        return EGL_FALSE;    
-    egl_surface_t const * const s = get_surface(surface);
-    if (s->cnx->egl.eglBindTexImage) {
-        return s->cnx->egl.eglBindTexImage(
-                dp->disp[s->impl].dpy, s->surface, buffer);
-    }
-    return setError(EGL_BAD_SURFACE, EGL_FALSE);
-}
-
-EGLBoolean eglReleaseTexImage(
-        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    SurfaceRef _s(surface);
-    if (!_s.get()) return setError(EGL_BAD_SURFACE, EGL_FALSE);
-
-    if (!validate_display_surface(dpy, surface))
-        return EGL_FALSE;    
-    egl_surface_t const * const s = get_surface(surface);
-    if (s->cnx->egl.eglReleaseTexImage) {
-        return s->cnx->egl.eglReleaseTexImage(
-                dp->disp[s->impl].dpy, s->surface, buffer);
-    }
-    return setError(EGL_BAD_SURFACE, EGL_FALSE);
-}
-
-EGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    EGLBoolean res = EGL_TRUE;
-    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
-        egl_connection_t* const cnx = &gEGLImpl[i];
-        if (cnx->dso) {
-            if (cnx->egl.eglSwapInterval) {
-                if (cnx->egl.eglSwapInterval(
-                        dp->disp[i].dpy, interval) == EGL_FALSE) {
-                    res = EGL_FALSE;
-                }
-            }
-        }
-    }
-    return res;
-}
-
-
-// ----------------------------------------------------------------------------
-// EGL 1.2
-// ----------------------------------------------------------------------------
-
-EGLBoolean eglWaitClient(void)
-{
-    clearError();
-
-    // could be called before eglInitialize(), but we wouldn't have a context
-    // then, and this function would return GL_TRUE, which isn't wrong.
-    EGLBoolean res = EGL_TRUE;
-    EGLContext ctx = getContext();
-    if (ctx) {
-        egl_context_t const * const c = get_context(ctx);
-        if (!c) return setError(EGL_BAD_CONTEXT, EGL_FALSE);
-        if (uint32_t(c->impl)>=2)
-            return setError(EGL_BAD_CONTEXT, EGL_FALSE);
-        egl_connection_t* const cnx = &gEGLImpl[c->impl];
-        if (!cnx->dso) 
-            return setError(EGL_BAD_CONTEXT, EGL_FALSE);
-        if (cnx->egl.eglWaitClient) {
-            res = cnx->egl.eglWaitClient();
-        } else {
-            res = cnx->egl.eglWaitGL();
-        }
-    }
-    return res;
-}
-
-EGLBoolean eglBindAPI(EGLenum api)
-{
-    clearError();
-
-    if (egl_init_drivers() == EGL_FALSE) {
-        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
-    }
-
-    // bind this API on all EGLs
-    EGLBoolean res = EGL_TRUE;
-    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
-        egl_connection_t* const cnx = &gEGLImpl[i];
-        if (cnx->dso) {
-            if (cnx->egl.eglBindAPI) {
-                if (cnx->egl.eglBindAPI(api) == EGL_FALSE) {
-                    res = EGL_FALSE;
-                }
-            }
-        }
-    }
-    return res;
-}
-
-EGLenum eglQueryAPI(void)
-{
-    clearError();
-
-    if (egl_init_drivers() == EGL_FALSE) {
-        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
-    }
-
-    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
-        egl_connection_t* const cnx = &gEGLImpl[i];
-        if (cnx->dso) {
-            if (cnx->egl.eglQueryAPI) {
-                // the first one we find is okay, because they all
-                // should be the same
-                return cnx->egl.eglQueryAPI();
-            }
-        }
-    }
-    // or, it can only be OpenGL ES
-    return EGL_OPENGL_ES_API;
-}
-
-EGLBoolean eglReleaseThread(void)
-{
-    clearError();
-
-    // If there is context bound to the thread, release it
-    loseCurrent(get_context(getContext()));
-
-    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
-        egl_connection_t* const cnx = &gEGLImpl[i];
-        if (cnx->dso) {
-            if (cnx->egl.eglReleaseThread) {
-                cnx->egl.eglReleaseThread();
-            }
-        }
-    }
-    clearTLS();    
-    return EGL_TRUE;
-}
-
-EGLSurface eglCreatePbufferFromClientBuffer(
-          EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
-          EGLConfig config, const EGLint *attrib_list)
-{
-    clearError();
-
-    egl_display_t const* dp = 0;
-    egl_connection_t* cnx = validate_display_config(dpy, config, dp);
-    if (!cnx) return EGL_FALSE;
-    if (cnx->egl.eglCreatePbufferFromClientBuffer) {
-        return cnx->egl.eglCreatePbufferFromClientBuffer(
-                dp->disp[ dp->configs[intptr_t(config)].impl ].dpy,
-                buftype, buffer,
-                dp->configs[intptr_t(config)].config, attrib_list);
-    }
-    return setError(EGL_BAD_CONFIG, EGL_NO_SURFACE);
-}
-
-// ----------------------------------------------------------------------------
-// EGL_EGLEXT_VERSION 3
-// ----------------------------------------------------------------------------
-
-EGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface,
-        const EGLint *attrib_list)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    SurfaceRef _s(surface);
-    if (!_s.get()) return setError(EGL_BAD_SURFACE, EGL_FALSE);
-
-    if (!validate_display_surface(dpy, surface))
-        return EGL_FALSE;
-
-    egl_surface_t const * const s = get_surface(surface);
-
-    if (s->cnx->egl.eglLockSurfaceKHR) {
-        return s->cnx->egl.eglLockSurfaceKHR(
-                dp->disp[s->impl].dpy, s->surface, attrib_list);
-    }
-    return setError(EGL_BAD_DISPLAY, EGL_FALSE);
-}
-
-EGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    SurfaceRef _s(surface);
-    if (!_s.get()) return setError(EGL_BAD_SURFACE, EGL_FALSE);
-
-    if (!validate_display_surface(dpy, surface))
-        return EGL_FALSE;
-
-    egl_surface_t const * const s = get_surface(surface);
-
-    if (s->cnx->egl.eglUnlockSurfaceKHR) {
-        return s->cnx->egl.eglUnlockSurfaceKHR(
-                dp->disp[s->impl].dpy, s->surface);
-    }
-    return setError(EGL_BAD_DISPLAY, EGL_FALSE);
-}
-
-EGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
-        EGLClientBuffer buffer, const EGLint *attrib_list)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_NO_IMAGE_KHR;
-
-    if (ctx != EGL_NO_CONTEXT) {
-        ContextRef _c(ctx);
-        if (!_c.get()) return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
-        if (!validate_display_context(dpy, ctx))
-            return EGL_NO_IMAGE_KHR;
-        egl_context_t * const c = get_context(ctx);
-        // since we have an EGLContext, we know which implementation to use
-        EGLImageKHR image = c->cnx->egl.eglCreateImageKHR(
-                dp->disp[c->impl].dpy, c->context, target, buffer, attrib_list);
-        if (image == EGL_NO_IMAGE_KHR)
-            return image;
-            
-        egl_image_t* result = new egl_image_t(dpy, ctx);
-        result->images[c->impl] = image;
-        return (EGLImageKHR)result;
-    } else {
-        // EGL_NO_CONTEXT is a valid parameter
-
-        /* Since we don't have a way to know which implementation to call,
-         * we're calling all of them. If at least one of the implementation
-         * succeeded, this is a success.
-         */
-
-        EGLint currentError = eglGetError();
-
-        EGLImageKHR implImages[IMPL_NUM_IMPLEMENTATIONS];
-        bool success = false;
-        for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
-            egl_connection_t* const cnx = &gEGLImpl[i];
-            implImages[i] = EGL_NO_IMAGE_KHR;
-            if (cnx->dso) {
-                if (cnx->egl.eglCreateImageKHR) {
-                    implImages[i] = cnx->egl.eglCreateImageKHR(
-                            dp->disp[i].dpy, ctx, target, buffer, attrib_list);
-                    if (implImages[i] != EGL_NO_IMAGE_KHR) {
-                        success = true;
-                    }
-                }
-            }
-        }
-
-        if (!success) {
-            // failure, if there was an error when we entered this function,
-            // the error flag must not be updated.
-            // Otherwise, the error is whatever happened in the implementation
-            // that faulted.
-            if (currentError != EGL_SUCCESS) {
-                setError(currentError, EGL_NO_IMAGE_KHR);
-            }
-            return EGL_NO_IMAGE_KHR;
-        } else {
-            // In case of success, we need to clear all error flags
-            // (especially those caused by the implementation that didn't
-            // succeed). TODO: we could avoid this if we knew this was
-            // a "full" success (all implementation succeeded).
-            eglGetError();
-        }
-
-        egl_image_t* result = new egl_image_t(dpy, ctx);
-        memcpy(result->images, implImages, sizeof(implImages));
-        return (EGLImageKHR)result;
-    }
-}
-
-EGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    ImageRef _i(img);
-    if (!_i.get()) return setError(EGL_BAD_PARAMETER, EGL_FALSE);
-
-    egl_image_t* image = get_image(img);
-    bool success = false;
-    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
-        egl_connection_t* const cnx = &gEGLImpl[i];
-        if (image->images[i] != EGL_NO_IMAGE_KHR) {
-            if (cnx->dso) {
-                if (cnx->egl.eglDestroyImageKHR) {
-                    if (cnx->egl.eglDestroyImageKHR(
-                            dp->disp[i].dpy, image->images[i])) {
-                        success = true;
-                    }
-                }
-            }
-        }
-    }
-    if (!success)
-        return EGL_FALSE;
-
-    _i.terminate();
-
-    return EGL_TRUE;
-}
-
-// ----------------------------------------------------------------------------
-// EGL_EGLEXT_VERSION 5
-// ----------------------------------------------------------------------------
-
-
-EGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_NO_SYNC_KHR;
-
-    EGLContext ctx = eglGetCurrentContext();
-    ContextRef _c(ctx);
-    if (!_c.get()) return setError(EGL_BAD_CONTEXT, EGL_NO_SYNC_KHR);
-    if (!validate_display_context(dpy, ctx))
-        return EGL_NO_SYNC_KHR;
-    egl_context_t * const c = get_context(ctx);
-    EGLSyncKHR result = EGL_NO_SYNC_KHR;
-    if (c->cnx->egl.eglCreateSyncKHR) {
-        EGLSyncKHR sync = c->cnx->egl.eglCreateSyncKHR(
-                dp->disp[c->impl].dpy, type, attrib_list);
-        if (sync == EGL_NO_SYNC_KHR)
-            return sync;
-        result = (egl_sync_t*)new egl_sync_t(dpy, ctx, sync);
-    }
-    return (EGLSyncKHR)result;
-}
-
-EGLBoolean eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    SyncRef _s(sync);
-    if (!_s.get()) return setError(EGL_BAD_PARAMETER, EGL_FALSE);
-    egl_sync_t* syncObject = get_sync(sync);
-
-    EGLContext ctx = syncObject->context;
-    ContextRef _c(ctx);
-    if (!_c.get()) return setError(EGL_BAD_CONTEXT, EGL_FALSE);
-    if (!validate_display_context(dpy, ctx))
-        return EGL_FALSE;
-
-    EGLBoolean result = EGL_FALSE;
-    egl_context_t * const c = get_context(ctx);
-    if (c->cnx->egl.eglDestroySyncKHR) {
-        result = c->cnx->egl.eglDestroySyncKHR(
-                dp->disp[c->impl].dpy, syncObject->sync);
-        if (result)
-            _s.terminate();
-    }
-    return result;
-}
-
-EGLint eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    SyncRef _s(sync);
-    if (!_s.get()) return setError(EGL_BAD_PARAMETER, EGL_FALSE);
-    egl_sync_t* syncObject = get_sync(sync);
-
-    EGLContext ctx = syncObject->context;
-    ContextRef _c(ctx);
-    if (!_c.get()) return setError(EGL_BAD_CONTEXT, EGL_FALSE);
-    if (!validate_display_context(dpy, ctx))
-        return EGL_FALSE;
-
-    egl_context_t * const c = get_context(ctx);
-
-    if (c->cnx->egl.eglClientWaitSyncKHR) {
-        return c->cnx->egl.eglClientWaitSyncKHR(
-                dp->disp[c->impl].dpy, syncObject->sync, flags, timeout);
-    }
-
-    return EGL_FALSE;
-}
-
-EGLBoolean eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    SyncRef _s(sync);
-    if (!_s.get()) return setError(EGL_BAD_PARAMETER, EGL_FALSE);
-    egl_sync_t* syncObject = get_sync(sync);
-
-    EGLContext ctx = syncObject->context;
-    ContextRef _c(ctx);
-    if (!_c.get()) return setError(EGL_BAD_CONTEXT, EGL_FALSE);
-    if (!validate_display_context(dpy, ctx))
-        return EGL_FALSE;
-
-    egl_context_t * const c = get_context(ctx);
-
-    if (c->cnx->egl.eglGetSyncAttribKHR) {
-        return c->cnx->egl.eglGetSyncAttribKHR(
-                dp->disp[c->impl].dpy, syncObject->sync, attribute, value);
-    }
-
-    return EGL_FALSE;
-}
-
-// ----------------------------------------------------------------------------
-// ANDROID extensions
-// ----------------------------------------------------------------------------
-
-EGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw,
-        EGLint left, EGLint top, EGLint width, EGLint height)
-{
-    clearError();
-
-    egl_display_t const * const dp = validate_display(dpy);
-    if (!dp) return EGL_FALSE;
-
-    SurfaceRef _s(draw);
-    if (!_s.get()) return setError(EGL_BAD_SURFACE, EGL_FALSE);
-
-    if (!validate_display_surface(dpy, draw))
-        return EGL_FALSE;    
-    egl_surface_t const * const s = get_surface(draw);
-    if (s->cnx->egl.eglSetSwapRectangleANDROID) {
-        return s->cnx->egl.eglSetSwapRectangleANDROID(
-                dp->disp[s->impl].dpy, s->surface, left, top, width, height);
-    }
-    return setError(EGL_BAD_DISPLAY, NULL);
-}
diff --git a/opengl/libs/EGL/eglApi.cpp b/opengl/libs/EGL/eglApi.cpp
new file mode 100644
index 0000000..7d5d010
--- /dev/null
+++ b/opengl/libs/EGL/eglApi.cpp
@@ -0,0 +1,1440 @@
+/* 
+ ** Copyright 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.
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <hardware/gralloc.h>
+#include <system/window.h>
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include <GLES/gl.h>
+#include <GLES/glext.h>
+
+#include <cutils/log.h>
+#include <cutils/atomic.h>
+#include <cutils/properties.h>
+#include <cutils/memory.h>
+
+#include <utils/KeyedVector.h>
+#include <utils/SortedVector.h>
+#include <utils/String8.h>
+
+#include "egl_impl.h"
+#include "egl_tls.h"
+#include "glesv2dbg.h"
+#include "hooks.h"
+
+#include "egl_display.h"
+#include "egl_impl.h"
+#include "egl_object.h"
+#include "egl_tls.h"
+
+using namespace android;
+
+// ----------------------------------------------------------------------------
+
+static char const * const sVendorString     = "Android";
+static char const * const sVersionString    = "1.4 Android META-EGL";
+static char const * const sClientApiString  = "OpenGL ES";
+static char const * const sExtensionString  =
+        "EGL_KHR_image "
+        "EGL_KHR_image_base "
+        "EGL_KHR_image_pixmap "
+        "EGL_KHR_gl_texture_2D_image "
+        "EGL_KHR_gl_texture_cubemap_image "
+        "EGL_KHR_gl_renderbuffer_image "
+        "EGL_KHR_fence_sync "
+        "EGL_ANDROID_image_native_buffer "
+        "EGL_ANDROID_swap_rectangle "
+        ;
+
+struct extention_map_t {
+    const char* name;
+    __eglMustCastToProperFunctionPointerType address;
+};
+
+static const extention_map_t sExtentionMap[] = {
+    { "eglLockSurfaceKHR",
+            (__eglMustCastToProperFunctionPointerType)&eglLockSurfaceKHR },
+    { "eglUnlockSurfaceKHR",
+            (__eglMustCastToProperFunctionPointerType)&eglUnlockSurfaceKHR },
+    { "eglCreateImageKHR",
+            (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR },
+    { "eglDestroyImageKHR",
+            (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR },
+    { "eglSetSwapRectangleANDROID",
+            (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID },
+};
+
+// accesses protected by sExtensionMapMutex
+static DefaultKeyedVector<String8, __eglMustCastToProperFunctionPointerType> sGLExtentionMap;
+static int sGLExtentionSlot = 0;
+static pthread_mutex_t sExtensionMapMutex = PTHREAD_MUTEX_INITIALIZER;
+
+static void(*findProcAddress(const char* name,
+        const extention_map_t* map, size_t n))() {
+    for (uint32_t i=0 ; i<n ; i++) {
+        if (!strcmp(name, map[i].name)) {
+            return map[i].address;
+        }
+    }
+    return NULL;
+}
+
+// ----------------------------------------------------------------------------
+
+template<typename T>
+static __attribute__((noinline))
+int binarySearch(T const sortedArray[], int first, int last, T key) {
+    while (first <= last) {
+        int mid = (first + last) / 2;
+        if (sortedArray[mid] < key) {
+            first = mid + 1;
+        } else if (key < sortedArray[mid]) {
+            last = mid - 1;
+        } else {
+            return mid;
+        }
+    }
+    return -1;
+}
+
+// ----------------------------------------------------------------------------
+
+namespace android {
+extern void setGLHooksThreadSpecific(gl_hooks_t const *value);
+extern EGLBoolean egl_init_drivers();
+extern const __eglMustCastToProperFunctionPointerType gExtensionForwarders[MAX_NUMBER_OF_GL_EXTENSIONS];
+extern int gEGLDebugLevel;
+extern gl_hooks_t gHooksTrace;
+extern gl_hooks_t gHooksDebug;
+} // namespace android;
+
+// ----------------------------------------------------------------------------
+
+static inline void clearError() { egl_tls_t::clearError(); }
+static inline EGLContext getContext() { return egl_tls_t::getContext(); }
+
+// ----------------------------------------------------------------------------
+
+EGLDisplay eglGetDisplay(EGLNativeDisplayType display)
+{
+    clearError();
+
+    uint32_t index = uint32_t(display);
+    if (index >= NUM_DISPLAYS) {
+        return setError(EGL_BAD_PARAMETER, EGL_NO_DISPLAY);
+    }
+
+    if (egl_init_drivers() == EGL_FALSE) {
+        return setError(EGL_BAD_PARAMETER, EGL_NO_DISPLAY);
+    }
+
+    EGLDisplay dpy = egl_display_t::getFromNativeDisplay(display);
+    return dpy;
+}
+
+// ----------------------------------------------------------------------------
+// Initialization
+// ----------------------------------------------------------------------------
+
+EGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
+{
+    clearError();
+
+    egl_display_t * const dp = get_display(dpy);
+    if (!dp) return setError(EGL_BAD_DISPLAY, EGL_FALSE);
+
+    EGLBoolean res = dp->initialize(major, minor);
+
+    return res;
+}
+
+EGLBoolean eglTerminate(EGLDisplay dpy)
+{
+    // NOTE: don't unload the drivers b/c some APIs can be called
+    // after eglTerminate() has been called. eglTerminate() only
+    // terminates an EGLDisplay, not a EGL itself.
+
+    clearError();
+
+    egl_display_t* const dp = get_display(dpy);
+    if (!dp) return setError(EGL_BAD_DISPLAY, EGL_FALSE);
+
+    EGLBoolean res = dp->terminate();
+    
+    return res;
+}
+
+// ----------------------------------------------------------------------------
+// configuration
+// ----------------------------------------------------------------------------
+
+EGLBoolean eglGetConfigs(   EGLDisplay dpy,
+                            EGLConfig *configs,
+                            EGLint config_size, EGLint *num_config)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    GLint numConfigs = dp->numTotalConfigs;
+    if (!configs) {
+        *num_config = numConfigs;
+        return EGL_TRUE;
+    }
+
+    GLint n = 0;
+    for (intptr_t i=0 ; i<dp->numTotalConfigs && config_size ; i++) {
+        *configs++ = EGLConfig(i);
+        config_size--;
+        n++;
+    }
+    
+    *num_config = n;
+    return EGL_TRUE;
+}
+
+EGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list,
+                            EGLConfig *configs, EGLint config_size,
+                            EGLint *num_config)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    if (num_config==0) {
+        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
+    }
+
+    EGLint n;
+    EGLBoolean res = EGL_FALSE;
+    *num_config = 0;
+
+    
+    // It is unfortunate, but we need to remap the EGL_CONFIG_IDs, 
+    // to do this, we have to go through the attrib_list array once
+    // to figure out both its size and if it contains an EGL_CONFIG_ID
+    // key. If so, the full array is copied and patched.
+    // NOTE: we assume that there can be only one occurrence
+    // of EGL_CONFIG_ID.
+    
+    EGLint patch_index = -1;
+    GLint attr;
+    size_t size = 0;
+    if (attrib_list) {
+        while ((attr=attrib_list[size]) != EGL_NONE) {
+            if (attr == EGL_CONFIG_ID)
+                patch_index = size;
+            size += 2;
+        }
+    }
+    if (patch_index >= 0) {
+        size += 2; // we need copy the sentinel as well
+        EGLint* new_list = (EGLint*)malloc(size*sizeof(EGLint));
+        if (new_list == 0)
+            return setError(EGL_BAD_ALLOC, EGL_FALSE);
+        memcpy(new_list, attrib_list, size*sizeof(EGLint));
+
+        // patch the requested EGL_CONFIG_ID
+        bool found = false;
+        EGLConfig ourConfig(0);
+        EGLint& configId(new_list[patch_index+1]);
+        for (intptr_t i=0 ; i<dp->numTotalConfigs ; i++) {
+            if (dp->configs[i].configId == configId) {
+                ourConfig = EGLConfig(i);
+                configId = dp->configs[i].implConfigId;
+                found = true;
+                break;
+            }
+        }
+
+        egl_connection_t* const cnx = &gEGLImpl[dp->configs[intptr_t(ourConfig)].impl];
+        if (found && cnx->dso) {
+            // and switch to the new list
+            attrib_list = const_cast<const EGLint *>(new_list);
+
+            // At this point, the only configuration that can match is
+            // dp->configs[i][index], however, we don't know if it would be
+            // rejected because of the other attributes, so we do have to call
+            // cnx->egl.eglChooseConfig() -- but we don't have to loop
+            // through all the EGLimpl[].
+            // We also know we can only get a single config back, and we know
+            // which one.
+
+            res = cnx->egl.eglChooseConfig(
+                    dp->disp[ dp->configs[intptr_t(ourConfig)].impl ].dpy,
+                    attrib_list, configs, config_size, &n);
+            if (res && n>0) {
+                // n has to be 0 or 1, by construction, and we already know
+                // which config it will return (since there can be only one).
+                if (configs) {
+                    configs[0] = ourConfig;
+                }
+                *num_config = 1;
+            }
+        }
+
+        free(const_cast<EGLint *>(attrib_list));
+        return res;
+    }
+
+
+    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
+        egl_connection_t* const cnx = &gEGLImpl[i];
+        if (cnx->dso) {
+            if (cnx->egl.eglChooseConfig(
+                    dp->disp[i].dpy, attrib_list, configs, config_size, &n)) {
+                if (configs) {
+                    // now we need to convert these client EGLConfig to our
+                    // internal EGLConfig format.
+                    // This is done in O(n Log(n)) time.
+                    for (int j=0 ; j<n ; j++) {
+                        egl_config_t key(i, configs[j]);
+                        intptr_t index = binarySearch<egl_config_t>(
+                                dp->configs, 0, dp->numTotalConfigs, key);
+                        if (index >= 0) {
+                            configs[j] = EGLConfig(index);
+                        } else {
+                            return setError(EGL_BAD_CONFIG, EGL_FALSE);
+                        }
+                    }
+                    configs += n;
+                    config_size -= n;
+                }
+                *num_config += n;
+                res = EGL_TRUE;
+            }
+        }
+    }
+    return res;
+}
+
+EGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
+        EGLint attribute, EGLint *value)
+{
+    clearError();
+
+    egl_display_t const* dp = 0;
+    egl_connection_t* cnx = validate_display_config(dpy, config, dp);
+    if (!cnx) return EGL_FALSE;
+    
+    if (attribute == EGL_CONFIG_ID) {
+        *value = dp->configs[intptr_t(config)].configId;
+        return EGL_TRUE;
+    }
+    return cnx->egl.eglGetConfigAttrib(
+            dp->disp[ dp->configs[intptr_t(config)].impl ].dpy,
+            dp->configs[intptr_t(config)].config, attribute, value);
+}
+
+// ----------------------------------------------------------------------------
+// surfaces
+// ----------------------------------------------------------------------------
+
+EGLSurface eglCreateWindowSurface(  EGLDisplay dpy, EGLConfig config,
+                                    NativeWindowType window,
+                                    const EGLint *attrib_list)
+{
+    clearError();
+
+    egl_display_t const* dp = 0;
+    egl_connection_t* cnx = validate_display_config(dpy, config, dp);
+    if (cnx) {
+        EGLDisplay iDpy = dp->disp[ dp->configs[intptr_t(config)].impl ].dpy;
+        EGLConfig iConfig = dp->configs[intptr_t(config)].config;
+        EGLint format;
+
+        // set the native window's buffers format to match this config
+        if (cnx->egl.eglGetConfigAttrib(iDpy,
+                iConfig, EGL_NATIVE_VISUAL_ID, &format)) {
+            if (format != 0) {
+                native_window_set_buffers_geometry(window, 0, 0, format);
+            }
+        }
+
+        EGLSurface surface = cnx->egl.eglCreateWindowSurface(
+                iDpy, iConfig, window, attrib_list);
+        if (surface != EGL_NO_SURFACE) {
+            egl_surface_t* s = new egl_surface_t(dpy, config, window, surface,
+                    dp->configs[intptr_t(config)].impl, cnx);
+            return s;
+        }
+    }
+    return EGL_NO_SURFACE;
+}
+
+EGLSurface eglCreatePixmapSurface(  EGLDisplay dpy, EGLConfig config,
+                                    NativePixmapType pixmap,
+                                    const EGLint *attrib_list)
+{
+    clearError();
+
+    egl_display_t const* dp = 0;
+    egl_connection_t* cnx = validate_display_config(dpy, config, dp);
+    if (cnx) {
+        EGLSurface surface = cnx->egl.eglCreatePixmapSurface(
+                dp->disp[ dp->configs[intptr_t(config)].impl ].dpy,
+                dp->configs[intptr_t(config)].config, pixmap, attrib_list);
+        if (surface != EGL_NO_SURFACE) {
+            egl_surface_t* s = new egl_surface_t(dpy, config, NULL, surface,
+                    dp->configs[intptr_t(config)].impl, cnx);
+            return s;
+        }
+    }
+    return EGL_NO_SURFACE;
+}
+
+EGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config,
+                                    const EGLint *attrib_list)
+{
+    clearError();
+
+    egl_display_t const* dp = 0;
+    egl_connection_t* cnx = validate_display_config(dpy, config, dp);
+    if (cnx) {
+        EGLSurface surface = cnx->egl.eglCreatePbufferSurface(
+                dp->disp[ dp->configs[intptr_t(config)].impl ].dpy,
+                dp->configs[intptr_t(config)].config, attrib_list);
+        if (surface != EGL_NO_SURFACE) {
+            egl_surface_t* s = new egl_surface_t(dpy, config, NULL, surface,
+                    dp->configs[intptr_t(config)].impl, cnx);
+            return s;
+        }
+    }
+    return EGL_NO_SURFACE;
+}
+                                    
+EGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    SurfaceRef _s(surface);
+    if (!_s.get())
+        return setError(EGL_BAD_SURFACE, EGL_FALSE);
+
+    egl_surface_t * const s = get_surface(surface);
+    EGLBoolean result = s->cnx->egl.eglDestroySurface(
+            dp->disp[s->impl].dpy, s->surface);
+    if (result == EGL_TRUE) {
+        if (s->win != NULL) {
+            native_window_set_buffers_geometry(s->win.get(), 0, 0, 0);
+        }
+        _s.terminate();
+    }
+    return result;
+}
+
+EGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface surface,
+                            EGLint attribute, EGLint *value)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    SurfaceRef _s(surface);
+    if (!_s.get())
+        return setError(EGL_BAD_SURFACE, EGL_FALSE);
+
+    egl_surface_t const * const s = get_surface(surface);
+    EGLBoolean result(EGL_TRUE);
+    if (attribute == EGL_CONFIG_ID) {
+        // We need to remap EGL_CONFIG_IDs
+        *value = dp->configs[intptr_t(s->config)].configId;
+    } else {
+        result = s->cnx->egl.eglQuerySurface(
+                dp->disp[s->impl].dpy, s->surface, attribute, value);
+    }
+
+    return result;
+}
+
+// ----------------------------------------------------------------------------
+// Contexts
+// ----------------------------------------------------------------------------
+
+EGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,
+                            EGLContext share_list, const EGLint *attrib_list)
+{
+    clearError();
+
+    egl_display_t const* dp = 0;
+    egl_connection_t* cnx = validate_display_config(dpy, config, dp);
+    if (cnx) {
+        if (share_list != EGL_NO_CONTEXT) {
+            egl_context_t* const c = get_context(share_list);
+            share_list = c->context;
+        }
+        EGLContext context = cnx->egl.eglCreateContext(
+                dp->disp[ dp->configs[intptr_t(config)].impl ].dpy,
+                dp->configs[intptr_t(config)].config,
+                share_list, attrib_list);
+        if (context != EGL_NO_CONTEXT) {
+            // figure out if it's a GLESv1 or GLESv2
+            int version = 0;
+            if (attrib_list) {
+                while (*attrib_list != EGL_NONE) {
+                    GLint attr = *attrib_list++;
+                    GLint value = *attrib_list++;
+                    if (attr == EGL_CONTEXT_CLIENT_VERSION) {
+                        if (value == 1) {
+                            version = GLESv1_INDEX;
+                        } else if (value == 2) {
+                            version = GLESv2_INDEX;
+                        }
+                    }
+                };
+            }
+            egl_context_t* c = new egl_context_t(dpy, context, config,
+                    dp->configs[intptr_t(config)].impl, cnx, version);
+            return c;
+        }
+    }
+    return EGL_NO_CONTEXT;
+}
+
+EGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp)
+        return EGL_FALSE;
+
+    ContextRef _c(ctx);
+    if (!_c.get())
+        return setError(EGL_BAD_CONTEXT, EGL_FALSE);
+    
+    egl_context_t * const c = get_context(ctx);
+    EGLBoolean result = c->cnx->egl.eglDestroyContext(
+            dp->disp[c->impl].dpy, c->context);
+    if (result == EGL_TRUE) {
+        _c.terminate();
+    }
+    return result;
+}
+
+static void loseCurrent(egl_context_t * cur_c)
+{
+    if (cur_c) {
+        egl_surface_t * cur_r = get_surface(cur_c->read);
+        egl_surface_t * cur_d = get_surface(cur_c->draw);
+
+        // by construction, these are either 0 or valid (possibly terminated)
+        // it should be impossible for these to be invalid
+        ContextRef _cur_c(cur_c);
+        SurfaceRef _cur_r(cur_r);
+        SurfaceRef _cur_d(cur_d);
+
+        cur_c->read = NULL;
+        cur_c->draw = NULL;
+
+        _cur_c.release();
+        _cur_r.release();
+        _cur_d.release();
+    }
+}
+
+EGLBoolean eglMakeCurrent(  EGLDisplay dpy, EGLSurface draw,
+                            EGLSurface read, EGLContext ctx)
+{
+    clearError();
+
+    egl_display_t const * const dp = get_display(dpy);
+    if (!dp) return setError(EGL_BAD_DISPLAY, EGL_FALSE);
+
+    // If ctx is not EGL_NO_CONTEXT, read is not EGL_NO_SURFACE, or draw is not
+    // EGL_NO_SURFACE, then an EGL_NOT_INITIALIZED error is generated if dpy is
+    // a valid but uninitialized display.
+    if ( (ctx != EGL_NO_CONTEXT) || (read != EGL_NO_SURFACE) ||
+         (draw != EGL_NO_SURFACE) ) {
+        if (!dp->isReady()) return setError(EGL_NOT_INITIALIZED, EGL_FALSE);
+    }
+
+    // get a reference to the object passed in
+    ContextRef _c(ctx);
+    SurfaceRef _d(draw);
+    SurfaceRef _r(read);
+
+    // validate the context (if not EGL_NO_CONTEXT)
+    if ((ctx != EGL_NO_CONTEXT) && !_c.get()) {
+        // EGL_NO_CONTEXT is valid
+        return EGL_FALSE;
+    }
+
+    // these are the underlying implementation's object
+    EGLContext impl_ctx  = EGL_NO_CONTEXT;
+    EGLSurface impl_draw = EGL_NO_SURFACE;
+    EGLSurface impl_read = EGL_NO_SURFACE;
+
+    // these are our objects structs passed in
+    egl_context_t       * c = NULL;
+    egl_surface_t const * d = NULL;
+    egl_surface_t const * r = NULL;
+
+    // these are the current objects structs
+    egl_context_t * cur_c = get_context(getContext());
+    
+    if (ctx != EGL_NO_CONTEXT) {
+        c = get_context(ctx);
+        impl_ctx = c->context;
+    } else {
+        // no context given, use the implementation of the current context
+        if (cur_c == NULL) {
+            // no current context
+            if (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE) {
+                // calling eglMakeCurrent( ..., !=0, !=0, EGL_NO_CONTEXT);
+                return setError(EGL_BAD_MATCH, EGL_FALSE);
+            }
+            // not an error, there is just no current context.
+            return EGL_TRUE;
+        }
+    }
+
+    // retrieve the underlying implementation's draw EGLSurface
+    if (draw != EGL_NO_SURFACE) {
+        d = get_surface(draw);
+        // make sure the EGLContext and EGLSurface passed in are for
+        // the same driver
+        if (c && d->impl != c->impl)
+            return setError(EGL_BAD_MATCH, EGL_FALSE);
+        impl_draw = d->surface;
+    }
+
+    // retrieve the underlying implementation's read EGLSurface
+    if (read != EGL_NO_SURFACE) {
+        r = get_surface(read);
+        // make sure the EGLContext and EGLSurface passed in are for
+        // the same driver
+        if (c && r->impl != c->impl)
+            return setError(EGL_BAD_MATCH, EGL_FALSE);
+        impl_read = r->surface;
+    }
+
+    EGLBoolean result;
+
+    if (c) {
+        result = c->cnx->egl.eglMakeCurrent(
+                dp->disp[c->impl].dpy, impl_draw, impl_read, impl_ctx);
+    } else {
+        result = cur_c->cnx->egl.eglMakeCurrent(
+                dp->disp[cur_c->impl].dpy, impl_draw, impl_read, impl_ctx);
+    }
+
+    if (result == EGL_TRUE) {
+
+        loseCurrent(cur_c);
+
+        if (ctx != EGL_NO_CONTEXT) {
+            setGLHooksThreadSpecific(c->cnx->hooks[c->version]);
+            egl_tls_t::setContext(ctx);
+            if (gEGLDebugLevel > 0) {
+                CreateDbgContext(c->version, c->cnx->hooks[c->version]);
+            }
+            _c.acquire();
+            _r.acquire();
+            _d.acquire();
+            c->read = read;
+            c->draw = draw;
+        } else {
+            setGLHooksThreadSpecific(&gHooksNoContext);
+            egl_tls_t::setContext(EGL_NO_CONTEXT);
+        }
+    }
+    return result;
+}
+
+
+EGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx,
+                            EGLint attribute, EGLint *value)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    ContextRef _c(ctx);
+    if (!_c.get()) return setError(EGL_BAD_CONTEXT, EGL_FALSE);
+
+    egl_context_t * const c = get_context(ctx);
+
+    EGLBoolean result(EGL_TRUE);
+    if (attribute == EGL_CONFIG_ID) {
+        *value = dp->configs[intptr_t(c->config)].configId;
+    } else {
+        // We need to remap EGL_CONFIG_IDs
+        result = c->cnx->egl.eglQueryContext(
+                dp->disp[c->impl].dpy, c->context, attribute, value);
+    }
+
+    return result;
+}
+
+EGLContext eglGetCurrentContext(void)
+{
+    // could be called before eglInitialize(), but we wouldn't have a context
+    // then, and this function would correctly return EGL_NO_CONTEXT.
+
+    clearError();
+
+    EGLContext ctx = getContext();
+    return ctx;
+}
+
+EGLSurface eglGetCurrentSurface(EGLint readdraw)
+{
+    // could be called before eglInitialize(), but we wouldn't have a context
+    // then, and this function would correctly return EGL_NO_SURFACE.
+
+    clearError();
+
+    EGLContext ctx = getContext();
+    if (ctx) {
+        egl_context_t const * const c = get_context(ctx);
+        if (!c) return setError(EGL_BAD_CONTEXT, EGL_NO_SURFACE);
+        switch (readdraw) {
+            case EGL_READ: return c->read;
+            case EGL_DRAW: return c->draw;            
+            default: return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
+        }
+    }
+    return EGL_NO_SURFACE;
+}
+
+EGLDisplay eglGetCurrentDisplay(void)
+{
+    // could be called before eglInitialize(), but we wouldn't have a context
+    // then, and this function would correctly return EGL_NO_DISPLAY.
+
+    clearError();
+
+    EGLContext ctx = getContext();
+    if (ctx) {
+        egl_context_t const * const c = get_context(ctx);
+        if (!c) return setError(EGL_BAD_CONTEXT, EGL_NO_SURFACE);
+        return c->dpy;
+    }
+    return EGL_NO_DISPLAY;
+}
+
+EGLBoolean eglWaitGL(void)
+{
+    // could be called before eglInitialize(), but we wouldn't have a context
+    // then, and this function would return GL_TRUE, which isn't wrong.
+
+    clearError();
+
+    EGLBoolean res = EGL_TRUE;
+    EGLContext ctx = getContext();
+    if (ctx) {
+        egl_context_t const * const c = get_context(ctx);
+        if (!c) return setError(EGL_BAD_CONTEXT, EGL_FALSE);
+        if (uint32_t(c->impl)>=2)
+            return setError(EGL_BAD_CONTEXT, EGL_FALSE);
+        egl_connection_t* const cnx = &gEGLImpl[c->impl];
+        if (!cnx->dso) 
+            return setError(EGL_BAD_CONTEXT, EGL_FALSE);
+        res = cnx->egl.eglWaitGL();
+    }
+    return res;
+}
+
+EGLBoolean eglWaitNative(EGLint engine)
+{
+    // could be called before eglInitialize(), but we wouldn't have a context
+    // then, and this function would return GL_TRUE, which isn't wrong.
+
+    clearError();
+
+    EGLBoolean res = EGL_TRUE;
+    EGLContext ctx = getContext();
+    if (ctx) {
+        egl_context_t const * const c = get_context(ctx);
+        if (!c) return setError(EGL_BAD_CONTEXT, EGL_FALSE);
+        if (uint32_t(c->impl)>=2)
+            return setError(EGL_BAD_CONTEXT, EGL_FALSE);
+        egl_connection_t* const cnx = &gEGLImpl[c->impl];
+        if (!cnx->dso) 
+            return setError(EGL_BAD_CONTEXT, EGL_FALSE);
+        res = cnx->egl.eglWaitNative(engine);
+    }
+    return res;
+}
+
+EGLint eglGetError(void)
+{
+    EGLint result = EGL_SUCCESS;
+    EGLint err;
+    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
+        err = EGL_SUCCESS;
+        egl_connection_t* const cnx = &gEGLImpl[i];
+        if (cnx->dso)
+            err = cnx->egl.eglGetError();
+        if (err!=EGL_SUCCESS && result==EGL_SUCCESS)
+            result = err;
+    }
+    err = egl_tls_t::getError();
+    if (result == EGL_SUCCESS)
+        result = err;
+    return result;
+}
+
+// Note: Similar implementations of these functions also exist in
+// gl2.cpp and gl.cpp, and are used by applications that call the
+// exported entry points directly.
+typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image);
+typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image);
+
+static PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES_impl = NULL;
+static PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC glEGLImageTargetRenderbufferStorageOES_impl = NULL;
+
+static void glEGLImageTargetTexture2DOES_wrapper(GLenum target, GLeglImageOES image)
+{
+    GLeglImageOES implImage =
+        (GLeglImageOES)egl_get_image_for_current_context((EGLImageKHR)image);
+    glEGLImageTargetTexture2DOES_impl(target, implImage);
+}
+
+static void glEGLImageTargetRenderbufferStorageOES_wrapper(GLenum target, GLeglImageOES image)
+{
+    GLeglImageOES implImage =
+        (GLeglImageOES)egl_get_image_for_current_context((EGLImageKHR)image);
+    glEGLImageTargetRenderbufferStorageOES_impl(target, implImage);
+}
+
+__eglMustCastToProperFunctionPointerType eglGetProcAddress(const char *procname)
+{
+    // eglGetProcAddress() could be the very first function called
+    // in which case we must make sure we've initialized ourselves, this
+    // happens the first time egl_get_display() is called.
+
+    clearError();
+
+    if (egl_init_drivers() == EGL_FALSE) {
+        setError(EGL_BAD_PARAMETER, NULL);
+        return  NULL;
+    }
+
+    __eglMustCastToProperFunctionPointerType addr;
+    addr = findProcAddress(procname, sExtentionMap, NELEM(sExtentionMap));
+    if (addr) return addr;
+
+    // this protects accesses to sGLExtentionMap and sGLExtentionSlot
+    pthread_mutex_lock(&sExtensionMapMutex);
+
+        /*
+         * Since eglGetProcAddress() is not associated to anything, it needs
+         * to return a function pointer that "works" regardless of what
+         * the current context is.
+         *
+         * For this reason, we return a "forwarder", a small stub that takes
+         * care of calling the function associated with the context
+         * currently bound.
+         *
+         * We first look for extensions we've already resolved, if we're seeing
+         * this extension for the first time, we go through all our
+         * implementations and call eglGetProcAddress() and record the
+         * result in the appropriate implementation hooks and return the
+         * address of the forwarder corresponding to that hook set.
+         *
+         */
+
+        const String8 name(procname);
+        addr = sGLExtentionMap.valueFor(name);
+        const int slot = sGLExtentionSlot;
+
+        LOGE_IF(slot >= MAX_NUMBER_OF_GL_EXTENSIONS,
+                "no more slots for eglGetProcAddress(\"%s\")",
+                procname);
+
+        if (!addr && (slot < MAX_NUMBER_OF_GL_EXTENSIONS)) {
+            bool found = false;
+            for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
+                egl_connection_t* const cnx = &gEGLImpl[i];
+                if (cnx->dso && cnx->egl.eglGetProcAddress) {
+                    found = true;
+                    // Extensions are independent of the bound context
+                    cnx->hooks[GLESv1_INDEX]->ext.extensions[slot] =
+                    cnx->hooks[GLESv2_INDEX]->ext.extensions[slot] =
+#if EGL_TRACE
+                    gHooksDebug.ext.extensions[slot] = gHooksTrace.ext.extensions[slot] =
+#endif
+                            cnx->egl.eglGetProcAddress(procname);
+                }
+            }
+            if (found) {
+                addr = gExtensionForwarders[slot];
+
+                if (!strcmp(procname, "glEGLImageTargetTexture2DOES")) {
+                    glEGLImageTargetTexture2DOES_impl = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)addr;
+                    addr = (__eglMustCastToProperFunctionPointerType)glEGLImageTargetTexture2DOES_wrapper;
+                }
+                if (!strcmp(procname, "glEGLImageTargetRenderbufferStorageOES")) {
+                    glEGLImageTargetRenderbufferStorageOES_impl = (PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC)addr;
+                    addr = (__eglMustCastToProperFunctionPointerType)glEGLImageTargetRenderbufferStorageOES_wrapper;
+                }
+
+                sGLExtentionMap.add(name, addr);
+                sGLExtentionSlot++;
+            }
+        }
+
+    pthread_mutex_unlock(&sExtensionMapMutex);
+    return addr;
+}
+
+EGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
+{
+    EGLBoolean Debug_eglSwapBuffers(EGLDisplay dpy, EGLSurface draw);
+    if (gEGLDebugLevel > 0)
+        Debug_eglSwapBuffers(dpy, draw);
+
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    SurfaceRef _s(draw);
+    if (!_s.get())
+        return setError(EGL_BAD_SURFACE, EGL_FALSE);
+
+    egl_surface_t const * const s = get_surface(draw);
+    return s->cnx->egl.eglSwapBuffers(dp->disp[s->impl].dpy, s->surface);
+}
+
+EGLBoolean eglCopyBuffers(  EGLDisplay dpy, EGLSurface surface,
+                            NativePixmapType target)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    SurfaceRef _s(surface);
+    if (!_s.get())
+        return setError(EGL_BAD_SURFACE, EGL_FALSE);
+
+    egl_surface_t const * const s = get_surface(surface);
+    return s->cnx->egl.eglCopyBuffers(
+            dp->disp[s->impl].dpy, s->surface, target);
+}
+
+const char* eglQueryString(EGLDisplay dpy, EGLint name)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return (const char *) NULL;
+
+    switch (name) {
+        case EGL_VENDOR:
+            return sVendorString;
+        case EGL_VERSION:
+            return sVersionString;
+        case EGL_EXTENSIONS:
+            return sExtensionString;
+        case EGL_CLIENT_APIS:
+            return sClientApiString;
+    }
+    return setError(EGL_BAD_PARAMETER, (const char *)0);
+}
+
+
+// ----------------------------------------------------------------------------
+// EGL 1.1
+// ----------------------------------------------------------------------------
+
+EGLBoolean eglSurfaceAttrib(
+        EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    SurfaceRef _s(surface);
+    if (!_s.get())
+        return setError(EGL_BAD_SURFACE, EGL_FALSE);
+
+    egl_surface_t const * const s = get_surface(surface);
+    if (s->cnx->egl.eglSurfaceAttrib) {
+        return s->cnx->egl.eglSurfaceAttrib(
+                dp->disp[s->impl].dpy, s->surface, attribute, value);
+    }
+    return setError(EGL_BAD_SURFACE, EGL_FALSE);
+}
+
+EGLBoolean eglBindTexImage(
+        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    SurfaceRef _s(surface);
+    if (!_s.get())
+        return setError(EGL_BAD_SURFACE, EGL_FALSE);
+
+    egl_surface_t const * const s = get_surface(surface);
+    if (s->cnx->egl.eglBindTexImage) {
+        return s->cnx->egl.eglBindTexImage(
+                dp->disp[s->impl].dpy, s->surface, buffer);
+    }
+    return setError(EGL_BAD_SURFACE, EGL_FALSE);
+}
+
+EGLBoolean eglReleaseTexImage(
+        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    SurfaceRef _s(surface);
+    if (!_s.get())
+        return setError(EGL_BAD_SURFACE, EGL_FALSE);
+
+    egl_surface_t const * const s = get_surface(surface);
+    if (s->cnx->egl.eglReleaseTexImage) {
+        return s->cnx->egl.eglReleaseTexImage(
+                dp->disp[s->impl].dpy, s->surface, buffer);
+    }
+    return setError(EGL_BAD_SURFACE, EGL_FALSE);
+}
+
+EGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    EGLBoolean res = EGL_TRUE;
+    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
+        egl_connection_t* const cnx = &gEGLImpl[i];
+        if (cnx->dso) {
+            if (cnx->egl.eglSwapInterval) {
+                if (cnx->egl.eglSwapInterval(
+                        dp->disp[i].dpy, interval) == EGL_FALSE) {
+                    res = EGL_FALSE;
+                }
+            }
+        }
+    }
+    return res;
+}
+
+
+// ----------------------------------------------------------------------------
+// EGL 1.2
+// ----------------------------------------------------------------------------
+
+EGLBoolean eglWaitClient(void)
+{
+    clearError();
+
+    // could be called before eglInitialize(), but we wouldn't have a context
+    // then, and this function would return GL_TRUE, which isn't wrong.
+    EGLBoolean res = EGL_TRUE;
+    EGLContext ctx = getContext();
+    if (ctx) {
+        egl_context_t const * const c = get_context(ctx);
+        if (!c) return setError(EGL_BAD_CONTEXT, EGL_FALSE);
+        if (uint32_t(c->impl)>=2)
+            return setError(EGL_BAD_CONTEXT, EGL_FALSE);
+        egl_connection_t* const cnx = &gEGLImpl[c->impl];
+        if (!cnx->dso) 
+            return setError(EGL_BAD_CONTEXT, EGL_FALSE);
+        if (cnx->egl.eglWaitClient) {
+            res = cnx->egl.eglWaitClient();
+        } else {
+            res = cnx->egl.eglWaitGL();
+        }
+    }
+    return res;
+}
+
+EGLBoolean eglBindAPI(EGLenum api)
+{
+    clearError();
+
+    if (egl_init_drivers() == EGL_FALSE) {
+        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
+    }
+
+    // bind this API on all EGLs
+    EGLBoolean res = EGL_TRUE;
+    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
+        egl_connection_t* const cnx = &gEGLImpl[i];
+        if (cnx->dso) {
+            if (cnx->egl.eglBindAPI) {
+                if (cnx->egl.eglBindAPI(api) == EGL_FALSE) {
+                    res = EGL_FALSE;
+                }
+            }
+        }
+    }
+    return res;
+}
+
+EGLenum eglQueryAPI(void)
+{
+    clearError();
+
+    if (egl_init_drivers() == EGL_FALSE) {
+        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
+    }
+
+    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
+        egl_connection_t* const cnx = &gEGLImpl[i];
+        if (cnx->dso) {
+            if (cnx->egl.eglQueryAPI) {
+                // the first one we find is okay, because they all
+                // should be the same
+                return cnx->egl.eglQueryAPI();
+            }
+        }
+    }
+    // or, it can only be OpenGL ES
+    return EGL_OPENGL_ES_API;
+}
+
+EGLBoolean eglReleaseThread(void)
+{
+    clearError();
+
+    // If there is context bound to the thread, release it
+    loseCurrent(get_context(getContext()));
+
+    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
+        egl_connection_t* const cnx = &gEGLImpl[i];
+        if (cnx->dso) {
+            if (cnx->egl.eglReleaseThread) {
+                cnx->egl.eglReleaseThread();
+            }
+        }
+    }
+    egl_tls_t::clearTLS();
+    dbgReleaseThread();
+    return EGL_TRUE;
+}
+
+EGLSurface eglCreatePbufferFromClientBuffer(
+          EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
+          EGLConfig config, const EGLint *attrib_list)
+{
+    clearError();
+
+    egl_display_t const* dp = 0;
+    egl_connection_t* cnx = validate_display_config(dpy, config, dp);
+    if (!cnx) return EGL_FALSE;
+    if (cnx->egl.eglCreatePbufferFromClientBuffer) {
+        return cnx->egl.eglCreatePbufferFromClientBuffer(
+                dp->disp[ dp->configs[intptr_t(config)].impl ].dpy,
+                buftype, buffer,
+                dp->configs[intptr_t(config)].config, attrib_list);
+    }
+    return setError(EGL_BAD_CONFIG, EGL_NO_SURFACE);
+}
+
+// ----------------------------------------------------------------------------
+// EGL_EGLEXT_VERSION 3
+// ----------------------------------------------------------------------------
+
+EGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface,
+        const EGLint *attrib_list)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    SurfaceRef _s(surface);
+    if (!_s.get())
+        return setError(EGL_BAD_SURFACE, EGL_FALSE);
+
+    egl_surface_t const * const s = get_surface(surface);
+    if (s->cnx->egl.eglLockSurfaceKHR) {
+        return s->cnx->egl.eglLockSurfaceKHR(
+                dp->disp[s->impl].dpy, s->surface, attrib_list);
+    }
+    return setError(EGL_BAD_DISPLAY, EGL_FALSE);
+}
+
+EGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    SurfaceRef _s(surface);
+    if (!_s.get())
+        return setError(EGL_BAD_SURFACE, EGL_FALSE);
+
+    egl_surface_t const * const s = get_surface(surface);
+    if (s->cnx->egl.eglUnlockSurfaceKHR) {
+        return s->cnx->egl.eglUnlockSurfaceKHR(
+                dp->disp[s->impl].dpy, s->surface);
+    }
+    return setError(EGL_BAD_DISPLAY, EGL_FALSE);
+}
+
+EGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
+        EGLClientBuffer buffer, const EGLint *attrib_list)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_NO_IMAGE_KHR;
+
+    if (ctx != EGL_NO_CONTEXT) {
+        ContextRef _c(ctx);
+        if (!_c.get())
+            return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
+        egl_context_t * const c = get_context(ctx);
+        // since we have an EGLContext, we know which implementation to use
+        EGLImageKHR image = c->cnx->egl.eglCreateImageKHR(
+                dp->disp[c->impl].dpy, c->context, target, buffer, attrib_list);
+        if (image == EGL_NO_IMAGE_KHR)
+            return image;
+            
+        egl_image_t* result = new egl_image_t(dpy, ctx);
+        result->images[c->impl] = image;
+        return (EGLImageKHR)result;
+    } else {
+        // EGL_NO_CONTEXT is a valid parameter
+
+        /* Since we don't have a way to know which implementation to call,
+         * we're calling all of them. If at least one of the implementation
+         * succeeded, this is a success.
+         */
+
+        EGLint currentError = eglGetError();
+
+        EGLImageKHR implImages[IMPL_NUM_IMPLEMENTATIONS];
+        bool success = false;
+        for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
+            egl_connection_t* const cnx = &gEGLImpl[i];
+            implImages[i] = EGL_NO_IMAGE_KHR;
+            if (cnx->dso) {
+                if (cnx->egl.eglCreateImageKHR) {
+                    implImages[i] = cnx->egl.eglCreateImageKHR(
+                            dp->disp[i].dpy, ctx, target, buffer, attrib_list);
+                    if (implImages[i] != EGL_NO_IMAGE_KHR) {
+                        success = true;
+                    }
+                }
+            }
+        }
+
+        if (!success) {
+            // failure, if there was an error when we entered this function,
+            // the error flag must not be updated.
+            // Otherwise, the error is whatever happened in the implementation
+            // that faulted.
+            if (currentError != EGL_SUCCESS) {
+                setError(currentError, EGL_NO_IMAGE_KHR);
+            }
+            return EGL_NO_IMAGE_KHR;
+        } else {
+            // In case of success, we need to clear all error flags
+            // (especially those caused by the implementation that didn't
+            // succeed). TODO: we could avoid this if we knew this was
+            // a "full" success (all implementation succeeded).
+            eglGetError();
+        }
+
+        egl_image_t* result = new egl_image_t(dpy, ctx);
+        memcpy(result->images, implImages, sizeof(implImages));
+        return (EGLImageKHR)result;
+    }
+}
+
+EGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    ImageRef _i(img);
+    if (!_i.get()) return setError(EGL_BAD_PARAMETER, EGL_FALSE);
+
+    egl_image_t* image = get_image(img);
+    bool success = false;
+    for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
+        egl_connection_t* const cnx = &gEGLImpl[i];
+        if (image->images[i] != EGL_NO_IMAGE_KHR) {
+            if (cnx->dso) {
+                if (cnx->egl.eglDestroyImageKHR) {
+                    if (cnx->egl.eglDestroyImageKHR(
+                            dp->disp[i].dpy, image->images[i])) {
+                        success = true;
+                    }
+                }
+            }
+        }
+    }
+    if (!success)
+        return EGL_FALSE;
+
+    _i.terminate();
+
+    return EGL_TRUE;
+}
+
+// ----------------------------------------------------------------------------
+// EGL_EGLEXT_VERSION 5
+// ----------------------------------------------------------------------------
+
+
+EGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_NO_SYNC_KHR;
+
+    EGLContext ctx = eglGetCurrentContext();
+    ContextRef _c(ctx);
+    if (!_c.get())
+        return setError(EGL_BAD_CONTEXT, EGL_NO_SYNC_KHR);
+
+    egl_context_t * const c = get_context(ctx);
+    EGLSyncKHR result = EGL_NO_SYNC_KHR;
+    if (c->cnx->egl.eglCreateSyncKHR) {
+        EGLSyncKHR sync = c->cnx->egl.eglCreateSyncKHR(
+                dp->disp[c->impl].dpy, type, attrib_list);
+        if (sync == EGL_NO_SYNC_KHR)
+            return sync;
+        result = (egl_sync_t*)new egl_sync_t(dpy, ctx, sync);
+    }
+    return (EGLSyncKHR)result;
+}
+
+EGLBoolean eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    SyncRef _s(sync);
+    if (!_s.get()) return setError(EGL_BAD_PARAMETER, EGL_FALSE);
+    egl_sync_t* syncObject = get_sync(sync);
+
+    EGLContext ctx = syncObject->context;
+    ContextRef _c(ctx);
+    if (!_c.get())
+        return setError(EGL_BAD_CONTEXT, EGL_FALSE);
+
+    EGLBoolean result = EGL_FALSE;
+    egl_context_t * const c = get_context(ctx);
+    if (c->cnx->egl.eglDestroySyncKHR) {
+        result = c->cnx->egl.eglDestroySyncKHR(
+                dp->disp[c->impl].dpy, syncObject->sync);
+        if (result)
+            _s.terminate();
+    }
+    return result;
+}
+
+EGLint eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    SyncRef _s(sync);
+    if (!_s.get()) return setError(EGL_BAD_PARAMETER, EGL_FALSE);
+    egl_sync_t* syncObject = get_sync(sync);
+
+    EGLContext ctx = syncObject->context;
+    ContextRef _c(ctx);
+    if (!_c.get())
+        return setError(EGL_BAD_CONTEXT, EGL_FALSE);
+
+    egl_context_t * const c = get_context(ctx);
+    if (c->cnx->egl.eglClientWaitSyncKHR) {
+        return c->cnx->egl.eglClientWaitSyncKHR(
+                dp->disp[c->impl].dpy, syncObject->sync, flags, timeout);
+    }
+
+    return EGL_FALSE;
+}
+
+EGLBoolean eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    SyncRef _s(sync);
+    if (!_s.get())
+        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
+
+    egl_sync_t* syncObject = get_sync(sync);
+    EGLContext ctx = syncObject->context;
+    ContextRef _c(ctx);
+    if (!_c.get())
+        return setError(EGL_BAD_CONTEXT, EGL_FALSE);
+
+    egl_context_t * const c = get_context(ctx);
+    if (c->cnx->egl.eglGetSyncAttribKHR) {
+        return c->cnx->egl.eglGetSyncAttribKHR(
+                dp->disp[c->impl].dpy, syncObject->sync, attribute, value);
+    }
+
+    return EGL_FALSE;
+}
+
+// ----------------------------------------------------------------------------
+// ANDROID extensions
+// ----------------------------------------------------------------------------
+
+EGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw,
+        EGLint left, EGLint top, EGLint width, EGLint height)
+{
+    clearError();
+
+    egl_display_t const * const dp = validate_display(dpy);
+    if (!dp) return EGL_FALSE;
+
+    SurfaceRef _s(draw);
+    if (!_s.get())
+        return setError(EGL_BAD_SURFACE, EGL_FALSE);
+
+    egl_surface_t const * const s = get_surface(draw);
+    if (s->cnx->egl.eglSetSwapRectangleANDROID) {
+        return s->cnx->egl.eglSetSwapRectangleANDROID(
+                dp->disp[s->impl].dpy, s->surface, left, top, width, height);
+    }
+    return setError(EGL_BAD_DISPLAY, NULL);
+}
diff --git a/opengl/libs/EGL/egl_display.cpp b/opengl/libs/EGL/egl_display.cpp
new file mode 100644
index 0000000..83aafa6
--- /dev/null
+++ b/opengl/libs/EGL/egl_display.cpp
@@ -0,0 +1,276 @@
+/* 
+ ** Copyright 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.
+ */
+
+#include "egl_display.h"
+#include "egl_object.h"
+#include "egl_tls.h"
+#include "egl_impl.h"
+#include "Loader.h"
+
+// ----------------------------------------------------------------------------
+namespace android {
+// ----------------------------------------------------------------------------
+
+extern void initEglTraceLevel();
+extern void setGLHooksThreadSpecific(gl_hooks_t const *value);
+
+static int cmp_configs(const void* a, const void *b) {
+    const egl_config_t& c0 = *(egl_config_t const *)a;
+    const egl_config_t& c1 = *(egl_config_t const *)b;
+    return c0<c1 ? -1 : (c1<c0 ? 1 : 0);
+}
+
+// ----------------------------------------------------------------------------
+
+egl_display_t egl_display_t::sDisplay[NUM_DISPLAYS];
+
+egl_display_t::egl_display_t() :
+    magic('_dpy'), numTotalConfigs(0), configs(0), refs(0) {
+}
+
+egl_display_t::~egl_display_t() {
+    magic = 0;
+}
+
+egl_display_t* egl_display_t::get(EGLDisplay dpy) {
+    uintptr_t index = uintptr_t(dpy)-1U;
+    return (index >= NUM_DISPLAYS) ? NULL : &sDisplay[index];
+}
+
+void egl_display_t::addObject(egl_object_t* object) {
+    Mutex::Autolock _l(lock);
+    objects.add(object);
+}
+
+void egl_display_t::removeObject(egl_object_t* object) {
+    Mutex::Autolock _l(lock);
+    objects.remove(object);
+}
+
+bool egl_display_t::getObject(egl_object_t* object) {
+    Mutex::Autolock _l(lock);
+    if (objects.indexOf(object) >= 0) {
+        object->incRef();
+        return true;
+    }
+    return false;
+}
+
+EGLDisplay egl_display_t::getFromNativeDisplay(EGLNativeDisplayType disp) {
+    if (uintptr_t(disp) >= NUM_DISPLAYS)
+        return NULL;
+
+    return sDisplay[uintptr_t(disp)].getDisplay(disp);
+}
+
+EGLDisplay egl_display_t::getDisplay(EGLNativeDisplayType display) {
+
+    Mutex::Autolock _l(lock);
+
+    // get our driver loader
+    Loader& loader(Loader::getInstance());
+
+    for (int i = 0; i < IMPL_NUM_IMPLEMENTATIONS; i++) {
+        egl_connection_t* const cnx = &gEGLImpl[i];
+        if (cnx->dso && disp[i].dpy == EGL_NO_DISPLAY) {
+            EGLDisplay dpy = cnx->egl.eglGetDisplay(display);
+            disp[i].dpy = dpy;
+            if (dpy == EGL_NO_DISPLAY) {
+                loader.close(cnx->dso);
+                cnx->dso = NULL;
+            }
+        }
+    }
+
+    return EGLDisplay(uintptr_t(display) + 1U);
+}
+
+EGLBoolean egl_display_t::initialize(EGLint *major, EGLint *minor) {
+
+    Mutex::Autolock _l(lock);
+
+    if (refs > 0) {
+        if (major != NULL)
+            *major = VERSION_MAJOR;
+        if (minor != NULL)
+            *minor = VERSION_MINOR;
+        refs++;
+        return EGL_TRUE;
+    }
+
+#if EGL_TRACE
+
+    // Called both at early_init time and at this time. (Early_init is pre-zygote, so
+    // the information from that call may be stale.)
+    initEglTraceLevel();
+
+#endif
+
+    setGLHooksThreadSpecific(&gHooksNoContext);
+
+    // initialize each EGL and
+    // build our own extension string first, based on the extension we know
+    // and the extension supported by our client implementation
+    for (int i = 0; i < IMPL_NUM_IMPLEMENTATIONS; i++) {
+        egl_connection_t* const cnx = &gEGLImpl[i];
+        cnx->major = -1;
+        cnx->minor = -1;
+        if (!cnx->dso)
+            continue;
+
+#if defined(ADRENO130)
+#warning "Adreno-130 eglInitialize() workaround"
+        /*
+         * The ADRENO 130 driver returns a different EGLDisplay each time
+         * eglGetDisplay() is called, but also makes the EGLDisplay invalid
+         * after eglTerminate() has been called, so that eglInitialize()
+         * cannot be called again. Therefore, we need to make sure to call
+         * eglGetDisplay() before calling eglInitialize();
+         */
+        if (i == IMPL_HARDWARE) {
+            disp[i].dpy =
+            cnx->egl.eglGetDisplay(EGL_DEFAULT_DISPLAY);
+        }
+#endif
+
+        EGLDisplay idpy = disp[i].dpy;
+        if (cnx->egl.eglInitialize(idpy, &cnx->major, &cnx->minor)) {
+            //LOGD("initialized %d dpy=%p, ver=%d.%d, cnx=%p",
+            //        i, idpy, cnx->major, cnx->minor, cnx);
+
+            // display is now initialized
+            disp[i].state = egl_display_t::INITIALIZED;
+
+            // get the query-strings for this display for each implementation
+            disp[i].queryString.vendor = cnx->egl.eglQueryString(idpy,
+                    EGL_VENDOR);
+            disp[i].queryString.version = cnx->egl.eglQueryString(idpy,
+                    EGL_VERSION);
+            disp[i].queryString.extensions = cnx->egl.eglQueryString(idpy,
+                    EGL_EXTENSIONS);
+            disp[i].queryString.clientApi = cnx->egl.eglQueryString(idpy,
+                    EGL_CLIENT_APIS);
+
+        } else {
+            LOGW("%d: eglInitialize(%p) failed (%s)", i, idpy,
+                    egl_tls_t::egl_strerror(cnx->egl.eglGetError()));
+        }
+    }
+
+    EGLBoolean res = EGL_FALSE;
+    for (int i = 0; i < IMPL_NUM_IMPLEMENTATIONS; i++) {
+        egl_connection_t* const cnx = &gEGLImpl[i];
+        if (cnx->dso && cnx->major >= 0 && cnx->minor >= 0) {
+            EGLint n;
+            if (cnx->egl.eglGetConfigs(disp[i].dpy, 0, 0, &n)) {
+                disp[i].config = (EGLConfig*) malloc(sizeof(EGLConfig) * n);
+                if (disp[i].config) {
+                    if (cnx->egl.eglGetConfigs(disp[i].dpy, disp[i].config, n,
+                            &disp[i].numConfigs)) {
+                        numTotalConfigs += n;
+                        res = EGL_TRUE;
+                    }
+                }
+            }
+        }
+    }
+
+    if (res == EGL_TRUE) {
+        configs = new egl_config_t[numTotalConfigs];
+        for (int i = 0, k = 0; i < IMPL_NUM_IMPLEMENTATIONS; i++) {
+            egl_connection_t* const cnx = &gEGLImpl[i];
+            if (cnx->dso && cnx->major >= 0 && cnx->minor >= 0) {
+                for (int j = 0; j < disp[i].numConfigs; j++) {
+                    configs[k].impl = i;
+                    configs[k].config = disp[i].config[j];
+                    configs[k].configId = k + 1; // CONFIG_ID start at 1
+                    // store the implementation's CONFIG_ID
+                    cnx->egl.eglGetConfigAttrib(disp[i].dpy, disp[i].config[j],
+                            EGL_CONFIG_ID, &configs[k].implConfigId);
+                    k++;
+                }
+            }
+        }
+
+        // sort our configurations so we can do binary-searches
+        qsort(configs, numTotalConfigs, sizeof(egl_config_t), cmp_configs);
+
+        refs++;
+        if (major != NULL)
+            *major = VERSION_MAJOR;
+        if (minor != NULL)
+            *minor = VERSION_MINOR;
+        return EGL_TRUE;
+    }
+    return setError(EGL_NOT_INITIALIZED, EGL_FALSE);
+}
+
+EGLBoolean egl_display_t::terminate() {
+
+    Mutex::Autolock _l(lock);
+
+    if (refs == 0) {
+        return setError(EGL_NOT_INITIALIZED, EGL_FALSE);
+    }
+
+    // this is specific to Android, display termination is ref-counted.
+    if (refs > 1) {
+        refs--;
+        return EGL_TRUE;
+    }
+
+    EGLBoolean res = EGL_FALSE;
+    for (int i = 0; i < IMPL_NUM_IMPLEMENTATIONS; i++) {
+        egl_connection_t* const cnx = &gEGLImpl[i];
+        if (cnx->dso && disp[i].state == egl_display_t::INITIALIZED) {
+            if (cnx->egl.eglTerminate(disp[i].dpy) == EGL_FALSE) {
+                LOGW("%d: eglTerminate(%p) failed (%s)", i, disp[i].dpy,
+                        egl_tls_t::egl_strerror(cnx->egl.eglGetError()));
+            }
+            // REVISIT: it's unclear what to do if eglTerminate() fails
+            free(disp[i].config);
+
+            disp[i].numConfigs = 0;
+            disp[i].config = 0;
+            disp[i].state = egl_display_t::TERMINATED;
+
+            res = EGL_TRUE;
+        }
+    }
+
+    // Mark all objects remaining in the list as terminated, unless
+    // there are no reference to them, it which case, we're free to
+    // delete them.
+    size_t count = objects.size();
+    LOGW_IF(count, "eglTerminate() called w/ %d objects remaining", count);
+    for (size_t i=0 ; i<count ; i++) {
+        egl_object_t* o = objects.itemAt(i);
+        o->destroy();
+    }
+
+    // this marks all object handles are "terminated"
+    objects.clear();
+
+    refs--;
+    numTotalConfigs = 0;
+    delete[] configs;
+    return res;
+}
+
+
+// ----------------------------------------------------------------------------
+}; // namespace android
+// ----------------------------------------------------------------------------
diff --git a/opengl/libs/EGL/egl_display.h b/opengl/libs/EGL/egl_display.h
new file mode 100644
index 0000000..113595f
--- /dev/null
+++ b/opengl/libs/EGL/egl_display.h
@@ -0,0 +1,144 @@
+/* 
+ ** Copyright 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.
+ */
+
+#ifndef ANDROID_EGL_DISPLAY_H
+#define ANDROID_EGL_DISPLAY_H
+
+
+#include <ctype.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include <GLES/gl.h>
+#include <GLES/glext.h>
+
+#include <utils/SortedVector.h>
+#include <utils/threads.h>
+
+#include "egldefs.h"
+#include "hooks.h"
+
+// ----------------------------------------------------------------------------
+namespace android {
+// ----------------------------------------------------------------------------
+
+class egl_object_t;
+class egl_connection_t;
+
+// ----------------------------------------------------------------------------
+
+struct egl_config_t {
+    egl_config_t() {}
+    egl_config_t(int impl, EGLConfig config)
+        : impl(impl), config(config), configId(0), implConfigId(0) { }
+    int         impl;           // the implementation this config is for
+    EGLConfig   config;         // the implementation's EGLConfig
+    EGLint      configId;       // our CONFIG_ID
+    EGLint      implConfigId;   // the implementation's CONFIG_ID
+    inline bool operator < (const egl_config_t& rhs) const {
+        if (impl < rhs.impl) return true;
+        if (impl > rhs.impl) return false;
+        return config < rhs.config;
+    }
+};
+
+// ----------------------------------------------------------------------------
+
+class egl_display_t {
+    static egl_display_t sDisplay[NUM_DISPLAYS];
+    EGLDisplay getDisplay(EGLNativeDisplayType display);
+
+public:
+    enum {
+        NOT_INITIALIZED = 0,
+        INITIALIZED     = 1,
+        TERMINATED      = 2
+    };
+
+    egl_display_t();
+    ~egl_display_t();
+
+    EGLBoolean initialize(EGLint *major, EGLint *minor);
+    EGLBoolean terminate();
+
+    // add object to this display's list
+    void addObject(egl_object_t* object);
+    // remove object from this display's list
+    void removeObject(egl_object_t* object);
+    // add reference to this object. returns true if this is a valid object.
+    bool getObject(egl_object_t* object);
+
+
+    static egl_display_t* get(EGLDisplay dpy);
+    static EGLDisplay getFromNativeDisplay(EGLNativeDisplayType disp);
+
+    inline bool isReady() const { return (refs > 0); }
+    inline bool isValid() const { return magic == '_dpy'; }
+    inline bool isAlive() const { return isValid(); }
+
+    struct strings_t {
+        char const * vendor;
+        char const * version;
+        char const * clientApi;
+        char const * extensions;
+    };
+
+    struct DisplayImpl {
+        DisplayImpl() : dpy(EGL_NO_DISPLAY), config(0),
+                        state(NOT_INITIALIZED), numConfigs(0) { }
+        EGLDisplay  dpy;
+        EGLConfig*  config;
+        EGLint      state;
+        EGLint      numConfigs;
+        strings_t   queryString;
+    };
+
+private:
+    uint32_t        magic;
+
+public:
+    DisplayImpl     disp[IMPL_NUM_IMPLEMENTATIONS];
+    EGLint          numTotalConfigs;
+    egl_config_t*   configs;
+
+private:
+    uint32_t        refs;
+    Mutex           lock;
+    SortedVector<egl_object_t*> objects;
+};
+
+// ----------------------------------------------------------------------------
+
+inline egl_display_t* get_display(EGLDisplay dpy) {
+    return egl_display_t::get(dpy);
+}
+
+// ----------------------------------------------------------------------------
+
+egl_display_t* validate_display(EGLDisplay dpy);
+egl_connection_t* validate_display_config(EGLDisplay dpy,
+        EGLConfig config, egl_display_t const*& dp);
+EGLBoolean validate_display_context(EGLDisplay dpy, EGLContext ctx);
+EGLBoolean validate_display_surface(EGLDisplay dpy, EGLSurface surface);
+
+// ----------------------------------------------------------------------------
+}; // namespace android
+// ----------------------------------------------------------------------------
+
+#endif // ANDROID_EGL_DISPLAY_H
+
diff --git a/opengl/libs/EGL/egl_object.cpp b/opengl/libs/EGL/egl_object.cpp
new file mode 100644
index 0000000..dbf9a01
--- /dev/null
+++ b/opengl/libs/EGL/egl_object.cpp
@@ -0,0 +1,66 @@
+/* 
+ ** Copyright 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.
+ */
+
+#include <ctype.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include <GLES/gl.h>
+#include <GLES/glext.h>
+
+#include <utils/threads.h>
+
+#include "egl_object.h"
+
+// ----------------------------------------------------------------------------
+namespace android {
+// ----------------------------------------------------------------------------
+
+egl_object_t::egl_object_t(egl_display_t* disp) :
+    display(disp), count(1) {
+    // NOTE: this does an implicit incRef
+    display->addObject(this);
+}
+
+egl_object_t::~egl_object_t() {
+}
+
+void egl_object_t::terminate() {
+    // this marks the object as "terminated"
+    display->removeObject(this);
+    if (decRef() == 1) {
+        // shouldn't happen because this is called from LocalRef
+        LOGE("egl_object_t::terminate() removed the last reference!");
+    }
+}
+
+void egl_object_t::destroy() {
+    if (decRef() == 1) {
+        delete this;
+    }
+}
+
+bool egl_object_t::get() {
+    // used by LocalRef, this does an incRef() atomically with
+    // checking that the object is valid.
+    return display->getObject(this);
+}
+
+// ----------------------------------------------------------------------------
+}; // namespace android
+// ----------------------------------------------------------------------------
diff --git a/opengl/libs/EGL/egl_object.h b/opengl/libs/EGL/egl_object.h
new file mode 100644
index 0000000..3459a8a
--- /dev/null
+++ b/opengl/libs/EGL/egl_object.h
@@ -0,0 +1,235 @@
+/* 
+ ** Copyright 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.
+ */
+
+#ifndef ANDROID_EGL_OBJECT_H
+#define ANDROID_EGL_OBJECT_H
+
+
+#include <ctype.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include <GLES/gl.h>
+#include <GLES/glext.h>
+
+#include <utils/threads.h>
+
+#include <system/window.h>
+
+#include "egl_display.h"
+
+// ----------------------------------------------------------------------------
+namespace android {
+// ----------------------------------------------------------------------------
+
+struct egl_display_t;
+
+class egl_object_t {
+    egl_display_t *display;
+    mutable volatile int32_t count;
+
+protected:
+    virtual ~egl_object_t();
+
+public:
+    egl_object_t(egl_display_t* display);
+    void destroy();
+
+    inline int32_t incRef() { return android_atomic_inc(&count); }
+    inline int32_t decRef() { return android_atomic_dec(&count); }
+
+private:
+    void terminate();
+    bool get();
+
+public:
+    template <typename N, typename T>
+    class LocalRef {
+        egl_object_t* ref;
+        LocalRef();
+        LocalRef(const LocalRef* rhs);
+    public:
+        ~LocalRef();
+        explicit LocalRef(egl_object_t* rhs);
+        explicit LocalRef(T o) : ref(0) {
+            egl_object_t* native = reinterpret_cast<N*>(o);
+            if (o && native->get()) {
+                ref = native;
+            }
+        }
+        inline N* get() {
+            return static_cast<N*>(ref);
+        }
+        void acquire() const;
+        void release() const;
+        void terminate();
+    };
+    template <typename N, typename T>
+    friend class LocalRef;
+};
+
+template<typename N, typename T>
+egl_object_t::LocalRef<N, T>::LocalRef(egl_object_t* rhs) : ref(rhs) {
+    if (ref) {
+        ref->incRef();
+    }
+}
+
+template <typename N, typename T>
+egl_object_t::LocalRef<N,T>::~LocalRef() {
+    if (ref) {
+        ref->destroy();
+    }
+}
+
+template <typename N, typename T>
+void egl_object_t::LocalRef<N,T>::acquire() const {
+    if (ref) {
+        ref->incRef();
+    }
+}
+
+template <typename N, typename T>
+void egl_object_t::LocalRef<N,T>::release() const {
+    if (ref) {
+        if (ref->decRef() == 1) {
+            // shouldn't happen because this is called from LocalRef
+            LOGE("LocalRef::release() removed the last reference!");
+        }
+    }
+}
+
+template <typename N, typename T>
+void egl_object_t::LocalRef<N,T>::terminate() {
+    if (ref) {
+        ref->terminate();
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+class egl_surface_t: public egl_object_t {
+protected:
+    ~egl_surface_t() {}
+public:
+    typedef egl_object_t::LocalRef<egl_surface_t, EGLSurface> Ref;
+
+    egl_surface_t(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win,
+            EGLSurface surface, int impl, egl_connection_t const* cnx) :
+        egl_object_t(get_display(dpy)), dpy(dpy), surface(surface),
+                config(config), win(win), impl(impl), cnx(cnx) {
+    }
+    EGLDisplay dpy;
+    EGLSurface surface;
+    EGLConfig config;
+    sp<ANativeWindow> win;
+    int impl;
+    egl_connection_t const* cnx;
+};
+
+class egl_context_t: public egl_object_t {
+protected:
+    ~egl_context_t() {}
+public:
+    typedef egl_object_t::LocalRef<egl_context_t, EGLContext> Ref;
+
+    egl_context_t(EGLDisplay dpy, EGLContext context, EGLConfig config,
+            int impl, egl_connection_t const* cnx, int version) :
+        egl_object_t(get_display(dpy)), dpy(dpy), context(context),
+                config(config), read(0), draw(0), impl(impl), cnx(cnx),
+                version(version) {
+    }
+    EGLDisplay dpy;
+    EGLContext context;
+    EGLConfig config;
+    EGLSurface read;
+    EGLSurface draw;
+    int impl;
+    egl_connection_t const* cnx;
+    int version;
+};
+
+class egl_image_t: public egl_object_t {
+protected:
+    ~egl_image_t() {}
+public:
+    typedef egl_object_t::LocalRef<egl_image_t, EGLImageKHR> Ref;
+
+    egl_image_t(EGLDisplay dpy, EGLContext context) :
+        egl_object_t(get_display(dpy)), dpy(dpy), context(context) {
+        memset(images, 0, sizeof(images));
+    }
+    EGLDisplay dpy;
+    EGLContext context;
+    EGLImageKHR images[IMPL_NUM_IMPLEMENTATIONS];
+};
+
+class egl_sync_t: public egl_object_t {
+protected:
+    ~egl_sync_t() {}
+public:
+    typedef egl_object_t::LocalRef<egl_sync_t, EGLSyncKHR> Ref;
+
+    egl_sync_t(EGLDisplay dpy, EGLContext context, EGLSyncKHR sync) :
+        egl_object_t(get_display(dpy)), dpy(dpy), context(context), sync(sync) {
+    }
+    EGLDisplay dpy;
+    EGLContext context;
+    EGLSyncKHR sync;
+};
+
+// ----------------------------------------------------------------------------
+
+typedef egl_surface_t::Ref  SurfaceRef;
+typedef egl_context_t::Ref  ContextRef;
+typedef egl_image_t::Ref    ImageRef;
+typedef egl_sync_t::Ref     SyncRef;
+
+// ----------------------------------------------------------------------------
+
+template<typename NATIVE, typename EGL>
+static inline NATIVE* egl_to_native_cast(EGL arg) {
+    return reinterpret_cast<NATIVE*>(arg);
+}
+
+static inline
+egl_surface_t* get_surface(EGLSurface surface) {
+    return egl_to_native_cast<egl_surface_t>(surface);
+}
+
+static inline
+egl_context_t* get_context(EGLContext context) {
+    return egl_to_native_cast<egl_context_t>(context);
+}
+
+static inline
+egl_image_t* get_image(EGLImageKHR image) {
+    return egl_to_native_cast<egl_image_t>(image);
+}
+
+static inline
+egl_sync_t* get_sync(EGLSyncKHR sync) {
+    return egl_to_native_cast<egl_sync_t>(sync);
+}
+
+// ----------------------------------------------------------------------------
+}; // namespace android
+// ----------------------------------------------------------------------------
+
+#endif // ANDROID_EGL_OBJECT_H
+
diff --git a/opengl/libs/EGL/egl_tls.cpp b/opengl/libs/EGL/egl_tls.cpp
new file mode 100644
index 0000000..961a61e
--- /dev/null
+++ b/opengl/libs/EGL/egl_tls.cpp
@@ -0,0 +1,133 @@
+/*
+ ** Copyright 2011, 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 <pthread.h>
+
+#include <cutils/log.h>
+
+#include <EGL/egl.h>
+
+#include "egl_tls.h"
+
+
+namespace android {
+
+pthread_key_t egl_tls_t::sKey = -1;
+pthread_mutex_t egl_tls_t::sLockKey = PTHREAD_MUTEX_INITIALIZER;
+
+egl_tls_t::egl_tls_t()
+    : error(EGL_SUCCESS), ctx(0), logCallWithNoContext(EGL_TRUE), dbg(0) {
+}
+
+const char *egl_tls_t::egl_strerror(EGLint err) {
+    switch (err) {
+        case EGL_SUCCESS:               return "EGL_SUCCESS";
+        case EGL_NOT_INITIALIZED:       return "EGL_NOT_INITIALIZED";
+        case EGL_BAD_ACCESS:            return "EGL_BAD_ACCESS";
+        case EGL_BAD_ALLOC:             return "EGL_BAD_ALLOC";
+        case EGL_BAD_ATTRIBUTE:         return "EGL_BAD_ATTRIBUTE";
+        case EGL_BAD_CONFIG:            return "EGL_BAD_CONFIG";
+        case EGL_BAD_CONTEXT:           return "EGL_BAD_CONTEXT";
+        case EGL_BAD_CURRENT_SURFACE:   return "EGL_BAD_CURRENT_SURFACE";
+        case EGL_BAD_DISPLAY:           return "EGL_BAD_DISPLAY";
+        case EGL_BAD_MATCH:             return "EGL_BAD_MATCH";
+        case EGL_BAD_NATIVE_PIXMAP:     return "EGL_BAD_NATIVE_PIXMAP";
+        case EGL_BAD_NATIVE_WINDOW:     return "EGL_BAD_NATIVE_WINDOW";
+        case EGL_BAD_PARAMETER:         return "EGL_BAD_PARAMETER";
+        case EGL_BAD_SURFACE:           return "EGL_BAD_SURFACE";
+        case EGL_CONTEXT_LOST:          return "EGL_CONTEXT_LOST";
+        default: return "UNKNOWN";
+    }
+}
+
+void egl_tls_t::validateTLSKey()
+{
+    if (sKey == -1) {
+        pthread_mutex_lock(&sLockKey);
+        if (sKey == -1)
+            pthread_key_create(&sKey, NULL);
+        pthread_mutex_unlock(&sLockKey);
+    }
+}
+
+void egl_tls_t::setErrorEtcImpl(const char* caller, int line, EGLint error) {
+    validateTLSKey();
+    egl_tls_t* tls = getTLS();
+    if (tls->error != error) {
+        LOGE("%s:%d error %x (%s)", caller, line, error, egl_strerror(error));
+        tls->error = error;
+    }
+}
+
+bool egl_tls_t::logNoContextCall() {
+    egl_tls_t* tls = getTLS();
+    if (tls->logCallWithNoContext == true) {
+        tls->logCallWithNoContext = false;
+        return true;
+    }
+    return false;
+}
+
+egl_tls_t* egl_tls_t::getTLS() {
+    egl_tls_t* tls = (egl_tls_t*)pthread_getspecific(sKey);
+    if (tls == 0) {
+        tls = new egl_tls_t;
+        pthread_setspecific(sKey, tls);
+    }
+    return tls;
+}
+
+void egl_tls_t::clearTLS() {
+    if (sKey != -1) {
+        egl_tls_t* tls = (egl_tls_t*)pthread_getspecific(sKey);
+        if (tls) {
+            delete tls;
+            pthread_setspecific(sKey, 0);
+        }
+    }
+}
+
+void egl_tls_t::clearError() {
+    // This must clear the error from all the underlying EGL implementations as
+    // well as the EGL wrapper layer.
+    eglGetError();
+}
+
+EGLint egl_tls_t::getError() {
+    if (sKey == -1)
+        return EGL_SUCCESS;
+    egl_tls_t* tls = (egl_tls_t*)pthread_getspecific(sKey);
+    if (!tls) return EGL_SUCCESS;
+    EGLint error = tls->error;
+    tls->error = EGL_SUCCESS;
+    return error;
+}
+
+void egl_tls_t::setContext(EGLContext ctx) {
+    validateTLSKey();
+    getTLS()->ctx = ctx;
+}
+
+EGLContext egl_tls_t::getContext() {
+    if (sKey == -1)
+        return EGL_NO_CONTEXT;
+    egl_tls_t* tls = (egl_tls_t *)pthread_getspecific(sKey);
+    if (!tls) return EGL_NO_CONTEXT;
+    return tls->ctx;
+}
+
+
+} // namespace android
diff --git a/opengl/libs/EGL/egl_tls.h b/opengl/libs/EGL/egl_tls.h
new file mode 100644
index 0000000..a7989ef
--- /dev/null
+++ b/opengl/libs/EGL/egl_tls.h
@@ -0,0 +1,78 @@
+/*
+ ** Copyright 2011, 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 ANDROID_EGL_TLS_H
+#define ANDROID_EGL_TLS_H
+
+#include <pthread.h>
+
+#include <EGL/egl.h>
+
+#include "egldefs.h"
+#include "hooks.h"
+
+// ----------------------------------------------------------------------------
+namespace android {
+// ----------------------------------------------------------------------------
+
+class DbgContext;
+
+class egl_tls_t {
+    static pthread_key_t sKey;
+    static pthread_mutex_t sLockKey;
+
+    EGLint      error;
+    EGLContext  ctx;
+    EGLBoolean  logCallWithNoContext;
+    DbgContext* dbg;
+
+    egl_tls_t();
+    static void validateTLSKey();
+    static void setErrorEtcImpl(const char* caller, int line, EGLint error);
+
+public:
+    static egl_tls_t* getTLS();
+    static void clearTLS();
+    static void clearError();
+    static EGLint getError();
+    static void setContext(EGLContext ctx);
+    static EGLContext getContext();
+    static bool logNoContextCall();
+    static const char *egl_strerror(EGLint err);
+
+    template<typename T>
+    static T setErrorEtc(const char* caller,
+            int line, EGLint error, T returnValue) {
+        setErrorEtcImpl(caller, line, error);
+        return returnValue;
+    }
+};
+
+#define setError(_e, _r) egl_tls_t::setErrorEtc(__FUNCTION__, __LINE__, _e, _r)
+
+// ----------------------------------------------------------------------------
+
+#if EGL_TRACE
+
+extern gl_hooks_t const* getGLTraceThreadSpecific();
+
+#endif
+
+// ----------------------------------------------------------------------------
+}; // namespace android
+// ----------------------------------------------------------------------------
+
+#endif // ANDROID_EGL_TLS_H
diff --git a/opengl/libs/EGL/egldefs.h b/opengl/libs/EGL/egldefs.h
new file mode 100644
index 0000000..107acd9
--- /dev/null
+++ b/opengl/libs/EGL/egldefs.h
@@ -0,0 +1,71 @@
+/*
+ ** Copyright 2011, 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 ANDROID_EGLDEFS_H
+#define ANDROID_EGLDEFS_H
+
+#include "hooks.h"
+
+// ----------------------------------------------------------------------------
+namespace android {
+// ----------------------------------------------------------------------------
+
+#define VERSION_MAJOR 1
+#define VERSION_MINOR 4
+
+//  EGLDisplay are global, not attached to a given thread
+const unsigned int NUM_DISPLAYS = 1;
+
+enum {
+    IMPL_HARDWARE = 0,
+    IMPL_SOFTWARE,
+    IMPL_NUM_IMPLEMENTATIONS
+};
+
+enum {
+    GLESv1_INDEX = 0,
+    GLESv2_INDEX = 1,
+};
+
+// ----------------------------------------------------------------------------
+
+struct egl_connection_t
+{
+    inline egl_connection_t() : dso(0) { }
+    void *              dso;
+    gl_hooks_t *        hooks[2];
+    EGLint              major;
+    EGLint              minor;
+    egl_t               egl;
+};
+
+// ----------------------------------------------------------------------------
+
+extern gl_hooks_t gHooks[2][IMPL_NUM_IMPLEMENTATIONS];
+extern gl_hooks_t gHooksNoContext;
+extern pthread_key_t gGLWrapperKey;
+extern "C" void gl_unimplemented();
+
+extern char const * const gl_names[];
+extern char const * const egl_names[];
+
+extern egl_connection_t gEGLImpl[IMPL_NUM_IMPLEMENTATIONS];
+
+// ----------------------------------------------------------------------------
+}; // namespace android
+// ----------------------------------------------------------------------------
+
+#endif /* ANDROID_EGLDEFS_H */
diff --git a/opengl/libs/EGL/getProcAddress.cpp b/opengl/libs/EGL/getProcAddress.cpp
index dcf8735c..f89c865 100644
--- a/opengl/libs/EGL/getProcAddress.cpp
+++ b/opengl/libs/EGL/getProcAddress.cpp
@@ -20,6 +20,7 @@
 
 #include <cutils/log.h>
 
+#include "egldefs.h"
 #include "hooks.h"
 
 // ----------------------------------------------------------------------------
@@ -34,7 +35,7 @@
 #undef GL_EXTENSION_LIST
 #undef GET_TLS
 
-#if defined(__arm__)
+#if USE_FAST_TLS_KEY
 
     #ifdef HAVE_ARM_TLS_REGISTER
         #define GET_TLS(reg) \
@@ -77,7 +78,7 @@
 
     #define GL_EXTENSION(_n)
 
-    #warning "eglGetProcAddress() partially supported on this architecture"
+    #warning "eglGetProcAddress() partially supported"
 
 #endif
 
diff --git a/opengl/libs/EGL/hooks.cpp b/opengl/libs/EGL/hooks.cpp
deleted file mode 100644
index 72ad6b3..0000000
--- a/opengl/libs/EGL/hooks.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/* 
- ** Copyright 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 <ctype.h>
-#include <stdlib.h>
-#include <errno.h>
-
-#include <cutils/log.h>
-
-#include "hooks.h"
-
-// ----------------------------------------------------------------------------
-namespace android {
-// ----------------------------------------------------------------------------
-
-void gl_unimplemented() {
-    LOGE("called unimplemented OpenGL ES API");
-}
-
-
-// ----------------------------------------------------------------------------
-// GL / EGL hooks
-// ----------------------------------------------------------------------------
-
-#undef GL_ENTRY
-#undef EGL_ENTRY
-#define GL_ENTRY(_r, _api, ...) #_api,
-#define EGL_ENTRY(_r, _api, ...) #_api,
-
-char const * const gl_names[] = {
-    #include "entries.in"
-    NULL
-};
-
-char const * const egl_names[] = {
-    #include "egl_entries.in"
-    NULL
-};
-
-#undef GL_ENTRY
-#undef EGL_ENTRY
-
-
-// ----------------------------------------------------------------------------
-}; // namespace android
-// ----------------------------------------------------------------------------
-
diff --git a/opengl/libs/EGL/trace.cpp b/opengl/libs/EGL/trace.cpp
index f3e101b..0e934e2 100644
--- a/opengl/libs/EGL/trace.cpp
+++ b/opengl/libs/EGL/trace.cpp
@@ -26,6 +26,7 @@
 
 #include <cutils/log.h>
 
+#include "egl_tls.h"
 #include "hooks.h"
 
 // ----------------------------------------------------------------------------
diff --git a/opengl/libs/GLES2_dbg/src/dbgcontext.cpp b/opengl/libs/GLES2_dbg/src/dbgcontext.cpp
index 7f5b27b..ff9be3c 100644
--- a/opengl/libs/GLES2_dbg/src/dbgcontext.cpp
+++ b/opengl/libs/GLES2_dbg/src/dbgcontext.cpp
@@ -15,22 +15,18 @@
  */
 
 #include "header.h"
-#include "egl_tls.h"
 
-extern "C"
-{
+extern "C" {
 #include "liblzf/lzf.h"
 }
 
-namespace android
-{
+namespace android {
 
-pthread_key_t dbgEGLThreadLocalStorageKey = -1;
+static pthread_key_t dbgEGLThreadLocalStorageKey = -1;
+static pthread_mutex_t gThreadLocalStorageKeyMutex = PTHREAD_MUTEX_INITIALIZER;
 
-DbgContext * getDbgContextThreadSpecific()
-{
-    tls_t* tls = (tls_t*)pthread_getspecific(dbgEGLThreadLocalStorageKey);
-    return tls->dbg;
+DbgContext * getDbgContextThreadSpecific() {
+    return (DbgContext*)pthread_getspecific(dbgEGLThreadLocalStorageKey);
 }
 
 DbgContext::DbgContext(const unsigned version, const gl_hooks_t * const hooks,
@@ -60,10 +56,13 @@
     free(lzf_ref[1]);
 }
 
-DbgContext * CreateDbgContext(const pthread_key_t EGLThreadLocalStorageKey,
-                              const unsigned version, const gl_hooks_t * const hooks)
+DbgContext* CreateDbgContext(const unsigned version, const gl_hooks_t * const hooks)
 {
-    dbgEGLThreadLocalStorageKey = EGLThreadLocalStorageKey;
+    pthread_mutex_lock(&gThreadLocalStorageKeyMutex);
+    if (dbgEGLThreadLocalStorageKey == -1)
+        pthread_key_create(&dbgEGLThreadLocalStorageKey, NULL);
+    pthread_mutex_unlock(&gThreadLocalStorageKeyMutex);
+
     assert(version < 2);
     assert(GL_NO_ERROR == hooks->gl.glGetError());
     GLint MAX_VERTEX_ATTRIBS = 0;
@@ -71,7 +70,7 @@
     GLint readFormat, readType;
     hooks->gl.glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &readFormat);
     hooks->gl.glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &readType);
-    DbgContext * const dbg = new DbgContext(version, hooks, MAX_VERTEX_ATTRIBS, readFormat, readType);
+    DbgContext* dbg = new DbgContext(version, hooks, MAX_VERTEX_ATTRIBS, readFormat, readType);
 
     glesv2debugger::Message msg, cmd;
     msg.set_context_id(reinterpret_cast<int>(dbg));
@@ -88,12 +87,13 @@
     msg.set_arg0(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS);
     msg.set_arg1(MAX_COMBINED_TEXTURE_IMAGE_UNITS);
     Send(msg, cmd);
+
+    *(DbgContext **)pthread_getspecific(dbgEGLThreadLocalStorageKey) = dbg;
     return dbg;
 }
 
-void DestroyDbgContext(DbgContext * const dbg)
-{
-    delete dbg;
+void dbgReleaseThread() {
+    delete getDbgContextThreadSpecific();
 }
 
 unsigned GetBytesPerPixel(const GLenum format, const GLenum type)
diff --git a/opengl/libs/GLES2_dbg/test/test_server.cpp b/opengl/libs/GLES2_dbg/test/test_server.cpp
index b6401e0..bbbe913 100644
--- a/opengl/libs/GLES2_dbg/test/test_server.cpp
+++ b/opengl/libs/GLES2_dbg/test/test_server.cpp
@@ -16,14 +16,12 @@
 
 #include "header.h"
 #include "gtest/gtest.h"
-#include "egl_tls.h"
 #include "hooks.h"
 
 namespace android
 {
 extern FILE * file;
 extern unsigned int MAX_FILE_SIZE;
-extern pthread_key_t dbgEGLThreadLocalStorageKey;
 };
 
 // tmpfile fails, so need to manually make a writable file first
@@ -114,7 +112,7 @@
     };
     hooks.gl.glGetError = HookMock::GetError;
     hooks.gl.glGetIntegerv = HookMock::GetIntegerv;
-    DbgContext * const dbg = CreateDbgContext(-1, 1, &hooks);
+    DbgContext * const dbg = CreateDbgContext(1, &hooks);
     ASSERT_TRUE(dbg != NULL);
     EXPECT_TRUE(dbg->vertexAttribs != NULL);
 
@@ -132,7 +130,7 @@
         EXPECT_EQ(expectedConstant, read.arg1());
     }
     CheckNoAvailable();
-    DestroyDbgContext(dbg);
+    dbgReleaseThread();
 }
 
 void * glNoop()
@@ -143,7 +141,7 @@
 class ServerFileContextTest : public ServerFileTest
 {
 protected:
-    tls_t tls;
+    DbgContext* dbg;
     gl_hooks_t hooks;
 
     ServerFileContextTest() { }
@@ -153,12 +151,8 @@
     virtual void SetUp() {
         ServerFileTest::SetUp();
 
-        if (dbgEGLThreadLocalStorageKey == -1)
-            pthread_key_create(&dbgEGLThreadLocalStorageKey, NULL);
-        ASSERT_NE(-1, dbgEGLThreadLocalStorageKey);
-        tls.dbg = new DbgContext(1, &hooks, 32, GL_RGBA, GL_UNSIGNED_BYTE);
-        ASSERT_NE((void *)NULL, tls.dbg);
-        pthread_setspecific(dbgEGLThreadLocalStorageKey, &tls);
+        dbg = new DbgContext(1, &hooks, 32, GL_RGBA, GL_UNSIGNED_BYTE);
+        ASSERT_NE((void *)NULL, dbg);
         for (unsigned int i = 0; i < sizeof(hooks) / sizeof(void *); i++)
             ((void **)&hooks)[i] = reinterpret_cast<void *>(glNoop);
     }
@@ -183,7 +177,7 @@
             return ret;
         }
     } caller;
-    const int contextId = reinterpret_cast<int>(tls.dbg);
+    const int contextId = reinterpret_cast<int>(dbg);
     glesv2debugger::Message msg, read;
 
     EXPECT_EQ(ret, MessageLoop(caller, msg, msg.glFinish));
@@ -214,25 +208,25 @@
 
 TEST_F(ServerFileContextTest, DisableEnableVertexAttribArray)
 {
-    Debug_glEnableVertexAttribArray(tls.dbg->MAX_VERTEX_ATTRIBS + 2); // should just ignore invalid index
+    Debug_glEnableVertexAttribArray(dbg->MAX_VERTEX_ATTRIBS + 2); // should just ignore invalid index
 
     glesv2debugger::Message read;
     rewind(file);
     Read(read);
     EXPECT_EQ(read.glEnableVertexAttribArray, read.function());
-    EXPECT_EQ(tls.dbg->MAX_VERTEX_ATTRIBS + 2, read.arg0());
+    EXPECT_EQ(dbg->MAX_VERTEX_ATTRIBS + 2, read.arg0());
     Read(read);
 
     rewind(file);
-    Debug_glDisableVertexAttribArray(tls.dbg->MAX_VERTEX_ATTRIBS + 4); // should just ignore invalid index
+    Debug_glDisableVertexAttribArray(dbg->MAX_VERTEX_ATTRIBS + 4); // should just ignore invalid index
     rewind(file);
     Read(read);
     Read(read);
 
-    for (unsigned int i = 0; i < tls.dbg->MAX_VERTEX_ATTRIBS; i += 5) {
+    for (unsigned int i = 0; i < dbg->MAX_VERTEX_ATTRIBS; i += 5) {
         rewind(file);
         Debug_glEnableVertexAttribArray(i);
-        EXPECT_TRUE(tls.dbg->vertexAttribs[i].enabled);
+        EXPECT_TRUE(dbg->vertexAttribs[i].enabled);
         rewind(file);
         Read(read);
         EXPECT_EQ(read.glEnableVertexAttribArray, read.function());
@@ -241,7 +235,7 @@
 
         rewind(file);
         Debug_glDisableVertexAttribArray(i);
-        EXPECT_FALSE(tls.dbg->vertexAttribs[i].enabled);
+        EXPECT_FALSE(dbg->vertexAttribs[i].enabled);
         rewind(file);
         Read(read);
         EXPECT_EQ(read.glDisableVertexAttribArray, read.function());
diff --git a/opengl/libs/GLES2_dbg/test/test_socket.cpp b/opengl/libs/GLES2_dbg/test/test_socket.cpp
index 617292e..b2148ac 100644
--- a/opengl/libs/GLES2_dbg/test/test_socket.cpp
+++ b/opengl/libs/GLES2_dbg/test/test_socket.cpp
@@ -19,13 +19,11 @@
 
 #include "header.h"
 #include "gtest/gtest.h"
-#include "egl_tls.h"
 #include "hooks.h"
 
 namespace android
 {
 extern int serverSock, clientSock;
-extern pthread_key_t dbgEGLThreadLocalStorageKey;
 };
 
 void * glNoop();
@@ -33,7 +31,7 @@
 class SocketContextTest : public ::testing::Test
 {
 protected:
-    tls_t tls;
+    DbgContext* dbg;
     gl_hooks_t hooks;
     int sock;
     char * buffer;
@@ -46,12 +44,8 @@
     }
 
     virtual void SetUp() {
-        if (dbgEGLThreadLocalStorageKey == -1)
-            pthread_key_create(&dbgEGLThreadLocalStorageKey, NULL);
-        ASSERT_NE(-1, dbgEGLThreadLocalStorageKey);
-        tls.dbg = new DbgContext(1, &hooks, 32, GL_RGBA, GL_UNSIGNED_BYTE);
-        ASSERT_TRUE(tls.dbg != NULL);
-        pthread_setspecific(dbgEGLThreadLocalStorageKey, &tls);
+        dbg = new DbgContext(1, &hooks, 32, GL_RGBA, GL_UNSIGNED_BYTE);
+        ASSERT_TRUE(dbg != NULL);
         for (unsigned int i = 0; i < sizeof(hooks) / sizeof(void *); i++)
             ((void **)&hooks)[i] = (void *)glNoop;
 
@@ -73,7 +67,7 @@
     }
 
     void Write(glesv2debugger::Message & msg) const {
-        msg.set_context_id((int)tls.dbg);
+        msg.set_context_id((int)dbg);
         msg.set_type(msg.Response);
         ASSERT_TRUE(msg.has_context_id());
         ASSERT_TRUE(msg.has_function());
@@ -129,7 +123,7 @@
         }
     } caller;
     glesv2debugger::Message msg, read, cmd;
-    tls.dbg->expectResponse.Bit(msg.glFinish, true);
+    dbg->expectResponse.Bit(msg.glFinish, true);
 
     cmd.set_function(cmd.SKIP);
     cmd.set_expect_response(false);
@@ -158,7 +152,7 @@
         }
     } caller;
     glesv2debugger::Message msg, read, cmd;
-    tls.dbg->expectResponse.Bit(msg.glCreateShader, true);
+    dbg->expectResponse.Bit(msg.glCreateShader, true);
 
     cmd.set_function(cmd.CONTINUE);
     cmd.set_expect_response(false); // MessageLoop should automatically skip after continue
@@ -204,7 +198,7 @@
     glesv2debugger::Message msg, read, cmd;
     hooks.gl.glCreateShader = caller.CreateShader;
     hooks.gl.glCreateProgram = caller.CreateProgram;
-    tls.dbg->expectResponse.Bit(msg.glCreateProgram, true);
+    dbg->expectResponse.Bit(msg.glCreateProgram, true);
 
     cmd.set_function(cmd.glCreateShader);
     cmd.set_arg0(GL_FRAGMENT_SHADER);
@@ -272,7 +266,7 @@
     glesv2debugger::Message msg, read, cmd;
     hooks.gl.glCreateShader = caller.CreateShader;
     hooks.gl.glCreateProgram = caller.CreateProgram;
-    tls.dbg->expectResponse.Bit(msg.glCreateProgram, false);
+    dbg->expectResponse.Bit(msg.glCreateProgram, false);
 
     cmd.set_function(cmd.SETPROP);
     cmd.set_prop(cmd.ExpectResponse);
@@ -305,8 +299,8 @@
 
     EXPECT_EQ((int *)ret, MessageLoop(caller, msg, msg.glCreateProgram));
 
-    EXPECT_TRUE(tls.dbg->expectResponse.Bit(msg.glCreateProgram));
-    EXPECT_EQ(819, tls.dbg->captureDraw);
+    EXPECT_TRUE(dbg->expectResponse.Bit(msg.glCreateProgram));
+    EXPECT_EQ(819, dbg->captureDraw);
 
     Read(read);
     EXPECT_EQ(read.glCreateProgram, read.function());
@@ -362,7 +356,7 @@
     } caller;
     glesv2debugger::Message msg, read, cmd;
     hooks.gl.glTexImage2D = caller.TexImage2D;
-    tls.dbg->expectResponse.Bit(msg.glTexImage2D, false);
+    dbg->expectResponse.Bit(msg.glTexImage2D, false);
 
     Debug_glTexImage2D(_target, _level, _internalformat, _width, _height, _border,
                        _format, _type, _pixels);
@@ -382,7 +376,7 @@
 
     EXPECT_TRUE(read.has_data());
     uint32_t dataLen = 0;
-    const unsigned char * data = tls.dbg->Decompress(read.data().data(),
+    const unsigned char * data = dbg->Decompress(read.data().data(),
                                  read.data().length(), &dataLen);
     EXPECT_EQ(sizeof(_pixels), dataLen);
     if (sizeof(_pixels) == dataLen)
@@ -435,7 +429,7 @@
     glesv2debugger::Message msg, read, cmd;
     hooks.gl.glCopyTexImage2D = caller.CopyTexImage2D;
     hooks.gl.glReadPixels = caller.ReadPixels;
-    tls.dbg->expectResponse.Bit(msg.glCopyTexImage2D, false);
+    dbg->expectResponse.Bit(msg.glCopyTexImage2D, false);
 
     Debug_glCopyTexImage2D(_target, _level, _internalformat, _x, _y, _width, _height,
                            _border);
@@ -459,7 +453,7 @@
     EXPECT_EQ(GL_RGBA, read.pixel_format());
     EXPECT_EQ(GL_UNSIGNED_BYTE, read.pixel_type());
     uint32_t dataLen = 0;
-    unsigned char * const data = tls.dbg->Decompress(read.data().data(),
+    unsigned char * const data = dbg->Decompress(read.data().data(),
                                  read.data().length(), &dataLen);
     ASSERT_EQ(sizeof(_pixels), dataLen);
     for (unsigned i = 0; i < sizeof(_pixels) / sizeof(*_pixels); i++)
diff --git a/opengl/libs/egl_impl.h b/opengl/libs/egl_impl.h
index c8f529a..a809316 100644
--- a/opengl/libs/egl_impl.h
+++ b/opengl/libs/egl_impl.h
@@ -29,16 +29,6 @@
 namespace android {
 // ----------------------------------------------------------------------------
 
-struct egl_connection_t
-{
-    inline egl_connection_t() : dso(0) { }
-    void *              dso;
-    gl_hooks_t *        hooks[2];
-    EGLint              major;
-    EGLint              minor;
-    egl_t               egl;
-};
-
 EGLAPI EGLImageKHR egl_get_image_for_current_context(EGLImageKHR image);
 
 // ----------------------------------------------------------------------------
diff --git a/opengl/libs/egl_tls.h b/opengl/libs/egl_tls.h
deleted file mode 100644
index 087989a..0000000
--- a/opengl/libs/egl_tls.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- ** Copyright 2011, 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 ANDROID_EGL_TLS_H
-#define ANDROID_EGL_TLS_H
-
-#include <EGL/egl.h>
-
-#include "glesv2dbg.h"
-
-namespace android
-{
-struct tls_t {
-    tls_t() : error(EGL_SUCCESS), ctx(0), logCallWithNoContext(EGL_TRUE), dbg(0) { }
-    ~tls_t() {
-        if (dbg)
-            DestroyDbgContext(dbg);
-    }
-
-    EGLint      error;
-    EGLContext  ctx;
-    EGLBoolean  logCallWithNoContext;
-    DbgContext* dbg;
-};
-}
-
-#endif
diff --git a/opengl/libs/glesv2dbg.h b/opengl/libs/glesv2dbg.h
index ee2c011..44bc288 100644
--- a/opengl/libs/glesv2dbg.h
+++ b/opengl/libs/glesv2dbg.h
@@ -23,10 +23,9 @@
 {
 struct DbgContext;
 
-DbgContext * CreateDbgContext(const pthread_key_t EGLThreadLocalStorageKey,
-                              const unsigned version, const gl_hooks_t * const hooks);
+DbgContext* CreateDbgContext(const unsigned version, const gl_hooks_t * const hooks);
 
-void DestroyDbgContext(DbgContext * const dbg);
+void dbgReleaseThread();
 
 // create and bind socket if haven't already, if failed to create socket or
 //  forceUseFile, then open /data/local/tmp/dump.gles2dbg, exit when size reached
diff --git a/opengl/libs/hooks.h b/opengl/libs/hooks.h
index 812e26d..7ac88cd 100644
--- a/opengl/libs/hooks.h
+++ b/opengl/libs/hooks.h
@@ -54,22 +54,6 @@
 namespace android {
 // ----------------------------------------------------------------------------
 
-//  EGLDisplay are global, not attached to a given thread
-const unsigned int NUM_DISPLAYS = 1;
-
-enum {
-    IMPL_HARDWARE = 0,
-    IMPL_SOFTWARE,
-    IMPL_NUM_IMPLEMENTATIONS
-};
-
-enum {
-    GLESv1_INDEX = 0,
-    GLESv2_INDEX = 1,
-};
-
-// ----------------------------------------------------------------------------
-
 // GL / EGL hooks
 
 #undef GL_ENTRY
@@ -92,60 +76,8 @@
 #undef GL_ENTRY
 #undef EGL_ENTRY
 
-
-// ----------------------------------------------------------------------------
-
-extern gl_hooks_t gHooks[2][IMPL_NUM_IMPLEMENTATIONS];
-extern gl_hooks_t gHooksNoContext;
-extern pthread_key_t gGLWrapperKey;
-extern "C" void gl_unimplemented();
-
-extern char const * const gl_names[];
-extern char const * const egl_names[];
-
-// ----------------------------------------------------------------------------
-
-#if USE_FAST_TLS_KEY
-
-// We have a dedicated TLS slot in bionic
-static inline gl_hooks_t const * volatile * get_tls_hooks() {
-    volatile void *tls_base = __get_tls();
-    gl_hooks_t const * volatile * tls_hooks = 
-            reinterpret_cast<gl_hooks_t const * volatile *>(tls_base);
-    return tls_hooks;
-}
-
-static inline void setGlThreadSpecific(gl_hooks_t const *value) {
-    gl_hooks_t const * volatile * tls_hooks = get_tls_hooks();
-    tls_hooks[TLS_SLOT_OPENGL_API] = value;
-}
-
-static gl_hooks_t const* getGlThreadSpecific() {
-    gl_hooks_t const * volatile * tls_hooks = get_tls_hooks();
-    gl_hooks_t const* hooks = tls_hooks[TLS_SLOT_OPENGL_API];
-    if (hooks) return hooks;
-    return &gHooksNoContext;
-}
-
-#else
-
-static inline void setGlThreadSpecific(gl_hooks_t const *value) {
-    pthread_setspecific(gGLWrapperKey, value);
-}
-
-static gl_hooks_t const* getGlThreadSpecific() {
-    gl_hooks_t const* hooks =  static_cast<gl_hooks_t*>(pthread_getspecific(gGLWrapperKey));
-    if (hooks) return hooks;
-    return &gHooksNoContext;
-}
-
-#endif
-
-#if EGL_TRACE
-
-extern gl_hooks_t const* getGLTraceThreadSpecific();
-
-#endif
+EGLAPI void setGlThreadSpecific(gl_hooks_t const *value);
+EGLAPI gl_hooks_t const* getGlThreadSpecific();
 
 // ----------------------------------------------------------------------------
 }; // namespace android
diff --git a/packages/SystemUI/res/drawable-hdpi/recents_bg_protect_tile.png b/packages/SystemUI/res/drawable-hdpi/recents_bg_protect_tile.png
new file mode 100644
index 0000000..87c7be6
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/recents_bg_protect_tile.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/recents_blue_glow.9.png b/packages/SystemUI/res/drawable-hdpi/recents_blue_glow.9.png
new file mode 100644
index 0000000..4f4ae78
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/recents_blue_glow.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/recents_callout_line.png b/packages/SystemUI/res/drawable-hdpi/recents_callout_line.png
new file mode 100644
index 0000000..5f4c035
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/recents_callout_line.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg.png b/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg.png
new file mode 100644
index 0000000..87a67c9
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/recents_bg_protect_tile.png b/packages/SystemUI/res/drawable-mdpi/recents_bg_protect_tile.png
new file mode 100644
index 0000000..87c7be6
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/recents_bg_protect_tile.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/recents_blue_glow.9.png b/packages/SystemUI/res/drawable-mdpi/recents_blue_glow.9.png
new file mode 100644
index 0000000..4f4ae78
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/recents_blue_glow.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/recents_callout_line.png b/packages/SystemUI/res/drawable-mdpi/recents_callout_line.png
new file mode 100644
index 0000000..5f4c035
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/recents_callout_line.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg.png b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg.png
new file mode 100644
index 0000000..87a67c9
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_press.png b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_press.png
new file mode 100644
index 0000000..a1c39e6
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_press.png
Binary files differ
diff --git a/packages/SystemUI/res/layout-large/status_bar_recent_item.xml b/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
similarity index 63%
copy from packages/SystemUI/res/layout-large/status_bar_recent_item.xml
copy to packages/SystemUI/res/layout-land/status_bar_recent_item.xml
index 3f172e6..ce72f04 100644
--- a/packages/SystemUI/res/layout-large/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
@@ -31,58 +31,47 @@
         android:layout_alignParentTop="true"
         android:layout_marginLeft="@dimen/status_bar_recents_thumbnail_left_margin"
         android:scaleType="center"
+        android:background="@drawable/recents_thumbnail_bg_selector"
     />
 
     <ImageView android:id="@+id/app_icon"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_alignParentTop="true"
-        android:layout_marginLeft="131dip"
-        android:layout_marginTop="13dip"
+        android:layout_alignLeft="@id/app_thumbnail"
+        android:layout_alignTop="@id/app_thumbnail"
+        android:layout_marginLeft="@dimen/status_bar_recents_thumbnail_border_width"
+        android:layout_marginTop="@dimen/status_bar_recents_thumbnail_border_height"
         android:maxWidth="@dimen/status_bar_recents_thumbnail_max_width"
         android:maxHeight="@dimen/status_bar_recents_thumbnail_max_height"
         android:adjustViewBounds="true"
     />
 
-    <View android:id="@+id/recents_callout_line"
-        android:layout_width="97dip"
-        android:layout_height="1dip"
-        android:layout_alignParentTop="true"
-        android:layout_marginTop="61dip"
-        android:layout_alignParentLeft="true"
-        android:layout_marginLeft="16dip"
-        android:layout_toLeftOf="@id/app_thumbnail"
-        android:layout_marginRight="3dip"
-        android:background="@drawable/recents_callout_line"
-    />
-
     <TextView android:id="@+id/app_label"
-        android:layout_width="97dip"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:textSize="18dip"
+        android:textSize="@dimen/status_bar_recents_app_label_text_size"
         android:fadingEdge="horizontal"
-        android:fadingEdgeLength="10dip"
+        android:fadingEdgeLength="@dimen/status_bar_recents_fading_edge_length"
         android:scrollHorizontally="true"
-        android:layout_alignParentLeft="true"
-        android:layout_alignParentTop="true"
-        android:layout_marginLeft="16dip"
-        android:layout_marginTop="32dip"
+        android:layout_alignLeft="@id/app_thumbnail"
+        android:layout_below="@id/app_thumbnail"
+        android:layout_marginTop="@dimen/status_bar_recents_text_description_padding"
+        android:layout_marginLeft="@dimen/status_bar_recents_thumbnail_border_width"
         android:singleLine="true"
         android:ellipsize="marquee"
     />
 
     <TextView android:id="@+id/app_description"
-        android:layout_width="97dip"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:textSize="18dip"
+        android:textSize="@dimen/status_bar_recents_app_description_text_size"
         android:fadingEdge="horizontal"
-        android:fadingEdgeLength="10dip"
+        android:fadingEdgeLength="@dimen/status_bar_recents_fading_edge_length"
         android:scrollHorizontally="true"
-        android:layout_alignParentLeft="true"
-        android:layout_alignParentTop="true"
-        android:layout_marginLeft="16dip"
-        android:layout_marginTop="61dip"
+        android:layout_alignLeft="@id/app_thumbnail"
+        android:layout_below="@id/app_label"
+        android:layout_marginTop="@dimen/status_bar_recents_text_description_padding"
+        android:layout_marginLeft="@dimen/status_bar_recents_thumbnail_border_width"
         android:singleLine="true"
         android:ellipsize="marquee"
     />
diff --git a/packages/SystemUI/res/layout-large/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml
similarity index 62%
copy from packages/SystemUI/res/layout-large/status_bar_recent_panel.xml
copy to packages/SystemUI/res/layout-land/status_bar_recent_panel.xml
index f019e2d..75f5ee4 100644
--- a/packages/SystemUI/res/layout-large/status_bar_recent_panel.xml
+++ b/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml
@@ -18,54 +18,56 @@
 */
 -->
 
-<com.android.systemui.statusbar.tablet.RecentAppsPanel
+<com.android.systemui.recent.RecentsPanelView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/recents_root"
     android:layout_height="match_parent"
     android:layout_width="wrap_content">
 
-    <CheckBox android:id="@+id/recents_compat_mode"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentBottom="true"
-        android:layout_alignParentRight="true"
-        android:layout_marginLeft="16dp"
-        android:layout_marginBottom="@*android:dimen/status_bar_height"
-        android:background="@drawable/hd"
-        android:button="@null"
-    />
-
     <FrameLayout
         android:id="@+id/recents_bg_protect"
         android:background="@drawable/recents_bg_protect_tile"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
-        android:layout_toLeftOf="@id/recents_compat_mode"
         android:layout_alignParentBottom="true"
+        android:layout_alignParentRight="true"
         android:paddingBottom="@*android:dimen/status_bar_height"
-        android:clipToPadding="false">
+        android:clipToPadding="false"
+        android:clipChildren="false">
 
         <LinearLayout android:id="@+id/recents_glow"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginBottom="-49dip"
-            android:layout_gravity="bottom"
+            android:layout_gravity="bottom|right"
             android:background="@drawable/recents_blue_glow"
             android:orientation="horizontal"
+            android:clipToPadding="false"
+            android:clipChildren="false"
             >
-
-            <ListView android:id="@+id/recents_container"
-                android:layout_width="@dimen/status_bar_recents_width"
+            <com.android.systemui.recent.RecentsHorizontalScrollView android:id="@+id/recents_container"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_marginRight="100dip"
+                android:layout_marginRight="@dimen/status_bar_recents_right_glow_margin"
                 android:divider="@null"
-                android:scrollingCache="true"
                 android:stackFromBottom="true"
-                android:fadingEdge="vertical"
+                android:fadingEdge="horizontal"
                 android:scrollbars="none"
-                android:fadingEdgeLength="20dip"
+                android:fadingEdgeLength="@dimen/status_bar_recents_fading_edge_length"
                 android:listSelector="@drawable/recents_thumbnail_bg_selector"
-            />
+                android:layout_gravity="bottom|left"
+                android:orientation="horizontal"
+                android:clipToPadding="false"
+                android:clipChildren="false">
+
+                <LinearLayout android:id="@+id/recents_linear_layout"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal"
+                    android:clipToPadding="false"
+                    android:clipChildren="false">
+                </LinearLayout>
+
+            </com.android.systemui.recent.RecentsHorizontalScrollView>
 
         </LinearLayout>
 
@@ -79,4 +81,4 @@
         android:background="@drawable/ic_sysbar_back_ime"
     />
 
-</com.android.systemui.statusbar.tablet.RecentAppsPanel>
+</com.android.systemui.recent.RecentsPanelView>
diff --git a/packages/SystemUI/res/layout-large/status_bar.xml b/packages/SystemUI/res/layout-sw600dp/status_bar.xml
similarity index 100%
rename from packages/SystemUI/res/layout-large/status_bar.xml
rename to packages/SystemUI/res/layout-sw600dp/status_bar.xml
diff --git a/packages/SystemUI/res/layout-large/status_bar_input_methods_item.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_input_methods_item.xml
similarity index 100%
rename from packages/SystemUI/res/layout-large/status_bar_input_methods_item.xml
rename to packages/SystemUI/res/layout-sw600dp/status_bar_input_methods_item.xml
diff --git a/packages/SystemUI/res/layout-large/status_bar_input_methods_panel.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_input_methods_panel.xml
similarity index 100%
rename from packages/SystemUI/res/layout-large/status_bar_input_methods_panel.xml
rename to packages/SystemUI/res/layout-sw600dp/status_bar_input_methods_panel.xml
diff --git a/packages/SystemUI/res/layout-large/status_bar_notification_area.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_notification_area.xml
similarity index 100%
rename from packages/SystemUI/res/layout-large/status_bar_notification_area.xml
rename to packages/SystemUI/res/layout-sw600dp/status_bar_notification_area.xml
diff --git a/packages/SystemUI/res/layout-large/status_bar_notification_panel.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_notification_panel.xml
similarity index 100%
rename from packages/SystemUI/res/layout-large/status_bar_notification_panel.xml
rename to packages/SystemUI/res/layout-sw600dp/status_bar_notification_panel.xml
diff --git a/packages/SystemUI/res/layout-large/status_bar_notification_panel_title.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_notification_panel_title.xml
similarity index 100%
rename from packages/SystemUI/res/layout-large/status_bar_notification_panel_title.xml
rename to packages/SystemUI/res/layout-sw600dp/status_bar_notification_panel_title.xml
diff --git a/packages/SystemUI/res/layout-large/status_bar_notification_peek.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_notification_peek.xml
similarity index 100%
rename from packages/SystemUI/res/layout-large/status_bar_notification_peek.xml
rename to packages/SystemUI/res/layout-sw600dp/status_bar_notification_peek.xml
diff --git a/packages/SystemUI/res/layout-large/status_bar_notification_row.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_notification_row.xml
similarity index 100%
rename from packages/SystemUI/res/layout-large/status_bar_notification_row.xml
rename to packages/SystemUI/res/layout-sw600dp/status_bar_notification_row.xml
diff --git a/packages/SystemUI/res/layout-large/status_bar_pocket_panel.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_pocket_panel.xml
similarity index 100%
rename from packages/SystemUI/res/layout-large/status_bar_pocket_panel.xml
rename to packages/SystemUI/res/layout-sw600dp/status_bar_pocket_panel.xml
diff --git a/packages/SystemUI/res/layout-large/status_bar_recent_item.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml
similarity index 90%
rename from packages/SystemUI/res/layout-large/status_bar_recent_item.xml
rename to packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml
index 3f172e6..cd42d7e 100644
--- a/packages/SystemUI/res/layout-large/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml
@@ -60,9 +60,9 @@
     <TextView android:id="@+id/app_label"
         android:layout_width="97dip"
         android:layout_height="wrap_content"
-        android:textSize="18dip"
+        android:textSize="@dimen/status_bar_recents_app_description_text_size"
         android:fadingEdge="horizontal"
-        android:fadingEdgeLength="10dip"
+        android:fadingEdgeLength="@dimen/status_bar_recents_fading_edge_length"
         android:scrollHorizontally="true"
         android:layout_alignParentLeft="true"
         android:layout_alignParentTop="true"
@@ -75,9 +75,9 @@
     <TextView android:id="@+id/app_description"
         android:layout_width="97dip"
         android:layout_height="wrap_content"
-        android:textSize="18dip"
+        android:textSize="@dimen/status_bar_recents_app_description_text_size"
         android:fadingEdge="horizontal"
-        android:fadingEdgeLength="10dip"
+        android:fadingEdgeLength="@dimen/status_bar_recents_fading_edge_length"
         android:scrollHorizontally="true"
         android:layout_alignParentLeft="true"
         android:layout_alignParentTop="true"
diff --git a/packages/SystemUI/res/layout-large/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_recent_panel.xml
similarity index 67%
copy from packages/SystemUI/res/layout-large/status_bar_recent_panel.xml
copy to packages/SystemUI/res/layout-sw600dp/status_bar_recent_panel.xml
index f019e2d..75fdc67 100644
--- a/packages/SystemUI/res/layout-large/status_bar_recent_panel.xml
+++ b/packages/SystemUI/res/layout-sw600dp/status_bar_recent_panel.xml
@@ -18,32 +18,23 @@
 */
 -->
 
-<com.android.systemui.statusbar.tablet.RecentAppsPanel
+<com.android.systemui.recent.RecentsPanelView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/recents_root"
     android:layout_height="match_parent"
-    android:layout_width="wrap_content">
-
-    <CheckBox android:id="@+id/recents_compat_mode"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentBottom="true"
-        android:layout_alignParentRight="true"
-        android:layout_marginLeft="16dp"
-        android:layout_marginBottom="@*android:dimen/status_bar_height"
-        android:background="@drawable/hd"
-        android:button="@null"
-    />
+    android:layout_width="wrap_content"
+    android:clipToPadding="false"
+    android:clipChildren="false">
 
     <FrameLayout
         android:id="@+id/recents_bg_protect"
         android:background="@drawable/recents_bg_protect_tile"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
-        android:layout_toLeftOf="@id/recents_compat_mode"
         android:layout_alignParentBottom="true"
         android:paddingBottom="@*android:dimen/status_bar_height"
-        android:clipToPadding="false">
+        android:clipToPadding="false"
+        android:clipChildren="false">
 
         <LinearLayout android:id="@+id/recents_glow"
             android:layout_width="wrap_content"
@@ -52,20 +43,32 @@
             android:layout_gravity="bottom"
             android:background="@drawable/recents_blue_glow"
             android:orientation="horizontal"
+            android:clipToPadding="false"
+            android:clipChildren="false"
             >
-
-            <ListView android:id="@+id/recents_container"
+            <com.android.systemui.recent.RecentsVerticalScrollView android:id="@+id/recents_container"
                 android:layout_width="@dimen/status_bar_recents_width"
                 android:layout_height="wrap_content"
-                android:layout_marginRight="100dip"
+                android:layout_marginRight="@dimen/status_bar_recents_right_glow_margin"
                 android:divider="@null"
-                android:scrollingCache="true"
                 android:stackFromBottom="true"
                 android:fadingEdge="vertical"
                 android:scrollbars="none"
                 android:fadingEdgeLength="20dip"
+                android:layout_gravity="bottom|left"
                 android:listSelector="@drawable/recents_thumbnail_bg_selector"
-            />
+                android:clipToPadding="false"
+                android:clipChildren="false">
+
+                <LinearLayout android:id="@+id/recents_linear_layout"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical"
+                    android:clipToPadding="false"
+                    android:clipChildren="false">
+                </LinearLayout>
+
+            </com.android.systemui.recent.RecentsVerticalScrollView>
 
         </LinearLayout>
 
@@ -79,4 +82,4 @@
         android:background="@drawable/ic_sysbar_back_ime"
     />
 
-</com.android.systemui.statusbar.tablet.RecentAppsPanel>
+</com.android.systemui.recent.RecentsPanelView>
diff --git a/packages/SystemUI/res/layout-large/status_bar_recent_panel_footer.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_recent_panel_footer.xml
similarity index 100%
rename from packages/SystemUI/res/layout-large/status_bar_recent_panel_footer.xml
rename to packages/SystemUI/res/layout-sw600dp/status_bar_recent_panel_footer.xml
diff --git a/packages/SystemUI/res/layout-large/status_bar_settings_view.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_settings_view.xml
similarity index 100%
rename from packages/SystemUI/res/layout-large/status_bar_settings_view.xml
rename to packages/SystemUI/res/layout-sw600dp/status_bar_settings_view.xml
diff --git a/packages/SystemUI/res/layout-large/status_bar_ticker_compat.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_ticker_compat.xml
similarity index 100%
rename from packages/SystemUI/res/layout-large/status_bar_ticker_compat.xml
rename to packages/SystemUI/res/layout-sw600dp/status_bar_ticker_compat.xml
diff --git a/packages/SystemUI/res/layout-large/status_bar_ticker_panel.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_ticker_panel.xml
similarity index 100%
rename from packages/SystemUI/res/layout-large/status_bar_ticker_panel.xml
rename to packages/SystemUI/res/layout-sw600dp/status_bar_ticker_panel.xml
diff --git a/packages/SystemUI/res/layout-large/status_bar_recent_item.xml b/packages/SystemUI/res/layout/status_bar_recent_item.xml
similarity index 90%
copy from packages/SystemUI/res/layout-large/status_bar_recent_item.xml
copy to packages/SystemUI/res/layout/status_bar_recent_item.xml
index 3f172e6..cd42d7e 100644
--- a/packages/SystemUI/res/layout-large/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout/status_bar_recent_item.xml
@@ -60,9 +60,9 @@
     <TextView android:id="@+id/app_label"
         android:layout_width="97dip"
         android:layout_height="wrap_content"
-        android:textSize="18dip"
+        android:textSize="@dimen/status_bar_recents_app_description_text_size"
         android:fadingEdge="horizontal"
-        android:fadingEdgeLength="10dip"
+        android:fadingEdgeLength="@dimen/status_bar_recents_fading_edge_length"
         android:scrollHorizontally="true"
         android:layout_alignParentLeft="true"
         android:layout_alignParentTop="true"
@@ -75,9 +75,9 @@
     <TextView android:id="@+id/app_description"
         android:layout_width="97dip"
         android:layout_height="wrap_content"
-        android:textSize="18dip"
+        android:textSize="@dimen/status_bar_recents_app_description_text_size"
         android:fadingEdge="horizontal"
-        android:fadingEdgeLength="10dip"
+        android:fadingEdgeLength="@dimen/status_bar_recents_fading_edge_length"
         android:scrollHorizontally="true"
         android:layout_alignParentLeft="true"
         android:layout_alignParentTop="true"
diff --git a/packages/SystemUI/res/layout-large/status_bar_recent_panel.xml b/packages/SystemUI/res/layout/status_bar_recent_panel.xml
similarity index 69%
rename from packages/SystemUI/res/layout-large/status_bar_recent_panel.xml
rename to packages/SystemUI/res/layout/status_bar_recent_panel.xml
index f019e2d..703cbc1 100644
--- a/packages/SystemUI/res/layout-large/status_bar_recent_panel.xml
+++ b/packages/SystemUI/res/layout/status_bar_recent_panel.xml
@@ -18,32 +18,21 @@
 */
 -->
 
-<com.android.systemui.statusbar.tablet.RecentAppsPanel
+<com.android.systemui.recent.RecentsPanelView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/recents_root"
     android:layout_height="match_parent"
     android:layout_width="wrap_content">
 
-    <CheckBox android:id="@+id/recents_compat_mode"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentBottom="true"
-        android:layout_alignParentRight="true"
-        android:layout_marginLeft="16dp"
-        android:layout_marginBottom="@*android:dimen/status_bar_height"
-        android:background="@drawable/hd"
-        android:button="@null"
-    />
-
     <FrameLayout
         android:id="@+id/recents_bg_protect"
         android:background="@drawable/recents_bg_protect_tile"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
-        android:layout_toLeftOf="@id/recents_compat_mode"
         android:layout_alignParentBottom="true"
         android:paddingBottom="@*android:dimen/status_bar_height"
-        android:clipToPadding="false">
+        android:clipToPadding="false"
+        android:clipChildren="false">
 
         <LinearLayout android:id="@+id/recents_glow"
             android:layout_width="wrap_content"
@@ -52,20 +41,33 @@
             android:layout_gravity="bottom"
             android:background="@drawable/recents_blue_glow"
             android:orientation="horizontal"
+            android:clipToPadding="false"
+            android:clipChildren="false"
             >
-
-            <ListView android:id="@+id/recents_container"
+            <com.android.systemui.recent.RecentsVerticalScrollView android:id="@+id/recents_container"
                 android:layout_width="@dimen/status_bar_recents_width"
                 android:layout_height="wrap_content"
-                android:layout_marginRight="100dip"
+                android:layout_marginRight="@dimen/status_bar_recents_right_glow_margin"
                 android:divider="@null"
-                android:scrollingCache="true"
                 android:stackFromBottom="true"
                 android:fadingEdge="vertical"
                 android:scrollbars="none"
                 android:fadingEdgeLength="20dip"
                 android:listSelector="@drawable/recents_thumbnail_bg_selector"
-            />
+                android:layout_gravity="bottom|left"
+                android:clipToPadding="false"
+                android:clipChildren="false">
+
+                <LinearLayout android:id="@+id/recents_linear_layout"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical"
+                    android:clipToPadding="false"
+                    android:clipChildren="false">
+                </LinearLayout>
+
+            </com.android.systemui.recent.RecentsVerticalScrollView>
+
 
         </LinearLayout>
 
@@ -79,4 +81,4 @@
         android:background="@drawable/ic_sysbar_back_ime"
     />
 
-</com.android.systemui.statusbar.tablet.RecentAppsPanel>
+</com.android.systemui.recent.RecentsPanelView>
diff --git a/packages/SystemUI/res/values-land/dimens.xml b/packages/SystemUI/res/values-land/dimens.xml
index bcc8da1..6f1453e 100644
--- a/packages/SystemUI/res/values-land/dimens.xml
+++ b/packages/SystemUI/res/values-land/dimens.xml
@@ -18,4 +18,20 @@
 <resources>
     <!-- thickness (width) of the navigation bar on phones that require it -->
     <dimen name="navigation_bar_size">42dp</dimen>
+
+    <!-- Recent Applications parameters -->
+    <!-- Width of a recent app view, including all content -->
+    <dimen name="status_bar_recents_thumbnail_view_width">156dp</dimen>
+    <!-- How far the thumbnail for a recent app appears from left edge -->
+    <dimen name="status_bar_recents_thumbnail_left_margin">0dp</dimen>
+    <!-- Width of scrollable area in recents -->
+    <dimen name="status_bar_recents_width">128dp</dimen>
+    <!-- Thumbnail border width -->
+    <dimen name="status_bar_recents_thumbnail_border_width">8dp</dimen>
+    <!-- Thumbnail border height -->
+    <dimen name="status_bar_recents_thumbnail_border_height">12dp</dimen>
+    <!-- Padding for text descriptions -->
+    <dimen name="status_bar_recents_text_description_padding">8dp</dimen>
+    <!-- Margin between recents container and glow on the right -->
+    <dimen name="status_bar_recents_right_glow_margin">0dip</dimen>
 </resources>
diff --git a/packages/SystemUI/res/values-large/dimens.xml b/packages/SystemUI/res/values-large/dimens.xml
index 9d89e21..f8a4a1c 100644
--- a/packages/SystemUI/res/values-large/dimens.xml
+++ b/packages/SystemUI/res/values-large/dimens.xml
@@ -22,6 +22,32 @@
     <dimen name="status_bar_panel_bottom_offset">36dp</dimen>
     <!-- gap on either side of status bar notification icons -->
     <dimen name="status_bar_icon_padding">8dp</dimen>
+
+    <!-- Recent Applications parameters -->
+    <!-- Width of a recent app view, including all content -->
+    <dimen name="status_bar_recents_thumbnail_view_width">156dp</dimen>
+    <!-- How far the thumbnail for a recent app appears from left edge -->
+    <dimen name="status_bar_recents_thumbnail_left_margin">110dp</dimen>
+    <!-- Upper width limit for application icon -->
+    <dimen name="status_bar_recents_thumbnail_max_width">64dp</dimen>
+    <!-- Upper height limit for application icon -->
+    <dimen name="status_bar_recents_thumbnail_max_height">64dp</dimen>
+    <!-- Width of scrollable area in recents -->
+    <dimen name="status_bar_recents_width">356dp</dimen>
+    <!-- Thumbnail border width -->
+    <dimen name="status_bar_recents_thumbnail_border_width">12dp</dimen>
+    <!-- Thumbnail border height -->
+    <dimen name="status_bar_recents_thumbnail_border_height">12dp</dimen>
+    <!-- Padding for text descriptions -->
+    <dimen name="status_bar_recents_text_description_padding">8dp</dimen>
+    <!-- Size of application label text -->
+    <dimen name="status_bar_recents_app_label_text_size">18dip</dimen>
+    <!-- Size of application description text -->
+    <dimen name="status_bar_recents_app_description_text_size">18dip</dimen>
+    <!-- Size of fading edge for scroll effect -->
+    <dimen name="status_bar_recents_fading_edge_length">20dip</dimen>
+    <!-- Margin between recents container and glow on the right -->
+    <dimen name="status_bar_recents_right_glow_margin">100dip</dimen>
 </resources>
 
 
diff --git a/packages/SystemUI/res/values-xlarge/styles.xml b/packages/SystemUI/res/values-sw600dp/styles.xml
similarity index 100%
rename from packages/SystemUI/res/values-xlarge/styles.xml
rename to packages/SystemUI/res/values-sw600dp/styles.xml
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index c0c39d0..954a871 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -40,7 +40,7 @@
 
     <!-- Whether a software navigation bar should be shown. NOTE: in the future this may be
          autodetected from the Configuration. -->
-    <bool name="config_showNavigationBar">true</bool>
+    <bool name="config_showNavigationBar">false</bool>
 
 </resources>
 
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index a2577cb..657dc46 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -30,6 +30,20 @@
     <dimen name="status_bar_recents_thumbnail_max_height">64dp</dimen>
     <!-- Width of scrollable area in recents -->
     <dimen name="status_bar_recents_width">356dp</dimen>
+    <!-- Thumbnail border width -->
+    <dimen name="status_bar_recents_thumbnail_border_width">12dp</dimen>
+    <!-- Thumbnail border height -->
+    <dimen name="status_bar_recents_thumbnail_border_height">12dp</dimen>
+    <!-- Padding for text descriptions -->
+    <dimen name="status_bar_recents_text_description_padding">8dp</dimen>
+    <!-- Size of application label text -->
+    <dimen name="status_bar_recents_app_label_text_size">18dip</dimen>
+    <!-- Size of application description text -->
+    <dimen name="status_bar_recents_app_description_text_size">18dip</dimen>
+    <!-- Size of fading edge for scroll effect -->
+    <dimen name="status_bar_recents_fading_edge_length">20dip</dimen>
+    <!-- Margin between recents container and glow on the right -->
+    <dimen name="status_bar_recents_right_glow_margin">100dip</dimen>
 
     <!-- thickness (height) of the navigation bar on phones that require it -->
     <dimen name="navigation_bar_size">42dp</dimen>
diff --git a/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java b/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java
new file mode 100644
index 0000000..b876075
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2011 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 com.android.systemui.recent;
+
+import android.animation.Animator;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.util.Log;
+import android.util.Slog;
+import android.view.View;
+
+/* package */ class Choreographer implements Animator.AnimatorListener {
+    // should group this into a multi-property animation
+    private static final int OPEN_DURATION = 136;
+    private static final int CLOSE_DURATION = 250;
+    private static final String TAG = RecentsPanelView.TAG;
+    private static final boolean DEBUG = RecentsPanelView.DEBUG;
+
+    boolean mVisible;
+    int mPanelHeight;
+    View mRootView;
+    View mScrimView;
+    View mContentView;
+    AnimatorSet mContentAnim;
+
+    // the panel will start to appear this many px from the end
+    final int HYPERSPACE_OFFRAMP = 200;
+
+    public Choreographer(View root, View scrim, View content) {
+        mRootView = root;
+        mScrimView = scrim;
+        mContentView = content;
+    }
+
+    void createAnimation(boolean appearing) {
+        float start, end;
+
+        if (RecentsPanelView.DEBUG) Log.e(TAG, "createAnimation()", new Exception());
+
+        // 0: on-screen
+        // height: off-screen
+        float y = mContentView.getTranslationY();
+        if (appearing) {
+            // we want to go from near-the-top to the top, unless we're half-open in the right
+            // general vicinity
+            start = (y < HYPERSPACE_OFFRAMP) ? y : HYPERSPACE_OFFRAMP;
+            end = 0;
+        } else {
+            start = y;
+            end = y + HYPERSPACE_OFFRAMP;
+        }
+
+        Animator posAnim = ObjectAnimator.ofFloat(mContentView, "translationY",
+                start, end);
+        posAnim.setInterpolator(appearing
+                ? new android.view.animation.DecelerateInterpolator(2.5f)
+                : new android.view.animation.AccelerateInterpolator(2.5f));
+
+        Animator glowAnim = ObjectAnimator.ofFloat(mContentView, "alpha",
+                mContentView.getAlpha(), appearing ? 1.0f : 0.0f);
+        glowAnim.setInterpolator(appearing
+                ? new android.view.animation.AccelerateInterpolator(1.0f)
+                : new android.view.animation.DecelerateInterpolator(1.0f));
+
+        Animator bgAnim = ObjectAnimator.ofInt(mScrimView.getBackground(),
+                "alpha", appearing ? 0 : 255, appearing ? 255 : 0);
+
+        mContentAnim = new AnimatorSet();
+        mContentAnim
+                .play(bgAnim)
+                .with(glowAnim)
+                .with(posAnim);
+        mContentAnim.setDuration(appearing ? OPEN_DURATION : CLOSE_DURATION);
+        mContentAnim.addListener(this);
+    }
+
+    void startAnimation(boolean appearing) {
+        if (DEBUG) Slog.d(TAG, "startAnimation(appearing=" + appearing + ")");
+
+        createAnimation(appearing);
+
+        mContentView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+        mContentAnim.start();
+
+        mVisible = appearing;
+    }
+
+    void jumpTo(boolean appearing) {
+        mContentView.setTranslationY(appearing ? 0 : mPanelHeight);
+    }
+
+    public void setPanelHeight(int h) {
+        if (DEBUG) Slog.d(TAG, "panelHeight=" + h);
+        mPanelHeight = h;
+    }
+
+    public void onAnimationCancel(Animator animation) {
+        if (DEBUG) Slog.d(TAG, "onAnimationCancel");
+        // force this to zero so we close the window
+        mVisible = false;
+    }
+
+    public void onAnimationEnd(Animator animation) {
+        if (DEBUG) Slog.d(TAG, "onAnimationEnd");
+        if (!mVisible) {
+            mRootView.setVisibility(View.GONE);
+        }
+        mContentView.setLayerType(View.LAYER_TYPE_NONE, null);
+        mContentAnim = null;
+    }
+
+    public void onAnimationRepeat(Animator animation) {
+    }
+
+    public void onAnimationStart(Animator animation) {
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsCallback.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsCallback.java
new file mode 100644
index 0000000..5d29e2a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsCallback.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2011 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 com.android.systemui.recent;
+
+import android.view.View;
+
+public interface RecentsCallback {
+    static final int SWIPE_LEFT = 0;
+    static final int SWIPE_RIGHT = 1;
+    static final int SWIPE_UP = 2;
+    static final int SWIPE_DOWN = 3;
+
+    void handleOnClick(View selectedView);
+    void handleSwipe(View selectedView, int direction);
+    void handleLongPress(View selectedView);
+}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java
new file mode 100644
index 0000000..194c9d1
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java
@@ -0,0 +1,307 @@
+/*
+ * Copyright (C) 2011 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 com.android.systemui.recent;
+
+import com.android.systemui.recent.RecentsPanelView.ActvityDescriptionAdapter;
+
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
+import android.animation.LayoutTransition;
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.animation.ValueAnimator.AnimatorUpdateListener;
+import android.content.Context;
+import android.database.DataSetObserver;
+import android.graphics.RectF;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.LinearInterpolator;
+import android.widget.HorizontalScrollView;
+import android.widget.LinearLayout;
+
+import com.android.systemui.R;
+
+public class RecentsHorizontalScrollView extends HorizontalScrollView
+        implements View.OnClickListener, View.OnTouchListener {
+    private static final float FADE_CONSTANT = 0.5f;
+    private static final int SNAP_BACK_DURATION = 250;
+    private static final int ESCAPE_VELOCITY = 100; // speed of item required to "curate" it
+    private static final String TAG = RecentsPanelView.TAG;
+    private static final float THRESHHOLD = 50;
+    private static final boolean DEBUG_INVALIDATE = false;
+    private LinearLayout mLinearLayout;
+    private ActvityDescriptionAdapter mAdapter;
+    private RecentsCallback mCallback;
+    protected int mLastScrollPosition;
+    private View mCurrentView;
+    private float mLastY;
+    private boolean mDragging;
+    private VelocityTracker mVelocityTracker;
+
+    public RecentsHorizontalScrollView(Context context) {
+        this(context, null);
+    }
+
+    public RecentsHorizontalScrollView(Context context, AttributeSet attrs) {
+        super(context, attrs, 0);
+    }
+
+    private int scrollPositionOfMostRecent() {
+        return mLinearLayout.getWidth() - getWidth();
+    }
+
+    public void update() {
+        mLinearLayout.removeAllViews();
+        for (int i = 0; i < mAdapter.getCount(); i++) {
+            View view = mAdapter.getView(i, null, mLinearLayout);
+            view.setClickable(true);
+            view.setOnClickListener(this);
+            view.setOnTouchListener(this);
+            mLinearLayout.addView(view);
+        }
+        // Scroll to end after layout.
+        post(new Runnable() {
+            public void run() {
+                mLastScrollPosition = scrollPositionOfMostRecent();
+                scrollTo(mLastScrollPosition, 0);
+            }
+        });
+    }
+
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+        if (mVelocityTracker == null) {
+            mVelocityTracker = VelocityTracker.obtain();
+        }
+        mVelocityTracker.addMovement(ev);
+        switch (ev.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                mDragging = false;
+                mLastY = ev.getY();
+                break;
+
+            case MotionEvent.ACTION_MOVE:
+                float delta = ev.getY() - mLastY;
+                if (Math.abs(delta) > THRESHHOLD) {
+                    mDragging = true;
+                }
+                break;
+
+            case MotionEvent.ACTION_UP:
+                mDragging = false;
+                break;
+        }
+        return mDragging ? true : super.onInterceptTouchEvent(ev);
+    }
+
+    private float getAlphaForOffset(View view, float thumbHeight) {
+        final float fadeHeight = FADE_CONSTANT * thumbHeight;
+        float result = 1.0f;
+        if (view.getY() >= thumbHeight) {
+            result = 1.0f - (view.getY() - thumbHeight) / fadeHeight;
+        } else if (view.getY() < 0.0f) {
+            result = 1.0f + (thumbHeight + view.getY()) / fadeHeight;
+        }
+        return result;
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent ev) {
+        if (!mDragging) {
+            return super.onTouchEvent(ev);
+        }
+
+        mVelocityTracker.addMovement(ev);
+
+        final View animView = mCurrentView;
+        // TODO: Cache thumbnail
+        final View thumb = animView.findViewById(R.id.app_thumbnail);
+        switch (ev.getAction()) {
+            case MotionEvent.ACTION_MOVE:
+                if (animView != null) {
+                    final float delta = ev.getY() - mLastY;
+                    animView.setY(animView.getY() + delta);
+                    animView.setAlpha(getAlphaForOffset(animView, thumb.getHeight()));
+                    invalidateGlobalRegion(animView);
+                }
+                mLastY = ev.getY();
+                break;
+
+            case MotionEvent.ACTION_UP:
+                final ObjectAnimator anim;
+                if (animView != null) {
+                    final VelocityTracker velocityTracker = mVelocityTracker;
+                    velocityTracker.computeCurrentVelocity(1000, 10000);
+                    final float velocityX = velocityTracker.getXVelocity();
+                    final float velocityY = velocityTracker.getYVelocity();
+                    final float curY = animView.getY();
+                    final float newY = (velocityY >= 0.0f ? 1 : -1) * animView.getHeight();
+
+                    if (Math.abs(velocityY) > Math.abs(velocityX)
+                            && Math.abs(velocityY) > ESCAPE_VELOCITY
+                            && (velocityY >= 0.0f) == (animView.getY() >= 0)) {
+                        final long duration =
+                            (long) (Math.abs(newY - curY) * 1000.0f / Math.abs(velocityY));
+                        anim = ObjectAnimator.ofFloat(animView, "y", curY, newY);
+                        anim.setInterpolator(new LinearInterpolator());
+                        final int swipeDirection = animView.getY() >= 0.0f ?
+                                RecentsCallback.SWIPE_RIGHT : RecentsCallback.SWIPE_LEFT;
+                        anim.addListener(new AnimatorListener() {
+                            public void onAnimationStart(Animator animation) {
+                            }
+                            public void onAnimationRepeat(Animator animation) {
+                            }
+                            public void onAnimationEnd(Animator animation) {
+                                mLinearLayout.removeView(mCurrentView);
+                                mCallback.handleSwipe(animView, swipeDirection);
+                            }
+                            public void onAnimationCancel(Animator animation) {
+                                mLinearLayout.removeView(mCurrentView);
+                                mCallback.handleSwipe(animView, swipeDirection);
+                            }
+                        });
+                        anim.setDuration(duration);
+                    } else { // Animate back to position
+                        final long duration = Math.abs(velocityY) > 0.0f ?
+                                (long) (Math.abs(newY - curY) * 1000.0f / Math.abs(velocityY))
+                                : SNAP_BACK_DURATION;
+                        anim = ObjectAnimator.ofFloat(animView, "y", animView.getY(), 0.0f);
+                        anim.setInterpolator(new DecelerateInterpolator(2.0f));
+                        anim.setDuration(duration);
+                    }
+
+                    anim.addUpdateListener(new AnimatorUpdateListener() {
+                        public void onAnimationUpdate(ValueAnimator animation) {
+                            animView.setAlpha(getAlphaForOffset(animView, thumb.getHeight()));
+                            invalidateGlobalRegion(animView);
+                        }
+                    });
+                    anim.start();
+                }
+
+                mVelocityTracker.recycle();
+                mVelocityTracker = null;
+                break;
+        }
+        return true;
+    }
+
+    void invalidateGlobalRegion(View view) {
+        RectF childBounds
+                = new RectF(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
+        childBounds.offset(view.getX(), view.getY());
+        if (DEBUG_INVALIDATE) Log.v(TAG, "-------------");
+        while (view.getParent() != null && view.getParent() instanceof View) {
+            view = (View) view.getParent();
+            view.getMatrix().mapRect(childBounds);
+            view.invalidate((int) Math.floor(childBounds.left),
+                    (int) Math.floor(childBounds.top),
+                    (int) Math.ceil(childBounds.right),
+                    (int) Math.ceil(childBounds.bottom));
+            if (DEBUG_INVALIDATE) {
+                Log.v(TAG, "INVALIDATE(" + (int) Math.floor(childBounds.left)
+                        + "," + (int) Math.floor(childBounds.top)
+                        + "," + (int) Math.ceil(childBounds.right)
+                        + "," + (int) Math.ceil(childBounds.bottom));
+            }
+        }
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+        LayoutInflater inflater = (LayoutInflater)
+                mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+        setScrollbarFadingEnabled(true);
+
+        mLinearLayout = (LinearLayout) findViewById(R.id.recents_linear_layout);
+
+        final int leftPadding = mContext.getResources()
+            .getDimensionPixelOffset(R.dimen.status_bar_recents_thumbnail_left_margin);
+        setOverScrollEffectPadding(leftPadding, 0);
+    }
+
+    private void setOverScrollEffectPadding(int leftPadding, int i) {
+        // TODO Add to RecentsHorizontalScrollView
+    }
+
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+        // Keep track of the last visible item in the list so we can restore it
+        // to the bottom when the orientation changes.
+        mLastScrollPosition = scrollPositionOfMostRecent();
+
+        // This has to happen post-layout, so run it "in the future"
+        post(new Runnable() {
+            public void run() {
+                scrollTo(0, mLastScrollPosition);
+            }
+        });
+    }
+
+    @Override
+    protected void onVisibilityChanged(View changedView, int visibility) {
+        super.onVisibilityChanged(changedView, visibility);
+        // scroll to bottom after reloading
+        if (visibility == View.VISIBLE && changedView == this) {
+            post(new Runnable() {
+                public void run() {
+                    update();
+                }
+            });
+        }
+    }
+
+    public void setAdapter(ActvityDescriptionAdapter adapter) {
+        mAdapter = adapter;
+        mAdapter.registerDataSetObserver(new DataSetObserver() {
+            public void onChanged() {
+                update();
+            }
+
+            public void onInvalidated() {
+                update();
+            }
+        });
+    }
+
+    @Override
+    public void setLayoutTransition(LayoutTransition transition) {
+        // The layout transition applies to our embedded LinearLayout
+        mLinearLayout.setLayoutTransition(transition);
+    }
+
+    public void onClick(View view) {
+        mCallback.handleOnClick(view);
+    }
+
+    public void setCallback(RecentsCallback callback) {
+        mCallback = callback;
+    }
+
+    public boolean onTouch(View v, MotionEvent event) {
+        mCurrentView = v;
+        return false;
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsListView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsListView.java
new file mode 100644
index 0000000..d8b086b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsListView.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2011 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 com.android.systemui.recent;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ListView;
+
+import com.android.systemui.R;
+
+public class RecentsListView extends ListView {
+    private int mLastVisiblePosition;
+    private RecentsCallback mCallback;
+
+    public RecentsListView(Context context) {
+        this(context, null);
+    }
+
+    public RecentsListView(Context context, AttributeSet attrs) {
+        super(context, attrs, 0);
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+        LayoutInflater inflater = (LayoutInflater)
+                mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+        View footer = inflater.inflate(R.layout.status_bar_recent_panel_footer, this, false);
+        setScrollbarFadingEnabled(true);
+        addFooterView(footer, null, false);
+        final int leftPadding = mContext.getResources()
+            .getDimensionPixelOffset(R.dimen.status_bar_recents_thumbnail_left_margin);
+        setOverScrollEffectPadding(leftPadding, 0);
+    }
+
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+        // Keep track of the last visible item in the list so we can restore it
+        // to the bottom when the orientation changes.
+        final int childCount = getChildCount();
+        if (childCount > 0) {
+            mLastVisiblePosition = getFirstVisiblePosition() + childCount - 1;
+            View view = getChildAt(childCount - 1);
+            final int distanceFromBottom = getHeight() - view.getTop();
+
+            // This has to happen post-layout, so run it "in the future"
+            post(new Runnable() {
+                public void run() {
+                    setSelectionFromTop(mLastVisiblePosition, getHeight() - distanceFromBottom);
+                }
+            });
+        }
+    }
+
+    @Override
+    protected void onVisibilityChanged(View changedView, int visibility) {
+        super.onVisibilityChanged(changedView, visibility);
+        // scroll to bottom after reloading
+        int count = getAdapter().getCount();
+        mLastVisiblePosition = count - 1;
+        if (visibility == View.VISIBLE && changedView == this) {
+            post(new Runnable() {
+                public void run() {
+                    setSelection(mLastVisiblePosition);
+                }
+            });
+        }
+    }
+
+    public void setCallback(RecentsCallback callback) {
+        mCallback = callback;
+    }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
similarity index 64%
rename from packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java
rename to packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
index d0e6551..e2b3446 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/RecentAppsPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2011 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.
@@ -14,14 +14,12 @@
  * limitations under the License.
  */
 
-package com.android.systemui.statusbar.tablet;
+package com.android.systemui.recent;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import android.animation.Animator;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
+import android.animation.LayoutTransition;
 import android.app.ActivityManager;
 import android.content.Context;
 import android.content.Intent;
@@ -43,25 +41,25 @@
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
 import android.util.Log;
-import android.util.Slog;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.BaseAdapter;
-import android.widget.CheckBox;
 import android.widget.ImageView;
-import android.widget.ListView;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
 import com.android.systemui.R;
+import com.android.systemui.statusbar.tablet.StatusBarPanel;
+import com.android.systemui.statusbar.tablet.TabletStatusBar;
 
-public class RecentAppsPanel extends RelativeLayout implements StatusBarPanel, OnItemClickListener {
+public class RecentsPanelView extends RelativeLayout
+        implements OnItemClickListener, RecentsCallback, StatusBarPanel {
     private static final int GLOW_PADDING = 15;
-    private static final String TAG = "RecentAppsPanel";
-    private static final boolean DEBUG = TabletStatusBar.DEBUG;
+    static final String TAG = "RecentsListView";
+    static final boolean DEBUG = TabletStatusBar.DEBUG;
     private static final int DISPLAY_TASKS = 20;
     private static final int MAX_TASKS = DISPLAY_TASKS + 1; // allow extra for non-apps
     private TabletStatusBar mBar;
@@ -69,17 +67,15 @@
     private int mIconDpi;
     private View mRecentsScrim;
     private View mRecentsGlowView;
-    private ListView mRecentsContainer;
-    private CheckBox mCompatMode;
+    private View mRecentsContainer;
     private Bitmap mGlowBitmap;
     private boolean mShowing;
     private Choreographer mChoreo;
     private View mRecentsDismissButton;
     private ActvityDescriptionAdapter mListAdapter;
-    protected int mLastVisibleItem;
 
-    static class ActivityDescription {
-        int id;
+    /* package */ final static class ActivityDescription {
+        int taskId; // application task id for curating apps
         Bitmap thumbnail; // generated by Activity.onCreateThumbnail()
         Drawable icon; // application package icon
         String label; // application package label
@@ -98,18 +94,18 @@
             label = _label;
             description = _desc;
             intent = _intent;
-            id = _id;
+            taskId = _id;
             position = _pos;
             packageName = _packageName;
         }
     };
 
     /* package */ final static class ViewHolder {
-        private ImageView thumbnailView;
-        private ImageView iconView;
-        private TextView labelView;
-        private TextView descriptionView;
-        private ActivityDescription activityDescription;
+        ImageView thumbnailView;
+        ImageView iconView;
+        TextView labelView;
+        TextView descriptionView;
+        ActivityDescription activityDescription;
     }
 
     /* package */ final class ActvityDescriptionAdapter extends BaseAdapter {
@@ -205,120 +201,15 @@
         return mShowing;
     }
 
-    private static class Choreographer implements Animator.AnimatorListener {
-        // should group this into a multi-property animation
-        private static final int OPEN_DURATION = 136;
-        private static final int CLOSE_DURATION = 250;
-
-        boolean mVisible;
-        int mPanelHeight;
-        View mRootView;
-        View mScrimView;
-        View mContentView;
-        AnimatorSet mContentAnim;
-
-        // the panel will start to appear this many px from the end
-        final int HYPERSPACE_OFFRAMP = 200;
-
-        public Choreographer(View root, View scrim, View content) {
-            mRootView = root;
-            mScrimView = scrim;
-            mContentView = content;
-        }
-
-        void createAnimation(boolean appearing) {
-            float start, end;
-
-            if (DEBUG) Log.e(TAG, "createAnimation()", new Exception());
-
-            // 0: on-screen
-            // height: off-screen
-            float y = mContentView.getTranslationY();
-            if (appearing) {
-                // we want to go from near-the-top to the top, unless we're half-open in the right
-                // general vicinity
-                start = (y < HYPERSPACE_OFFRAMP) ? y : HYPERSPACE_OFFRAMP;
-                end = 0;
-            } else {
-                start = y;
-                end = y + HYPERSPACE_OFFRAMP;
-            }
-
-            Animator posAnim = ObjectAnimator.ofFloat(mContentView, "translationY",
-                    start, end);
-            posAnim.setInterpolator(appearing
-                    ? new android.view.animation.DecelerateInterpolator(2.5f)
-                    : new android.view.animation.AccelerateInterpolator(2.5f));
-
-            Animator glowAnim = ObjectAnimator.ofFloat(mContentView, "alpha",
-                    mContentView.getAlpha(), appearing ? 1.0f : 0.0f);
-            glowAnim.setInterpolator(appearing
-                    ? new android.view.animation.AccelerateInterpolator(1.0f)
-                    : new android.view.animation.DecelerateInterpolator(1.0f));
-
-            Animator bgAnim = ObjectAnimator.ofInt(mScrimView.getBackground(),
-                    "alpha", appearing ? 0 : 255, appearing ? 255 : 0);
-
-            mContentAnim = new AnimatorSet();
-            mContentAnim
-                    .play(bgAnim)
-                    .with(glowAnim)
-                    .with(posAnim);
-            mContentAnim.setDuration(appearing ? OPEN_DURATION : CLOSE_DURATION);
-            mContentAnim.addListener(this);
-        }
-
-        void startAnimation(boolean appearing) {
-            if (DEBUG) Slog.d(TAG, "startAnimation(appearing=" + appearing + ")");
-
-            createAnimation(appearing);
-
-            mContentView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
-            mContentAnim.start();
-
-            mVisible = appearing;
-        }
-
-        void jumpTo(boolean appearing) {
-            mContentView.setTranslationY(appearing ? 0 : mPanelHeight);
-        }
-
-        public void setPanelHeight(int h) {
-            if (DEBUG) Slog.d(TAG, "panelHeight=" + h);
-            mPanelHeight = h;
-        }
-
-        public void onAnimationCancel(Animator animation) {
-            if (DEBUG) Slog.d(TAG, "onAnimationCancel");
-            // force this to zero so we close the window
-            mVisible = false;
-        }
-
-        public void onAnimationEnd(Animator animation) {
-            if (DEBUG) Slog.d(TAG, "onAnimationEnd");
-            if (!mVisible) {
-                mRootView.setVisibility(View.GONE);
-            }
-            mContentView.setLayerType(View.LAYER_TYPE_NONE, null);
-            mContentAnim = null;
-        }
-
-        public void onAnimationRepeat(Animator animation) {
-        }
-
-        public void onAnimationStart(Animator animation) {
-        }
-    }
-
     public void setBar(TabletStatusBar bar) {
         mBar = bar;
     }
 
-    public RecentAppsPanel(Context context, AttributeSet attrs) {
+    public RecentsPanelView(Context context, AttributeSet attrs) {
         this(context, attrs, 0);
     }
 
-    public RecentAppsPanel(Context context, AttributeSet attrs, int defStyle) {
+    public RecentsPanelView(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
 
         Resources res = context.getResources();
@@ -330,52 +221,34 @@
     }
 
     @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        super.onSizeChanged(w, h, oldw, oldh);
-        // Keep track of the last visible item in the list so we can restore it
-        // to the bottom when the orientation changes.
-        int childCount = mRecentsContainer.getChildCount();
-        if (childCount > 0) {
-            mLastVisibleItem = mRecentsContainer.getFirstVisiblePosition() + childCount - 1;
-            View view = mRecentsContainer.getChildAt(childCount - 1);
-            final int distanceFromBottom = mRecentsContainer.getHeight() - view.getTop();
-            //final int distanceFromBottom = view.getHeight() + BOTTOM_OFFSET;
-
-            // This has to happen post-layout, so run it "in the future"
-            post(new Runnable() {
-                public void run() {
-                    mRecentsContainer.setSelectionFromTop(mLastVisibleItem,
-                            mRecentsContainer.getHeight() - distanceFromBottom);
-                }
-            });
-        }
-    }
-
-    @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
-        LayoutInflater inflater = (LayoutInflater)
         mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        mRecentsContainer = findViewById(R.id.recents_container);
+        mListAdapter = new ActvityDescriptionAdapter(mContext);
+        if (mRecentsContainer instanceof RecentsListView) {
+            RecentsListView listView = (RecentsListView) mRecentsContainer;
+            listView.setAdapter(mListAdapter);
+            listView.setOnItemClickListener(this);
+            listView.setCallback(this);
+        } else if (mRecentsContainer instanceof RecentsHorizontalScrollView){
+            RecentsHorizontalScrollView scrollView
+                    = (RecentsHorizontalScrollView) mRecentsContainer;
+            scrollView.setAdapter(mListAdapter);
+            scrollView.setCallback(this);
+        } else if (mRecentsContainer instanceof RecentsVerticalScrollView){
+            RecentsVerticalScrollView scrollView
+                    = (RecentsVerticalScrollView) mRecentsContainer;
+            scrollView.setAdapter(mListAdapter);
+            scrollView.setCallback(this);
+        }
+        else {
+            throw new IllegalArgumentException("missing RecentsListView/RecentsScrollView");
+        }
 
-        mRecentsContainer = (ListView) findViewById(R.id.recents_container);
-        mCompatMode = (CheckBox) findViewById(R.id.recents_compat_mode);
-        mCompatMode.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                final ActivityManager am = (ActivityManager)
-                        mContext.getSystemService(Context.ACTIVITY_SERVICE);
-                am.setFrontActivityScreenCompatMode(ActivityManager.COMPAT_MODE_TOGGLE);
-                hide(true);
-            }
-        });
-        View footer = inflater.inflate(R.layout.status_bar_recent_panel_footer,
-                mRecentsContainer, false);
-        mRecentsContainer.setScrollbarFadingEnabled(true);
-        mRecentsContainer.addFooterView(footer, null, false);
-        mRecentsContainer.setAdapter(mListAdapter = new ActvityDescriptionAdapter(mContext));
-        mRecentsContainer.setOnItemClickListener(this);
-        final int leftPadding = mContext.getResources()
-            .getDimensionPixelOffset(R.dimen.status_bar_recents_thumbnail_left_margin);
-        mRecentsContainer.setOverScrollEffectPadding(leftPadding, 0);
+        final LayoutTransition transitioner = new LayoutTransition();
+        ((ViewGroup)mRecentsContainer).setLayoutTransition(transitioner);
+        createCustomAnimations(transitioner);
 
         mRecentsGlowView = findViewById(R.id.recents_glow);
         mRecentsScrim = (View) findViewById(R.id.recents_bg_protect);
@@ -393,17 +266,16 @@
         }
     }
 
+    private void createCustomAnimations(LayoutTransition transitioner) {
+        transitioner.setDuration(LayoutTransition.DISAPPEARING, 250);
+    }
+
     @Override
     protected void onVisibilityChanged(View changedView, int visibility) {
         super.onVisibilityChanged(changedView, visibility);
         if (DEBUG) Log.v(TAG, "onVisibilityChanged(" + changedView + ", " + visibility + ")");
         if (visibility == View.VISIBLE && changedView == this) {
             refreshApplicationList();
-            post(new Runnable() {
-                public void run() {
-                    mRecentsContainer.setSelection(mActivityDescriptions.size() - 1);
-                }
-            });
         }
     }
 
@@ -496,7 +368,7 @@
         ActivityDescription desc = null;
         for (int i = 0; i < mActivityDescriptions.size(); i++) {
             ActivityDescription item = mActivityDescriptions.get(i);
-            if (item != null && item.id == id) {
+            if (item != null && item.taskId == id) {
                 desc = item;
                 break;
             }
@@ -504,34 +376,15 @@
         return desc;
     }
 
-    private void updateShownCompatMode() {
-        final ActivityManager am = (ActivityManager)
-                mContext.getSystemService(Context.ACTIVITY_SERVICE);
-        int mode = am.getFrontActivityScreenCompatMode();
-        switch (mode) {
-            case ActivityManager.COMPAT_MODE_DISABLED:
-                mCompatMode.setVisibility(View.VISIBLE);
-                mCompatMode.setChecked(true);
-                break;
-            case ActivityManager.COMPAT_MODE_ENABLED:
-                mCompatMode.setVisibility(View.VISIBLE);
-                mCompatMode.setChecked(false);
-                break;
-            default:
-                mCompatMode.setVisibility(View.GONE);
-                break;
-        }
-    }
-
     private void refreshApplicationList() {
         mActivityDescriptions = getRecentTasks();
         mListAdapter.notifyDataSetInvalidated();
         if (mActivityDescriptions.size() > 0) {
-            mLastVisibleItem = mActivityDescriptions.size() - 1; // scroll to bottom after reloading
+            Log.v(TAG, "Showing " + mActivityDescriptions.size() + " apps");
             updateUiElements(getResources().getConfiguration());
-            updateShownCompatMode();
         } else {
             // Immediately hide this panel
+            Log.v(TAG, "Nothing to show");
             hide(false);
         }
     }
@@ -546,6 +399,7 @@
             paint.setAlpha(255);
             final int srcWidth = thumbnail.getWidth();
             final int srcHeight = thumbnail.getHeight();
+            Log.v(TAG, "Source thumb: " + srcWidth + "x" + srcHeight);
             canvas.drawBitmap(thumbnail,
                     new Rect(0, 0, srcWidth-1, srcHeight-1),
                     new RectF(GLOW_PADDING,
@@ -563,27 +417,57 @@
         mRecentsGlowView.setVisibility(items > 0 ? View.VISIBLE : View.GONE);
     }
 
-    private void hide(boolean animate) {
+    public void hide(boolean animate) {
         if (!animate) {
             setVisibility(View.GONE);
         }
-        mBar.animateCollapse();
+        if (mBar != null) {
+            mBar.animateCollapse();
+        }
     }
 
-    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+    public void handleOnClick(View view) {
         ActivityDescription ad = ((ViewHolder) view.getTag()).activityDescription;
+        final Context context = view.getContext();
         final ActivityManager am = (ActivityManager)
-                getContext().getSystemService(Context.ACTIVITY_SERVICE);
-        if (ad.id >= 0) {
+                context.getSystemService(Context.ACTIVITY_SERVICE);
+        if (ad.taskId >= 0) {
             // This is an active task; it should just go to the foreground.
-            am.moveTaskToFront(ad.id, ActivityManager.MOVE_TASK_WITH_HOME);
+            am.moveTaskToFront(ad.taskId, ActivityManager.MOVE_TASK_WITH_HOME);
         } else {
             Intent intent = ad.intent;
             intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
                     | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
             if (DEBUG) Log.v(TAG, "Starting activity " + intent);
-            getContext().startActivity(intent);
+            context.startActivity(intent);
         }
         hide(true);
     }
+
+    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+        handleOnClick(view);
+    }
+
+    public void handleSwipe(View view, int direction) {
+        ActivityDescription ad = ((ViewHolder) view.getTag()).activityDescription;
+        Log.v(TAG, "Jettison " + ad.label);
+        mActivityDescriptions.remove(ad);
+
+        // Handled by widget containers to enable LayoutTransitions properly
+        // mListAdapter.notifyDataSetChanged();
+
+        if (mActivityDescriptions.size() == 0) {
+            hide(false);
+        }
+
+        // Currently, either direction means the same thing, so ignore direction and remove
+        // the task.
+        final ActivityManager am = (ActivityManager)
+                mContext.getSystemService(Context.ACTIVITY_SERVICE);
+        am.removeTask(ad.taskId, 0);
+    }
+
+    public void handleLongPress(View selectedView) {
+        // TODO show context menu : "Remove from list", "Show properties"
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
new file mode 100644
index 0000000..54ec6b5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
@@ -0,0 +1,309 @@
+/*
+ * Copyright (C) 2011 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 com.android.systemui.recent;
+
+import com.android.systemui.recent.RecentsPanelView.ActvityDescriptionAdapter;
+
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
+import android.animation.LayoutTransition;
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.animation.ValueAnimator.AnimatorUpdateListener;
+import android.content.Context;
+import android.database.DataSetObserver;
+import android.graphics.RectF;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.LinearInterpolator;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
+
+import com.android.systemui.R;
+
+public class RecentsVerticalScrollView extends ScrollView
+        implements View.OnClickListener, View.OnTouchListener {
+    private static final float FADE_CONSTANT = 0.5f;
+    private static final int SNAP_BACK_DURATION = 250;
+    private static final int ESCAPE_VELOCITY = 100; // speed of item required to "curate" it
+    private static final String TAG = RecentsPanelView.TAG;
+    private static final float THRESHHOLD = 50;
+    private static final boolean DEBUG_INVALIDATE = false;
+    private LinearLayout mLinearLayout;
+    private ActvityDescriptionAdapter mAdapter;
+    private RecentsCallback mCallback;
+    protected int mLastScrollPosition;
+    private View mCurrentView;
+    private float mLastX;
+    private boolean mDragging;
+    private VelocityTracker mVelocityTracker;
+
+    public RecentsVerticalScrollView(Context context) {
+        this(context, null);
+    }
+
+    public RecentsVerticalScrollView(Context context, AttributeSet attrs) {
+        super(context, attrs, 0);
+    }
+
+    private int scrollPositionOfMostRecent() {
+        return mLinearLayout.getHeight() - getHeight();
+    }
+
+    public void update() {
+        mLinearLayout.removeAllViews();
+        for (int i = 0; i < mAdapter.getCount(); i++) {
+            View view = mAdapter.getView(i, null, mLinearLayout);
+            view.setClickable(true);
+            view.setOnClickListener(this);
+            view.setOnTouchListener(this);
+            mLinearLayout.addView(view);
+        }
+        // Scroll to end after layout.
+        post(new Runnable() {
+            public void run() {
+                mLastScrollPosition = scrollPositionOfMostRecent();
+                scrollTo(0, mLastScrollPosition);
+            }
+        });
+    }
+
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+        if (mVelocityTracker == null) {
+            mVelocityTracker = VelocityTracker.obtain();
+        }
+        mVelocityTracker.addMovement(ev);
+        switch (ev.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                mDragging = false;
+                mLastX = ev.getX();
+                break;
+
+            case MotionEvent.ACTION_MOVE:
+                float delta = ev.getX() - mLastX;
+                Log.v(TAG, "ACTION_MOVE : " + delta);
+                if (Math.abs(delta) > THRESHHOLD) {
+                    mDragging = true;
+                }
+                break;
+
+            case MotionEvent.ACTION_UP:
+                mDragging = false;
+                break;
+        }
+        return mDragging ? true : super.onInterceptTouchEvent(ev);
+    }
+
+    private float getAlphaForOffset(View view, float thumbWidth) {
+        final float fadeWidth = FADE_CONSTANT * thumbWidth;
+        float result = 1.0f;
+        if (view.getX() >= thumbWidth) {
+            result = 1.0f - (view.getX() - thumbWidth) / fadeWidth;
+        } else if (view.getX() < 0.0f) {
+            result = 1.0f + (thumbWidth + view.getX()) / fadeWidth;
+        }
+        Log.v(TAG, "FADE AMOUNT: " + result);
+        return result;
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent ev) {
+        if (!mDragging) {
+            return super.onTouchEvent(ev);
+        }
+
+        mVelocityTracker.addMovement(ev);
+
+        final View animView = mCurrentView;
+        // TODO: Cache thumbnail
+        final View thumb = animView.findViewById(R.id.app_thumbnail);
+        switch (ev.getAction()) {
+            case MotionEvent.ACTION_MOVE:
+                if (animView != null) {
+                    final float delta = ev.getX() - mLastX;
+                    animView.setX(animView.getX() + delta);
+                    animView.setAlpha(getAlphaForOffset(animView, thumb.getWidth()));
+                    invalidateGlobalRegion(animView);
+                }
+                mLastX = ev.getX();
+                break;
+
+            case MotionEvent.ACTION_UP:
+                final ObjectAnimator anim;
+                if (animView != null) {
+                    final VelocityTracker velocityTracker = mVelocityTracker;
+                    velocityTracker.computeCurrentVelocity(1000, 10000);
+                    final float velocityX = velocityTracker.getXVelocity();
+                    final float velocityY = velocityTracker.getYVelocity();
+                    final float curX = animView.getX();
+                    final float newX = (velocityX >= 0.0f ? 1 : -1) * animView.getWidth();
+
+                    if (Math.abs(velocityX) > Math.abs(velocityY)
+                            && Math.abs(velocityX) > ESCAPE_VELOCITY
+                            && (velocityX > 0.0f) == (animView.getX() >= 0)) {
+                        final long duration =
+                            (long) (Math.abs(newX-curX) * 1000.0f / Math.abs(velocityX));
+                        anim = ObjectAnimator.ofFloat(animView, "x", curX, newX);
+                        anim.setInterpolator(new LinearInterpolator());
+                        final int swipeDirection = animView.getX() >= 0.0f ?
+                                RecentsCallback.SWIPE_RIGHT : RecentsCallback.SWIPE_LEFT;
+                        anim.addListener(new AnimatorListener() {
+                            public void onAnimationStart(Animator animation) {
+                            }
+                            public void onAnimationRepeat(Animator animation) {
+                            }
+                            public void onAnimationEnd(Animator animation) {
+                                mLinearLayout.removeView(mCurrentView);
+                                mCallback.handleSwipe(animView, swipeDirection);
+                            }
+                            public void onAnimationCancel(Animator animation) {
+                                mLinearLayout.removeView(mCurrentView);
+                                mCallback.handleSwipe(animView, swipeDirection);
+                            }
+                        });
+                        anim.setDuration(duration);
+                    } else { // Animate back to position
+                        final long duration = Math.abs(velocityX) > 0.0f ?
+                                (long) (Math.abs(newX-curX) * 1000.0f / Math.abs(velocityX))
+                                : SNAP_BACK_DURATION;
+                        anim = ObjectAnimator.ofFloat(animView, "x", animView.getX(), 0.0f);
+                        anim.setInterpolator(new DecelerateInterpolator(4.0f));
+                        anim.setDuration(duration);
+                    }
+
+                    anim.addUpdateListener(new AnimatorUpdateListener() {
+                        public void onAnimationUpdate(ValueAnimator animation) {
+                            animView.setAlpha(getAlphaForOffset(animView, thumb.getWidth()));
+                            invalidateGlobalRegion(animView);
+                        }
+                    });
+                    anim.start();
+                }
+
+                mVelocityTracker.recycle();
+                mVelocityTracker = null;
+                break;
+        }
+        return true;
+    }
+
+    void invalidateGlobalRegion(View view) {
+        RectF childBounds
+                = new RectF(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
+        childBounds.offset(view.getX(), view.getY());
+        if (DEBUG_INVALIDATE) Log.v(TAG, "-------------");
+        while (view.getParent() != null && view.getParent() instanceof View) {
+            view = (View) view.getParent();
+            view.getMatrix().mapRect(childBounds);
+            view.invalidate((int) Math.floor(childBounds.left),
+                    (int) Math.floor(childBounds.top),
+                    (int) Math.ceil(childBounds.right),
+                    (int) Math.ceil(childBounds.bottom));
+            if (DEBUG_INVALIDATE) {
+                Log.v(TAG, "INVALIDATE(" + (int) Math.floor(childBounds.left)
+                        + "," + (int) Math.floor(childBounds.top)
+                        + "," + (int) Math.ceil(childBounds.right)
+                        + "," + (int) Math.ceil(childBounds.bottom));
+            }
+        }
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+        LayoutInflater inflater = (LayoutInflater)
+                mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+        setScrollbarFadingEnabled(true);
+
+        mLinearLayout = (LinearLayout) findViewById(R.id.recents_linear_layout);
+
+        final int leftPadding = mContext.getResources()
+            .getDimensionPixelOffset(R.dimen.status_bar_recents_thumbnail_left_margin);
+        setOverScrollEffectPadding(leftPadding, 0);
+    }
+
+    private void setOverScrollEffectPadding(int leftPadding, int i) {
+        // TODO Add to (Vertical)ScrollView
+    }
+
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+        // Keep track of the last visible item in the list so we can restore it
+        // to the bottom when the orientation changes.
+        mLastScrollPosition = scrollPositionOfMostRecent();
+
+        // This has to happen post-layout, so run it "in the future"
+        post(new Runnable() {
+            public void run() {
+                scrollTo(0, mLastScrollPosition);
+            }
+        });
+    }
+
+    @Override
+    protected void onVisibilityChanged(View changedView, int visibility) {
+        super.onVisibilityChanged(changedView, visibility);
+        // scroll to bottom after reloading
+        if (visibility == View.VISIBLE && changedView == this) {
+            post(new Runnable() {
+                public void run() {
+                    update();
+                }
+            });
+        }
+    }
+
+    public void setAdapter(ActvityDescriptionAdapter adapter) {
+        mAdapter = adapter;
+        mAdapter.registerDataSetObserver(new DataSetObserver() {
+            public void onChanged() {
+                update();
+            }
+
+            public void onInvalidated() {
+                update();
+            }
+        });
+    }
+
+    @Override
+    public void setLayoutTransition(LayoutTransition transition) {
+        // The layout transition applies to our embedded LinearLayout
+        mLinearLayout.setLayoutTransition(transition);
+    }
+
+    public void onClick(View view) {
+        mCallback.handleOnClick(view);
+    }
+
+    public void setCallback(RecentsCallback callback) {
+        mCallback = callback;
+    }
+
+    public boolean onTouch(View v, MotionEvent event) {
+        mCurrentView = v;
+        return false;
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsActivity.java b/packages/SystemUI/src/com/android/systemui/recent/carousel/RecentApplicationsActivity.java
similarity index 99%
rename from packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsActivity.java
rename to packages/SystemUI/src/com/android/systemui/recent/carousel/RecentApplicationsActivity.java
index 7d4629e..45e230f 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/carousel/RecentApplicationsActivity.java
@@ -15,7 +15,7 @@
  */
 
 
-package com.android.systemui.recent;
+package com.android.systemui.recent.carousel;
 
 import com.android.systemui.R;
 
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsCarouselView.java b/packages/SystemUI/src/com/android/systemui/recent/carousel/RecentApplicationsCarouselView.java
similarity index 95%
rename from packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsCarouselView.java
rename to packages/SystemUI/src/com/android/systemui/recent/carousel/RecentApplicationsCarouselView.java
index 1c8ec95..1afb086 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentApplicationsCarouselView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/carousel/RecentApplicationsCarouselView.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.systemui.recent;
+package com.android.systemui.recent.carousel;
 
 import android.content.Context;
 import android.util.AttributeSet;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
index f74fcc6..91c3cc1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
@@ -71,7 +71,8 @@
 import com.android.systemui.statusbar.policy.LocationController;
 import com.android.systemui.statusbar.policy.NetworkController;
 import com.android.systemui.statusbar.policy.Prefs;
-import com.android.systemui.recent.RecentApplicationsActivity;
+import com.android.systemui.recent.RecentsPanelView;
+import com.android.systemui.recent.carousel.RecentApplicationsActivity;
 
 public class TabletStatusBar extends StatusBar implements
         HeightReceiver.OnBarHeightChangedListener,
@@ -162,7 +163,7 @@
     // for disabling the status bar
     int mDisabled = 0;
 
-    private RecentAppsPanel mRecentsPanel;
+    private RecentsPanelView mRecentsPanel;
     private InputMethodsPanel mInputMethodsPanel;
 
     public Context getContext() { return mContext; }
@@ -253,7 +254,7 @@
         WindowManagerImpl.getDefault().addView(mNotificationPeekWindow, lp);
 
         // Recents Panel
-        mRecentsPanel = (RecentAppsPanel) View.inflate(context,
+        mRecentsPanel = (RecentsPanelView) View.inflate(context,
                 R.layout.status_bar_recent_panel, null);
         mRecentsPanel.setVisibility(View.GONE);
         mRecentsPanel.setOnTouchListener(new TouchOutsideListener(MSG_CLOSE_RECENTS_PANEL,
@@ -1195,7 +1196,7 @@
                     if (mVT != null) {
                         if (action == MotionEvent.ACTION_UP
                          // was this a sloppy tap?
-                         && Math.abs(event.getX() - mInitialTouchX) < mTouchSlop 
+                         && Math.abs(event.getX() - mInitialTouchX) < mTouchSlop
                          && Math.abs(event.getY() - mInitialTouchY) < (mTouchSlop / 3)
                          // dragging off the bottom doesn't count
                          && (int)event.getY() < v.getBottom()) {
@@ -1298,7 +1299,7 @@
                     if (!peeking) {
                         if (action == MotionEvent.ACTION_UP
                                 // was this a sloppy tap?
-                                && Math.abs(event.getX() - mInitialTouchX) < mTouchSlop 
+                                && Math.abs(event.getX() - mInitialTouchX) < mTouchSlop
                                 && Math.abs(event.getY() - mInitialTouchY) < (mTouchSlop / 3)
                                 // dragging off the bottom doesn't count
                                 && (int)event.getY() < v.getBottom()) {
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index f34044d..e48dbe9 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -231,7 +231,7 @@
     boolean mSafeMode;
     WindowState mStatusBar = null;
     boolean mStatusBarCanHide;
-    int mScreenMarginBottom;
+    int mStatusBarHeight;
     final ArrayList<WindowState> mStatusBarPanels = new ArrayList<WindowState>();
     WindowState mNavigationBar = null;
 
@@ -1083,12 +1083,20 @@
         return STATUS_BAR_LAYER;
     }
 
-    public int getNonDecorDisplayWidth(int fullWidth) {
+    public int getNonDecorDisplayWidth(int rotation, int fullWidth) {
         return fullWidth;
     }
 
-    public int getNonDecorDisplayHeight(int fullHeight) {
-        return fullHeight - mScreenMarginBottom;
+    public int getNonDecorDisplayHeight(int rotation, int fullHeight) {
+        return mStatusBarCanHide ? fullHeight : (fullHeight - mStatusBarHeight);
+    }
+
+    public int getConfigDisplayWidth(int rotation, int fullWidth) {
+        return fullWidth;
+    }
+
+    public int getConfigDisplayHeight(int rotation, int fullHeight) {
+        return fullHeight - mStatusBarHeight;
     }
 
     public boolean doesForceHide(WindowState win, WindowManager.LayoutParams attrs) {
@@ -1240,8 +1248,8 @@
                 // The Configuration will be stable by now, so we can load this
                 mStatusBarCanHide = mContext.getResources().getBoolean(
                         com.android.internal.R.bool.config_statusBarCanHide);
-                mScreenMarginBottom = mContext.getResources().getDimensionPixelSize(
-                        com.android.internal.R.dimen.screen_margin_bottom);
+                mStatusBarHeight = mContext.getResources().getDimensionPixelSize(
+                        com.android.internal.R.dimen.status_bar_height);
 
                 break;
             case TYPE_NAVIGATION_BAR:
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index a6ba1a0..8e86eda 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -87,40 +87,20 @@
 static const nsecs_t kWarningThrottle = seconds(5);
 
 
-#define AUDIOFLINGER_SECURITY_ENABLED 1
-
 // ----------------------------------------------------------------------------
 
 static bool recordingAllowed() {
-#ifndef HAVE_ANDROID_OS
-    return true;
-#endif
-#if AUDIOFLINGER_SECURITY_ENABLED
     if (getpid() == IPCThreadState::self()->getCallingPid()) return true;
     bool ok = checkCallingPermission(String16("android.permission.RECORD_AUDIO"));
     if (!ok) LOGE("Request requires android.permission.RECORD_AUDIO");
     return ok;
-#else
-    if (!checkCallingPermission(String16("android.permission.RECORD_AUDIO")))
-        LOGW("WARNING: Need to add android.permission.RECORD_AUDIO to manifest");
-    return true;
-#endif
 }
 
 static bool settingsAllowed() {
-#ifndef HAVE_ANDROID_OS
-    return true;
-#endif
-#if AUDIOFLINGER_SECURITY_ENABLED
     if (getpid() == IPCThreadState::self()->getCallingPid()) return true;
     bool ok = checkCallingPermission(String16("android.permission.MODIFY_AUDIO_SETTINGS"));
     if (!ok) LOGE("Request requires android.permission.MODIFY_AUDIO_SETTINGS");
     return ok;
-#else
-    if (!checkCallingPermission(String16("android.permission.MODIFY_AUDIO_SETTINGS")))
-        LOGW("WARNING: Need to add android.permission.MODIFY_AUDIO_SETTINGS to manifest");
-    return true;
-#endif
 }
 
 // To collect the amplifier usage
diff --git a/services/input/EventHub.cpp b/services/input/EventHub.cpp
index ff4b11a..af30887 100644
--- a/services/input/EventHub.cpp
+++ b/services/input/EventHub.cpp
@@ -101,7 +101,7 @@
         const InputDeviceIdentifier& identifier) :
         next(NULL),
         fd(fd), id(id), path(path), identifier(identifier),
-        classes(0), keyBitmask(NULL), relBitmask(NULL),
+        classes(0), keyBitmask(NULL), relBitmask(NULL), propBitmask(NULL),
         configuration(NULL), virtualKeyMap(NULL) {
 }
 
@@ -109,6 +109,7 @@
     close();
     delete[] keyBitmask;
     delete[] relBitmask;
+    delete[] propBitmask;
     delete configuration;
     delete virtualKeyMap;
 }
@@ -205,6 +206,18 @@
     return false;
 }
 
+bool EventHub::hasInputProperty(int32_t deviceId, int property) const {
+    if (property >= 0 && property <= INPUT_PROP_MAX) {
+        AutoMutex _l(mLock);
+
+        Device* device = getDeviceLocked(deviceId);
+        if (device && device->propBitmask) {
+            return test_bit(property, device->propBitmask);
+        }
+    }
+    return false;
+}
+
 int32_t EventHub::getScanCodeState(int32_t deviceId, int32_t scanCode) const {
     if (scanCode >= 0 && scanCode <= KEY_MAX) {
         AutoMutex _l(mLock);
@@ -834,23 +847,23 @@
     memset(sw_bitmask, 0, sizeof(sw_bitmask));
     ioctl(fd, EVIOCGBIT(EV_SW, sizeof(sw_bitmask)), sw_bitmask);
 
+    uint8_t prop_bitmask[sizeof_bit_array(INPUT_PROP_MAX + 1)];
+    memset(prop_bitmask, 0, sizeof(prop_bitmask));
+    ioctl(fd, EVIOCGPROP(sizeof(prop_bitmask)), prop_bitmask);
+
     device->keyBitmask = new uint8_t[sizeof(key_bitmask)];
-    if (device->keyBitmask != NULL) {
-        memcpy(device->keyBitmask, key_bitmask, sizeof(key_bitmask));
-    } else {
+    device->relBitmask = new uint8_t[sizeof(rel_bitmask)];
+    device->propBitmask = new uint8_t[sizeof(prop_bitmask)];
+
+    if (!device->keyBitmask || !device->relBitmask || !device->propBitmask) {
         delete device;
-        LOGE("out of memory allocating key bitmask");
+        LOGE("out of memory allocating bitmasks");
         return -1;
     }
 
-    device->relBitmask = new uint8_t[sizeof(rel_bitmask)];
-    if (device->relBitmask != NULL) {
-        memcpy(device->relBitmask, rel_bitmask, sizeof(rel_bitmask));
-    } else {
-        delete device;
-        LOGE("out of memory allocating rel bitmask");
-        return -1;
-    }
+    memcpy(device->keyBitmask, key_bitmask, sizeof(key_bitmask));
+    memcpy(device->relBitmask, rel_bitmask, sizeof(rel_bitmask));
+    memcpy(device->propBitmask, prop_bitmask, sizeof(prop_bitmask));
 
     // See if this is a keyboard.  Ignore everything in the button range except for
     // joystick and gamepad buttons which are handled like keyboards for the most part.
diff --git a/services/input/EventHub.h b/services/input/EventHub.h
index 4d26a95..ca33619 100644
--- a/services/input/EventHub.h
+++ b/services/input/EventHub.h
@@ -34,25 +34,38 @@
 
 #include <linux/input.h>
 
-/* These constants are not defined in linux/input.h but they are part of the multitouch
- * input protocol. */
+/* These constants are not defined in linux/input.h in the version of the kernel
+ * headers currently provided with Bionic. */
 
-#define ABS_MT_TOUCH_MAJOR 0x30  /* Major axis of touching ellipse */
-#define ABS_MT_TOUCH_MINOR 0x31  /* Minor axis (omit if circular) */
-#define ABS_MT_WIDTH_MAJOR 0x32  /* Major axis of approaching ellipse */
-#define ABS_MT_WIDTH_MINOR 0x33  /* Minor axis (omit if circular) */
-#define ABS_MT_ORIENTATION 0x34  /* Ellipse orientation */
-#define ABS_MT_POSITION_X 0x35   /* Center X ellipse position */
-#define ABS_MT_POSITION_Y 0x36   /* Center Y ellipse position */
-#define ABS_MT_TOOL_TYPE 0x37    /* Type of touching device (finger, pen, ...) */
-#define ABS_MT_BLOB_ID 0x38      /* Group a set of packets as a blob */
-#define ABS_MT_TRACKING_ID 0x39  /* Unique ID of initiated contact */
-#define ABS_MT_PRESSURE 0x3a     /* Pressure on contact area */
+#define EVIOCGPROP(len) _IOC(_IOC_READ, 'E', 0x09, len)
 
-#define MT_TOOL_FINGER 0 /* Identifies a finger */
-#define MT_TOOL_PEN 1    /* Identifies a pen */
+#define INPUT_PROP_POINTER 0x00
+#define INPUT_PROP_DIRECT 0x01
+#define INPUT_PROP_BUTTONPAD 0x02
+#define INPUT_PROP_SEMI_MT 0x03
+#define INPUT_PROP_MAX 0x1f
+#define INPUT_PROP_CNT (INPUT_PROP_MAX + 1)
+
+#define ABS_MT_SLOT 0x2f
+#define ABS_MT_TOUCH_MAJOR 0x30
+#define ABS_MT_TOUCH_MINOR 0x31
+#define ABS_MT_WIDTH_MAJOR 0x32
+#define ABS_MT_WIDTH_MINOR 0x33
+#define ABS_MT_ORIENTATION 0x34
+#define ABS_MT_POSITION_X 0x35
+#define ABS_MT_POSITION_Y 0x36
+#define ABS_MT_TOOL_TYPE 0x37
+#define ABS_MT_BLOB_ID 0x38
+#define ABS_MT_TRACKING_ID 0x39
+#define ABS_MT_PRESSURE 0x3a
+#define ABS_MT_DISTANCE 0x3b
+
+#define MT_TOOL_FINGER 0
+#define MT_TOOL_PEN 1
 
 #define SYN_MT_REPORT 2
+#define SYN_DROPPED 3
+
 
 /* Convenience constants. */
 
@@ -172,6 +185,8 @@
 
     virtual bool hasRelativeAxis(int32_t deviceId, int axis) const = 0;
 
+    virtual bool hasInputProperty(int32_t deviceId, int property) const = 0;
+
     virtual status_t mapKey(int32_t deviceId, int scancode,
             int32_t* outKeycode, uint32_t* outFlags) const = 0;
 
@@ -236,6 +251,8 @@
 
     virtual bool hasRelativeAxis(int32_t deviceId, int axis) const;
 
+    virtual bool hasInputProperty(int32_t deviceId, int property) const;
+
     virtual status_t mapKey(int32_t deviceId, int scancode,
             int32_t* outKeycode, uint32_t* outFlags) const;
 
@@ -286,6 +303,7 @@
         uint32_t classes;
         uint8_t* keyBitmask;
         uint8_t* relBitmask;
+        uint8_t* propBitmask;
         String8 configurationFile;
         PropertyMap* configuration;
         VirtualKeyMap* virtualKeyMap;
diff --git a/services/input/InputReader.cpp b/services/input/InputReader.cpp
index 6003207..25a2c78 100644
--- a/services/input/InputReader.cpp
+++ b/services/input/InputReader.cpp
@@ -58,6 +58,9 @@
 
 // --- Constants ---
 
+// Maximum number of slots supported when using the slot-based Multitouch Protocol B.
+static const size_t MAX_SLOTS = 32;
+
 // Quiet time between certain gesture transitions.
 // Time to allow for all fingers or buttons to settle into a stable state before
 // starting a new gesture.
@@ -809,7 +812,8 @@
 // --- InputDevice ---
 
 InputDevice::InputDevice(InputReaderContext* context, int32_t id, const String8& name) :
-        mContext(context), mId(id), mName(name), mSources(0), mIsExternal(false) {
+        mContext(context), mId(id), mName(name), mSources(0),
+        mIsExternal(false), mDropUntilNextSync(false) {
 }
 
 InputDevice::~InputDevice() {
@@ -898,9 +902,26 @@
                 rawEvent->value, rawEvent->flags);
 #endif
 
-        for (size_t i = 0; i < numMappers; i++) {
-            InputMapper* mapper = mMappers[i];
-            mapper->process(rawEvent);
+        if (mDropUntilNextSync) {
+            if (rawEvent->type == EV_SYN && rawEvent->scanCode == SYN_REPORT) {
+                mDropUntilNextSync = false;
+#if DEBUG_RAW_EVENTS
+                LOGD("Recovered from input event buffer overrun.");
+#endif
+            } else {
+#if DEBUG_RAW_EVENTS
+                LOGD("Dropped input event while waiting for next input sync.");
+#endif
+            }
+        } else if (rawEvent->type == EV_SYN && rawEvent->scanCode == SYN_DROPPED) {
+            LOGI("Detected input event buffer overrun for device %s.", mName.string());
+            mDropUntilNextSync = true;
+            reset();
+        } else {
+            for (size_t i = 0; i < numMappers; i++) {
+                InputMapper* mapper = mMappers[i];
+                mapper->process(rawEvent);
+            }
         }
     }
 }
@@ -1812,6 +1833,10 @@
             info->addMotionRange(mLocked.orientedRanges.orientation);
         }
 
+        if (mLocked.orientedRanges.haveDistance) {
+            info->addMotionRange(mLocked.orientedRanges.distance);
+        }
+
         if (mPointerController != NULL) {
             float minX, minY, maxX, maxY;
             if (mPointerController->getBounds(&minX, &minY, &maxX, &maxY)) {
@@ -1849,6 +1874,7 @@
         dump.appendFormat(INDENT4 "PressureScale: %0.3f\n", mLocked.pressureScale);
         dump.appendFormat(INDENT4 "SizeScale: %0.3f\n", mLocked.sizeScale);
         dump.appendFormat(INDENT4 "OrientationScale: %0.3f\n", mLocked.orientationScale);
+        dump.appendFormat(INDENT4 "DistanceScale: %0.3f\n", mLocked.distanceScale);
 
         dump.appendFormat(INDENT3 "Last Touch:\n");
         dump.appendFormat(INDENT4 "Pointer Count: %d\n", mLastTouch.pointerCount);
@@ -1889,6 +1915,7 @@
     mLocked.orientedRanges.haveTouchSize = false;
     mLocked.orientedRanges.haveToolSize = false;
     mLocked.orientedRanges.haveOrientation = false;
+    mLocked.orientedRanges.haveDistance = false;
 
     mPointerGesture.reset();
 }
@@ -1947,9 +1974,14 @@
         // The device is a cursor device with a touch pad attached.
         // By default don't use the touch pad to move the pointer.
         mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_PAD;
+    } else if (getEventHub()->hasInputProperty(getDeviceId(), INPUT_PROP_POINTER)) {
+        // The device is a pointing device like a track pad.
+        mParameters.deviceType = Parameters::DEVICE_TYPE_POINTER;
+    } else if (getEventHub()->hasInputProperty(getDeviceId(), INPUT_PROP_DIRECT)) {
+        // The device is a touch screen.
+        mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_SCREEN;
     } else {
-        // The device is just a touch pad.
-        // By default use the touch pad to move the pointer and to perform related gestures.
+        // The device is a touch pad of unknown purpose.
         mParameters.deviceType = Parameters::DEVICE_TYPE_POINTER;
     }
 
@@ -2016,6 +2048,9 @@
     mRawAxes.toolMajor.clear();
     mRawAxes.toolMinor.clear();
     mRawAxes.orientation.clear();
+    mRawAxes.distance.clear();
+    mRawAxes.trackingId.clear();
+    mRawAxes.slot.clear();
 }
 
 void TouchInputMapper::dumpRawAxes(String8& dump) {
@@ -2028,6 +2063,9 @@
     dumpRawAbsoluteAxisInfo(dump, mRawAxes.toolMajor, "ToolMajor");
     dumpRawAbsoluteAxisInfo(dump, mRawAxes.toolMinor, "ToolMinor");
     dumpRawAbsoluteAxisInfo(dump, mRawAxes.orientation, "Orientation");
+    dumpRawAbsoluteAxisInfo(dump, mRawAxes.distance, "Distance");
+    dumpRawAbsoluteAxisInfo(dump, mRawAxes.trackingId, "TrackingId");
+    dumpRawAbsoluteAxisInfo(dump, mRawAxes.slot, "Slot");
 }
 
 bool TouchInputMapper::configureSurfaceLocked() {
@@ -2234,6 +2272,8 @@
                 }
             }
 
+            mLocked.orientedRanges.haveOrientation = true;
+
             mLocked.orientedRanges.orientation.axis = AMOTION_EVENT_AXIS_ORIENTATION;
             mLocked.orientedRanges.orientation.source = mTouchSource;
             mLocked.orientedRanges.orientation.min = - M_PI_2;
@@ -2241,6 +2281,31 @@
             mLocked.orientedRanges.orientation.flat = 0;
             mLocked.orientedRanges.orientation.fuzz = 0;
         }
+
+        // Distance
+        mLocked.distanceScale = 0;
+        if (mCalibration.distanceCalibration != Calibration::DISTANCE_CALIBRATION_NONE) {
+            if (mCalibration.distanceCalibration
+                    == Calibration::DISTANCE_CALIBRATION_SCALED) {
+                if (mCalibration.haveDistanceScale) {
+                    mLocked.distanceScale = mCalibration.distanceScale;
+                } else {
+                    mLocked.distanceScale = 1.0f;
+                }
+            }
+
+            mLocked.orientedRanges.haveDistance = true;
+
+            mLocked.orientedRanges.distance.axis = AMOTION_EVENT_AXIS_DISTANCE;
+            mLocked.orientedRanges.distance.source = mTouchSource;
+            mLocked.orientedRanges.distance.min =
+                    mRawAxes.distance.minValue * mLocked.distanceScale;
+            mLocked.orientedRanges.distance.max =
+                    mRawAxes.distance.minValue * mLocked.distanceScale;
+            mLocked.orientedRanges.distance.flat = 0;
+            mLocked.orientedRanges.distance.fuzz =
+                    mRawAxes.distance.fuzz * mLocked.distanceScale;
+        }
     }
 
     if (orientationChanged || sizeChanged) {
@@ -2518,6 +2583,23 @@
                     orientationCalibrationString.string());
         }
     }
+
+    // Distance
+    out.distanceCalibration = Calibration::DISTANCE_CALIBRATION_DEFAULT;
+    String8 distanceCalibrationString;
+    if (in.tryGetProperty(String8("touch.distance.calibration"), distanceCalibrationString)) {
+        if (distanceCalibrationString == "none") {
+            out.distanceCalibration = Calibration::DISTANCE_CALIBRATION_NONE;
+        } else if (distanceCalibrationString == "scaled") {
+            out.distanceCalibration = Calibration::DISTANCE_CALIBRATION_SCALED;
+        } else if (distanceCalibrationString != "default") {
+            LOGW("Invalid value for touch.distance.calibration: '%s'",
+                    distanceCalibrationString.string());
+        }
+    }
+
+    out.haveDistanceScale = in.tryGetProperty(String8("touch.distance.scale"),
+            out.distanceScale);
 }
 
 void TouchInputMapper::resolveCalibration() {
@@ -2618,6 +2700,20 @@
     default:
         break;
     }
+
+    // Distance
+    switch (mCalibration.distanceCalibration) {
+    case Calibration::DISTANCE_CALIBRATION_DEFAULT:
+        if (mRawAxes.distance.valid) {
+            mCalibration.distanceCalibration = Calibration::DISTANCE_CALIBRATION_SCALED;
+        } else {
+            mCalibration.distanceCalibration = Calibration::DISTANCE_CALIBRATION_NONE;
+        }
+        break;
+
+    default:
+        break;
+    }
 }
 
 void TouchInputMapper::dumpCalibration(String8& dump) {
@@ -2740,6 +2836,23 @@
     default:
         LOG_ASSERT(false);
     }
+
+    // Distance
+    switch (mCalibration.distanceCalibration) {
+    case Calibration::DISTANCE_CALIBRATION_NONE:
+        dump.append(INDENT4 "touch.distance.calibration: none\n");
+        break;
+    case Calibration::DISTANCE_CALIBRATION_SCALED:
+        dump.append(INDENT4 "touch.distance.calibration: scaled\n");
+        break;
+    default:
+        LOG_ASSERT(false);
+    }
+
+    if (mCalibration.haveDistanceScale) {
+        dump.appendFormat(INDENT4 "touch.distance.scale: %0.3f\n",
+                mCalibration.distanceScale);
+    }
 }
 
 void TouchInputMapper::reset() {
@@ -3247,6 +3360,16 @@
             orientation = 0;
         }
 
+        // Distance
+        float distance;
+        switch (mCalibration.distanceCalibration) {
+        case Calibration::DISTANCE_CALIBRATION_SCALED:
+            distance = in.distance * mLocked.distanceScale;
+            break;
+        default:
+            distance = 0;
+        }
+
         // X and Y
         // Adjust coords for surface orientation.
         float x, y;
@@ -3289,6 +3412,9 @@
         out.setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, toolMajor);
         out.setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, toolMinor);
         out.setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, orientation);
+        if (distance != 0) {
+            out.setAxisValue(AMOTION_EVENT_AXIS_DISTANCE, distance);
+        }
 
         // Write output properties.
         PointerProperties& properties = mCurrentTouchProperties[i];
@@ -5020,13 +5146,13 @@
 
 SingleTouchInputMapper::SingleTouchInputMapper(InputDevice* device) :
         TouchInputMapper(device) {
-    initialize();
+    clearState();
 }
 
 SingleTouchInputMapper::~SingleTouchInputMapper() {
 }
 
-void SingleTouchInputMapper::initialize() {
+void SingleTouchInputMapper::clearState() {
     mAccumulator.clear();
 
     mDown = false;
@@ -5040,7 +5166,7 @@
 void SingleTouchInputMapper::reset() {
     TouchInputMapper::reset();
 
-    initialize();
+    clearState();
  }
 
 void SingleTouchInputMapper::process(const RawEvent* rawEvent) {
@@ -5144,6 +5270,7 @@
         mCurrentTouch.pointers[0].toolMajor = mToolWidth;
         mCurrentTouch.pointers[0].toolMinor = mToolWidth;
         mCurrentTouch.pointers[0].orientation = 0;
+        mCurrentTouch.pointers[0].distance = 0;
         mCurrentTouch.pointers[0].isStylus = false; // TODO: Set stylus
         mCurrentTouch.idToIndex[0] = 0;
         mCurrentTouch.idBits.markBit(0);
@@ -5168,22 +5295,22 @@
 // --- MultiTouchInputMapper ---
 
 MultiTouchInputMapper::MultiTouchInputMapper(InputDevice* device) :
-        TouchInputMapper(device) {
-    initialize();
+        TouchInputMapper(device), mSlotCount(0), mUsingSlotsProtocol(false) {
+    clearState();
 }
 
 MultiTouchInputMapper::~MultiTouchInputMapper() {
 }
 
-void MultiTouchInputMapper::initialize() {
-    mAccumulator.clear();
+void MultiTouchInputMapper::clearState() {
+    mAccumulator.clear(mSlotCount);
     mButtonState = 0;
 }
 
 void MultiTouchInputMapper::reset() {
     TouchInputMapper::reset();
 
-    initialize();
+    clearState();
 }
 
 void MultiTouchInputMapper::process(const RawEvent* rawEvent) {
@@ -5203,45 +5330,69 @@
     }
 
     case EV_ABS: {
-        uint32_t pointerIndex = mAccumulator.pointerCount;
-        Accumulator::Pointer* pointer = & mAccumulator.pointers[pointerIndex];
+        bool newSlot = false;
+        if (mUsingSlotsProtocol && rawEvent->scanCode == ABS_MT_SLOT) {
+            mAccumulator.currentSlot = rawEvent->value;
+            newSlot = true;
+        }
+
+        if (mAccumulator.currentSlot < 0 || size_t(mAccumulator.currentSlot) >= mSlotCount) {
+            if (newSlot) {
+#if DEBUG_POINTERS
+                LOGW("MultiTouch device %s emitted invalid slot index %d but it "
+                        "should be between 0 and %d; ignoring this slot.",
+                        getDeviceName().string(), mAccumulator.currentSlot, mSlotCount);
+#endif
+            }
+            break;
+        }
+
+        Accumulator::Slot* slot = &mAccumulator.slots[mAccumulator.currentSlot];
 
         switch (rawEvent->scanCode) {
         case ABS_MT_POSITION_X:
-            pointer->fields |= Accumulator::FIELD_ABS_MT_POSITION_X;
-            pointer->absMTPositionX = rawEvent->value;
+            slot->fields |= Accumulator::FIELD_ABS_MT_POSITION_X;
+            slot->absMTPositionX = rawEvent->value;
             break;
         case ABS_MT_POSITION_Y:
-            pointer->fields |= Accumulator::FIELD_ABS_MT_POSITION_Y;
-            pointer->absMTPositionY = rawEvent->value;
+            slot->fields |= Accumulator::FIELD_ABS_MT_POSITION_Y;
+            slot->absMTPositionY = rawEvent->value;
             break;
         case ABS_MT_TOUCH_MAJOR:
-            pointer->fields |= Accumulator::FIELD_ABS_MT_TOUCH_MAJOR;
-            pointer->absMTTouchMajor = rawEvent->value;
+            slot->fields |= Accumulator::FIELD_ABS_MT_TOUCH_MAJOR;
+            slot->absMTTouchMajor = rawEvent->value;
             break;
         case ABS_MT_TOUCH_MINOR:
-            pointer->fields |= Accumulator::FIELD_ABS_MT_TOUCH_MINOR;
-            pointer->absMTTouchMinor = rawEvent->value;
+            slot->fields |= Accumulator::FIELD_ABS_MT_TOUCH_MINOR;
+            slot->absMTTouchMinor = rawEvent->value;
             break;
         case ABS_MT_WIDTH_MAJOR:
-            pointer->fields |= Accumulator::FIELD_ABS_MT_WIDTH_MAJOR;
-            pointer->absMTWidthMajor = rawEvent->value;
+            slot->fields |= Accumulator::FIELD_ABS_MT_WIDTH_MAJOR;
+            slot->absMTWidthMajor = rawEvent->value;
             break;
         case ABS_MT_WIDTH_MINOR:
-            pointer->fields |= Accumulator::FIELD_ABS_MT_WIDTH_MINOR;
-            pointer->absMTWidthMinor = rawEvent->value;
+            slot->fields |= Accumulator::FIELD_ABS_MT_WIDTH_MINOR;
+            slot->absMTWidthMinor = rawEvent->value;
             break;
         case ABS_MT_ORIENTATION:
-            pointer->fields |= Accumulator::FIELD_ABS_MT_ORIENTATION;
-            pointer->absMTOrientation = rawEvent->value;
+            slot->fields |= Accumulator::FIELD_ABS_MT_ORIENTATION;
+            slot->absMTOrientation = rawEvent->value;
             break;
         case ABS_MT_TRACKING_ID:
-            pointer->fields |= Accumulator::FIELD_ABS_MT_TRACKING_ID;
-            pointer->absMTTrackingId = rawEvent->value;
+            if (mUsingSlotsProtocol && rawEvent->value < 0) {
+                slot->clear();
+            } else {
+                slot->fields |= Accumulator::FIELD_ABS_MT_TRACKING_ID;
+                slot->absMTTrackingId = rawEvent->value;
+            }
             break;
         case ABS_MT_PRESSURE:
-            pointer->fields |= Accumulator::FIELD_ABS_MT_PRESSURE;
-            pointer->absMTPressure = rawEvent->value;
+            slot->fields |= Accumulator::FIELD_ABS_MT_PRESSURE;
+            slot->absMTPressure = rawEvent->value;
+            break;
+        case ABS_MT_TOOL_TYPE:
+            slot->fields |= Accumulator::FIELD_ABS_MT_TOOL_TYPE;
+            slot->absMTToolType = rawEvent->value;
             break;
         }
         break;
@@ -5251,19 +5402,7 @@
         switch (rawEvent->scanCode) {
         case SYN_MT_REPORT: {
             // MultiTouch Sync: The driver has returned all data for *one* of the pointers.
-            uint32_t pointerIndex = mAccumulator.pointerCount;
-
-            if (mAccumulator.pointers[pointerIndex].fields) {
-                if (pointerIndex == MAX_POINTERS) {
-                    LOGW("MultiTouch device driver returned more than maximum of %d pointers.",
-                            MAX_POINTERS);
-                } else {
-                    pointerIndex += 1;
-                    mAccumulator.pointerCount = pointerIndex;
-                }
-            }
-
-            mAccumulator.pointers[pointerIndex].clear();
+            mAccumulator.currentSlot += 1;
             break;
         }
 
@@ -5279,99 +5418,120 @@
     static const uint32_t REQUIRED_FIELDS =
             Accumulator::FIELD_ABS_MT_POSITION_X | Accumulator::FIELD_ABS_MT_POSITION_Y;
 
-    uint32_t inCount = mAccumulator.pointerCount;
-    uint32_t outCount = 0;
+    size_t inCount = mSlotCount;
+    size_t outCount = 0;
     bool havePointerIds = true;
 
     mCurrentTouch.clear();
 
-    for (uint32_t inIndex = 0; inIndex < inCount; inIndex++) {
-        const Accumulator::Pointer& inPointer = mAccumulator.pointers[inIndex];
-        uint32_t fields = inPointer.fields;
+    for (size_t inIndex = 0; inIndex < inCount; inIndex++) {
+        const Accumulator::Slot& inSlot = mAccumulator.slots[inIndex];
+        uint32_t fields = inSlot.fields;
 
         if ((fields & REQUIRED_FIELDS) != REQUIRED_FIELDS) {
             // Some drivers send empty MT sync packets without X / Y to indicate a pointer up.
+            // This may also indicate an unused slot.
             // Drop this finger.
             continue;
         }
 
+        if (outCount >= MAX_POINTERS) {
+#if DEBUG_POINTERS
+            LOGD("MultiTouch device %s emitted more than maximum of %d pointers; "
+                    "ignoring the rest.",
+                    getDeviceName().string(), MAX_POINTERS);
+#endif
+            break; // too many fingers!
+        }
+
         PointerData& outPointer = mCurrentTouch.pointers[outCount];
-        outPointer.x = inPointer.absMTPositionX;
-        outPointer.y = inPointer.absMTPositionY;
+        outPointer.x = inSlot.absMTPositionX;
+        outPointer.y = inSlot.absMTPositionY;
 
         if (fields & Accumulator::FIELD_ABS_MT_PRESSURE) {
-            if (inPointer.absMTPressure <= 0) {
-                // Some devices send sync packets with X / Y but with a 0 pressure to indicate
-                // a pointer going up.  Drop this finger.
-                continue;
-            }
-            outPointer.pressure = inPointer.absMTPressure;
+            outPointer.pressure = inSlot.absMTPressure;
         } else {
             // Default pressure to 0 if absent.
             outPointer.pressure = 0;
         }
 
         if (fields & Accumulator::FIELD_ABS_MT_TOUCH_MAJOR) {
-            if (inPointer.absMTTouchMajor <= 0) {
+            if (inSlot.absMTTouchMajor <= 0) {
                 // Some devices send sync packets with X / Y but with a 0 touch major to indicate
                 // a pointer going up.  Drop this finger.
                 continue;
             }
-            outPointer.touchMajor = inPointer.absMTTouchMajor;
+            outPointer.touchMajor = inSlot.absMTTouchMajor;
         } else {
             // Default touch area to 0 if absent.
             outPointer.touchMajor = 0;
         }
 
         if (fields & Accumulator::FIELD_ABS_MT_TOUCH_MINOR) {
-            outPointer.touchMinor = inPointer.absMTTouchMinor;
+            outPointer.touchMinor = inSlot.absMTTouchMinor;
         } else {
             // Assume touch area is circular.
             outPointer.touchMinor = outPointer.touchMajor;
         }
 
         if (fields & Accumulator::FIELD_ABS_MT_WIDTH_MAJOR) {
-            outPointer.toolMajor = inPointer.absMTWidthMajor;
+            outPointer.toolMajor = inSlot.absMTWidthMajor;
         } else {
             // Default tool area to 0 if absent.
             outPointer.toolMajor = 0;
         }
 
         if (fields & Accumulator::FIELD_ABS_MT_WIDTH_MINOR) {
-            outPointer.toolMinor = inPointer.absMTWidthMinor;
+            outPointer.toolMinor = inSlot.absMTWidthMinor;
         } else {
             // Assume tool area is circular.
             outPointer.toolMinor = outPointer.toolMajor;
         }
 
         if (fields & Accumulator::FIELD_ABS_MT_ORIENTATION) {
-            outPointer.orientation = inPointer.absMTOrientation;
+            outPointer.orientation = inSlot.absMTOrientation;
         } else {
             // Default orientation to vertical if absent.
             outPointer.orientation = 0;
         }
 
-        outPointer.isStylus = false; // TODO: Handle stylus
+        if (fields & Accumulator::FIELD_ABS_MT_DISTANCE) {
+            outPointer.distance = inSlot.absMTDistance;
+        } else {
+            // Default distance is 0 (direct contact).
+            outPointer.distance = 0;
+        }
+
+        if (fields & Accumulator::FIELD_ABS_MT_TOOL_TYPE) {
+            outPointer.isStylus = (inSlot.absMTToolType == MT_TOOL_PEN);
+        } else {
+            // Assume this is not a stylus.
+            outPointer.isStylus = false;
+        }
 
         // Assign pointer id using tracking id if available.
         if (havePointerIds) {
-            if (fields & Accumulator::FIELD_ABS_MT_TRACKING_ID) {
-                uint32_t id = uint32_t(inPointer.absMTTrackingId);
+            int32_t id;
+            if (mUsingSlotsProtocol) {
+                id = inIndex;
+            } else if (fields & Accumulator::FIELD_ABS_MT_TRACKING_ID) {
+                id = inSlot.absMTTrackingId;
+            } else {
+                id = -1;
+            }
 
-                if (id > MAX_POINTER_ID) {
+            if (id >= 0 && id <= MAX_POINTER_ID) {
+                outPointer.id = id;
+                mCurrentTouch.idToIndex[id] = outCount;
+                mCurrentTouch.idBits.markBit(id);
+            } else {
+                if (id >= 0) {
 #if DEBUG_POINTERS
-                    LOGD("Pointers: Ignoring driver provided pointer id %d because "
-                            "it is larger than max supported id %d",
+                    LOGD("Pointers: Ignoring driver provided slot index or tracking id %d because "
+                            "it is larger than the maximum supported pointer id %d",
                             id, MAX_POINTER_ID);
 #endif
-                    havePointerIds = false;
                 }
-                else {
-                    outPointer.id = id;
-                    mCurrentTouch.idToIndex[id] = outCount;
-                    mCurrentTouch.idBits.markBit(id);
-                }
-            } else {
                 havePointerIds = false;
             }
         }
@@ -5386,20 +5546,40 @@
 
     syncTouch(when, havePointerIds);
 
-    mAccumulator.clear();
+    mAccumulator.clear(mUsingSlotsProtocol ? 0 : mSlotCount);
 }
 
 void MultiTouchInputMapper::configureRawAxes() {
     TouchInputMapper::configureRawAxes();
 
-    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_POSITION_X, & mRawAxes.x);
-    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_POSITION_Y, & mRawAxes.y);
-    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_TOUCH_MAJOR, & mRawAxes.touchMajor);
-    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_TOUCH_MINOR, & mRawAxes.touchMinor);
-    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_WIDTH_MAJOR, & mRawAxes.toolMajor);
-    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_WIDTH_MINOR, & mRawAxes.toolMinor);
-    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_ORIENTATION, & mRawAxes.orientation);
-    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_PRESSURE, & mRawAxes.pressure);
+    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_POSITION_X, &mRawAxes.x);
+    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_POSITION_Y, &mRawAxes.y);
+    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_TOUCH_MAJOR, &mRawAxes.touchMajor);
+    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_TOUCH_MINOR, &mRawAxes.touchMinor);
+    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_WIDTH_MAJOR, &mRawAxes.toolMajor);
+    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_WIDTH_MINOR, &mRawAxes.toolMinor);
+    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_ORIENTATION, &mRawAxes.orientation);
+    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_PRESSURE, &mRawAxes.pressure);
+    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_DISTANCE, &mRawAxes.distance);
+    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_TRACKING_ID, &mRawAxes.trackingId);
+    getEventHub()->getAbsoluteAxisInfo(getDeviceId(), ABS_MT_SLOT, &mRawAxes.slot);
+
+    if (mRawAxes.trackingId.valid
+            && mRawAxes.slot.valid && mRawAxes.slot.minValue == 0 && mRawAxes.slot.maxValue > 0) {
+        mSlotCount = mRawAxes.slot.maxValue + 1;
+        if (mSlotCount > MAX_SLOTS) {
+            LOGW("MultiTouch Device %s reported %d slots but the framework "
+                    "only supports a maximum of %d slots at this time.",
+                    getDeviceName().string(), mSlotCount, MAX_SLOTS);
+            mSlotCount = MAX_SLOTS;
+        }
+        mUsingSlotsProtocol = true;
+    } else {
+        mSlotCount = MAX_POINTERS;
+        mUsingSlotsProtocol = false;
+    }
+
+    mAccumulator.allocateSlots(mSlotCount);
 }
 
 
diff --git a/services/input/InputReader.h b/services/input/InputReader.h
index 62ac4b2..85338b6 100644
--- a/services/input/InputReader.h
+++ b/services/input/InputReader.h
@@ -331,6 +331,7 @@
     String8 mName;
     uint32_t mSources;
     bool mIsExternal;
+    bool mDropUntilNextSync;
 
     typedef int32_t (InputMapper::*GetStateFunc)(uint32_t sourceMask, int32_t code);
     int32_t getState(uint32_t sourceMask, int32_t code, GetStateFunc getStateFunc);
@@ -602,6 +603,7 @@
         int32_t toolMajor;
         int32_t toolMinor;
         int32_t orientation;
+        int32_t distance;
         bool isStylus;
 
         inline bool operator== (const PointerData& other) const {
@@ -613,7 +615,8 @@
                     && touchMinor == other.touchMinor
                     && toolMajor == other.toolMajor
                     && toolMinor == other.toolMinor
-                    && orientation == other.orientation;
+                    && orientation == other.orientation
+                    && distance == other.distance;
         }
         inline bool operator!= (const PointerData& other) const {
             return !(*this == other);
@@ -759,6 +762,17 @@
         };
 
         OrientationCalibration orientationCalibration;
+
+        // Distance
+        enum DistanceCalibration {
+            DISTANCE_CALIBRATION_DEFAULT,
+            DISTANCE_CALIBRATION_NONE,
+            DISTANCE_CALIBRATION_SCALED,
+        };
+
+        DistanceCalibration distanceCalibration;
+        bool haveDistanceScale;
+        float distanceScale;
     } mCalibration;
 
     // Raw axis information from the driver.
@@ -771,6 +785,9 @@
         RawAbsoluteAxisInfo toolMajor;
         RawAbsoluteAxisInfo toolMinor;
         RawAbsoluteAxisInfo orientation;
+        RawAbsoluteAxisInfo distance;
+        RawAbsoluteAxisInfo trackingId;
+        RawAbsoluteAxisInfo slot;
     } mRawAxes;
 
     // Current and previous touch sample data.
@@ -819,6 +836,8 @@
 
         float orientationScale;
 
+        float distanceScale;
+
         // Oriented motion ranges for input device info.
         struct OrientedRanges {
             InputDeviceInfo::MotionRange x;
@@ -840,6 +859,9 @@
 
             bool haveOrientation;
             InputDeviceInfo::MotionRange orientation;
+
+            bool haveDistance;
+            InputDeviceInfo::MotionRange distance;
         } orientedRanges;
 
         // Oriented dimensions and precision.
@@ -1146,7 +1168,7 @@
     int32_t mToolWidth;
     int32_t mButtonState;
 
-    void initialize();
+    void clearState();
 
     void sync(nsecs_t when);
 };
@@ -1166,20 +1188,21 @@
 private:
     struct Accumulator {
         enum {
-            FIELD_ABS_MT_POSITION_X = 1,
-            FIELD_ABS_MT_POSITION_Y = 2,
-            FIELD_ABS_MT_TOUCH_MAJOR = 4,
-            FIELD_ABS_MT_TOUCH_MINOR = 8,
-            FIELD_ABS_MT_WIDTH_MAJOR = 16,
-            FIELD_ABS_MT_WIDTH_MINOR = 32,
-            FIELD_ABS_MT_ORIENTATION = 64,
-            FIELD_ABS_MT_TRACKING_ID = 128,
-            FIELD_ABS_MT_PRESSURE = 256,
+            FIELD_ABS_MT_POSITION_X = 1 << 0,
+            FIELD_ABS_MT_POSITION_Y = 1 << 1,
+            FIELD_ABS_MT_TOUCH_MAJOR = 1 << 2,
+            FIELD_ABS_MT_TOUCH_MINOR = 1 << 3,
+            FIELD_ABS_MT_WIDTH_MAJOR = 1 << 4,
+            FIELD_ABS_MT_WIDTH_MINOR = 1 << 5,
+            FIELD_ABS_MT_ORIENTATION = 1 << 6,
+            FIELD_ABS_MT_TRACKING_ID = 1 << 7,
+            FIELD_ABS_MT_PRESSURE = 1 << 8,
+            FIELD_ABS_MT_TOOL_TYPE = 1 << 9,
+            FIELD_ABS_MT_DISTANCE = 1 << 10,
         };
 
-        uint32_t pointerCount;
-        struct Pointer {
-            uint32_t fields;
+        struct Slot {
+            uint32_t fields; // 0 if slot is unused
 
             int32_t absMTPositionX;
             int32_t absMTPositionY;
@@ -1190,27 +1213,56 @@
             int32_t absMTOrientation;
             int32_t absMTTrackingId;
             int32_t absMTPressure;
+            int32_t absMTToolType;
+            int32_t absMTDistance;
+
+            inline Slot() {
+                clear();
+            }
 
             inline void clear() {
                 fields = 0;
             }
-        } pointers[MAX_POINTERS + 1]; // + 1 to remove the need for extra range checks
+        };
+
+        // Current slot index.
+        int32_t currentSlot;
+
+        // Array of slots.
+        Slot* slots;
 
         // Bitfield of buttons that went down or up.
         uint32_t buttonDown;
         uint32_t buttonUp;
 
-        inline void clear() {
-            pointerCount = 0;
-            pointers[0].clear();
+        Accumulator() : slots(NULL) {
+            clear(false);
+        }
+
+        ~Accumulator() {
+            delete[] slots;
+        }
+
+        void allocateSlots(size_t slotCount) {
+            slots = new Slot[slotCount];
+        }
+
+        void clear(size_t slotCount) {
+            for (size_t i = 0; i < slotCount; i++) {
+                slots[i].clear();
+            }
+            currentSlot = 0;
             buttonDown = 0;
             buttonUp = 0;
         }
     } mAccumulator;
 
+    size_t mSlotCount;
+    bool mUsingSlotsProtocol;
+
     int32_t mButtonState;
 
-    void initialize();
+    void clearState();
 
     void sync(nsecs_t when);
 };
diff --git a/services/input/tests/InputReader_test.cpp b/services/input/tests/InputReader_test.cpp
index f5d7ae8..1ab2a3e 100644
--- a/services/input/tests/InputReader_test.cpp
+++ b/services/input/tests/InputReader_test.cpp
@@ -613,6 +613,10 @@
         return false;
     }
 
+    virtual bool hasInputProperty(int32_t deviceId, int property) const {
+        return false;
+    }
+
     virtual status_t mapKey(int32_t deviceId, int scancode,
             int32_t* outKeycode, uint32_t* outFlags) const {
         Device* device = getDevice(deviceId);
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index db831c7..d2fd04b 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -26,6 +26,7 @@
 import android.net.DummyDataStateTracker;
 import android.net.EthernetDataTracker;
 import android.net.IConnectivityManager;
+import android.net.LinkAddress;
 import android.net.LinkProperties;
 import android.net.MobileDataStateTracker;
 import android.net.NetworkConfig;
@@ -61,6 +62,7 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.net.InetAddress;
+import java.net.Inet4Address;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -125,6 +127,8 @@
 
     private AtomicBoolean mBackgroundDataEnabled = new AtomicBoolean(true);
 
+    private INetworkManagementService mNetd;
+
     private static final int ENABLED  = 1;
     private static final int DISABLED = 0;
 
@@ -539,11 +543,7 @@
      * active
      */
     public NetworkInfo getActiveNetworkInfo() {
-        enforceAccessPermission();
-        if (mActiveDefaultNetwork != -1) {
-            return mNetTrackers[mActiveDefaultNetwork].getNetworkInfo();
-        }
-        return null;
+        return getNetworkInfo(mActiveDefaultNetwork);
     }
 
     public NetworkInfo getNetworkInfo(int networkType) {
@@ -575,18 +575,7 @@
      * none is active
      */
     public LinkProperties getActiveLinkProperties() {
-        enforceAccessPermission();
-        for (int type=0; type <= ConnectivityManager.MAX_NETWORK_TYPE; type++) {
-            if (mNetConfigs[type] == null || !mNetConfigs[type].isDefault()) {
-                continue;
-            }
-            NetworkStateTracker t = mNetTrackers[type];
-            NetworkInfo info = t.getNetworkInfo();
-            if (info.isConnected()) {
-                return t.getLinkProperties();
-            }
-        }
-        return null;
+        return getLinkProperties(mActiveDefaultNetwork);
     }
 
     public LinkProperties getLinkProperties(int networkType) {
@@ -933,10 +922,6 @@
      * @return {@code true} on success, {@code false} on failure
      */
     private boolean addHostRoute(NetworkStateTracker nt, InetAddress hostAddress, int cycleCount) {
-        if (nt.getNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI) {
-            return false;
-        }
-
         LinkProperties lp = nt.getLinkProperties();
         if ((lp == null) || (hostAddress == null)) return false;
 
@@ -951,20 +936,28 @@
         }
 
         RouteInfo bestRoute = RouteInfo.selectBestRoute(lp.getRoutes(), hostAddress);
-        InetAddress gateway = null;
+        InetAddress gatewayAddress = null;
         if (bestRoute != null) {
-            gateway = bestRoute.getGateway();
+            gatewayAddress = bestRoute.getGateway();
             // if the best route is ourself, don't relf-reference, just add the host route
-            if (hostAddress.equals(gateway)) gateway = null;
+            if (hostAddress.equals(gatewayAddress)) gatewayAddress = null;
         }
-        if (gateway != null) {
+        if (gatewayAddress != null) {
             if (cycleCount > MAX_HOSTROUTE_CYCLE_COUNT) {
                 loge("Error adding hostroute - too much recursion");
                 return false;
             }
-            if (!addHostRoute(nt, gateway, cycleCount+1)) return false;
+            if (!addHostRoute(nt, gatewayAddress, cycleCount+1)) return false;
         }
-        return NetworkUtils.addHostRoute(interfaceName, hostAddress, gateway);
+
+        RouteInfo route = RouteInfo.makeHostRoute(hostAddress, gatewayAddress);
+
+        try {
+            mNetd.addRoute(interfaceName, route);
+            return true;
+        } catch (Exception ex) {
+            return false;
+        }
     }
 
     // TODO support the removal of single host routes.  Keep a ref count of them so we
@@ -1291,6 +1284,9 @@
     }
 
     void systemReady() {
+        IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
+        mNetd = INetworkManagementService.Stub.asInterface(b);
+
         synchronized(this) {
             mSystemReady = true;
             if (mInitialBroadcast != null) {
@@ -1399,6 +1395,12 @@
                 }
                 addPrivateDnsRoutes(mNetTrackers[netType]);
             }
+
+            /** Notify TetheringService if interface name has been changed. */
+            if (TextUtils.equals(mNetTrackers[netType].getNetworkInfo().getReason(),
+                                 Phone.REASON_LINK_PROPERTIES_CHANGED)) {
+                handleTetherIfaceChange(netType);
+            }
         } else {
             if (mNetConfigs[netType].isDefault()) {
                 removeDefaultRoute(mNetTrackers[netType]);
@@ -1421,7 +1423,6 @@
         if (interfaceName != null && !privateDnsRouteSet) {
             Collection<InetAddress> dnsList = p.getDnses();
             for (InetAddress dns : dnsList) {
-                if (DBG) log("  adding " + dns);
                 addHostRoute(nt, dns, 0);
             }
             nt.privateDnsRouteSet(true);
@@ -1429,8 +1430,6 @@
     }
 
     private void removePrivateDnsRoutes(NetworkStateTracker nt) {
-        // TODO - we should do this explicitly but the NetUtils api doesnt
-        // support this yet - must remove all.  No worse than before
         LinkProperties p = nt.getLinkProperties();
         if (p == null) return;
         String interfaceName = p.getInterfaceName();
@@ -1440,7 +1439,17 @@
                 log("removePrivateDnsRoutes for " + nt.getNetworkInfo().getTypeName() +
                         " (" + interfaceName + ")");
             }
-            NetworkUtils.removeHostRoutes(interfaceName);
+
+            Collection<InetAddress> dnsList = p.getDnses();
+            for (InetAddress dns : dnsList) {
+                if (DBG) log("  removing " + dns);
+                RouteInfo route = RouteInfo.makeHostRoute(dns);
+                try {
+                    mNetd.removeRoute(interfaceName, route);
+                } catch (Exception ex) {
+                    loge("error (" + ex + ") removing dns route " + route);
+                }
+            }
             nt.privateDnsRouteSet(false);
         }
     }
@@ -1451,19 +1460,27 @@
         if (p == null) return;
         String interfaceName = p.getInterfaceName();
         if (TextUtils.isEmpty(interfaceName)) return;
-        for (RouteInfo route : p.getRoutes()) {
 
+        for (RouteInfo route : p.getRoutes()) {
             //TODO - handle non-default routes
             if (route.isDefaultRoute()) {
+                if (DBG) log("adding default route " + route);
                 InetAddress gateway = route.getGateway();
-                if (addHostRoute(nt, gateway, 0) &&
-                        NetworkUtils.addDefaultRoute(interfaceName, gateway)) {
+                if (addHostRoute(nt, gateway, 0)) {
+                    try {
+                        mNetd.addRoute(interfaceName, route);
+                    } catch (Exception e) {
+                        loge("error adding default route " + route);
+                        continue;
+                    }
                     if (DBG) {
                         NetworkInfo networkInfo = nt.getNetworkInfo();
                         log("addDefaultRoute for " + networkInfo.getTypeName() +
                                 " (" + interfaceName + "), GatewayAddr=" +
                                 gateway.getHostAddress());
                     }
+                } else {
+                    loge("error adding host route for default route " + route);
                 }
             }
         }
@@ -1475,8 +1492,17 @@
         if (p == null) return;
         String interfaceName = p.getInterfaceName();
 
-        if (interfaceName != null) {
-            if (NetworkUtils.removeDefaultRoute(interfaceName) >= 0) {
+        if (interfaceName == null) return;
+
+        for (RouteInfo route : p.getRoutes()) {
+            //TODO - handle non-default routes
+            if (route.isDefaultRoute()) {
+                try {
+                    mNetd.removeRoute(interfaceName, route);
+                } catch (Exception ex) {
+                    loge("error (" + ex + ") removing default route " + route);
+                    continue;
+                }
                 if (DBG) {
                     NetworkInfo networkInfo = nt.getNetworkInfo();
                     log("removeDefaultRoute for " + networkInfo.getTypeName() + " (" +
@@ -2211,6 +2237,14 @@
         }
     }
 
+    private void handleTetherIfaceChange(int type) {
+        String iface = mNetTrackers[type].getLinkProperties().getInterfaceName();
+
+        if (isTetheringSupported()) {
+            mTethering.handleTetherIfaceChange(iface);
+        }
+    }
+
     private void log(String s) {
         Slog.d(TAG, s);
     }
diff --git a/services/java/com/android/server/DevicePolicyManagerService.java b/services/java/com/android/server/DevicePolicyManagerService.java
index df2cd1b..92d76be 100644
--- a/services/java/com/android/server/DevicePolicyManagerService.java
+++ b/services/java/com/android/server/DevicePolicyManagerService.java
@@ -134,18 +134,43 @@
         final DeviceAdminInfo info;
 
         int passwordQuality = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
-        int minimumPasswordLength = 0;
-        int passwordHistoryLength = 0;
-        int minimumPasswordUpperCase = 0;
-        int minimumPasswordLowerCase = 0;
-        int minimumPasswordLetters = 1;
-        int minimumPasswordNumeric = 1;
-        int minimumPasswordSymbols = 1;
-        int minimumPasswordNonLetter = 0;
-        long maximumTimeToUnlock = 0;
-        int maximumFailedPasswordsForWipe = 0;
-        long passwordExpirationTimeout = 0L;
-        long passwordExpirationDate = 0L;
+
+        static final int DEF_MINIMUM_PASSWORD_LENGTH = 0;
+        int minimumPasswordLength = DEF_MINIMUM_PASSWORD_LENGTH;
+
+        static final int DEF_PASSWORD_HISTORY_LENGTH = 0;
+        int passwordHistoryLength = DEF_PASSWORD_HISTORY_LENGTH;
+
+        static final int DEF_MINIMUM_PASSWORD_UPPER_CASE = 0;
+        int minimumPasswordUpperCase = DEF_MINIMUM_PASSWORD_UPPER_CASE;
+
+        static final int DEF_MINIMUM_PASSWORD_LOWER_CASE = 0;
+        int minimumPasswordLowerCase = DEF_MINIMUM_PASSWORD_LOWER_CASE;
+
+        static final int DEF_MINIMUM_PASSWORD_LETTERS = 1;
+        int minimumPasswordLetters = DEF_MINIMUM_PASSWORD_LOWER_CASE;
+
+        static final int DEF_MINIMUM_PASSWORD_NUMERIC = 1;
+        int minimumPasswordNumeric = DEF_MINIMUM_PASSWORD_NUMERIC;
+
+        static final int DEF_MINIMUM_PASSWORD_SYMBOLS = 1;
+        int minimumPasswordSymbols = DEF_MINIMUM_PASSWORD_SYMBOLS;
+
+        static final int DEF_MINIMUM_PASSWORD_NON_LETTER = 0;
+        int minimumPasswordNonLetter = DEF_MINIMUM_PASSWORD_NON_LETTER;
+
+        static final long DEF_MAXIMUM_TIME_TO_UNLOCK = 0;
+        long maximumTimeToUnlock = DEF_MAXIMUM_TIME_TO_UNLOCK;
+
+        static final int DEF_MAXIMUM_FAILED_PASSWORDS_FOR_WIPE = 0;
+        int maximumFailedPasswordsForWipe = DEF_MAXIMUM_FAILED_PASSWORDS_FOR_WIPE;
+
+        static final long DEF_PASSWORD_EXPIRATION_TIMEOUT = 0;
+        long passwordExpirationTimeout = DEF_PASSWORD_EXPIRATION_TIMEOUT;
+
+        static final long DEF_PASSWORD_EXPIRATION_DATE = 0;
+        long passwordExpirationDate = DEF_PASSWORD_EXPIRATION_DATE;
+
         boolean encryptionRequested = false;
 
         // TODO: review implementation decisions with frameworks team
@@ -168,53 +193,53 @@
                 out.startTag(null, "password-quality");
                 out.attribute(null, "value", Integer.toString(passwordQuality));
                 out.endTag(null, "password-quality");
-                if (minimumPasswordLength > 0) {
+                if (minimumPasswordLength != DEF_MINIMUM_PASSWORD_LENGTH) {
                     out.startTag(null, "min-password-length");
                     out.attribute(null, "value", Integer.toString(minimumPasswordLength));
                     out.endTag(null, "min-password-length");
                 }
-                if(passwordHistoryLength > 0) {
+                if(passwordHistoryLength != DEF_PASSWORD_HISTORY_LENGTH) {
                     out.startTag(null, "password-history-length");
                     out.attribute(null, "value", Integer.toString(passwordHistoryLength));
                     out.endTag(null, "password-history-length");
                 }
-                if (minimumPasswordUpperCase > 0) {
+                if (minimumPasswordUpperCase != DEF_MINIMUM_PASSWORD_UPPER_CASE) {
                     out.startTag(null, "min-password-uppercase");
                     out.attribute(null, "value", Integer.toString(minimumPasswordUpperCase));
                     out.endTag(null, "min-password-uppercase");
                 }
-                if (minimumPasswordLowerCase > 0) {
+                if (minimumPasswordLowerCase != DEF_MINIMUM_PASSWORD_LOWER_CASE) {
                     out.startTag(null, "min-password-lowercase");
                     out.attribute(null, "value", Integer.toString(minimumPasswordLowerCase));
                     out.endTag(null, "min-password-lowercase");
                 }
-                if (minimumPasswordLetters > 0) {
+                if (minimumPasswordLetters != DEF_MINIMUM_PASSWORD_LETTERS) {
                     out.startTag(null, "min-password-letters");
                     out.attribute(null, "value", Integer.toString(minimumPasswordLetters));
                     out.endTag(null, "min-password-letters");
                 }
-                if (minimumPasswordNumeric > 0) {
+                if (minimumPasswordNumeric != DEF_MINIMUM_PASSWORD_NUMERIC) {
                     out.startTag(null, "min-password-numeric");
                     out.attribute(null, "value", Integer.toString(minimumPasswordNumeric));
                     out.endTag(null, "min-password-numeric");
                 }
-                if (minimumPasswordSymbols > 0) {
+                if (minimumPasswordSymbols != DEF_MINIMUM_PASSWORD_SYMBOLS) {
                     out.startTag(null, "min-password-symbols");
                     out.attribute(null, "value", Integer.toString(minimumPasswordSymbols));
                     out.endTag(null, "min-password-symbols");
                 }
-                if (minimumPasswordNonLetter > 0) {
+                if (minimumPasswordNonLetter > DEF_MINIMUM_PASSWORD_NON_LETTER) {
                     out.startTag(null, "min-password-nonletter");
                     out.attribute(null, "value", Integer.toString(minimumPasswordNonLetter));
                     out.endTag(null, "min-password-nonletter");
                 }
             }
-            if (maximumTimeToUnlock != 0) {
+            if (maximumTimeToUnlock != DEF_MAXIMUM_TIME_TO_UNLOCK) {
                 out.startTag(null, "max-time-to-unlock");
                 out.attribute(null, "value", Long.toString(maximumTimeToUnlock));
                 out.endTag(null, "max-time-to-unlock");
             }
-            if (maximumFailedPasswordsForWipe != 0) {
+            if (maximumFailedPasswordsForWipe != DEF_MAXIMUM_FAILED_PASSWORDS_FOR_WIPE) {
                 out.startTag(null, "max-failed-password-wipe");
                 out.attribute(null, "value", Integer.toString(maximumFailedPasswordsForWipe));
                 out.endTag(null, "max-failed-password-wipe");
@@ -234,12 +259,12 @@
                     out.endTag(null, "global-proxy-exclusion-list");
                 }
             }
-            if (passwordExpirationTimeout != 0L) {
+            if (passwordExpirationTimeout != DEF_PASSWORD_EXPIRATION_TIMEOUT) {
                 out.startTag(null, "password-expiration-timeout");
                 out.attribute(null, "value", Long.toString(passwordExpirationTimeout));
                 out.endTag(null, "password-expiration-timeout");
             }
-            if (passwordExpirationDate != 0L) {
+            if (passwordExpirationDate != DEF_PASSWORD_EXPIRATION_DATE) {
                 out.startTag(null, "password-expiration-date");
                 out.attribute(null, "value", Long.toString(passwordExpirationDate));
                 out.endTag(null, "password-expiration-date");
@@ -399,6 +424,7 @@
                 }
                 if (removed) {
                     validatePasswordOwnerLocked();
+                    saveSettingsLocked();
                 }
             }
         }
@@ -509,12 +535,21 @@
     }
 
     void sendAdminCommandLocked(ActiveAdmin admin, String action) {
+        sendAdminCommandLocked(admin, action, null);
+    }
+
+    void sendAdminCommandLocked(ActiveAdmin admin, String action, BroadcastReceiver result) {
         Intent intent = new Intent(action);
         intent.setComponent(admin.info.getComponent());
         if (action.equals(DeviceAdminReceiver.ACTION_PASSWORD_EXPIRING)) {
             intent.putExtra("expiration", admin.passwordExpirationDate);
         }
-        mContext.sendBroadcast(intent);
+        if (result != null) {
+            mContext.sendOrderedBroadcast(intent, null, result, mHandler,
+                    Activity.RESULT_OK, null, null);
+        } else {
+            mContext.sendBroadcast(intent);
+        }
     }
 
     void sendAdminCommandLocked(String action, int reqPolicy) {
@@ -529,20 +564,27 @@
         }
     }
 
-    void removeActiveAdminLocked(ComponentName adminReceiver) {
-        ActiveAdmin admin = getActiveAdminUncheckedLocked(adminReceiver);
+    void removeActiveAdminLocked(final ComponentName adminReceiver) {
+        final ActiveAdmin admin = getActiveAdminUncheckedLocked(adminReceiver);
         if (admin != null) {
-            boolean doProxyCleanup =
-                admin.info.usesPolicy(DeviceAdminInfo.USES_POLICY_SETS_GLOBAL_PROXY);
             sendAdminCommandLocked(admin,
-                    DeviceAdminReceiver.ACTION_DEVICE_ADMIN_DISABLED);
-            // XXX need to wait for it to complete.
-            mAdminList.remove(admin);
-            mAdminMap.remove(adminReceiver);
-            validatePasswordOwnerLocked();
-            if (doProxyCleanup) {
-                resetGlobalProxy();
-            }
+                    DeviceAdminReceiver.ACTION_DEVICE_ADMIN_DISABLED,
+                    new BroadcastReceiver() {
+                        @Override
+                        public void onReceive(Context context, Intent intent) {
+                            synchronized (this) {
+                                boolean doProxyCleanup = admin.info.usesPolicy(
+                                        DeviceAdminInfo.USES_POLICY_SETS_GLOBAL_PROXY);
+                                mAdminList.remove(admin);
+                                mAdminMap.remove(adminReceiver);
+                                validatePasswordOwnerLocked();
+                                if (doProxyCleanup) {
+                                    resetGlobalProxy();
+                                }
+                                saveSettingsLocked();
+                            }
+                        }
+            });
         }
     }
 
@@ -1749,7 +1791,6 @@
 
             // Scan through active admins and find if anyone has already
             // set the global proxy.
-            final int N = mAdminList.size();
             Set<ComponentName> compSet = mAdminMap.keySet();
             for  (ComponentName component : compSet) {
                 ActiveAdmin ap = mAdminMap.get(component);
diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java
index 7028772..465fd2e 100644
--- a/services/java/com/android/server/InputMethodManagerService.java
+++ b/services/java/com/android/server/InputMethodManagerService.java
@@ -64,7 +64,9 @@
 import android.provider.Settings.Secure;
 import android.provider.Settings.SettingNotFoundException;
 import android.text.TextUtils;
+import android.text.style.SuggestionSpan;
 import android.util.EventLog;
+import android.util.LruCache;
 import android.util.Pair;
 import android.util.Slog;
 import android.util.PrintWriterPrinter;
@@ -117,6 +119,8 @@
 
     static final long TIME_TO_RECONNECT = 10*1000;
 
+    static final int SECURE_SUGGESTION_SPANS_MAX_SIZE = 20;
+
     private static final int NOT_A_SUBTYPE_ID = -1;
     private static final String NOT_A_SUBTYPE_ID_STR = String.valueOf(NOT_A_SUBTYPE_ID);
     private static final String SUBTYPE_MODE_KEYBOARD = "keyboard";
@@ -141,6 +145,8 @@
     // lock for this class.
     final ArrayList<InputMethodInfo> mMethodList = new ArrayList<InputMethodInfo>();
     final HashMap<String, InputMethodInfo> mMethodMap = new HashMap<String, InputMethodInfo>();
+    private final LruCache<SuggestionSpan, InputMethodInfo> mSecureSuggestionSpans =
+            new LruCache<SuggestionSpan, InputMethodInfo>(SECURE_SUGGESTION_SPANS_MAX_SIZE);
 
     class SessionState {
         final ClientState client;
@@ -965,6 +971,7 @@
         }
     }
 
+    @Override
     public void updateStatusIcon(IBinder token, String packageName, int iconId) {
         int uid = Binder.getCallingUid();
         long ident = Binder.clearCallingIdentity();
@@ -989,6 +996,7 @@
         }
     }
 
+    @Override
     public void setImeWindowStatus(IBinder token, int vis, int backDisposition) {
         int uid = Binder.getCallingUid();
         long ident = Binder.clearCallingIdentity();
@@ -1008,6 +1016,42 @@
         }
     }
 
+    public void registerSuggestionSpansForNotification(SuggestionSpan[] spans) {
+        synchronized (mMethodMap) {
+            final InputMethodInfo currentImi = mMethodMap.get(mCurMethodId);
+            for (int i = 0; i < spans.length; ++i) {
+                SuggestionSpan ss = spans[i];
+                if (!TextUtils.isEmpty(ss.getNotificationTargetClassName())) {
+                    mSecureSuggestionSpans.put(ss, currentImi);
+                    final InputMethodInfo targetImi = mSecureSuggestionSpans.get(ss);
+                }
+            }
+        }
+    }
+
+    public boolean notifySuggestionPicked(SuggestionSpan span, String originalString, int index) {
+        synchronized (mMethodMap) {
+            final InputMethodInfo targetImi = mSecureSuggestionSpans.get(span);
+            // TODO: Do not send the intent if the process of the targetImi is already dead.
+            if (targetImi != null) {
+                final String[] suggestions = span.getSuggestions();
+                if (index < 0 || index >= suggestions.length) return false;
+                final String className = span.getNotificationTargetClassName();
+                final Intent intent = new Intent();
+                // Ensures that only a class in the original IME package will receive the
+                // notification.
+                intent.setClassName(targetImi.getPackageName(), className);
+                intent.setAction(SuggestionSpan.ACTION_SUGGESTION_PICKED);
+                intent.putExtra(SuggestionSpan.SUGGESTION_SPAN_PICKED_BEFORE, originalString);
+                intent.putExtra(SuggestionSpan.SUGGESTION_SPAN_PICKED_AFTER, suggestions[index]);
+                intent.putExtra(SuggestionSpan.SUGGESTION_SPAN_PICKED_HASHCODE, span.hashCode());
+                mContext.sendBroadcast(intent);
+                return true;
+            }
+        }
+        return false;
+    }
+
     void updateFromSettingsLocked() {
         // We are assuming that whoever is changing DEFAULT_INPUT_METHOD and
         // ENABLED_INPUT_METHODS is taking care of keeping them correctly in
@@ -1102,6 +1146,7 @@
         }
     }
 
+    @Override
     public boolean showSoftInput(IInputMethodClient client, int flags,
             ResultReceiver resultReceiver) {
         int uid = Binder.getCallingUid();
@@ -1167,6 +1212,7 @@
         return res;
     }
 
+    @Override
     public boolean hideSoftInput(IInputMethodClient client, int flags,
             ResultReceiver resultReceiver) {
         int uid = Binder.getCallingUid();
@@ -1229,6 +1275,7 @@
         return res;
     }
 
+    @Override
     public void windowGainedFocus(IInputMethodClient client, IBinder windowToken,
             boolean viewHasFocus, boolean isTextEditor, int softInputMode,
             boolean first, int windowFlags) {
@@ -1330,6 +1377,7 @@
         }
     }
 
+    @Override
     public void showInputMethodPickerFromClient(IInputMethodClient client) {
         synchronized (mMethodMap) {
             if (mCurClient == null || client == null
@@ -1344,10 +1392,12 @@
         }
     }
 
+    @Override
     public void setInputMethod(IBinder token, String id) {
         setInputMethodWithSubtypeId(token, id, NOT_A_SUBTYPE_ID);
     }
 
+    @Override
     public void setInputMethodAndSubtype(IBinder token, String id, InputMethodSubtype subtype) {
         synchronized (mMethodMap) {
             if (subtype != null) {
@@ -1359,6 +1409,7 @@
         }
     }
 
+    @Override
     public void showInputMethodAndSubtypeEnablerFromClient(
             IInputMethodClient client, String inputMethodId) {
         synchronized (mMethodMap) {
@@ -1371,31 +1422,70 @@
         }
     }
 
+    @Override
     public boolean switchToLastInputMethod(IBinder token) {
         synchronized (mMethodMap) {
             final Pair<String, String> lastIme = mSettings.getLastInputMethodAndSubtypeLocked();
-            if (lastIme == null) return false;
-            final InputMethodInfo lastImi = mMethodMap.get(lastIme.first);
-            if (lastImi == null) return false;
-
-            final boolean imiIdIsSame = lastImi.getId().equals(mCurMethodId);
-            final int lastSubtypeHash = Integer.valueOf(lastIme.second);
-            // If the last IME is the same as the current IME and the last subtype is not defined,
-            // there is no need to switch to the last IME.
-            if (imiIdIsSame && lastSubtypeHash == NOT_A_SUBTYPE_ID) return false;
-
-            int currentSubtypeHash = mCurrentSubtype == null ? NOT_A_SUBTYPE_ID
-                    : mCurrentSubtype.hashCode();
-            if (!imiIdIsSame || lastSubtypeHash != currentSubtypeHash) {
-                if (DEBUG) {
-                    Slog.d(TAG, "Switch to: " + lastImi.getId() + ", " + lastIme.second + ", from: "
-                            + mCurMethodId + ", " + currentSubtypeHash);
-                }
-                setInputMethodWithSubtypeId(token, lastIme.first, getSubtypeIdFromHashCode(
-                        lastImi, lastSubtypeHash));
-                return true;
+            final InputMethodInfo lastImi;
+            if (lastIme != null) {
+                lastImi = mMethodMap.get(lastIme.first);
+            } else {
+                lastImi = null;
             }
-            return false;
+            String targetLastImiId = null;
+            int subtypeId = NOT_A_SUBTYPE_ID;
+            if (lastIme != null && lastImi != null) {
+                final boolean imiIdIsSame = lastImi.getId().equals(mCurMethodId);
+                final int lastSubtypeHash = Integer.valueOf(lastIme.second);
+                final int currentSubtypeHash = mCurrentSubtype == null ? NOT_A_SUBTYPE_ID
+                        : mCurrentSubtype.hashCode();
+                // If the last IME is the same as the current IME and the last subtype is not
+                // defined, there is no need to switch to the last IME.
+                if (!imiIdIsSame || lastSubtypeHash != currentSubtypeHash) {
+                    targetLastImiId = lastIme.first;
+                    subtypeId = getSubtypeIdFromHashCode(lastImi, lastSubtypeHash);
+                }
+            }
+
+            if (TextUtils.isEmpty(targetLastImiId) && !canAddToLastInputMethod(mCurrentSubtype)) {
+                // This is a safety net. If the currentSubtype can't be added to the history
+                // and the framework couldn't find the last ime, we will make the last ime be
+                // the most applicable enabled keyboard subtype of the system imes.
+                final List<InputMethodInfo> enabled = mSettings.getEnabledInputMethodListLocked();
+                if (enabled != null) {
+                    final int N = enabled.size();
+                    final String locale = mCurrentSubtype == null
+                            ? mRes.getConfiguration().locale.toString()
+                            : mCurrentSubtype.getLocale();
+                    for (int i = 0; i < N; ++i) {
+                        final InputMethodInfo imi = enabled.get(i);
+                        if (imi.getSubtypeCount() > 0 && isSystemIme(imi)) {
+                            InputMethodSubtype keyboardSubtype =
+                                    findLastResortApplicableSubtypeLocked(mRes, getSubtypes(imi),
+                                            SUBTYPE_MODE_KEYBOARD, locale, true);
+                            if (keyboardSubtype != null) {
+                                targetLastImiId = imi.getId();
+                                subtypeId = getSubtypeIdFromHashCode(
+                                        imi, keyboardSubtype.hashCode());
+                                if(keyboardSubtype.getLocale().equals(locale)) {
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            if (!TextUtils.isEmpty(targetLastImiId)) {
+                if (DEBUG) {
+                    Slog.d(TAG, "Switch to: " + lastImi.getId() + ", " + lastIme.second
+                            + ", from: " + mCurMethodId + ", " + subtypeId);
+                }
+                setInputMethodWithSubtypeId(token, targetLastImiId, subtypeId);
+                return true;
+            } else {
+                return false;
+            }
         }
     }
 
@@ -1442,6 +1532,7 @@
         }
     }
 
+    @Override
     public void hideMySoftInput(IBinder token, int flags) {
         synchronized (mMethodMap) {
             if (token == null || mCurToken != token) {
@@ -1458,6 +1549,7 @@
         }
     }
 
+    @Override
     public void showMySoftInput(IBinder token, int flags) {
         synchronized (mMethodMap) {
             if (token == null || mCurToken != token) {
@@ -1494,6 +1586,7 @@
         }
     }
 
+    @Override
     public boolean handleMessage(Message msg) {
         HandlerCaller.SomeArgs args;
         switch (msg.what) {
@@ -1837,6 +1930,7 @@
             }
 
             AlertDialog.OnClickListener adocl = new AlertDialog.OnClickListener() {
+                @Override
                 public void onClick(DialogInterface dialog, int which) {
                     hideInputMethodMenu();
                 }
@@ -1848,6 +1942,7 @@
             mDialogBuilder = new AlertDialog.Builder(context)
                     .setTitle(com.android.internal.R.string.select_input_method)
                     .setOnCancelListener(new OnCancelListener() {
+                        @Override
                         public void onCancel(DialogInterface dialog) {
                             hideInputMethodMenu();
                         }
@@ -1858,6 +1953,7 @@
 
             mDialogBuilder.setSingleChoiceItems(mItems, checkedItem,
                     new AlertDialog.OnClickListener() {
+                        @Override
                         public void onClick(DialogInterface dialog, int which) {
                             synchronized (mMethodMap) {
                                 if (mIms == null || mIms.length <= which
@@ -1882,6 +1978,7 @@
                 mDialogBuilder.setPositiveButton(
                         com.android.internal.R.string.configure_input_methods,
                         new DialogInterface.OnClickListener() {
+                            @Override
                             public void onClick(DialogInterface dialog, int whichButton) {
                                 showConfigureInputMethods();
                             }
@@ -1917,6 +2014,7 @@
 
     // ----------------------------------------------------------------------
 
+    @Override
     public boolean setInputMethodEnabled(String id, boolean enabled) {
         synchronized (mMethodMap) {
             if (mContext.checkCallingOrSelfPermission(
@@ -2247,6 +2345,7 @@
     /**
      * @return Return the current subtype of this input method.
      */
+    @Override
     public InputMethodSubtype getCurrentInputMethodSubtype() {
         boolean subtypeIsSelected = false;
         try {
@@ -2329,6 +2428,7 @@
         }
     }
 
+    @Override
     public boolean setCurrentInputMethodSubtype(InputMethodSubtype subtype) {
         synchronized (mMethodMap) {
             if (subtype != null && mCurMethodId != null) {
@@ -2619,7 +2719,7 @@
             List<Pair<String, ArrayList<String>>> enabledImes =
                     getEnabledInputMethodsAndSubtypeListLocked();
             List<Pair<String, String>> subtypeHistory = loadInputMethodAndSubtypeHistoryLocked();
-            for (Pair<String, String> imeAndSubtype: subtypeHistory) {
+            for (Pair<String, String> imeAndSubtype : subtypeHistory) {
                 final String imeInTheHistory = imeAndSubtype.first;
                 // If imeId is empty, returns the first IME and subtype in the history
                 if (TextUtils.isEmpty(imeId) || imeInTheHistory.equals(imeId)) {
diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java
index 03d5728..f78dca9 100644
--- a/services/java/com/android/server/MountService.java
+++ b/services/java/com/android/server/MountService.java
@@ -163,6 +163,7 @@
     private final ArrayList<StorageVolume>        mVolumes = new ArrayList<StorageVolume>();
     private StorageVolume                         mPrimaryVolume;
     private final HashMap<String, String>         mVolumeStates = new HashMap<String, String>();
+    private final HashMap<String, StorageVolume>  mVolumeMap = new HashMap<String, StorageVolume>();
     private String                                mExternalStoragePath;
     private PackageManagerService                 mPms;
     private boolean                               mUmsEnabling;
@@ -672,8 +673,6 @@
      * Callback from NativeDaemonConnector
      */
     public boolean onEvent(int code, String raw, String[] cooked) {
-        Intent in = null;
-
         if (DEBUG_EVENTS) {
             StringBuilder builder = new StringBuilder();
             builder.append("onEvent::");
@@ -708,6 +707,7 @@
             // FMT: NNN Volume <label> <mountpoint> disk inserted (<major>:<minor>)
             // FMT: NNN Volume <label> <mountpoint> disk removed (<major>:<minor>)
             // FMT: NNN Volume <label> <mountpoint> bad removal (<major>:<minor>)
+            String action = null;
             final String label = cooked[2];
             final String path = cooked[3];
             int major = -1;
@@ -746,32 +746,31 @@
                 /* Send the media unmounted event first */
                 if (DEBUG_EVENTS) Slog.i(TAG, "Sending unmounted event first");
                 updatePublicVolumeState(path, Environment.MEDIA_UNMOUNTED);
-                in = new Intent(Intent.ACTION_MEDIA_UNMOUNTED, Uri.parse("file://" + path));
-                mContext.sendBroadcast(in);
+                sendStorageIntent(Environment.MEDIA_UNMOUNTED, path);
 
                 if (DEBUG_EVENTS) Slog.i(TAG, "Sending media removed");
                 updatePublicVolumeState(path, Environment.MEDIA_REMOVED);
-                in = new Intent(Intent.ACTION_MEDIA_REMOVED, Uri.parse("file://" + path));
+                action = Intent.ACTION_MEDIA_REMOVED;
             } else if (code == VoldResponseCode.VolumeBadRemoval) {
                 if (DEBUG_EVENTS) Slog.i(TAG, "Sending unmounted event first");
                 /* Send the media unmounted event first */
                 updatePublicVolumeState(path, Environment.MEDIA_UNMOUNTED);
-                in = new Intent(Intent.ACTION_MEDIA_UNMOUNTED, Uri.parse("file://" + path));
-                mContext.sendBroadcast(in);
+                action = Intent.ACTION_MEDIA_UNMOUNTED;
 
                 if (DEBUG_EVENTS) Slog.i(TAG, "Sending media bad removal");
                 updatePublicVolumeState(path, Environment.MEDIA_BAD_REMOVAL);
-                in = new Intent(Intent.ACTION_MEDIA_BAD_REMOVAL, Uri.parse("file://" + path));
+                action = Intent.ACTION_MEDIA_BAD_REMOVAL;
             } else {
                 Slog.e(TAG, String.format("Unknown code {%d}", code));
             }
+
+            if (action != null) {
+                sendStorageIntent(action, path);
+            }
         } else {
             return false;
         }
 
-        if (in != null) {
-            mContext.sendBroadcast(in);
-        }
         return true;
     }
 
@@ -779,12 +778,11 @@
         String vs = getVolumeState(path);
         if (DEBUG_EVENTS) Slog.i(TAG, "notifyVolumeStateChanged::" + vs);
 
-        Intent in = null;
+        String action = null;
 
         if (oldState == VolumeState.Shared && newState != oldState) {
             if (LOCAL_LOGD) Slog.d(TAG, "Sending ACTION_MEDIA_UNSHARED intent");
-            mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_UNSHARED,
-                                                Uri.parse("file://" + path)));
+            sendStorageIntent(Intent.ACTION_MEDIA_UNSHARED,  path);
         }
 
         if (newState == VolumeState.Init) {
@@ -801,31 +799,29 @@
                                     Environment.MEDIA_UNMOUNTABLE) && !getUmsEnabling()) {
                 if (DEBUG_EVENTS) Slog.i(TAG, "updating volume state for media bad removal nofs and unmountable");
                 updatePublicVolumeState(path, Environment.MEDIA_UNMOUNTED);
-                in = new Intent(Intent.ACTION_MEDIA_UNMOUNTED, Uri.parse("file://" + path));
+                action = Intent.ACTION_MEDIA_UNMOUNTED;
             }
         } else if (newState == VolumeState.Pending) {
         } else if (newState == VolumeState.Checking) {
             if (DEBUG_EVENTS) Slog.i(TAG, "updating volume state checking");
             updatePublicVolumeState(path, Environment.MEDIA_CHECKING);
-            in = new Intent(Intent.ACTION_MEDIA_CHECKING, Uri.parse("file://" + path));
+            action = Intent.ACTION_MEDIA_CHECKING;
         } else if (newState == VolumeState.Mounted) {
             if (DEBUG_EVENTS) Slog.i(TAG, "updating volume state mounted");
             updatePublicVolumeState(path, Environment.MEDIA_MOUNTED);
-            in = new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + path));
-            in.putExtra("read-only", false);
+            action = Intent.ACTION_MEDIA_MOUNTED;
         } else if (newState == VolumeState.Unmounting) {
-            in = new Intent(Intent.ACTION_MEDIA_EJECT, Uri.parse("file://" + path));
+            action = Intent.ACTION_MEDIA_EJECT;
         } else if (newState == VolumeState.Formatting) {
         } else if (newState == VolumeState.Shared) {
             if (DEBUG_EVENTS) Slog.i(TAG, "Updating volume state media mounted");
             /* Send the media unmounted event first */
             updatePublicVolumeState(path, Environment.MEDIA_UNMOUNTED);
-            in = new Intent(Intent.ACTION_MEDIA_UNMOUNTED, Uri.parse("file://" + path));
-            mContext.sendBroadcast(in);
+            sendStorageIntent(Intent.ACTION_MEDIA_UNMOUNTED, path);
 
             if (DEBUG_EVENTS) Slog.i(TAG, "Updating media shared");
             updatePublicVolumeState(path, Environment.MEDIA_SHARED);
-            in = new Intent(Intent.ACTION_MEDIA_SHARED, Uri.parse("file://" + path));
+            action = Intent.ACTION_MEDIA_SHARED;
             if (LOCAL_LOGD) Slog.d(TAG, "Sending ACTION_MEDIA_SHARED intent");
         } else if (newState == VolumeState.SharedMnt) {
             Slog.e(TAG, "Live shared mounts not supported yet!");
@@ -834,8 +830,8 @@
             Slog.e(TAG, "Unhandled VolumeState {" + newState + "}");
         }
 
-        if (in != null) {
-            mContext.sendBroadcast(in);
+        if (action != null) {
+            sendStorageIntent(action, path);
         }
     }
 
@@ -885,7 +881,7 @@
             /*
              * Mount failed for some reason
              */
-            Intent in = null;
+            String action = null;
             int code = e.getCode();
             if (code == VoldResponseCode.OpFailedNoMedia) {
                 /*
@@ -898,7 +894,7 @@
                  * Media is blank or does not contain a supported filesystem
                  */
                 updatePublicVolumeState(path, Environment.MEDIA_NOFS);
-                in = new Intent(Intent.ACTION_MEDIA_NOFS, Uri.parse("file://" + path));
+                action = Intent.ACTION_MEDIA_NOFS;
                 rc = StorageResultCode.OperationFailedMediaBlank;
             } else if (code == VoldResponseCode.OpFailedMediaCorrupt) {
                 if (DEBUG_EVENTS) Slog.i(TAG, "updating volume state media corrupt");
@@ -906,7 +902,7 @@
                  * Volume consistency check failed
                  */
                 updatePublicVolumeState(path, Environment.MEDIA_UNMOUNTABLE);
-                in = new Intent(Intent.ACTION_MEDIA_UNMOUNTABLE, Uri.parse("file://" + path));
+                action = Intent.ACTION_MEDIA_UNMOUNTABLE;
                 rc = StorageResultCode.OperationFailedMediaCorrupt;
             } else {
                 rc = StorageResultCode.OperationFailedInternalError;
@@ -915,8 +911,8 @@
             /*
              * Send broadcast intent (if required for the failure)
              */
-            if (in != null) {
-                mContext.sendBroadcast(in);
+            if (action != null) {
+                sendStorageIntent(action, path);
             }
         }
 
@@ -1073,6 +1069,14 @@
         }
     }
 
+    private void sendStorageIntent(String action, String path) {
+        Intent intent = new Intent(action, Uri.parse("file://" + path));
+        // add StorageVolume extra
+        intent.putExtra(StorageVolume.EXTRA_STORAGE_VOLUME, mVolumeMap.get(path));
+        Slog.d(TAG, "sendStorageIntent " + intent);
+        mContext.sendBroadcast(intent);
+    }
+
     private void sendUmsIntent(boolean c) {
         mContext.sendBroadcast(
                 new Intent((c ? Intent.ACTION_UMS_CONNECTED : Intent.ACTION_UMS_DISCONNECTED)));
@@ -1124,7 +1128,8 @@
                     if (path == null || description == null) {
                         Slog.e(TAG, "path or description is null in readStorageList");
                     } else {
-                        StorageVolume volume = new StorageVolume(path.toString(),
+                        String pathString = path.toString();
+                        StorageVolume volume = new StorageVolume(pathString,
                                 description.toString(), removable, emulated, mtpReserve);
                         if (primary) {
                             if (mPrimaryVolume == null) {
@@ -1139,6 +1144,7 @@
                         } else {
                             mVolumes.add(volume);
                         }
+                        mVolumeMap.put(pathString, volume);
                     }
                     a.recycle();
                 }
@@ -1148,6 +1154,11 @@
         } catch (IOException e) {
             throw new RuntimeException(e);
         } finally {
+            // compute storage ID for each volume
+            int length = mVolumes.size();
+            for (int i = 0; i < length; i++) {
+                mVolumes.get(i).setStorageId(i);
+            }
             parser.close();
         }
     }
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java
index d931350..8f179f5 100644
--- a/services/java/com/android/server/NetworkManagementService.java
+++ b/services/java/com/android/server/NetworkManagementService.java
@@ -16,48 +16,34 @@
 
 package com.android.server;
 
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
 import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Resources;
 import android.content.pm.PackageManager;
-import android.net.NetworkStats;
-import android.net.Uri;
-import android.net.InterfaceConfiguration;
 import android.net.INetworkManagementEventObserver;
+import android.net.InterfaceConfiguration;
 import android.net.LinkAddress;
+import android.net.NetworkStats;
 import android.net.NetworkUtils;
+import android.net.RouteInfo;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiConfiguration.KeyMgmt;
+import android.os.Binder;
 import android.os.INetworkManagementService;
-import android.os.Handler;
-import android.os.RemoteException;
 import android.os.SystemClock;
 import android.os.SystemProperties;
-import android.text.TextUtils;
 import android.util.Log;
 import android.util.Slog;
+
+import java.io.BufferedReader;
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.Inet4Address;
+import java.net.InetAddress;
 import java.util.ArrayList;
 import java.util.NoSuchElementException;
 import java.util.StringTokenizer;
-import android.provider.Settings;
-import android.content.ContentResolver;
-import android.database.ContentObserver;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.RandomAccessFile;
-import java.io.Reader;
-import java.lang.IllegalStateException;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
 import java.util.concurrent.CountDownLatch;
 
 import libcore.io.IoUtils;
@@ -66,11 +52,16 @@
  * @hide
  */
 class NetworkManagementService extends INetworkManagementService.Stub {
-
-    private static final String TAG = "NetworkManagmentService";
+    private static final String TAG = "NetworkManagementService";
     private static final boolean DBG = false;
     private static final String NETD_TAG = "NetdConnector";
 
+    private static final int ADD = 1;
+    private static final int REMOVE = 2;
+
+    /** Base path to UID-granularity network statistics. */
+    private static final File PATH_PROC_UID_STAT = new File("/proc/uid_stat");
+
     class NetdResponseCode {
         public static final int InterfaceListResult       = 110;
         public static final int TetherInterfaceListResult = 111;
@@ -320,6 +311,164 @@
         }
     }
 
+    public void addRoute(String interfaceName, RouteInfo route) {
+        modifyRoute(interfaceName, ADD, route);
+    }
+
+    public void removeRoute(String interfaceName, RouteInfo route) {
+        modifyRoute(interfaceName, REMOVE, route);
+    }
+
+    private void modifyRoute(String interfaceName, int action, RouteInfo route) {
+        ArrayList<String> rsp;
+
+        StringBuilder cmd;
+
+        switch (action) {
+            case ADD:
+            {
+                cmd = new StringBuilder("interface route add " + interfaceName);
+                break;
+            }
+            case REMOVE:
+            {
+                cmd = new StringBuilder("interface route remove " + interfaceName);
+                break;
+            }
+            default:
+                throw new IllegalStateException("Unknown action type " + action);
+        }
+
+        // create triplet: dest-ip-addr prefixlength gateway-ip-addr
+        LinkAddress la = route.getDestination();
+        cmd.append(' ');
+        cmd.append(la.getAddress().getHostAddress());
+        cmd.append(' ');
+        cmd.append(la.getNetworkPrefixLength());
+        cmd.append(' ');
+        if (route.getGateway() == null) {
+            if (la.getAddress() instanceof Inet4Address) {
+                cmd.append("0.0.0.0");
+            } else {
+                cmd.append ("::0");
+            }
+        } else {
+            cmd.append(route.getGateway().getHostAddress());
+        }
+        try {
+            rsp = mConnector.doCommand(cmd.toString());
+        } catch (NativeDaemonConnectorException e) {
+            throw new IllegalStateException(
+                    "Unable to communicate with native dameon to add routes - "
+                    + e);
+        }
+
+        for (String line : rsp) {
+            Log.v(TAG, "add route response is " + line);
+        }
+    }
+
+    private ArrayList<String> readRouteList(String filename) {
+        FileInputStream fstream = null;
+        ArrayList<String> list = new ArrayList<String>();
+
+        try {
+            fstream = new FileInputStream(filename);
+            DataInputStream in = new DataInputStream(fstream);
+            BufferedReader br = new BufferedReader(new InputStreamReader(in));
+            String s;
+
+            // throw away the title line
+
+            while (((s = br.readLine()) != null) && (s.length() != 0)) {
+                list.add(s);
+            }
+        } catch (IOException ex) {
+            // return current list, possibly empty
+        } finally {
+            if (fstream != null) {
+                try {
+                    fstream.close();
+                } catch (IOException ex) {}
+            }
+        }
+
+        return list;
+    }
+
+    public RouteInfo[] getRoutes(String interfaceName) {
+        ArrayList<RouteInfo> routes = new ArrayList<RouteInfo>();
+
+        // v4 routes listed as:
+        // iface dest-addr gateway-addr flags refcnt use metric netmask mtu window IRTT
+        for (String s : readRouteList("/proc/net/route")) {
+            String[] fields = s.split("\t");
+
+            if (fields.length > 7) {
+                String iface = fields[0];
+
+                if (interfaceName.equals(iface)) {
+                    String dest = fields[1];
+                    String gate = fields[2];
+                    String flags = fields[3]; // future use?
+                    String mask = fields[7];
+                    try {
+                        // address stored as a hex string, ex: 0014A8C0
+                        InetAddress destAddr =
+                                NetworkUtils.intToInetAddress((int)Long.parseLong(dest, 16));
+                        int prefixLength =
+                                NetworkUtils.netmaskIntToPrefixLength(
+                                (int)Long.parseLong(mask, 16));
+                        LinkAddress linkAddress = new LinkAddress(destAddr, prefixLength);
+
+                        // address stored as a hex string, ex 0014A8C0
+                        InetAddress gatewayAddr =
+                                NetworkUtils.intToInetAddress((int)Long.parseLong(gate, 16));
+
+                        RouteInfo route = new RouteInfo(linkAddress, gatewayAddr);
+                        routes.add(route);
+                    } catch (Exception e) {
+                        Log.e(TAG, "Error parsing route " + s + " : " + e);
+                        continue;
+                    }
+                }
+            }
+        }
+
+        // v6 routes listed as:
+        // dest-addr prefixlength ?? ?? gateway-addr ?? ?? ?? ?? iface
+        for (String s : readRouteList("/proc/net/ipv6_route")) {
+            String[]fields = s.split("\\s+");
+            if (fields.length > 9) {
+                String iface = fields[9].trim();
+                if (interfaceName.equals(iface)) {
+                    String dest = fields[0];
+                    String prefix = fields[1];
+                    String gate = fields[4];
+
+                    try {
+                        // prefix length stored as a hex string, ex 40
+                        int prefixLength = Integer.parseInt(prefix, 16);
+
+                        // address stored as a 32 char hex string
+                        // ex fe800000000000000000000000000000
+                        InetAddress destAddr = NetworkUtils.hexToInet6Address(dest);
+                        LinkAddress linkAddress = new LinkAddress(destAddr, prefixLength);
+
+                        InetAddress gateAddr = NetworkUtils.hexToInet6Address(gate);
+
+                        RouteInfo route = new RouteInfo(linkAddress, gateAddr);
+                        routes.add(route);
+                    } catch (Exception e) {
+                        Log.e(TAG, "Error parsing route " + s + " : " + e);
+                        continue;
+                    }
+                }
+            }
+        }
+        return (RouteInfo[]) routes.toArray(new RouteInfo[0]);
+    }
+
     public void shutdown() {
         if (mContext.checkCallingOrSelfPermission(
                 android.Manifest.permission.SHUTDOWN)
@@ -727,7 +876,7 @@
         return -1;
     }
 
-    /** {@inheritDoc} */
+    @Override
     public NetworkStats getNetworkStatsSummary() {
         mContext.enforceCallingOrSelfPermission(
                 android.Manifest.permission.ACCESS_NETWORK_STATE, "NetworkManagementService");
@@ -745,31 +894,46 @@
         return stats.build();
     }
 
-    /** {@inheritDoc} */
+    @Override
     public NetworkStats getNetworkStatsDetail() {
         mContext.enforceCallingOrSelfPermission(
                 android.Manifest.permission.ACCESS_NETWORK_STATE, "NetworkManagementService");
 
-        final File procPath = new File("/proc/uid_stat");
-        final String[] knownUids = procPath.list();
+        final String[] knownUids = PATH_PROC_UID_STAT.list();
         final NetworkStats.Builder stats = new NetworkStats.Builder(
                 SystemClock.elapsedRealtime(), knownUids.length);
 
-        // TODO: kernel module will provide interface-level stats in future
-        // TODO: migrate these stats to come across netd in bulk, instead of all
-        // these individual file reads.
         for (String uid : knownUids) {
-            final File uidPath = new File(procPath, uid);
-            final int rx = readSingleIntFromFile(new File(uidPath, "tcp_rcv"));
-            final int tx = readSingleIntFromFile(new File(uidPath, "tcp_snd"));
-
             final int uidInt = Integer.parseInt(uid);
-            stats.addEntry(NetworkStats.IFACE_ALL, uidInt, rx, tx);
+            collectNetworkStatsDetail(stats, uidInt);
         }
 
         return stats.build();
     }
 
+    @Override
+    public NetworkStats getNetworkStatsUidDetail(int uid) {
+        if (Binder.getCallingUid() != uid) {
+            mContext.enforceCallingOrSelfPermission(
+                    android.Manifest.permission.ACCESS_NETWORK_STATE, "NetworkManagementService");
+        }
+
+        final NetworkStats.Builder stats = new NetworkStats.Builder(
+                SystemClock.elapsedRealtime(), 1);
+        collectNetworkStatsDetail(stats, uid);
+        return stats.build();
+    }
+
+    private void collectNetworkStatsDetail(NetworkStats.Builder stats, int uid) {
+        // TODO: kernel module will provide interface-level stats in future
+        // TODO: migrate these stats to come across netd in bulk, instead of all
+        // these individual file reads.
+        final File uidPath = new File(PATH_PROC_UID_STAT, Integer.toString(uid));
+        final long rx = readSingleLongFromFile(new File(uidPath, "tcp_rcv"));
+        final long tx = readSingleLongFromFile(new File(uidPath, "tcp_snd"));
+        stats.addEntry(NetworkStats.IFACE_ALL, uid, rx, tx);
+    }
+
     public void setInterfaceThrottle(String iface, int rxKbps, int txKbps) {
         mContext.enforceCallingOrSelfPermission(
                 android.Manifest.permission.CHANGE_NETWORK_STATE, "NetworkManagementService");
@@ -830,22 +994,17 @@
     }
 
     /**
-     * Utility method to read a single plain-text {@link Integer} from the given
+     * Utility method to read a single plain-text {@link Long} from the given
      * {@link File}, usually from a {@code /proc/} filesystem.
      */
-    private static int readSingleIntFromFile(File file) {
-        RandomAccessFile f = null;
+    private static long readSingleLongFromFile(File file) {
         try {
-            f = new RandomAccessFile(file, "r");
-            byte[] buffer = new byte[(int) f.length()];
-            f.readFully(buffer);
-            return Integer.parseInt(new String(buffer).trim());
+            final byte[] buffer = IoUtils.readFileAsByteArray(file.toString());
+            return Long.parseLong(new String(buffer).trim());
         } catch (NumberFormatException e) {
             return -1;
         } catch (IOException e) {
             return -1;
-        } finally {
-            IoUtils.closeQuietly(f);
         }
     }
 }
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index cd8915d..5355d44 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -18,6 +18,7 @@
 
 import com.android.server.accessibility.AccessibilityManagerService;
 import com.android.server.am.ActivityManagerService;
+import com.android.server.net.NetworkPolicyManagerService;
 import com.android.server.pm.PackageManagerService;
 import com.android.server.usb.UsbService;
 import com.android.server.wm.WindowManagerService;
@@ -119,6 +120,7 @@
         LightsService lights = null;
         PowerManagerService power = null;
         BatteryService battery = null;
+        NetworkPolicyManagerService networkPolicy = null;
         ConnectivityService connectivity = null;
         IPackageManager pm = null;
         Context context = null;
@@ -282,6 +284,15 @@
             }
 
             try {
+                Slog.i(TAG, "NetworkPolicy Service");
+                networkPolicy = new NetworkPolicyManagerService(
+                        context, ActivityManagerService.self(), power);
+                ServiceManager.addService(Context.NETWORK_POLICY_SERVICE, networkPolicy);
+            } catch (Throwable e) {
+                Slog.e(TAG, "Failure starting Connectivity Service", e);
+            }
+
+            try {
                 Slog.i(TAG, "NetworkManagement Service");
                 ServiceManager.addService(
                         Context.NETWORKMANAGEMENT_SERVICE,
@@ -528,6 +539,7 @@
         // These are needed to propagate to the runnable below.
         final Context contextF = context;
         final BatteryService batteryF = battery;
+        final NetworkPolicyManagerService networkPolicyF = networkPolicy;
         final ConnectivityService connectivityF = connectivity;
         final DockObserver dockF = dock;
         final UsbService usbF = usb;
@@ -553,6 +565,7 @@
 
                 startSystemUi(contextF);
                 if (batteryF != null) batteryF.systemReady();
+                if (networkPolicyF != null) networkPolicyF.systemReady();
                 if (connectivityF != null) connectivityF.systemReady();
                 if (dockF != null) dockF.systemReady();
                 if (usbF != null) usbF.systemReady();
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index a2d10df..41ec63a 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -568,31 +568,10 @@
      * @param wifiConfig SSID, security and channel details as
      *        part of WifiConfiguration
      * @param enabled true to enable and false to disable
-     * @return {@code true} if the start operation was
-     *         started or is already in the queue.
      */
-    public synchronized boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) {
+    public void setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) {
         enforceChangePermission();
-
-        if (enabled) {
-            /* Use default config if there is no existing config */
-            if (wifiConfig == null && ((wifiConfig = getWifiApConfiguration()) == null)) {
-                wifiConfig = new WifiConfiguration();
-                wifiConfig.SSID = mContext.getString(R.string.wifi_tether_configure_ssid_default);
-                wifiConfig.allowedKeyManagement.set(KeyMgmt.NONE);
-            }
-            /*
-             * Caller might not have WRITE_SECURE_SETTINGS,
-             * only CHANGE_WIFI_STATE is enforced
-             */
-            long ident = Binder.clearCallingIdentity();
-            setWifiApConfiguration(wifiConfig);
-            Binder.restoreCallingIdentity(ident);
-        }
-
         mWifiStateMachine.setWifiApEnabled(wifiConfig, enabled);
-
-        return true;
     }
 
     /**
@@ -612,38 +591,20 @@
      * see {@link WifiManager#getWifiApConfiguration()}
      * @return soft access point configuration
      */
-    public synchronized WifiConfiguration getWifiApConfiguration() {
-        final ContentResolver cr = mContext.getContentResolver();
-        WifiConfiguration wifiConfig = new WifiConfiguration();
-        int authType;
-        try {
-            wifiConfig.SSID = Settings.Secure.getString(cr, Settings.Secure.WIFI_AP_SSID);
-            if (wifiConfig.SSID == null)
-                return null;
-            authType = Settings.Secure.getInt(cr, Settings.Secure.WIFI_AP_SECURITY);
-            wifiConfig.allowedKeyManagement.set(authType);
-            wifiConfig.preSharedKey = Settings.Secure.getString(cr, Settings.Secure.WIFI_AP_PASSWD);
-            return wifiConfig;
-        } catch (Settings.SettingNotFoundException e) {
-            Slog.e(TAG,"AP settings not found, returning");
-            return null;
-        }
+    public WifiConfiguration getWifiApConfiguration() {
+        enforceAccessPermission();
+        return mWifiStateMachine.syncGetWifiApConfiguration(mWifiStateMachineChannel);
     }
 
     /**
      * see {@link WifiManager#setWifiApConfiguration(WifiConfiguration)}
      * @param wifiConfig WifiConfiguration details for soft access point
      */
-    public synchronized void setWifiApConfiguration(WifiConfiguration wifiConfig) {
+    public void setWifiApConfiguration(WifiConfiguration wifiConfig) {
         enforceChangePermission();
-        final ContentResolver cr = mContext.getContentResolver();
         if (wifiConfig == null)
             return;
-        int authType = wifiConfig.getAuthType();
-        Settings.Secure.putString(cr, Settings.Secure.WIFI_AP_SSID, wifiConfig.SSID);
-        Settings.Secure.putInt(cr, Settings.Secure.WIFI_AP_SECURITY, authType);
-        if (authType != KeyMgmt.NONE)
-            Settings.Secure.putString(cr, Settings.Secure.WIFI_AP_PASSWD, wifiConfig.preSharedKey);
+        mWifiStateMachine.setWifiApConfiguration(wifiConfig);
     }
 
     /**
diff --git a/services/java/com/android/server/accessibility/TouchExplorer.java b/services/java/com/android/server/accessibility/TouchExplorer.java
index fb97089..4c7f595 100644
--- a/services/java/com/android/server/accessibility/TouchExplorer.java
+++ b/services/java/com/android/server/accessibility/TouchExplorer.java
@@ -110,9 +110,6 @@
     // Temporary array for storing pointer IDs.
     private final int[] mTempPointerIds = new int[MAX_POINTER_COUNT];
 
-    // Temporary array for mapping new to old pointer IDs while filtering inactive pointers.
-    private final int [] mTempNewToOldPointerIndexMap = new int[MAX_POINTER_COUNT];
-
     // Temporary array for storing PointerProperties
     private final PointerProperties[] mTempPointerProperties =
             PointerProperties.createArray(MAX_POINTER_COUNT);
@@ -229,7 +226,7 @@
                 // Send a hover for every finger down so the user gets feedback
                 // where she is currently touching.
                 mSendHoverDelayed.forceSendAndRemove();
-                mSendHoverDelayed.post(event, MotionEvent.ACTION_HOVER_ENTER, 0, policyFlags,
+                mSendHoverDelayed.post(event, MotionEvent.ACTION_HOVER_ENTER, 1, policyFlags,
                         DELAY_SEND_HOVER_MOVE);
             } break;
             case MotionEvent.ACTION_POINTER_DOWN: {
@@ -243,13 +240,13 @@
                         // accessibility event from the hovered view.
                         mSendHoverDelayed.remove();
                         final int pointerId = pointerTracker.getPrimaryActivePointerId();
-                        final int pointerIndex = event.findPointerIndex(pointerId);
+                        final int pointerIdBits = (1 << pointerId);
                         final int lastAction = pointerTracker.getLastInjectedHoverAction();
                         // If a schedules hover enter for another pointer is delivered we send move.
                         final int action = (lastAction == MotionEvent.ACTION_HOVER_ENTER)
                                 ? MotionEvent.ACTION_HOVER_MOVE
                                 : MotionEvent.ACTION_HOVER_ENTER;
-                        mSendHoverDelayed.post(event, action, pointerIndex, policyFlags,
+                        mSendHoverDelayed.post(event, action, pointerIdBits, policyFlags,
                                 DELAY_SEND_HOVER_MOVE);
 
                         if (mLastTouchExploreEvent == null) {
@@ -268,14 +265,14 @@
                 }
             } break;
             case MotionEvent.ACTION_MOVE: {
+                final int pointerId = pointerTracker.getPrimaryActivePointerId();
+                final int pointerIndex = event.findPointerIndex(pointerId);
+                final int pointerIdBits = (1 << pointerId);
                 switch (activePointerCount) {
                     case 0: {
                         /* do nothing - no active pointers so we swallow the event */
                     } break;
                     case 1: {
-                        final int pointerId = pointerTracker.getPrimaryActivePointerId();
-                        final int pointerIndex = event.findPointerIndex(pointerId);
-
                         // Detect touch exploration gesture start by having one active pointer
                         // that moved more than a given distance.
                         if (!mTouchExploreGestureInProgress) {
@@ -290,12 +287,19 @@
                                 sendAccessibilityEvent(TYPE_TOUCH_EXPLORATION_GESTURE_START);
                                 // Make sure the scheduled down/move event is sent.
                                 mSendHoverDelayed.forceSendAndRemove();
-                                sendHoverEvent(event, MotionEvent.ACTION_HOVER_MOVE, pointerIndex,
+                                // If we have transitioned to exploring state from another one
+                                // we need to send a hover enter event here.
+                                final int lastAction = mPointerTracker.getLastInjectedHoverAction();
+                                if (lastAction == MotionEvent.ACTION_HOVER_EXIT) {
+                                    sendMotionEvent(event, MotionEvent.ACTION_HOVER_ENTER,
+                                            pointerIdBits, policyFlags);
+                                }
+                                sendMotionEvent(event, MotionEvent.ACTION_HOVER_MOVE, pointerIdBits,
                                         policyFlags);
                             }
                         } else {
                             // Touch exploration gesture in progress so send a hover event.
-                            sendHoverEvent(event,  MotionEvent.ACTION_HOVER_MOVE, pointerIndex,
+                            sendMotionEvent(event, MotionEvent.ACTION_HOVER_MOVE, pointerIdBits,
                                     policyFlags);
                         }
 
@@ -337,13 +341,10 @@
                         }
                     } break;
                     case 2: {
-                        // Make sure the scheduled hover enter is delivered.
                         mSendHoverDelayed.forceSendAndRemove();
                         // We want to no longer hover over the location so subsequent
                         // touch at the same spot will generate a hover enter.
-                        final int pointerId = pointerTracker.getPrimaryActivePointerId();
-                        final int pointerIndex = event.findPointerIndex(pointerId);
-                        sendHoverEvent(event, MotionEvent.ACTION_HOVER_EXIT, pointerIndex,
+                        sendMotionEvent(event, MotionEvent.ACTION_HOVER_EXIT, pointerIdBits,
                                 policyFlags);
 
                         if (isDraggingGesture(event)) {
@@ -354,8 +355,9 @@
                                 sendAccessibilityEvent(TYPE_TOUCH_EXPLORATION_GESTURE_END);
                                 mTouchExploreGestureInProgress = false;
                             }
-                            mDraggingPointerId = pointerTracker.getPrimaryActivePointerId();
-                            sendDragEvent(event, MotionEvent.ACTION_DOWN, policyFlags);
+                            mDraggingPointerId = pointerId;
+                            sendMotionEvent(event, MotionEvent.ACTION_DOWN, pointerIdBits,
+                                    policyFlags);
                         } else {
                             // Two pointers moving arbitrary are delegated to the view hierarchy.
                             mCurrentState = STATE_DELEGATING;
@@ -367,13 +369,10 @@
                         }
                     } break;
                     default: {
-                        // Make sure the scheduled hover enter is delivered.
                         mSendHoverDelayed.forceSendAndRemove();
                         // We want to no longer hover over the location so subsequent
                         // touch at the same spot will generate a hover enter.
-                        final int pointerId = pointerTracker.getPrimaryActivePointerId();
-                        final int pointerIndex = event.findPointerIndex(pointerId);
-                        sendHoverEvent(event, MotionEvent.ACTION_HOVER_EXIT, pointerIndex,
+                        sendMotionEvent(event, MotionEvent.ACTION_HOVER_EXIT, pointerIdBits,
                                 policyFlags);
 
                         // More than two pointers are delegated to the view hierarchy.
@@ -389,6 +388,8 @@
             } break;
             case MotionEvent.ACTION_UP:
             case MotionEvent.ACTION_POINTER_UP: {
+                final int pointerId = pointerTracker.getLastReceivedUpPointerId();
+                final int pointerIdBits = (1 << pointerId);
                 switch (activePointerCount) {
                     case 0: {
                         // If the pointer that went up was not active we have nothing to do.
@@ -404,7 +405,6 @@
 
                         // Detect whether to activate i.e. click on the last explored location.
                         if (mLastTouchExploreEvent != null) {
-                            final int pointerId = pointerTracker.getLastReceivedUpPointerId();
 
                             // If the down was not in the time slop => nothing else to do.
                             final long eventTime =
@@ -413,7 +413,11 @@
                             final long deltaTime = eventTime - exploreTime;
                             if (deltaTime > ACTIVATION_TIME_SLOP) {
                                 mSendHoverDelayed.forceSendAndRemove();
-                                scheduleHoverExit(event, policyFlags);
+                                final int lastAction = mPointerTracker.getLastInjectedHoverAction();
+                                if (lastAction != MotionEvent.ACTION_HOVER_EXIT) {
+                                    sendMotionEvent(event, MotionEvent.ACTION_HOVER_EXIT,
+                                            pointerIdBits, policyFlags);
+                                }
                                 mLastTouchExploreEvent = MotionEvent.obtain(event);
                                 break;
                             }
@@ -427,7 +431,11 @@
                             final float deltaMove = (float) Math.hypot(deltaX, deltaY);
                             if (deltaMove > mTouchExplorationTapSlop) {
                                 mSendHoverDelayed.forceSendAndRemove();
-                                scheduleHoverExit(event, policyFlags);
+                                final int lastAction = mPointerTracker.getLastInjectedHoverAction();
+                                if (lastAction != MotionEvent.ACTION_HOVER_EXIT) {
+                                    sendMotionEvent(event, MotionEvent.ACTION_HOVER_EXIT,
+                                            pointerIdBits, policyFlags);
+                                }
                                 mLastTouchExploreEvent = MotionEvent.obtain(event);
                                 break;
                             }
@@ -438,7 +446,11 @@
                             mLastTouchExploreEvent = null;
                         } else {
                             mSendHoverDelayed.forceSendAndRemove();
-                            scheduleHoverExit(event, policyFlags);
+                            final int lastAction = mPointerTracker.getLastInjectedHoverAction();
+                            if (lastAction != MotionEvent.ACTION_HOVER_EXIT) {
+                                sendMotionEvent(event, MotionEvent.ACTION_HOVER_EXIT,
+                                        pointerIdBits, policyFlags);
+                            }
                             mLastTouchExploreEvent = MotionEvent.obtain(event);
                         }
                     } break;
@@ -448,8 +460,8 @@
                 final int lastAction = pointerTracker.getLastInjectedHoverAction();
                 if (lastAction != MotionEvent.ACTION_HOVER_EXIT) {
                     final int pointerId = pointerTracker.getPrimaryActivePointerId();
-                    final int pointerIndex = event.findPointerIndex(pointerId);
-                    sendHoverEvent(event, MotionEvent.ACTION_HOVER_EXIT, pointerIndex,
+                    final int pointerIdBits = (1 << pointerId);
+                    sendMotionEvent(event, MotionEvent.ACTION_HOVER_EXIT, pointerIdBits,
                             policyFlags);
                 }
                 clear();
@@ -464,6 +476,7 @@
      * @param policyFlags The policy flags associated with the event.
      */
     private void handleMotionEventStateDragging(MotionEvent event, int policyFlags) {
+        final int pointerIdBits = (1 << mDraggingPointerId);
         switch (event.getActionMasked()) {
             case MotionEvent.ACTION_DOWN: {
                 throw new IllegalStateException("Dragging state can be reached only if two "
@@ -473,7 +486,7 @@
                 // We are in dragging state so we have two pointers and another one
                 // goes down => delegate the three pointers to the view hierarchy
                 mCurrentState = STATE_DELEGATING;
-                sendDragEvent(event, MotionEvent.ACTION_UP, policyFlags);
+                sendMotionEvent(event, MotionEvent.ACTION_UP, pointerIdBits, policyFlags);
                 sendDownForAllActiveNotInjectedPointers(event, policyFlags);
             } break;
             case MotionEvent.ACTION_MOVE: {
@@ -482,13 +495,15 @@
                     case 2: {
                         if (isDraggingGesture(event)) {
                             // If still dragging send a drag event.
-                            sendDragEvent(event, MotionEvent.ACTION_MOVE, policyFlags);
+                            sendMotionEvent(event, MotionEvent.ACTION_MOVE, pointerIdBits,
+                                    policyFlags);
                         } else {
                             // The two pointers are moving either in different directions or
                             // no close enough => delegate the gesture to the view hierarchy.
                             mCurrentState = STATE_DELEGATING;
                             // Send an event to the end of the drag gesture.
-                            sendDragEvent(event, MotionEvent.ACTION_UP, policyFlags);
+                            sendMotionEvent(event, MotionEvent.ACTION_UP, pointerIdBits,
+                                    policyFlags);
                             // Deliver all active pointers to the view hierarchy.
                             sendDownForAllActiveNotInjectedPointers(event, policyFlags);
                         }
@@ -496,7 +511,8 @@
                     default: {
                         mCurrentState = STATE_DELEGATING;
                         // Send an event to the end of the drag gesture.
-                        sendDragEvent(event, MotionEvent.ACTION_UP, policyFlags);
+                        sendMotionEvent(event, MotionEvent.ACTION_UP, pointerIdBits,
+                                policyFlags);
                         // Deliver all active pointers to the view hierarchy.
                         sendDownForAllActiveNotInjectedPointers(event, policyFlags);
                     }
@@ -505,7 +521,7 @@
             case MotionEvent.ACTION_POINTER_UP: {
                 mCurrentState = STATE_TOUCH_EXPLORING;
                 // Send an event to the end of the drag gesture.
-                sendDragEvent(event, MotionEvent.ACTION_UP, policyFlags);
+                sendMotionEvent(event, MotionEvent.ACTION_UP, pointerIdBits, policyFlags);
              } break;
             case MotionEvent.ACTION_CANCEL: {
                 clear();
@@ -551,23 +567,6 @@
     }
 
     /**
-     * Schedules a hover up event so subsequent poking on the same location after
-     * the scheduled delay will perform exploration.
-     *
-     * @param prototype The prototype from which to create the injected events.
-     * @param policyFlags The policy flags associated with the event.
-     */
-    private void scheduleHoverExit(MotionEvent prototype,
-            int policyFlags) {
-        final int pointerId = mPointerTracker.getLastReceivedUpPointerId();
-        final int pointerIndex = prototype.findPointerIndex(pointerId);
-        // We want to no longer hover over the location so subsequent
-        // touch at the same spot will generate a hover enter.
-        mSendHoverDelayed.post(prototype, MotionEvent.ACTION_HOVER_EXIT,
-                 pointerIndex, policyFlags, ACTIVATION_TIME_SLOP);
-    }
-
-    /**
      * Sends down events to the view hierarchy for all active pointers which are
      * not already being delivered i.e. pointers that are not yet injected.
      *
@@ -600,9 +599,9 @@
             final long downTime = pointerTracker.getLastInjectedDownEventTime();
             final int action = computeInjectionAction(MotionEvent.ACTION_DOWN, pointerDataIndex);
             final int pointerCount = pointerDataIndex + 1;
-            final long pointerDownTime = SystemClock.uptimeMillis();
+            final long eventTime = SystemClock.uptimeMillis();
 
-            MotionEvent event = MotionEvent.obtain(downTime, pointerDownTime,
+            MotionEvent event = MotionEvent.obtain(downTime, eventTime,
                     action, pointerCount, pointerProperties, pointerCoords,
                     prototype.getMetaState(), prototype.getButtonState(),
                     prototype.getXPrecision(), prototype.getYPrecision(), prototype.getDeviceId(),
@@ -680,89 +679,18 @@
             return;
         }
 
-        // Filter out inactive pointers from the event and inject it.
-        final PointerProperties[] pointerProperties = mTempPointerProperties;
-        final PointerCoords[] pointerCoords = mTempPointerCoords;
-        int [] newToOldPointerIndexMap = mTempNewToOldPointerIndexMap;
-        int newPointerIndex = 0;
-        int actionIndex = prototype.getActionIndex();
-
-        final int oldPointerCount = prototype.getPointerCount();
-        for (int oldPointerIndex = 0; oldPointerIndex < oldPointerCount; oldPointerIndex++) {
-            final int pointerId = prototype.getPointerId(oldPointerIndex);
-
+        int pointerIdBits = 0;
+        final int pointerCount = prototype.getPointerCount();
+        for (int pointerIndex = 0; pointerIndex < pointerCount; pointerIndex++) {
+            final int pointerId = prototype.getPointerId(pointerIndex);
             // If the pointer is inactive or the pointer that just went up
             // was inactive we strip the pointer data from the event.
-            if (!pointerTracker.isActiveOrWasLastActiveUpPointer(pointerId)) {
-                if (oldPointerIndex <= prototype.getActionIndex()) {
-                    actionIndex--;
-                }
-                continue;
+            if (pointerTracker.isActiveOrWasLastActiveUpPointer(pointerId)) {
+                pointerIdBits |= (1 << pointerId);
             }
-
-            newToOldPointerIndexMap[newPointerIndex] = oldPointerIndex;
-            prototype.getPointerProperties(oldPointerIndex, pointerProperties[newPointerIndex]);
-            prototype.getPointerCoords(oldPointerIndex, pointerCoords[newPointerIndex]);
-
-            newPointerIndex++;
         }
 
-        // If we skipped all pointers => nothing to do.
-        if (newPointerIndex == 0) {
-            return;
-        }
-
-        // Populate and inject the event.
-        final long downTime = pointerTracker.getLastInjectedDownEventTime();
-        final int action = computeInjectionAction(prototype.getActionMasked(), actionIndex);
-        final int newPointerCount = newPointerIndex;
-        MotionEvent prunedEvent = MotionEvent.obtain(downTime, prototype.getEventTime(), action,
-                newPointerCount, pointerProperties, pointerCoords,
-                prototype.getMetaState(), prototype.getButtonState(),
-                prototype.getXPrecision(), prototype.getYPrecision(), prototype.getDeviceId(),
-                prototype.getEdgeFlags(), prototype.getSource(),prototype.getFlags());
-
-        // Add the filtered history.
-        final int historySize = prototype.getHistorySize();
-        for (int historyIndex = 0; historyIndex < historySize; historyIndex++) {
-            for (int pointerIndex = 0; pointerIndex < newPointerCount; pointerIndex++) {
-                final int oldPointerIndex = newToOldPointerIndexMap[pointerIndex];
-                prototype.getPointerCoords(oldPointerIndex, pointerCoords[pointerIndex]);
-            }
-            final long historicalTime = prototype.getHistoricalEventTime(historyIndex);
-            prunedEvent.addBatch(historicalTime, pointerCoords, 0);
-        }
-
-        sendMotionEvent(prunedEvent, policyFlags);
-        prunedEvent.recycle();
-    }
-
-    /**
-     * Sends a dragging event from a two pointer event. The two pointers are
-     * merged into one and delivered to the view hierarchy. Through the entire
-     * drag gesture the pointer id delivered to the view hierarchy is the same.
-     *
-     * @param prototype The prototype from which to create the injected event.
-     * @param action The dragging action that is to be injected.
-     * @param policyFlags The policy flags associated with the event.
-     */
-    private void sendDragEvent(MotionEvent prototype, int action, int policyFlags) {
-        final PointerProperties[] pointerProperties = mTempPointerProperties;
-        final PointerCoords[] pointerCoords = mTempPointerCoords;
-        final int pointerId = mDraggingPointerId;
-        final int pointerIndex = prototype.findPointerIndex(pointerId);
-
-        // Populate the event with the date of the dragging pointer and inject it.
-        prototype.getPointerProperties(pointerIndex, pointerProperties[0]);
-        prototype.getPointerCoords(pointerIndex, pointerCoords[0]);
-
-        MotionEvent event = MotionEvent.obtain(prototype.getDownTime(),
-                prototype.getEventTime(), action, 1, pointerProperties, pointerCoords,
-                prototype.getMetaState(), prototype.getButtonState(),
-                prototype.getXPrecision(), prototype.getYPrecision(),
-                prototype.getDeviceId(), prototype.getEdgeFlags(), prototype.getSource(),
-                prototype.getFlags());
-
+        MotionEvent event = prototype.split(pointerIdBits);
         sendMotionEvent(event, policyFlags);
         event.recycle();
     }
@@ -798,32 +726,20 @@
     }
 
     /**
-     * Sends a hover event.
+     * Sends an event.
      *
-     * @param prototype The prototype from which to create the injected event.
-     * @param action The hover action.
-     * @param pointerIndex The action pointer index.
+     * @param event The event to send.
+     * @param action The action of the event.
+     * @param pointerIdBits The bits of the pointers to send.
      * @param policyFlags The policy flags associated with the event.
      */
-    private void sendHoverEvent(MotionEvent prototype, int action, int pointerIndex, int
-            policyFlags) {
-        final PointerProperties[] pointerProperties = mTempPointerProperties;
-        final PointerCoords[] pointerCoords = mTempPointerCoords;
-
-        prototype.getPointerProperties(pointerIndex, pointerProperties[0]);
-        prototype.getPointerCoords(pointerIndex, pointerCoords[0]);
-
-        final long downTime = mPointerTracker.getLastInjectedDownEventTime();
-
-        // Populate and inject a hover event.
-        MotionEvent hoverEvent = MotionEvent.obtain(downTime, prototype.getEventTime(), action,
-                1, pointerProperties, pointerCoords,
-                prototype.getMetaState(), prototype.getButtonState(),
-                prototype.getXPrecision(), prototype.getYPrecision(), prototype.getDeviceId(),
-                prototype.getEdgeFlags(), prototype.getSource(), prototype.getFlags());
-
-        sendMotionEvent(hoverEvent, policyFlags);
-        hoverEvent.recycle();
+    private void sendMotionEvent(MotionEvent prototype, int action, int pointerIdBits,
+            int policyFlags) {
+        MotionEvent event = prototype.split(pointerIdBits);
+        event.setDownTime(mPointerTracker.getLastInjectedDownEventTime());
+        event.setAction(action);
+        sendMotionEvent(event, policyFlags);
+        event.recycle();
     }
 
     /**
@@ -1381,6 +1297,9 @@
             final int pointerId = event.getPointerId(pointerIndex);
             final int pointerFlag = (1 << pointerId);
             mInjectedPointersDown &= ~pointerFlag;
+            if (mInjectedPointersDown == 0) {
+                mLastInjectedDownEventTime = 0;
+            }
         }
 
         /**
@@ -1481,15 +1400,15 @@
 
         private MotionEvent mEvent;
         private int mAction;
-        private int mPointerIndex;
+        private int mPointerIdBits;
         private int mPolicyFlags;
 
-        public void post(MotionEvent prototype, int action, int pointerIndex, int policyFlags,
+        public void post(MotionEvent prototype, int action, int pointerIdBits, int policyFlags,
                 long delay) {
             remove();
             mEvent = MotionEvent.obtain(prototype);
             mAction = action;
-            mPointerIndex = pointerIndex;
+            mPointerIdBits = pointerIdBits;
             mPolicyFlags = policyFlags;
             mHandler.postDelayed(this, delay);
         }
@@ -1510,7 +1429,7 @@
             mEvent.recycle();
             mEvent = null;
             mAction = 0;
-            mPointerIndex = -1;
+            mPointerIdBits = -1;
             mPolicyFlags = 0;
         }
 
@@ -1532,7 +1451,7 @@
                 }
             }
 
-            sendHoverEvent(mEvent, mAction, mPointerIndex, mPolicyFlags);
+            sendMotionEvent(mEvent, mAction, mPointerIdBits, mPolicyFlags);
             clear();
         }
     }
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 5aae539..cf5592c 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -43,6 +43,7 @@
 import android.app.IApplicationThread;
 import android.app.IInstrumentationWatcher;
 import android.app.INotificationManager;
+import android.app.IProcessObserver;
 import android.app.IServiceConnection;
 import android.app.IThumbnailReceiver;
 import android.app.IThumbnailRetriever;
@@ -752,8 +753,6 @@
      */
     final UsageStatsService mUsageStatsService;
 
-    final NetworkPolicyManagerService mNetworkPolicyService;
-
     /**
      * Current configuration information.  HistoryRecord objects are given
      * a reference to this object to indicate which configuration they are
@@ -854,14 +853,6 @@
      * Current sequence id for process LRU updating.
      */
     int mLruSeq = 0;
-    
-    /**
-     * Set to true if the ANDROID_SIMPLE_PROCESS_MANAGEMENT envvar
-     * is set, indicating the user wants processes started in such a way
-     * that they can use ANDROID_PROCESS_WRAPPER and know what will be
-     * running in each process (thus no pre-initialized process, etc).
-     */
-    boolean mSimpleProcessManagement = false;
 
     /**
      * System monitoring: number of processes that died since the last
@@ -885,7 +876,10 @@
 
     final RemoteCallbackList<IActivityWatcher> mWatchers
             = new RemoteCallbackList<IActivityWatcher>();
-    
+
+    final RemoteCallbackList<IProcessObserver> mProcessObservers
+            = new RemoteCallbackList<IProcessObserver>();
+
     /**
      * Callback of last caller to {@link #requestPss}.
      */
@@ -1277,16 +1271,15 @@
                 }
             } break;
             case DISPATCH_FOREGROUND_ACTIVITIES_CHANGED: {
-                // Flag might have changed during dispatch, but it's always
-                // consistent since we dispatch for every change.
                 final ProcessRecord app = (ProcessRecord) msg.obj;
-                mNetworkPolicyService.onForegroundActivitiesChanged(
-                        app.info.uid, app.pid, app.foregroundActivities);
+                final boolean foregroundActivities = msg.arg1 != 0;
+                dispatchForegroundActivitiesChanged(
+                        app.pid, app.info.uid, foregroundActivities);
                 break;
             }
             case DISPATCH_PROCESS_DIED: {
                 final ProcessRecord app = (ProcessRecord) msg.obj;
-                mNetworkPolicyService.onProcessDied(app.info.uid, app.pid);
+                dispatchProcessDied(app.pid, app.info.uid);
                 break;
             }
             }
@@ -1358,7 +1351,6 @@
         
         m.mBatteryStatsService.publish(context);
         m.mUsageStatsService.publish(context);
-        m.mNetworkPolicyService.publish(context);
         
         synchronized (thr) {
             thr.mReady = true;
@@ -1455,15 +1447,6 @@
     }
 
     private ActivityManagerService() {
-        String v = System.getenv("ANDROID_SIMPLE_PROCESS_MANAGEMENT");
-        if (v != null && Integer.getInteger(v) != 0) {
-            mSimpleProcessManagement = true;
-        }
-        v = System.getenv("ANDROID_DEBUG_APP");
-        if (v != null) {
-            mSimpleProcessManagement = true;
-        }
-
         Slog.i(TAG, "Memory class: " + ActivityManager.staticGetMemoryClass());
         
         File dataDir = Environment.getDataDirectory();
@@ -1480,8 +1463,6 @@
         mUsageStatsService = new UsageStatsService(new File(
                 systemDir, "usagestats").toString());
 
-        mNetworkPolicyService = new NetworkPolicyManagerService();
-
         GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version",
             ConfigurationInfo.GL_ES_VERSION_UNDEFINED);
 
@@ -1937,8 +1918,7 @@
                 debugFlags |= Zygote.DEBUG_ENABLE_ASSERT;
             }
             int pid = Process.start("android.app.ActivityThread",
-                    mSimpleProcessManagement ? app.processName : null, uid, uid,
-                    gids, debugFlags, null);
+                    app.processName, uid, uid, gids, debugFlags, null);
             BatteryStatsImpl bs = app.batteryStats.getBatteryStats();
             synchronized (bs) {
                 if (bs.isOnBattery()) {
@@ -2152,6 +2132,36 @@
         mWatchers.finishBroadcast();
     }
 
+    private void dispatchForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities) {
+        int i = mProcessObservers.beginBroadcast();
+        while (i > 0) {
+            i--;
+            final IProcessObserver observer = mProcessObservers.getBroadcastItem(i);
+            if (observer != null) {
+                try {
+                    observer.onForegroundActivitiesChanged(pid, uid, foregroundActivities);
+                } catch (RemoteException e) {
+                }
+            }
+        }
+        mProcessObservers.finishBroadcast();
+    }
+
+    private void dispatchProcessDied(int pid, int uid) {
+        int i = mProcessObservers.beginBroadcast();
+        while (i > 0) {
+            i--;
+            final IProcessObserver observer = mProcessObservers.getBroadcastItem(i);
+            if (observer != null) {
+                try {
+                    observer.onProcessDied(pid, uid);
+                } catch (RemoteException e) {
+                }
+            }
+        }
+        mProcessObservers.finishBroadcast();
+    }
+
     final void doPendingActivityLaunchesLocked(boolean doResume) {
         final int N = mPendingActivityLaunches.size();
         if (N <= 0) {
@@ -6084,7 +6094,6 @@
         
         mUsageStatsService.shutdown();
         mBatteryStatsService.shutdown();
-        mNetworkPolicyService.shutdown();
         
         return timedout;
     }
@@ -6241,6 +6250,14 @@
         }
     }
 
+    public void registerProcessObserver(IProcessObserver observer) {
+        mProcessObservers.register(observer);
+    }
+
+    public void unregisterProcessObserver(IProcessObserver observer) {
+        mProcessObservers.unregister(observer);
+    }
+
     public void setImmersive(IBinder token, boolean immersive) {
         synchronized(this) {
             int index = (token != null) ? mMainStack.indexOfTokenLocked(token) : -1;
@@ -12755,7 +12772,8 @@
         app.curSchedGroup = schedGroup;
 
         if (hadForegroundActivities != app.foregroundActivities) {
-            mHandler.obtainMessage(DISPATCH_FOREGROUND_ACTIVITIES_CHANGED, app).sendToTarget();
+            mHandler.obtainMessage(DISPATCH_FOREGROUND_ACTIVITIES_CHANGED,
+                    app.foregroundActivities ? 1 : 0, 0, app).sendToTarget();
         }
 
         return adj;
diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java
index 316db2e..e8155b4 100644
--- a/services/java/com/android/server/connectivity/Tethering.java
+++ b/services/java/com/android/server/connectivity/Tethering.java
@@ -636,6 +636,16 @@
         return retVal;
     }
 
+    public void handleTetherIfaceChange(String iface) {
+        // check if iface is white listed
+        for (String regex : mUpstreamIfaceRegexs) {
+            if (iface.matches(regex)) {
+                if (DEBUG) Log.d(TAG, "Tethering got Interface Change");
+                mTetherMasterSM.sendMessage(TetherMasterSM.CMD_IFACE_CHANGED, iface);
+                break;
+            }
+        }
+    }
 
     class TetherInterfaceSM extends StateMachine {
         // notification from the master SM that it's not in tether mode
@@ -1034,6 +1044,8 @@
         static final int CMD_CELL_CONNECTION_RENEW   = 4;
         // we don't have a valid upstream conn, check again after a delay
         static final int CMD_RETRY_UPSTREAM          = 5;
+        // received an indication that upstream interface has changed
+        static final int CMD_IFACE_CHANGED           = 6;
 
         // This indicates what a timeout event relates to.  A state that
         // sends itself a delayed timeout event and handles incoming timeout events
@@ -1377,13 +1389,18 @@
                             turnOnMobileConnection();
                         }
                         break;
-                   case CMD_RETRY_UPSTREAM:
-                       chooseUpstreamType(mTryCell);
-                       mTryCell = !mTryCell;
-                       break;
-                   default:
-                       retValue = false;
-                       break;
+                    case CMD_RETRY_UPSTREAM:
+                        chooseUpstreamType(mTryCell);
+                        mTryCell = !mTryCell;
+                        break;
+                    case CMD_IFACE_CHANGED:
+                        String iface = (String)message.obj;
+                        if (DEBUG) Log.d(TAG, "Activie upstream interface changed: " + iface);
+                        notifyTetheredOfNewUpstreamIface(iface);
+                        break;
+                    default:
+                        retValue = false;
+                        break;
                 }
                 return retValue;
             }
diff --git a/services/java/com/android/server/location/GpsLocationProvider.java b/services/java/com/android/server/location/GpsLocationProvider.java
index b1ab05b..67e73f5f 100755
--- a/services/java/com/android/server/location/GpsLocationProvider.java
+++ b/services/java/com/android/server/location/GpsLocationProvider.java
@@ -277,8 +277,8 @@
     private final SparseIntArray mClientUids = new SparseIntArray();
 
     // how often to request NTP time, in milliseconds
-    // current setting 4 hours
-    private static final long NTP_INTERVAL = 4*60*60*1000;
+    // current setting 24 hours
+    private static final long NTP_INTERVAL = 24*60*60*1000;
     // how long to wait if we have a network error in NTP or XTRA downloading
     // current setting - 5 minutes
     private static final long RETRY_INTERVAL = 5*60*1000;
diff --git a/services/java/com/android/server/net/NetworkPolicyManagerService.java b/services/java/com/android/server/net/NetworkPolicyManagerService.java
index a7a4f07..d083d01 100644
--- a/services/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -19,13 +19,20 @@
 import static android.Manifest.permission.MANAGE_APP_TOKENS;
 import static android.Manifest.permission.UPDATE_DEVICE_STATS;
 import static android.net.NetworkPolicyManager.POLICY_NONE;
-import static android.net.NetworkPolicyManager.POLICY_REJECT_PAID;
 import static android.net.NetworkPolicyManager.POLICY_REJECT_BACKGROUND;
+import static android.net.NetworkPolicyManager.POLICY_REJECT_PAID;
 
+import android.app.IActivityManager;
+import android.app.IProcessObserver;
+import android.content.BroadcastReceiver;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.net.INetworkPolicyManager;
-import android.os.ServiceManager;
+import android.os.IPowerManager;
+import android.os.RemoteException;
 import android.util.Log;
+import android.util.Slog;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
@@ -38,92 +45,139 @@
     private static final String TAG = "NetworkPolicy";
     private static final boolean LOGD = true;
 
-    private static final String SERVICE_NAME = "netpolicy";
-
     private Context mContext;
+    private IActivityManager mActivityManager;
+    private IPowerManager mPowerManager;
+
+    private Object mRulesLock = new Object();
+
+    private boolean mScreenOn = false;
 
     /** Current network policy for each UID. */
-    private SparseIntArray mUidPolicy;
+    private SparseIntArray mUidPolicy = new SparseIntArray();
 
     /** Foreground at both UID and PID granularity. */
-    private SparseBooleanArray mUidForeground;
-    private SparseArray<SparseBooleanArray> mUidPidForeground;
+    private SparseBooleanArray mUidForeground = new SparseBooleanArray();
+    private SparseArray<SparseBooleanArray> mUidPidForeground = new SparseArray<
+            SparseBooleanArray>();
 
     // TODO: periodically poll network stats and write to disk
     // TODO: save/restore policy information from disk
 
-    // TODO: watch screen on/off broadcasts to track foreground
+    public NetworkPolicyManagerService(
+            Context context, IActivityManager activityManager, IPowerManager powerManager) {
+        mContext = checkNotNull(context, "missing context");
+        mActivityManager = checkNotNull(activityManager, "missing activityManager");
+        mPowerManager = checkNotNull(powerManager, "missing powerManager");
+    }
 
-    public void publish(Context context) {
-        mContext = context;
-        ServiceManager.addService(SERVICE_NAME, asBinder());
-
-        mUidPolicy = new SparseIntArray();
-        mUidForeground = new SparseBooleanArray();
-        mUidPidForeground = new SparseArray<SparseBooleanArray>();
-
-        // TODO: register for NetworkManagementService callbacks
+    public void systemReady() {
         // TODO: read current policy+stats from disk and generate NMS rules
-    }
 
-    public void shutdown() {
-        // TODO: persist any pending stats during clean shutdown
+        updateScreenOn();
 
-        mUidPolicy = null;
-        mUidForeground = null;
-        mUidPidForeground = null;
-    }
-
-    @Override
-    public void onForegroundActivitiesChanged(int uid, int pid, boolean foreground) {
-        // only someone like AMS should only be calling us
-        mContext.enforceCallingOrSelfPermission(
-                MANAGE_APP_TOKENS, "requires MANAGE_APP_TOKENS permission");
-
-        // because a uid can have multiple pids running inside, we need to
-        // remember all pid states and summarize foreground at uid level.
-
-        // record foreground for this specific pid
-        SparseBooleanArray pidForeground = mUidPidForeground.get(uid);
-        if (pidForeground == null) {
-            pidForeground = new SparseBooleanArray(2);
-            mUidPidForeground.put(uid, pidForeground);
+        try {
+            mActivityManager.registerProcessObserver(mProcessObserver);
+        } catch (RemoteException e) {
+            // ouch, no foregroundActivities updates means some processes may
+            // never get network access.
+            Slog.e(TAG, "unable to register IProcessObserver", e);
         }
-        pidForeground.put(pid, foreground);
-        computeUidForeground(uid);
+
+        // TODO: traverse existing processes to know foreground state, or have
+        // activitymanager dispatch current state when new observer attached.
+
+        final IntentFilter screenFilter = new IntentFilter();
+        screenFilter.addAction(Intent.ACTION_SCREEN_ON);
+        screenFilter.addAction(Intent.ACTION_SCREEN_OFF);
+        mContext.registerReceiver(mScreenReceiver, screenFilter);
+
+        final IntentFilter shutdownFilter = new IntentFilter();
+        shutdownFilter.addAction(Intent.ACTION_SHUTDOWN);
+        mContext.registerReceiver(mShutdownReceiver, shutdownFilter);
+
     }
 
-    @Override
-    public void onProcessDied(int uid, int pid) {
-        // only someone like AMS should only be calling us
-        mContext.enforceCallingOrSelfPermission(
-                MANAGE_APP_TOKENS, "requires MANAGE_APP_TOKENS permission");
+    private IProcessObserver mProcessObserver = new IProcessObserver.Stub() {
+        @Override
+        public void onForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities) {
+            // only someone like AMS should only be calling us
+            mContext.enforceCallingOrSelfPermission(
+                    MANAGE_APP_TOKENS, "requires MANAGE_APP_TOKENS permission");
 
-        // clear records and recompute, when they exist
-        final SparseBooleanArray pidForeground = mUidPidForeground.get(uid);
-        if (pidForeground != null) {
-            pidForeground.delete(pid);
-            computeUidForeground(uid);
+            synchronized (mRulesLock) {
+                // because a uid can have multiple pids running inside, we need to
+                // remember all pid states and summarize foreground at uid level.
+
+                // record foreground for this specific pid
+                SparseBooleanArray pidForeground = mUidPidForeground.get(uid);
+                if (pidForeground == null) {
+                    pidForeground = new SparseBooleanArray(2);
+                    mUidPidForeground.put(uid, pidForeground);
+                }
+                pidForeground.put(pid, foregroundActivities);
+                computeUidForegroundL(uid);
+            }
         }
-    }
+
+        @Override
+        public void onProcessDied(int pid, int uid) {
+            // only someone like AMS should only be calling us
+            mContext.enforceCallingOrSelfPermission(
+                    MANAGE_APP_TOKENS, "requires MANAGE_APP_TOKENS permission");
+
+            synchronized (mRulesLock) {
+                // clear records and recompute, when they exist
+                final SparseBooleanArray pidForeground = mUidPidForeground.get(uid);
+                if (pidForeground != null) {
+                    pidForeground.delete(pid);
+                    computeUidForegroundL(uid);
+                }
+            }
+        }
+    };
+
+    private BroadcastReceiver mScreenReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            synchronized (mRulesLock) {
+                // screen-related broadcasts are protected by system, no need
+                // for permissions check.
+                updateScreenOn();
+            }
+        }
+    };
+
+    private BroadcastReceiver mShutdownReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            // TODO: persist any pending stats during clean shutdown
+            Log.d(TAG, "persisting stats");
+        }
+    };
 
     @Override
     public void setUidPolicy(int uid, int policy) {
         mContext.enforceCallingOrSelfPermission(
                 UPDATE_DEVICE_STATS, "requires UPDATE_DEVICE_STATS permission");
-        mUidPolicy.put(uid, policy);
+
+        synchronized (mRulesLock) {
+            mUidPolicy.put(uid, policy);
+        }
     }
 
     @Override
     public int getUidPolicy(int uid) {
-        return mUidPolicy.get(uid, POLICY_NONE);
+        synchronized (mRulesLock) {
+            return mUidPolicy.get(uid, POLICY_NONE);
+        }
     }
 
     /**
      * Foreground for PID changed; recompute foreground at UID level. If
-     * changed, will trigger {@link #updateRulesForUid(int)}.
+     * changed, will trigger {@link #updateRulesForUidL(int)}.
      */
-    private void computeUidForeground(int uid) {
+    private void computeUidForegroundL(int uid) {
         final SparseBooleanArray pidForeground = mUidPidForeground.get(uid);
 
         // current pid is dropping foreground; examine other pids
@@ -140,12 +194,37 @@
         if (oldUidForeground != uidForeground) {
             // foreground changed, push updated rules
             mUidForeground.put(uid, uidForeground);
-            updateRulesForUid(uid);
+            updateRulesForUidL(uid);
         }
     }
 
-    private void updateRulesForUid(int uid) {
-        final boolean uidForeground = mUidForeground.get(uid, false);
+    private void updateScreenOn() {
+        synchronized (mRulesLock) {
+            try {
+                mScreenOn = mPowerManager.isScreenOn();
+            } catch (RemoteException e) {
+            }
+            updateRulesForScreenL();
+        }
+    }
+
+    /**
+     * Update rules that might be changed by {@link #mScreenOn} value.
+     */
+    private void updateRulesForScreenL() {
+        // only update rules for anyone with foreground activities
+        final int size = mUidForeground.size();
+        for (int i = 0; i < size; i++) {
+            if (mUidForeground.valueAt(i)) {
+                final int uid = mUidForeground.keyAt(i);
+                updateRulesForUidL(uid);
+            }
+        }
+    }
+
+    private void updateRulesForUidL(int uid) {
+        // only really in foreground when screen on
+        final boolean uidForeground = mUidForeground.get(uid, false) && mScreenOn;
         final int uidPolicy = getUidPolicy(uid);
 
         if (LOGD) {
@@ -162,4 +241,10 @@
         }
     }
 
+    private static <T> T checkNotNull(T value, String message) {
+        if (value == null) {
+            throw new NullPointerException(message);
+        }
+        return value;
+    }
 }
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index de439ca..e1fbe1c 100644
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -59,6 +59,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageParser;
 import android.content.pm.PackageStats;
+import android.content.pm.ParceledListSlice;
 import android.content.pm.PermissionGroupInfo;
 import android.content.pm.PermissionInfo;
 import android.content.pm.ProviderInfo;
@@ -2371,63 +2372,112 @@
         }
     }
 
-    public List<PackageInfo> getInstalledPackages(int flags) {
-        final ArrayList<PackageInfo> finalList = new ArrayList<PackageInfo>();
+    private static final int getContinuationPoint(final String[] keys, final String key) {
+        final int index;
+        if (key == null) {
+            index = 0;
+        } else {
+            final int insertPoint = Arrays.binarySearch(keys, key);
+            if (insertPoint < 0) {
+                index = -insertPoint;
+            } else {
+                index = insertPoint + 1;
+            }
+        }
+        return index;
+    }
+
+    public ParceledListSlice<PackageInfo> getInstalledPackages(int flags, String lastRead) {
+        final ParceledListSlice<PackageInfo> list = new ParceledListSlice<PackageInfo>();
+        final boolean listUninstalled = (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0;
+        final String[] keys;
 
         // writer
         synchronized (mPackages) {
-            if((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) {
-                final Iterator<PackageSetting> i = mSettings.mPackages.values().iterator();
-                while (i.hasNext()) {
-                    final PackageSetting ps = i.next();
-                    final PackageInfo psPkg = generatePackageInfoFromSettingsLPw(ps.name, flags);
-                    if (psPkg != null) {
-                        finalList.add(psPkg);
+            if (listUninstalled) {
+                keys = mSettings.mPackages.keySet().toArray(new String[mSettings.mPackages.size()]);
+            } else {
+                keys = mPackages.keySet().toArray(new String[mPackages.size()]);
+            }
+
+            Arrays.sort(keys);
+            int i = getContinuationPoint(keys, lastRead);
+            final int N = keys.length;
+
+            while (i < N) {
+                final String packageName = keys[i++];
+
+                PackageInfo pi = null;
+                if (listUninstalled) {
+                    final PackageSetting ps = mSettings.mPackages.get(packageName);
+                    if (ps != null) {
+                        pi = generatePackageInfoFromSettingsLPw(ps.name, flags);
+                    }
+                } else {
+                    final PackageParser.Package p = mPackages.get(packageName);
+                    if (p != null) {
+                        pi = generatePackageInfo(p, flags);
                     }
                 }
-            } else {
-                final Iterator<PackageParser.Package> i = mPackages.values().iterator();
-                while (i.hasNext()) {
-                    final PackageParser.Package p = i.next();
-                    if (p.applicationInfo != null) {
-                        final PackageInfo pi = generatePackageInfo(p, flags);
-                        if (pi != null) {
-                            finalList.add(pi);
-                        }
-                    }
+
+                if (pi != null && !list.append(pi)) {
+                    break;
                 }
             }
+
+            if (i == N) {
+                list.setLastSlice(true);
+            }
         }
-        return finalList;
+
+        return list;
     }
 
-    public List<ApplicationInfo> getInstalledApplications(int flags) {
-        final ArrayList<ApplicationInfo> finalList = new ArrayList<ApplicationInfo>();
+    public ParceledListSlice<ApplicationInfo> getInstalledApplications(int flags,
+            String lastRead) {
+        final ParceledListSlice<ApplicationInfo> list = new ParceledListSlice<ApplicationInfo>();
+        final boolean listUninstalled = (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0;
+        final String[] keys;
+
         // writer
-        synchronized(mPackages) {
-            if((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) {
-                final Iterator<PackageSetting> i = mSettings.mPackages.values().iterator();
-                while (i.hasNext()) {
-                    final PackageSetting ps = i.next();
-                    ApplicationInfo ai = generateApplicationInfoFromSettingsLPw(ps.name, flags);
-                    if(ai != null) {
-                        finalList.add(ai);
+        synchronized (mPackages) {
+            if (listUninstalled) {
+                keys = mSettings.mPackages.keySet().toArray(new String[mSettings.mPackages.size()]);
+            } else {
+                keys = mPackages.keySet().toArray(new String[mPackages.size()]);
+            }
+
+            Arrays.sort(keys);
+            int i = getContinuationPoint(keys, lastRead);
+            final int N = keys.length;
+
+            while (i < N) {
+                final String packageName = keys[i++];
+
+                ApplicationInfo ai = null;
+                if (listUninstalled) {
+                    final PackageSetting ps = mSettings.mPackages.get(packageName);
+                    if (ps != null) {
+                        ai = generateApplicationInfoFromSettingsLPw(ps.name, flags);
+                    }
+                } else {
+                    final PackageParser.Package p = mPackages.get(packageName);
+                    if (p != null) {
+                        ai = PackageParser.generateApplicationInfo(p, flags);
                     }
                 }
-            } else {
-                final Iterator<PackageParser.Package> i = mPackages.values().iterator();
-                while (i.hasNext()) {
-                    final PackageParser.Package p = i.next();
-                    if (p.applicationInfo != null) {
-                        ApplicationInfo ai = PackageParser.generateApplicationInfo(p, flags);
-                        if(ai != null) {
-                            finalList.add(ai);
-                        }
-                    }
+
+                if (ai != null && !list.append(ai)) {
+                    break;
                 }
             }
+
+            if (i == N) {
+                list.setLastSlice(true);
+            }
         }
-        return finalList;
+
+        return list;
     }
 
     public List<ApplicationInfo> getPersistentApplications(int flags) {
@@ -8052,7 +8102,8 @@
     }
 
     public UserInfo createUser(String name, int flags) {
-        UserInfo userInfo = mUserManager.createUser(name, flags, getInstalledApplications(0));
+        // TODO(kroot): fix this API
+        UserInfo userInfo = mUserManager.createUser(name, flags, new ArrayList<ApplicationInfo>());
         return userInfo;
     }
 
diff --git a/services/java/com/android/server/wm/DragState.java b/services/java/com/android/server/wm/DragState.java
index c8f8ff3..118cd55 100644
--- a/services/java/com/android/server/wm/DragState.java
+++ b/services/java/com/android/server/wm/DragState.java
@@ -156,9 +156,8 @@
         }
 
         if (mDragInProgress && newWin.isPotentialDragTarget()) {
-            DragEvent event = DragEvent.obtain(DragEvent.ACTION_DRAG_STARTED,
-                    touchX - newWin.mFrame.left, touchY - newWin.mFrame.top,
-                    null, desc, null, false);
+            DragEvent event = obtainDragEvent(newWin, DragEvent.ACTION_DRAG_STARTED,
+                    touchX, touchY, null, desc, null, false);
             try {
                 newWin.mClient.dispatchDragEvent(event);
                 // track each window that we've notified that the drag is starting
@@ -267,9 +266,8 @@
                     Slog.d(WindowManagerService.TAG, "sending DRAG_EXITED to " + mTargetWindow);
                 }
                 // force DRAG_EXITED_EVENT if appropriate
-                DragEvent evt = DragEvent.obtain(DragEvent.ACTION_DRAG_EXITED,
-                        x - mTargetWindow.mFrame.left, y - mTargetWindow.mFrame.top,
-                        null, null, null, false);
+                DragEvent evt = obtainDragEvent(mTargetWindow, DragEvent.ACTION_DRAG_EXITED,
+                        x, y, null, null, null, false);
                 mTargetWindow.mClient.dispatchDragEvent(evt);
                 if (myPid != mTargetWindow.mSession.mPid) {
                     evt.recycle();
@@ -279,9 +277,8 @@
                 if (false && WindowManagerService.DEBUG_DRAG) {
                     Slog.d(WindowManagerService.TAG, "sending DRAG_LOCATION to " + touchedWin);
                 }
-                DragEvent evt = DragEvent.obtain(DragEvent.ACTION_DRAG_LOCATION,
-                        x - touchedWin.mFrame.left, y - touchedWin.mFrame.top,
-                        null, null, null, false);
+                DragEvent evt = obtainDragEvent(touchedWin, DragEvent.ACTION_DRAG_LOCATION,
+                        x, y, null, null, null, false);
                 touchedWin.mClient.dispatchDragEvent(evt);
                 if (myPid != touchedWin.mSession.mPid) {
                     evt.recycle();
@@ -310,8 +307,7 @@
         }
         final int myPid = Process.myPid();
         final IBinder token = touchedWin.mClient.asBinder();
-        DragEvent evt = DragEvent.obtain(DragEvent.ACTION_DROP,
-                x - touchedWin.mFrame.left, y - touchedWin.mFrame.top,
+        DragEvent evt = obtainDragEvent(touchedWin, DragEvent.ACTION_DROP, x, y,
                 null, null, mData, false);
         try {
             touchedWin.mClient.dispatchDragEvent(evt);
@@ -365,4 +361,16 @@
 
         return touchedWin;
     }
+
+    private static DragEvent obtainDragEvent(WindowState win, int action,
+            float x, float y, Object localState,
+            ClipDescription description, ClipData data, boolean result) {
+        float winX = x - win.mFrame.left;
+        float winY = y - win.mFrame.top;
+        if (win.mEnforceSizeCompat) {
+            winX *= win.mGlobalScale;
+            winY *= win.mGlobalScale;
+        }
+        return DragEvent.obtain(action, winX, winY, localState, description, data, result);
+    }
 }
\ No newline at end of file
diff --git a/services/java/com/android/server/wm/FadeInOutAnimation.java b/services/java/com/android/server/wm/FadeInOutAnimation.java
deleted file mode 100644
index 06f7657..0000000
--- a/services/java/com/android/server/wm/FadeInOutAnimation.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2011 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 com.android.server.wm;
-
-import android.view.animation.AccelerateInterpolator;
-import android.view.animation.Animation;
-import android.view.animation.Transformation;
-
-/**
- * Animation that fade in after 0.5 interpolate time, or fade out in reverse order.
- * This is used for opening/closing transition for apps in compatible mode.
- */
-class FadeInOutAnimation extends Animation {
-    boolean mFadeIn;
-
-    public FadeInOutAnimation(boolean fadeIn) {
-        setInterpolator(new AccelerateInterpolator());
-        setDuration(WindowManagerService.DEFAULT_FADE_IN_OUT_DURATION);
-        mFadeIn = fadeIn;
-    }
-
-    @Override
-    protected void applyTransformation(float interpolatedTime, Transformation t) {
-        float x = interpolatedTime;
-        if (!mFadeIn) {
-            x = 1.0f - x; // reverse the interpolation for fade out
-        }
-        t.setAlpha(x);
-    }
-}
\ No newline at end of file
diff --git a/services/java/com/android/server/wm/InputMonitor.java b/services/java/com/android/server/wm/InputMonitor.java
index a3e8be0..9dc92d3 100644
--- a/services/java/com/android/server/wm/InputMonitor.java
+++ b/services/java/com/android/server/wm/InputMonitor.java
@@ -205,7 +205,7 @@
             inputWindow.ownerPid = child.mSession.mPid;
             inputWindow.ownerUid = child.mSession.mUid;
             
-            final Rect frame = child.mScaledFrame;
+            final Rect frame = child.mFrame;
             inputWindow.frameLeft = frame.left;
             inputWindow.frameTop = frame.top;
             inputWindow.frameRight = frame.right;
diff --git a/services/java/com/android/server/wm/ViewServer.java b/services/java/com/android/server/wm/ViewServer.java
index 9fb35b9..70cb26a 100644
--- a/services/java/com/android/server/wm/ViewServer.java
+++ b/services/java/com/android/server/wm/ViewServer.java
@@ -73,19 +73,6 @@
     private ExecutorService mThreadPool;
 
     /**
-     * Creates a new ViewServer associated with the specified window manager.
-     * The server uses the default port {@link #VIEW_SERVER_DEFAULT_PORT}. The server
-     * is not started by default.
-     *
-     * @param windowManager The window manager used to communicate with the views.
-     *
-     * @see #start()
-     */
-    ViewServer(WindowManagerService windowManager) {
-        this(windowManager, VIEW_SERVER_DEFAULT_PORT);
-    }
-
-    /**
      * Creates a new ViewServer associated with the specified window manager on the
      * specified local port. The server is not started by default.
      *
@@ -177,7 +164,7 @@
             // Any uncaught exception will crash the system process
             try {
                 Socket client = mServer.accept();
-                if(mThreadPool != null) {
+                if (mThreadPool != null) {
                     mThreadPool.submit(new ViewServerWorker(client));
                 } else {
                     try {
@@ -220,6 +207,7 @@
         private Socket mClient;
         private boolean mNeedWindowListUpdate;
         private boolean mNeedFocusedWindowUpdate;
+
         public ViewServerWorker(Socket client) {
             mClient = client;
             mNeedWindowListUpdate = false;
@@ -255,7 +243,7 @@
                     result = mWindowManager.viewServerListWindows(mClient);
                 } else if (COMMAND_WINDOW_MANAGER_GET_FOCUS.equalsIgnoreCase(command)) {
                     result = mWindowManager.viewServerGetFocusedWindow(mClient);
-                } else if(COMMAND_WINDOW_MANAGER_AUTOLIST.equalsIgnoreCase(command)) {
+                } else if (COMMAND_WINDOW_MANAGER_AUTOLIST.equalsIgnoreCase(command)) {
                     result = windowManagerAutolistLoop();
                 } else {
                     result = mWindowManager.viewServerWindowCommand(mClient,
@@ -263,7 +251,7 @@
                 }
 
                 if (!result) {
-                    Slog.w(LOG_TAG, "An error occured with the command: " + command);
+                    Slog.w(LOG_TAG, "An error occurred with the command: " + command);
                 }
             } catch(IOException e) {
                 Slog.w(LOG_TAG, "Connection error: ", e);
@@ -321,11 +309,11 @@
                             needFocusedWindowUpdate = true;
                         }
                     }
-                    if(needWindowListUpdate) {
+                    if (needWindowListUpdate) {
                         out.write("LIST UPDATE\n");
                         out.flush();
                     }
-                    if(needFocusedWindowUpdate) {
+                    if (needFocusedWindowUpdate) {
                         out.write("FOCUS UPDATE\n");
                         out.flush();
                     }
@@ -337,6 +325,7 @@
                     try {
                         out.close();
                     } catch (IOException e) {
+                        // Ignore
                     }
                 }
                 mWindowManager.removeWindowChangeListener(this);
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 642d52c..08fea1b 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -603,9 +603,6 @@
     // The frame use to limit the size of the app running in compatibility mode.
     Rect mCompatibleScreenFrame = new Rect();
     float mCompatibleScreenScale;
-    // The surface used to fill the outer rim of the app running in compatibility mode.
-    Surface mBackgroundFillerSurface = null;
-    WindowState mBackgroundFillerTarget = null;
 
     public static WindowManagerService main(Context context,
             PowerManagerService pm, boolean haveInputMethods) {
@@ -1774,7 +1771,7 @@
         boolean rawChanged = false;
         float wpx = mLastWallpaperX >= 0 ? mLastWallpaperX : 0.5f;
         float wpxs = mLastWallpaperXStep >= 0 ? mLastWallpaperXStep : -1.0f;
-        int availw = wallpaperWin.mScaledFrame.right-wallpaperWin.mScaledFrame.left-dw;
+        int availw = wallpaperWin.mFrame.right-wallpaperWin.mFrame.left-dw;
         int offset = availw > 0 ? -(int)(availw*wpx+.5f) : 0;
         changed = wallpaperWin.mXOffset != offset;
         if (changed) {
@@ -2369,6 +2366,11 @@
                     w.mGivenVisibleInsets.set(visibleInsets);
                     w.mGivenTouchableRegion.set(touchableRegion);
                     w.mTouchableInsets = touchableInsets;
+                    if (w.mGlobalScale != 1) {
+                        w.mGivenContentInsets.scale(w.mGlobalScale);
+                        w.mGivenVisibleInsets.scale(w.mGlobalScale);
+                        w.mGivenTouchableRegion.scale(w.mGlobalScale);
+                    }
                     mLayoutNeeded = true;
                     performLayoutAndPlaceSurfacesLocked();
                 }
@@ -2704,7 +2706,7 @@
             if (win.mAppToken != null) {
                 win.mAppToken.updateReportedVisibilityLocked();
             }
-            outFrame.set(win.mFrame);
+            outFrame.set(win.mCompatFrame);
             outContentInsets.set(win.mContentInsets);
             outVisibleInsets.set(win.mVisibleInsets);
             if (localLOGV) Slog.v(
@@ -2903,18 +2905,14 @@
     }
 
     private boolean applyAnimationLocked(AppWindowToken wtoken,
-            WindowManager.LayoutParams lp, int transit, boolean enter, boolean bgFiller) {
+            WindowManager.LayoutParams lp, int transit, boolean enter) {
         // Only apply an animation if the display isn't frozen.  If it is
         // frozen, there is no reason to animate and it can cause strange
         // artifacts when we unfreeze the display if some different animation
         // is running.
         if (!mDisplayFrozen && mPolicy.isScreenOn()) {
             Animation a;
-            if (bgFiller) {
-                a = new FadeInOutAnimation(enter);
-                if (DEBUG_ANIM) Slog.v(TAG,
-                        "applying FadeInOutAnimation for a window in compatibility mode");
-            } else if (mNextAppTransitionPackage != null) {
+            if (mNextAppTransitionPackage != null) {
                 a = loadAnimation(mNextAppTransitionPackage, enter ?
                         mNextAppTransitionEnter : mNextAppTransitionExit);
             } else {
@@ -3706,7 +3704,7 @@
     }
 
     boolean setTokenVisibilityLocked(AppWindowToken wtoken, WindowManager.LayoutParams lp,
-            boolean visible, int transit, boolean performLayout, boolean bgFiller) {
+            boolean visible, int transit, boolean performLayout) {
         boolean delayed = false;
 
         if (wtoken.clientHidden == visible) {
@@ -3728,7 +3726,7 @@
                 if (wtoken.animation == sDummyAnimation) {
                     wtoken.animation = null;
                 }
-                applyAnimationLocked(wtoken, lp, transit, visible, bgFiller);
+                applyAnimationLocked(wtoken, lp, transit, visible);
                 changed = true;
                 if (wtoken.animation != null) {
                     delayed = runningAppAnimation = true;
@@ -3882,7 +3880,7 @@
 
             final long origId = Binder.clearCallingIdentity();
             setTokenVisibilityLocked(wtoken, null, visible, WindowManagerPolicy.TRANSIT_UNSET,
-                    true, false);
+                    true);
             wtoken.updateReportedVisibilityLocked();
             Binder.restoreCallingIdentity(origId);
         }
@@ -4009,7 +4007,7 @@
             if (basewtoken != null && (wtoken=basewtoken.appWindowToken) != null) {
                 if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Removing app token: " + wtoken);
                 delayed = setTokenVisibilityLocked(wtoken, null, false,
-                        WindowManagerPolicy.TRANSIT_UNSET, true, false);
+                        WindowManagerPolicy.TRANSIT_UNSET, true);
                 wtoken.inPendingTransaction = false;
                 mOpeningApps.remove(wtoken);
                 wtoken.waitingToShow = false;
@@ -4785,8 +4783,8 @@
         synchronized(mWindowMap) {
             long ident = Binder.clearCallingIdentity();
 
-            dw = mPolicy.getNonDecorDisplayWidth(mCurDisplayWidth);
-            dh = mPolicy.getNonDecorDisplayHeight(mCurDisplayHeight);
+            dw = mPolicy.getNonDecorDisplayWidth(mRotation, mCurDisplayWidth);
+            dh = mPolicy.getNonDecorDisplayHeight(mRotation, mCurDisplayHeight);
 
             int aboveAppLayer = mPolicy.windowTypeToLayerLw(
                     WindowManager.LayoutParams.TYPE_APPLICATION) * TYPE_LAYER_MULTIPLIER
@@ -4834,7 +4832,7 @@
                 
                 // Don't include wallpaper in bounds calculation
                 if (!ws.mIsWallpaper) {
-                    final Rect wf = ws.mScaledFrame;
+                    final Rect wf = ws.mFrame;
                     final Rect cr = ws.mContentInsets;
                     int left = wf.left + cr.left;
                     int top = wf.top + cr.top;
@@ -5503,6 +5501,14 @@
         return config;
     }
 
+    private int reduceConfigWidthSize(int curSize, int rotation, float density, int dw) {
+        int size = (int)(mPolicy.getConfigDisplayWidth(rotation, dw) / density);
+        if (size < curSize) {
+            curSize = size;
+        }
+        return curSize;
+    }
+
     boolean computeNewConfigurationLocked(Configuration config) {
         if (mDisplay == null) {
             return false;
@@ -5553,14 +5559,37 @@
 
         // Override display width and height with what we are computing,
         // to be sure they remain consistent.
-        dm.widthPixels = mPolicy.getNonDecorDisplayWidth(dw);
-        dm.heightPixels = mPolicy.getNonDecorDisplayHeight(dh);
+        dm.widthPixels = dm.realWidthPixels = mPolicy.getNonDecorDisplayWidth(
+                mRotation, dw);
+        dm.heightPixels = dm.realHeightPixels = mPolicy.getNonDecorDisplayHeight(
+                mRotation, dh);
 
         mCompatibleScreenScale = CompatibilityInfo.updateCompatibleScreenFrame(
                 dm, mCompatibleScreenFrame, null);
 
-        config.screenWidthDp = (int)(dm.widthPixels / dm.density);
-        config.screenHeightDp = (int)(dm.heightPixels / dm.density);
+        config.screenWidthDp = (int)(mPolicy.getConfigDisplayWidth(mRotation, dw) / dm.density);
+        config.screenHeightDp = (int)(mPolicy.getConfigDisplayHeight(mRotation, dh) / dm.density);
+
+        // We need to determine the smallest width that will occur under normal
+        // operation.  To this, start with the base screen size and compute the
+        // width under the different possible rotations.  We need to un-rotate
+        // the current screen dimensions before doing this.
+        int unrotDw, unrotDh;
+        if (rotated) {
+            unrotDw = dh;
+            unrotDh = dw;
+        } else {
+            unrotDw = dw;
+            unrotDh = dh;
+        }
+        config.smallestScreenWidthDp = reduceConfigWidthSize(unrotDw,
+                Surface.ROTATION_0, dm.density, unrotDw);
+        config.smallestScreenWidthDp = reduceConfigWidthSize(config.smallestScreenWidthDp,
+                Surface.ROTATION_90, dm.density, unrotDh);
+        config.smallestScreenWidthDp = reduceConfigWidthSize(config.smallestScreenWidthDp,
+                Surface.ROTATION_180, dm.density, unrotDw);
+        config.smallestScreenWidthDp = reduceConfigWidthSize(config.smallestScreenWidthDp,
+                Surface.ROTATION_270, dm.density, unrotDh);
 
         // Compute the screen layout size class.
         int screenLayout;
@@ -5971,8 +6000,12 @@
             mActivityManager.updateConfiguration(null);
         } catch (RemoteException e) {
         }
-        
+
         mPolicy.systemReady();
+
+        synchronized (mWindowMap) {
+            readForcedDisplaySizeLocked();
+        }
     }
 
     // This is an animation that does nothing: it just immediately finishes
@@ -6488,6 +6521,8 @@
                         ? shortDimen : mInitialDisplayHeight;
             }
             setForcedDisplaySizeLocked(width, height);
+            Settings.Secure.putString(mContext.getContentResolver(),
+                    Settings.Secure.DISPLAY_SIZE_FORCED, width + "," + height);
         }
     }
 
@@ -6504,8 +6539,22 @@
             }
             if (mBaseDisplayWidth < mInitialDisplayWidth
                     || mBaseDisplayHeight < mInitialDisplayHeight) {
-                Rect outer = new Rect(0, 0, mInitialDisplayWidth, mInitialDisplayHeight);
-                Rect inner = new Rect(0, 0, mBaseDisplayWidth, mBaseDisplayHeight);
+                int initW, initH, baseW, baseH;
+                final boolean rotated = (mRotation == Surface.ROTATION_90
+                        || mRotation == Surface.ROTATION_270);
+                if (rotated) {
+                    initW = mInitialDisplayHeight;
+                    initH = mInitialDisplayWidth;
+                    baseW = mBaseDisplayHeight;
+                    baseH = mBaseDisplayWidth;
+                } else {
+                    initW = mInitialDisplayWidth;
+                    initH = mInitialDisplayHeight;
+                    baseW = mBaseDisplayWidth;
+                    baseH = mBaseDisplayHeight;
+                }
+                Rect outer = new Rect(0, 0, initW, initH);
+                Rect inner = new Rect(0, 0, baseW, baseH);
                 try {
                     mBlackFrame = new BlackFrame(mFxSession, outer, inner, MASK_LAYER);
                 } catch (Surface.OutOfResourcesException e) {
@@ -6520,7 +6569,29 @@
         }
     }
 
+    private void readForcedDisplaySizeLocked() {
+        final String str = Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.DISPLAY_SIZE_FORCED);
+        if (str == null || str.length() == 0) {
+            return;
+        }
+        final int pos = str.indexOf(',');
+        if (pos <= 0 || str.lastIndexOf(',') != pos) {
+            return;
+        }
+        int width, height;
+        try {
+            width = Integer.parseInt(str.substring(0, pos));
+            height = Integer.parseInt(str.substring(pos+1));
+        } catch (NumberFormatException ex) {
+            return;
+        }
+        setForcedDisplaySizeLocked(width, height);
+    }
+
     private void setForcedDisplaySizeLocked(int width, int height) {
+        Slog.i(TAG, "Using new display size: " + width + "x" + height);
+
         mBaseDisplayWidth = width;
         mBaseDisplayHeight = height;
         mPolicy.setInitialDisplaySize(mBaseDisplayWidth, mBaseDisplayHeight);
@@ -6550,6 +6621,8 @@
     public void clearForcedDisplaySize() {
         synchronized(mWindowMap) {
             setForcedDisplaySizeLocked(mInitialDisplayWidth, mInitialDisplayHeight);
+            Settings.Secure.putString(mContext.getContentResolver(),
+                    Settings.Secure.DISPLAY_SIZE_FORCED, "");
         }
     }
 
@@ -6798,9 +6871,6 @@
         final int dw = mCurDisplayWidth;
         final int dh = mCurDisplayHeight;
 
-        final int innerDw = mPolicy.getNonDecorDisplayWidth(dw);
-        final int innerDh = mPolicy.getNonDecorDisplayHeight(dh);
-
         final int N = mWindows.size();
         int i;
 
@@ -6855,7 +6925,6 @@
                     }
                     win.prelayout();
                     mPolicy.layoutWindowLw(win, win.mAttrs, null);
-                    win.evalNeedsBackgroundFiller(innerDw, innerDh);
                     win.mLayoutSeq = seq;
                     if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame="
                             + win.mFrame + " mContainingFrame="
@@ -6892,7 +6961,6 @@
                     }
                     win.prelayout();
                     mPolicy.layoutWindowLw(win, win.mAttrs, win.mAttachedWindow);
-                    win.evalNeedsBackgroundFiller(innerDw, innerDh);
                     win.mLayoutSeq = seq;
                     if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame="
                             + win.mFrame + " mContainingFrame="
@@ -6923,8 +6991,8 @@
         final int dw = mCurDisplayWidth;
         final int dh = mCurDisplayHeight;
 
-        final int innerDw = mPolicy.getNonDecorDisplayWidth(dw);
-        final int innerDh = mPolicy.getNonDecorDisplayHeight(dh);
+        final int innerDw = mPolicy.getNonDecorDisplayWidth(mRotation, dw);
+        final int innerDh = mPolicy.getNonDecorDisplayHeight(mRotation, dh);
 
         int i;
 
@@ -7344,7 +7412,6 @@
                         LayoutParams animLp = null;
                         int bestAnimLayer = -1;
                         boolean fullscreenAnim = false;
-                        boolean needBgFiller = false;
 
                         if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
                                 "New wallpaper target=" + mWallpaperTarget
@@ -7382,16 +7449,8 @@
                             if (wtoken.appFullscreen) {
                                 WindowState ws = wtoken.findMainWindow();
                                 if (ws != null) {
-                                    // If this is a compatibility mode
-                                    // window, we will always use its anim.
-                                    if (ws.mNeedsBackgroundFiller) {
-                                        animLp = ws.mAttrs;
-                                        bestAnimLayer = Integer.MAX_VALUE;
-                                        needBgFiller = true;
-                                    } else if (!fullscreenAnim || ws.mLayer > bestAnimLayer) {
-                                        animLp = ws.mAttrs;
-                                        bestAnimLayer = ws.mLayer;
-                                    }
+                                    animLp = ws.mAttrs;
+                                    bestAnimLayer = ws.mLayer;
                                     fullscreenAnim = true;
                                 }
                             } else if (!fullscreenAnim) {
@@ -7453,7 +7512,7 @@
                             wtoken.inPendingTransaction = false;
                             wtoken.animation = null;
                             setTokenVisibilityLocked(wtoken, animLp, true,
-                                    transit, false, needBgFiller);
+                                    transit, false);
                             wtoken.updateReportedVisibilityLocked();
                             wtoken.waitingToShow = false;
                             wtoken.showAllWindowsLocked();
@@ -7466,7 +7525,7 @@
                             wtoken.inPendingTransaction = false;
                             wtoken.animation = null;
                             setTokenVisibilityLocked(wtoken, animLp, false,
-                                    transit, false, needBgFiller);
+                                    transit, false);
                             wtoken.updateReportedVisibilityLocked();
                             wtoken.waitingToHide = false;
                             // Force the allDrawn flag, because we want to start
@@ -7633,8 +7692,6 @@
             boolean dimming = false;
             boolean covered = false;
             boolean syswin = false;
-            boolean backgroundFillerWasShown = mBackgroundFillerTarget != null;
-            mBackgroundFillerTarget = null;
 
             final int N = mWindows.size();
 
@@ -7663,8 +7720,7 @@
                     w.computeShownFrameLocked();
                     if (localLOGV) Slog.v(
                             TAG, "Placing surface #" + i + " " + w.mSurface
-                            + ": new=" + w.mShownFrame + ", old="
-                            + w.mLastShownFrame);
+                            + ": new=" + w.mShownFrame);
 
                     int width, height;
                     if ((w.mAttrs.flags & w.mAttrs.FLAG_SCALED) != 0) {
@@ -7672,13 +7728,9 @@
                         // the requested size.
                         width  = w.mRequestedWidth;
                         height = w.mRequestedHeight;
-                        w.mLastRequestedWidth = width;
-                        w.mLastRequestedHeight = height;
-                        w.mLastShownFrame.set(w.mShownFrame);
                     } else {
-                        width = w.mShownFrame.width();
-                        height = w.mShownFrame.height();
-                        w.mLastShownFrame.set(w.mShownFrame);
+                        width = w.mCompatFrame.width();
+                        height = w.mCompatFrame.height();
                     }
 
                     if (w.mSurface != null) {
@@ -7745,8 +7797,8 @@
                         }
                         if (localLOGV) Slog.v(TAG, "Resizing " + w
                                 + ": configChanged=" + configChanged
-                                + " last=" + w.mLastFrame + " frame=" + w.mFrame);
-                        boolean frameChanged = !w.mLastFrame.equals(w.mFrame);
+                                + " last=" + w.mLastCompatFrame + " frame=" + w.mCompatFrame);
+                        boolean frameChanged = !w.mLastCompatFrame.equals(w.mCompatFrame);
                         if (frameChanged
                                 || w.mContentInsetsChanged
                                 || w.mVisibleInsetsChanged
@@ -7762,6 +7814,7 @@
                             }
 
                             w.mLastFrame.set(w.mFrame);
+                            w.mLastCompatFrame.set(w.mCompatFrame);
                             w.mLastContentInsets.set(w.mContentInsets);
                             w.mLastVisibleInsets.set(w.mVisibleInsets);
                             // If the screen is currently frozen, then keep
@@ -7797,7 +7850,7 @@
                                 }
                             }
                             if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG,
-                                    "Resizing window " + w + " to " + w.mFrame);
+                                    "Resizing window " + w + " to " + w.mCompatFrame);
                             mResizingWindows.add(w);
                         } else if (w.mOrientationChanging) {
                             if (!w.mDrawPending && !w.mCommitDrawPending) {
@@ -7936,16 +7989,6 @@
 
                 final boolean obscuredChanged = w.mObscured != obscured;
 
-                if (mBackgroundFillerTarget != null) {
-                    if (w.isAnimating()) {
-                        // Background filler is below all other windows that
-                        // are animating.
-                        mBackgroundFillerTarget = w;
-                    } else if (w.mIsWallpaper) {
-                        mBackgroundFillerTarget = w;
-                    }
-                }
-
                 // Update effect.
                 if (!(w.mObscured=obscured)) {
                     if (w.mSurface != null) {
@@ -7974,12 +8017,6 @@
                         // so we want to leave all of them as unblurred (for
                         // performance reasons).
                         obscured = true;
-                    } else if (w.mNeedsBackgroundFiller && w.mHasDrawn
-                            && w.mViewVisibility == View.VISIBLE
-                            && (canBeSeen || w.isAnimating())) {
-                        // This window is in compatibility mode, and needs background filler.
-                        obscured = true;
-                        mBackgroundFillerTarget = w;
                     } else if (canBeSeen && !obscured &&
                             (attrFlags&FLAG_BLUR_BEHIND|FLAG_DIM_BEHIND) != 0) {
                         if (localLOGV) Slog.v(TAG, "Win " + w
@@ -8046,47 +8083,6 @@
                 }
             }
 
-            if (mBackgroundFillerTarget != null) {
-                if (mBackgroundFillerSurface == null) {
-                    try {
-                        mBackgroundFillerSurface = new Surface(mFxSession, 0,
-                                "BackGroundFiller",
-                                0, dw, dh,
-                                PixelFormat.OPAQUE,
-                                Surface.FX_SURFACE_NORMAL);
-                    } catch (Exception e) {
-                        Slog.e(TAG, "Exception creating filler surface", e);
-                    }
-                    if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BG FILLER "
-                            + mBackgroundFillerSurface + ": CREATE");
-                }
-                try {
-                    if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BG FILLER "
-                            + mBackgroundFillerSurface + " SHOW: pos=(0,0) ("
-                            + dw + "x" + dh + ") layer="
-                            + (mBackgroundFillerTarget.mLayer - 1));
-                    mBackgroundFillerSurface.setPosition(0, 0);
-                    mBackgroundFillerSurface.setSize(dw, dh);
-                    // Using the same layer as Dim because they will never be shown at the
-                    // same time.  NOTE: we do NOT use mAnimLayer, because we don't
-                    // want this surface dragged up in front of stuff that is animating.
-                    mBackgroundFillerSurface.setLayer(mBackgroundFillerTarget.mLayer
-                            - LAYER_OFFSET_DIM);
-                    mBackgroundFillerSurface.show();
-                } catch (RuntimeException e) {
-                    Slog.e(TAG, "Exception showing filler surface");
-                }
-            } else if (backgroundFillerWasShown) {
-                mBackgroundFillerTarget = null;
-                if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BG FILLER "
-                        + mBackgroundFillerSurface + " HIDE");
-                try {
-                    mBackgroundFillerSurface.hide();
-                } catch (RuntimeException e) {
-                    Slog.e(TAG, "Exception hiding filler surface", e);
-                }
-            }
-
             if (mDimAnimator != null && mDimAnimator.mDimShown) {
                 animating |= mDimAnimator.updateSurface(dimming, currentTime,
                         mDisplayFrozen || !mPolicy.isScreenOn());
@@ -8141,7 +8137,7 @@
                 WindowState win = mResizingWindows.get(i);
                 try {
                     if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG,
-                            "Reporting new frame to " + win + ": " + win.mFrame);
+                            "Reporting new frame to " + win + ": " + win.mCompatFrame);
                     int diff = 0;
                     boolean configChanged =
                         win.mConfiguration != mCurConfiguration
@@ -8150,13 +8146,13 @@
                     if ((DEBUG_RESIZE || DEBUG_ORIENTATION || DEBUG_CONFIGURATION)
                             && configChanged) {
                         Slog.i(TAG, "Sending new config to window " + win + ": "
-                                + win.mFrame.width() + "x" + win.mFrame.height()
+                                + win.mCompatFrame.width() + "x" + win.mCompatFrame.height()
                                 + " / " + mCurConfiguration + " / 0x"
                                 + Integer.toHexString(diff));
                     }
                     win.mConfiguration = mCurConfiguration;
-                    win.mClient.resized(win.mFrame.width(),
-                            win.mFrame.height(), win.mLastContentInsets,
+                    win.mClient.resized(win.mCompatFrame.width(),
+                            win.mCompatFrame.height(), win.mLastContentInsets,
                             win.mLastVisibleInsets, win.mDrawPending,
                             configChanged ? win.mConfiguration : null);
                     win.mContentInsetsChanged = false;
diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java
index 2014e9d..144341b 100644
--- a/services/java/com/android/server/wm/WindowState.java
+++ b/services/java/com/android/server/wm/WindowState.java
@@ -18,7 +18,6 @@
 
 import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
 import static android.view.WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
-import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
 import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
 import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
@@ -83,23 +82,30 @@
     boolean mAttachedHidden;    // is our parent window hidden?
     boolean mLastHidden;        // was this window last hidden?
     boolean mWallpaperVisible;  // for wallpaper, what was last vis report?
+
+    /**
+     * The window size that was requested by the application.  These are in
+     * the application's coordinate space (without compatibility scale applied).
+     */
     int mRequestedWidth;
     int mRequestedHeight;
-    int mLastRequestedWidth;
-    int mLastRequestedHeight;
+
     int mLayer;
     int mAnimLayer;
     int mLastLayer;
     boolean mHaveFrame;
     boolean mObscured;
-    boolean mNeedsBackgroundFiller;
     boolean mTurnOnScreen;
 
     int mLayoutSeq = -1;
     
     Configuration mConfiguration = null;
     
-    // Actual frame shown on-screen (may be modified by animation)
+    /**
+     * Actual frame shown on-screen (may be modified by animation).  These
+     * are in the screen's coordinate space (WITH the compatibility scale
+     * applied).
+     */
     final Rect mShownFrame = new Rect();
     final Rect mLastShownFrame = new Rect();
 
@@ -110,14 +116,16 @@
     boolean mSurfaceResized;
     
     /**
-     * Insets that determine the actually visible area
+     * Insets that determine the actually visible area.  These are in the application's
+     * coordinate space (without compatibility scale applied).
      */
     final Rect mVisibleInsets = new Rect();
     final Rect mLastVisibleInsets = new Rect();
     boolean mVisibleInsetsChanged;
 
     /**
-     * Insets that are covered by system windows
+     * Insets that are covered by system windows.  These are in the application's
+     * coordinate space (without compatibility scale applied).
      */
     final Rect mContentInsets = new Rect();
     final Rect mLastContentInsets = new Rect();
@@ -157,16 +165,20 @@
     // Current transformation being applied.
     boolean mHaveMatrix;
     float mGlobalScale=1;
+    float mInvGlobalScale=1;
     float mDsDx=1, mDtDx=0, mDsDy=0, mDtDy=1;
     float mLastDsDx=1, mLastDtDx=0, mLastDsDy=0, mLastDtDy=1;
     float mHScale=1, mVScale=1;
     float mLastHScale=1, mLastVScale=1;
     final Matrix mTmpMatrix = new Matrix();
 
-    // "Real" frame that the application sees.
+    // "Real" frame that the application sees, in display coordinate space.
     final Rect mFrame = new Rect();
     final Rect mLastFrame = new Rect();
-    final Rect mScaledFrame = new Rect();
+    // Frame that is scaled to the application's coordinate space when in
+    // screen size compatibility mode.
+    final Rect mCompatFrame = new Rect();
+    final Rect mLastCompatFrame = new Rect();
 
     final Rect mContainingFrame = new Rect();
     final Rect mDisplayFrame = new Rect();
@@ -346,8 +358,6 @@
         mSurface = null;
         mRequestedWidth = 0;
         mRequestedHeight = 0;
-        mLastRequestedWidth = 0;
-        mLastRequestedHeight = 0;
         mXOffset = 0;
         mYOffset = 0;
         mLayer = 0;
@@ -373,23 +383,40 @@
         final Rect display = mDisplayFrame;
         display.set(df);
 
-        if (mEnforceSizeCompat) {
-            container.intersect(mService.mCompatibleScreenFrame);
-            if ((mAttrs.flags & FLAG_LAYOUT_NO_LIMITS) == 0) {
-                display.intersect(mService.mCompatibleScreenFrame);
-            }
-        }
-
         final int pw = container.right - container.left;
         final int ph = container.bottom - container.top;
 
         int w,h;
-        if ((mAttrs.flags & mAttrs.FLAG_SCALED) != 0) {
-            w = mAttrs.width < 0 ? pw : mAttrs.width;
-            h = mAttrs.height< 0 ? ph : mAttrs.height;
+        if ((mAttrs.flags & WindowManager.LayoutParams.FLAG_SCALED) != 0) {
+            if (mAttrs.width < 0) {
+                w = pw;
+            } else if (mEnforceSizeCompat) {
+                w = (int)(mAttrs.width * mGlobalScale + .5f);
+            } else {
+                w = mAttrs.width;
+            }
+            if (mAttrs.height < 0) {
+                h = ph;
+            } else if (mEnforceSizeCompat) {
+                h = (int)(mAttrs.height * mGlobalScale + .5f);
+            } else {
+                h = mAttrs.height;
+            }
         } else {
-            w = mAttrs.width == mAttrs.MATCH_PARENT ? pw : mRequestedWidth;
-            h = mAttrs.height== mAttrs.MATCH_PARENT ? ph : mRequestedHeight;
+            if (mAttrs.width == WindowManager.LayoutParams.MATCH_PARENT) {
+                w = pw;
+            } else if (mEnforceSizeCompat) {
+                w = (int)(mRequestedWidth * mGlobalScale + .5f);
+            } else {
+                w = mRequestedWidth;
+            }
+            if (mAttrs.height == WindowManager.LayoutParams.MATCH_PARENT) {
+                h = ph;
+            } else if (mEnforceSizeCompat) {
+                h = (int)(mRequestedHeight * mGlobalScale + .5f);
+            } else {
+                h = mRequestedHeight;
+            }
         }
 
         if (!mParentFrame.equals(pf)) {
@@ -412,37 +439,24 @@
         //System.out.println("In: w=" + w + " h=" + h + " container=" +
         //                   container + " x=" + mAttrs.x + " y=" + mAttrs.y);
 
+        float x, y;
+        if (mEnforceSizeCompat) {
+            x = mAttrs.x * mGlobalScale;
+            y = mAttrs.y * mGlobalScale;
+        } else {
+            x = mAttrs.x;
+            y = mAttrs.y;
+        }
+
         Gravity.apply(mAttrs.gravity, w, h, container,
-                (int) (mAttrs.x + mAttrs.horizontalMargin * pw),
-                (int) (mAttrs.y + mAttrs.verticalMargin * ph), frame);
+                (int) (x + mAttrs.horizontalMargin * pw),
+                (int) (y + mAttrs.verticalMargin * ph), frame);
 
         //System.out.println("Out: " + mFrame);
 
         // Now make sure the window fits in the overall display.
         Gravity.applyDisplay(mAttrs.gravity, df, frame);
 
-        int adjRight=0, adjBottom=0;
-
-        if (mEnforceSizeCompat) {
-            // Adjust window offsets by the scaling factor.
-            int xoff = (int)((frame.left-mService.mCompatibleScreenFrame.left)*mGlobalScale)
-                    - (frame.left-mService.mCompatibleScreenFrame.left);
-            int yoff = (int)((frame.top-mService.mCompatibleScreenFrame.top)*mGlobalScale)
-                    - (frame.top-mService.mCompatibleScreenFrame.top);
-            frame.offset(xoff, yoff);
-
-            // We are temporarily going to apply the compatibility scale
-            // to the window so that we can correctly associate it with the
-            // content and visible frame.
-            adjRight = frame.right - frame.left;
-            adjRight = (int)((adjRight)*mGlobalScale + .5f) - adjRight;
-            adjBottom = frame.bottom - frame.top;
-            adjBottom = (int)((adjBottom)*mGlobalScale + .5f) - adjBottom;
-            frame.right += adjRight;
-            frame.bottom += adjBottom;
-        }
-        mScaledFrame.set(frame);
-
         // Make sure the content and visible frames are inside of the
         // final window frame.
         if (content.left < frame.left) content.left = frame.left;
@@ -466,20 +480,17 @@
         visibleInsets.right = frame.right-visible.right;
         visibleInsets.bottom = frame.bottom-visible.bottom;
 
+        mCompatFrame.set(frame);
         if (mEnforceSizeCompat) {
-            // Scale the computed insets back to the window's compatibility
-            // coordinate space, and put frame back to correct size.
-            final float invScale = 1.0f/mGlobalScale;
-            contentInsets.left = (int)(contentInsets.left*invScale);
-            contentInsets.top = (int)(contentInsets.top*invScale);
-            contentInsets.right = (int)(contentInsets.right*invScale);
-            contentInsets.bottom = (int)(contentInsets.bottom*invScale);
-            visibleInsets.left = (int)(visibleInsets.left*invScale);
-            visibleInsets.top = (int)(visibleInsets.top*invScale);
-            visibleInsets.right = (int)(visibleInsets.right*invScale);
-            visibleInsets.bottom = (int)(visibleInsets.bottom*invScale);
-            frame.right -= adjRight;
-            frame.bottom -= adjBottom;
+            // If there is a size compatibility scale being applied to the
+            // window, we need to apply this to its insets so that they are
+            // reported to the app in its coordinate space.
+            contentInsets.scale(mInvGlobalScale);
+            visibleInsets.scale(mInvGlobalScale);
+
+            // Also the scaled frame that we report to the app needs to be
+            // adjusted to be in its coordinate space.
+            mCompatFrame.scale(mInvGlobalScale);
         }
 
         if (mIsWallpaper && (fw != frame.width() || fh != frame.height())) {
@@ -592,12 +603,12 @@
             if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(
                 WindowManagerService.TAG, "Creating surface in session "
                 + mSession.mSurfaceSession + " window " + this
-                + " w=" + mFrame.width()
-                + " h=" + mFrame.height() + " format="
+                + " w=" + mCompatFrame.width()
+                + " h=" + mCompatFrame.height() + " format="
                 + mAttrs.format + " flags=" + flags);
 
-            int w = mFrame.width();
-            int h = mFrame.height();
+            int w = mCompatFrame.width();
+            int h = mCompatFrame.height();
             if ((mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) {
                 // for a scaled surface, we always want the requested
                 // size.
@@ -650,8 +661,9 @@
                 + ", animLayer=" + mAnimLayer);
             if (WindowManagerService.SHOW_TRANSACTIONS) {
                 Slog.i(WindowManagerService.TAG, ">>> OPEN TRANSACTION createSurfaceLocked");
-                WindowManagerService.logSurface(this, "CREATE pos=(" + mFrame.left + "," + mFrame.top + ") (" +
-                        mFrame.width() + "x" + mFrame.height() + "), layer=" +
+                WindowManagerService.logSurface(this, "CREATE pos=(" + mFrame.left
+                        + "," + mFrame.top + ") (" +
+                        mCompatFrame.width() + "x" + mCompatFrame.height() + "), layer=" +
                         mAnimLayer + " HIDE", null);
             }
             Surface.openTransaction();
@@ -862,10 +874,10 @@
                 if (!mLocalAnimating) {
                     if (WindowManagerService.DEBUG_ANIM) Slog.v(
                         WindowManagerService.TAG, "Starting animation in " + this +
-                        " @ " + currentTime + ": ww=" + mScaledFrame.width() +
-                        " wh=" + mScaledFrame.height() +
+                        " @ " + currentTime + ": ww=" + mFrame.width() +
+                        " wh=" + mFrame.height() +
                         " dw=" + dw + " dh=" + dh + " scale=" + mService.mWindowAnimationScale);
-                    mAnimation.initialize(mScaledFrame.width(), mScaledFrame.height(), dw, dh);
+                    mAnimation.initialize(mFrame.width(), mFrame.height(), dw, dh);
                     mAnimation.setStartTime(currentTime);
                     mLocalAnimating = true;
                     mAnimating = true;
@@ -1035,8 +1047,9 @@
     void prelayout() {
         if (mEnforceSizeCompat) {
             mGlobalScale = mService.mCompatibleScreenScale;
+            mInvGlobalScale = 1/mGlobalScale;
         } else {
-            mGlobalScale = 1;
+            mGlobalScale = mInvGlobalScale = 1;
         }
     }
 
@@ -1334,35 +1347,9 @@
                 && mService.mPolicy.isScreenOn();
     }
 
-    void evalNeedsBackgroundFiller(int screenWidth, int screenHeight) {
-        mNeedsBackgroundFiller =
-             // only if the application is requesting compatible window
-             mEnforceSizeCompat &&
-             // only if it's visible
-             mHasDrawn && mViewVisibility == View.VISIBLE &&
-             // not needed if the compat window is actually full screen
-             !isFullscreenIgnoringCompat(screenWidth, screenHeight) &&
-             // and only if the application fills the compatible screen
-             mFrame.left <= mService.mCompatibleScreenFrame.left &&
-             mFrame.top <= mService.mCompatibleScreenFrame.top &&
-             mFrame.right >= mService.mCompatibleScreenFrame.right &&
-             mFrame.bottom >= mService.mCompatibleScreenFrame.bottom;
-    }
-
     boolean isFullscreen(int screenWidth, int screenHeight) {
-        if (mEnforceSizeCompat) {
-            return mFrame.left <= mService.mCompatibleScreenFrame.left &&
-                    mFrame.top <= mService.mCompatibleScreenFrame.top &&
-                    mFrame.right >= mService.mCompatibleScreenFrame.right &&
-                    mFrame.bottom >= mService.mCompatibleScreenFrame.bottom;
-        } else {
-            return isFullscreenIgnoringCompat(screenWidth, screenHeight);
-        }
-    }
-
-    boolean isFullscreenIgnoringCompat(int screenWidth, int screenHeight) {
-        return mScaledFrame.left <= 0 && mScaledFrame.top <= 0 &&
-                mScaledFrame.right >= screenWidth && mScaledFrame.bottom >= screenHeight;
+        return mFrame.left <= 0 && mFrame.top <= 0 &&
+                mFrame.right >= screenWidth && mFrame.bottom >= screenHeight;
     }
 
     void removeLocked() {
@@ -1492,38 +1479,28 @@
         return true;
     }
 
-    private static void applyScaledInsets(Region outRegion, Rect frame, Rect inset, float scale) {
-        if (scale != 1) {
-            outRegion.set(frame.left + (int)(inset.left*scale),
-                    frame.top + (int)(inset.top*scale),
-                    frame.right - (int)(inset.right*scale),
-                    frame.bottom - (int)(inset.bottom*scale));
-        } else {
-            outRegion.set(
-                    frame.left + inset.left, frame.top + inset.top,
-                    frame.right - inset.right, frame.bottom - inset.bottom);
-        }
+    private static void applyInsets(Region outRegion, Rect frame, Rect inset) {
+        outRegion.set(
+                frame.left + inset.left, frame.top + inset.top,
+                frame.right - inset.right, frame.bottom - inset.bottom);
     }
 
     public void getTouchableRegion(Region outRegion) {
-        final Rect frame = mScaledFrame;
+        final Rect frame = mFrame;
         switch (mTouchableInsets) {
             default:
             case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME:
                 outRegion.set(frame);
                 break;
             case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT:
-                applyScaledInsets(outRegion, frame, mGivenContentInsets, mGlobalScale);
+                applyInsets(outRegion, frame, mGivenContentInsets);
                 break;
             case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_VISIBLE:
-                applyScaledInsets(outRegion, frame, mGivenVisibleInsets, mGlobalScale);
+                applyInsets(outRegion, frame, mGivenVisibleInsets);
                 break;
             case ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION: {
                 final Region givenTouchableRegion = mGivenTouchableRegion;
                 outRegion.set(givenTouchableRegion);
-                if (mGlobalScale != 1) {
-                    outRegion.scale(mGlobalScale);
-                }
                 outRegion.translate(frame.left, frame.top);
                 break;
             }
@@ -1586,8 +1563,7 @@
         }
         pw.print(prefix); pw.print("Requested w="); pw.print(mRequestedWidth);
                 pw.print(" h="); pw.print(mRequestedHeight);
-                pw.print(" mLayoutSeq="); pw.print(mLayoutSeq);
-                pw.print(" mNeedsBackgroundFiller="); pw.println(mNeedsBackgroundFiller);
+                pw.print(" mLayoutSeq="); pw.println(mLayoutSeq);
         if (mXOffset != 0 || mYOffset != 0) {
             pw.print(prefix); pw.print("Offsets x="); pw.print(mXOffset);
                     pw.print(" y="); pw.println(mYOffset);
@@ -1608,8 +1584,12 @@
                 pw.println();
         pw.print(prefix); pw.print("mFrame="); mFrame.printShortString(pw);
                 pw.print(" last="); mLastFrame.printShortString(pw);
-                pw.print(" scaled="); mScaledFrame.printShortString(pw);
                 pw.println();
+        if (mEnforceSizeCompat) {
+            pw.print(prefix); pw.print("mCompatFrame="); mCompatFrame.printShortString(pw);
+                    pw.print(" last="); mLastCompatFrame.printShortString(pw);
+                    pw.println();
+        }
         pw.print(prefix); pw.print("mContainingFrame=");
                 mContainingFrame.printShortString(pw);
                 pw.print(" mParentFrame=");
diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp
index ce1ab3d..c5e69ff 100644
--- a/services/sensorservice/SensorService.cpp
+++ b/services/sensorservice/SensorService.cpp
@@ -44,8 +44,7 @@
 // ---------------------------------------------------------------------------
 
 SensorService::SensorService()
-    : Thread(false),
-      mDump("android.permission.DUMP"),
+    : mDump("android.permission.DUMP"),
       mInitCheck(NO_INIT)
 {
 }
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 2cabe02..8df2b92 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -79,6 +79,10 @@
     }
 }
 
+void Layer::destroy() const {
+    mFlinger->destroyLayer(this);
+}
+
 status_t Layer::setToken(const sp<UserClient>& userClient,
         SharedClient* sharedClient, int32_t token)
 {
@@ -147,18 +151,6 @@
     return sur;
 }
 
-status_t Layer::ditch()
-{
-    // NOTE: Called from the main UI thread
-
-    // the layer is not on screen anymore. free as much resources as possible
-    mFreezeLock.clear();
-
-    Mutex::Autolock _l(mLock);
-    mWidth = mHeight = 0;
-    return NO_ERROR;
-}
-
 status_t Layer::setBuffers( uint32_t w, uint32_t h,
                             PixelFormat format, uint32_t flags)
 {
diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h
index 128f93d..278d64e 100644
--- a/services/surfaceflinger/Layer.h
+++ b/services/surfaceflinger/Layer.h
@@ -82,7 +82,6 @@
     virtual bool isSecure() const           { return mSecure; }
     virtual bool isProtected() const;
     virtual sp<Surface> createSurface() const;
-    virtual status_t ditch();
     virtual void onRemoved();
 
     // only for debugging
@@ -93,6 +92,7 @@
         return mFreezeLock; }
 
 protected:
+    virtual void destroy() const;
     virtual void dump(String8& result, char* scratch, size_t size) const;
 
 private:
diff --git a/services/surfaceflinger/LayerBase.cpp b/services/surfaceflinger/LayerBase.cpp
index 6025ed4..022f251 100644
--- a/services/surfaceflinger/LayerBase.cpp
+++ b/services/surfaceflinger/LayerBase.cpp
@@ -616,10 +616,7 @@
      */
 
     // destroy client resources
-    sp<LayerBaseClient> layer = getOwner();
-    if (layer != 0) {
-        mFlinger->destroySurface(layer);
-    }
+    mFlinger->destroySurface(mOwner);
 }
 
 sp<LayerBaseClient> LayerBaseClient::Surface::getOwner() const {
diff --git a/services/surfaceflinger/LayerBase.h b/services/surfaceflinger/LayerBase.h
index 7162e47..6c49a19 100644
--- a/services/surfaceflinger/LayerBase.h
+++ b/services/surfaceflinger/LayerBase.h
@@ -202,10 +202,6 @@
      */
     virtual bool isProtected() const   { return false; }
 
-    /** Called from the main thread, when the surface is removed from the
-     * draw list */
-    virtual status_t ditch() { return NO_ERROR; }
-
     /** called with the state lock when the surface is removed from the
      *  current list */
     virtual void onRemoved() { };
@@ -271,7 +267,8 @@
     volatile    int32_t         mInvalidate;
                 
 
-protected:
+public:
+    // called from class SurfaceFlinger
     virtual ~LayerBase();
 
 private:
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index e8f0328..b7a51a4 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -387,6 +387,9 @@
 {
     waitForEvent();
 
+    // call Layer's destructor
+    handleDestroyLayers();
+
     // check for transactions
     if (UNLIKELY(mConsoleSignals)) {
         handleConsoleEvents();
@@ -480,49 +483,27 @@
 
 void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
 {
-    Vector< sp<LayerBase> > ditchedLayers;
+    Mutex::Autolock _l(mStateLock);
+    const nsecs_t now = systemTime();
+    mDebugInTransaction = now;
 
-    /*
-     * Perform and commit the transaction
-     */
+    // Here we're guaranteed that some transaction flags are set
+    // so we can call handleTransactionLocked() unconditionally.
+    // We call getTransactionFlags(), which will also clear the flags,
+    // with mStateLock held to guarantee that mCurrentState won't change
+    // until the transaction is committed.
 
-    { // scope for the lock
-        Mutex::Autolock _l(mStateLock);
-        const nsecs_t now = systemTime();
-        mDebugInTransaction = now;
+    const uint32_t mask = eTransactionNeeded | eTraversalNeeded;
+    transactionFlags = getTransactionFlags(mask);
+    handleTransactionLocked(transactionFlags);
 
-        // Here we're guaranteed that some transaction flags are set
-        // so we can call handleTransactionLocked() unconditionally.
-        // We call getTransactionFlags(), which will also clear the flags,
-        // with mStateLock held to guarantee that mCurrentState won't change
-        // until the transaction is commited.
-
-        const uint32_t mask = eTransactionNeeded | eTraversalNeeded;
-        transactionFlags = getTransactionFlags(mask);
-        handleTransactionLocked(transactionFlags, ditchedLayers);
-
-        mLastTransactionTime = systemTime() - now;
-        mDebugInTransaction = 0;
-        invalidateHwcGeometry();
-        // here the transaction has been committed
-    }
-
-    /*
-     * Clean-up all layers that went away
-     * (do this without the lock held)
-     */
-
-    const size_t count = ditchedLayers.size();
-    for (size_t i=0 ; i<count ; i++) {
-        if (ditchedLayers[i] != 0) {
-            //LOGD("ditching layer %p", ditchedLayers[i].get());
-            ditchedLayers[i]->ditch();
-        }
-    }
+    mLastTransactionTime = systemTime() - now;
+    mDebugInTransaction = 0;
+    invalidateHwcGeometry();
+    // here the transaction has been committed
 }
 
-void SurfaceFlinger::handleTransactionLocked(
-        uint32_t transactionFlags, Vector< sp<LayerBase> >& ditchedLayers)
+void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
 {
     const LayerVector& currentLayers(mCurrentState.layersSortedByZ);
     const size_t count = currentLayers.size();
@@ -594,7 +575,6 @@
                 const sp<LayerBase>& layer(previousLayers[i]);
                 if (currentLayers.indexOf( layer ) < 0) {
                     // this layer is not visible anymore
-                    ditchedLayers.add(layer);
                     mDirtyRegionRemovedLayer.orSelf(layer->visibleRegionScreen);
                 }
             }
@@ -604,6 +584,31 @@
     commitTransaction();
 }
 
+void SurfaceFlinger::destroyLayer(LayerBase const* layer)
+{
+    Mutex::Autolock _l(mDestroyedLayerLock);
+    mDestroyedLayers.add(layer);
+    signalEvent();
+}
+
+void SurfaceFlinger::handleDestroyLayers()
+{
+    Vector<LayerBase const *> destroyedLayers;
+
+    { // scope for the lock
+        Mutex::Autolock _l(mDestroyedLayerLock);
+        destroyedLayers = mDestroyedLayers;
+        mDestroyedLayers.clear();
+    }
+
+    // call destructors without a lock held
+    const size_t count = destroyedLayers.size();
+    for (size_t i=0 ; i<count ; i++) {
+        //LOGD("destroying %s", destroyedLayers[i]->getName().string());
+        delete destroyedLayers[i];
+    }
+}
+
 sp<FreezeLock> SurfaceFlinger::getFreezeLock() const
 {
     return new FreezeLock(const_cast<SurfaceFlinger *>(this));
@@ -1377,51 +1382,26 @@
     return err;
 }
 
-status_t SurfaceFlinger::destroySurface(const sp<LayerBaseClient>& layer)
+status_t SurfaceFlinger::destroySurface(const wp<LayerBaseClient>& layer)
 {
     // called by ~ISurface() when all references are gone
-
-    class MessageDestroySurface : public MessageBase {
-        SurfaceFlinger* flinger;
-        sp<LayerBaseClient> layer;
-    public:
-        MessageDestroySurface(
-                SurfaceFlinger* flinger, const sp<LayerBaseClient>& layer)
-            : flinger(flinger), layer(layer) { }
-        virtual bool handler() {
-            sp<LayerBaseClient> l(layer);
-            layer.clear(); // clear it outside of the lock;
-            Mutex::Autolock _l(flinger->mStateLock);
-            /*
-             * remove the layer from the current list -- chances are that it's
-             * not in the list anyway, because it should have been removed
-             * already upon request of the client (eg: window manager).
-             * However, a buggy client could have not done that.
-             * Since we know we don't have any more clients, we don't need
-             * to use the purgatory.
-             */
-            status_t err = flinger->removeLayer_l(l);
-            if (err == NAME_NOT_FOUND) {
-                // The surface wasn't in the current list, which means it was
-                // removed already, which means it is in the purgatory,
-                // and need to be removed from there.
-                // This needs to happen from the main thread since its dtor
-                // must run from there (b/c of OpenGL ES). Additionally, we
-                // can't really acquire our internal lock from
-                // destroySurface() -- see postMessage() below.
-                ssize_t idx = flinger->mLayerPurgatory.remove(l);
-                LOGE_IF(idx < 0,
-                        "layer=%p is not in the purgatory list", l.get());
-            }
-
-            LOGE_IF(err<0 && err != NAME_NOT_FOUND,
-                    "error removing layer=%p (%s)", l.get(), strerror(-err));
-            return true;
+    status_t err = NO_ERROR;
+    sp<LayerBaseClient> l(layer.promote());
+    if (l != NULL) {
+        Mutex::Autolock _l(mStateLock);
+        err = removeLayer_l(l);
+        if (err == NAME_NOT_FOUND) {
+            // The surface wasn't in the current list, which means it was
+            // removed already, which means it is in the purgatory,
+            // and need to be removed from there.
+            ssize_t idx = mLayerPurgatory.remove(l);
+            LOGE_IF(idx < 0,
+                    "layer=%p is not in the purgatory list", l.get());
         }
-    };
-
-    postMessageAsync( new MessageDestroySurface(this, layer) );
-    return NO_ERROR;
+        LOGE_IF(err<0 && err != NAME_NOT_FOUND,
+                "error removing layer=%p (%s)", l.get(), strerror(-err));
+    }
+    return err;
 }
 
 status_t SurfaceFlinger::setClientState(
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index 1e16943..992861a 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -227,6 +227,7 @@
     status_t addLayer(const sp<LayerBase>& layer);
     status_t invalidateLayerVisibility(const sp<LayerBase>& layer);
     void invalidateHwcGeometry();
+    void destroyLayer(LayerBase const* layer);
 
     sp<Layer> getLayer(const sp<ISurface>& sur) const;
 
@@ -255,7 +256,7 @@
             uint32_t w, uint32_t h, uint32_t flags);
 
     status_t removeSurface(const sp<Client>& client, SurfaceID sid);
-    status_t destroySurface(const sp<LayerBaseClient>& layer);
+    status_t destroySurface(const wp<LayerBaseClient>& layer);
     status_t setClientState(const sp<Client>& client,
             int32_t count, const layer_state_t* states);
 
@@ -300,9 +301,8 @@
 private:
             void        handleConsoleEvents();
             void        handleTransaction(uint32_t transactionFlags);
-            void        handleTransactionLocked(
-                            uint32_t transactionFlags, 
-                            Vector< sp<LayerBase> >& ditchedLayers);
+            void        handleTransactionLocked(uint32_t transactionFlags);
+            void        handleDestroyLayers();
 
             void        computeVisibleRegions(
                             const LayerVector& currentLayers,
@@ -424,6 +424,11 @@
                 // these are thread safe
     mutable     Barrier                     mReadyToRunBarrier;
 
+
+                // protected by mDestroyedLayerLock;
+    mutable     Mutex                       mDestroyedLayerLock;
+                Vector<LayerBase const *>   mDestroyedLayers;
+
                 // atomic variables
                 enum {
                     eConsoleReleased = 1,
diff --git a/services/tests/servicestests/src/com/android/server/ThrottleServiceTest.java b/services/tests/servicestests/src/com/android/server/ThrottleServiceTest.java
index f20d5e5..ca33d32 100644
--- a/services/tests/servicestests/src/com/android/server/ThrottleServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/ThrottleServiceTest.java
@@ -42,6 +42,7 @@
 import android.os.SystemClock;
 import android.provider.Settings;
 import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.LargeTest;
 import android.test.suitebuilder.annotation.Suppress;
 import android.text.format.DateUtils;
 import android.util.Log;
@@ -54,6 +55,7 @@
 /**
  * Tests for {@link ThrottleService}.
  */
+@LargeTest
 public class ThrottleServiceTest extends AndroidTestCase {
     private static final String TAG = "ThrottleServiceTest";
 
diff --git a/telephony/java/com/android/internal/telephony/ApnContext.java b/telephony/java/com/android/internal/telephony/ApnContext.java
index ce1a3b6..496c43c 100644
--- a/telephony/java/com/android/internal/telephony/ApnContext.java
+++ b/telephony/java/com/android/internal/telephony/ApnContext.java
@@ -85,12 +85,10 @@
 
 
     public synchronized DataConnectionAc getDataConnectionAc() {
-        log("getDataConnectionAc dcac=" + mDataConnectionAc);
         return mDataConnectionAc;
     }
 
     public synchronized void setDataConnectionAc(DataConnectionAc dcac) {
-        log("setDataConnectionAc dcac=" + dcac);
         mDataConnectionAc = dcac;
     }
 
diff --git a/telephony/java/com/android/internal/telephony/BaseCommands.java b/telephony/java/com/android/internal/telephony/BaseCommands.java
index 9fc4667..0c4581b 100644
--- a/telephony/java/com/android/internal/telephony/BaseCommands.java
+++ b/telephony/java/com/android/internal/telephony/BaseCommands.java
@@ -25,6 +25,11 @@
 import android.os.SystemProperties;
 import android.util.Log;
 
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 /**
  * {@hide}
  */
@@ -794,6 +799,34 @@
     }
 
     /**
+     * The contents of the /proc/cmdline file
+     */
+    private static String getProcCmdLine()
+    {
+        String cmdline = "";
+        FileInputStream is = null;
+        try {
+            is = new FileInputStream("/proc/cmdline");
+            byte [] buffer = new byte[2048];
+            int count = is.read(buffer);
+            if (count > 0) {
+                cmdline = new String(buffer, 0, count);
+            }
+        } catch (IOException e) {
+            Log.d(LOG_TAG, "No /proc/cmdline exception=" + e);
+        } finally {
+            if (is != null) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+        Log.d(LOG_TAG, "/proc/cmdline=" + cmdline);
+        return cmdline;
+    }
+
+    /**
      * {@inheritDoc}
      */
     @Override
@@ -801,6 +834,17 @@
         return getLteOnCdmaModeStatic();
     }
 
+    /** Kernel command line */
+    private static final String sKernelCmdLine = getProcCmdLine();
+
+    /** Pattern for selecting the product type from the kernel command line */
+    private static final Pattern sProductTypePattern =
+        Pattern.compile("\\sproduct_type\\s*=\\s*(\\w+)");
+
+    /** The ProductType used for LTE on CDMA devices */
+    private static final String sLteOnCdmaProductType =
+        SystemProperties.get(TelephonyProperties.PROPERTY_LTE_ON_CDMA_PRODUCT_TYPE, "");
+
     /**
      * Return if the current radio is LTE on CDMA. This
      * is a tri-state return value as for a period of time
@@ -810,9 +854,24 @@
      * or {@link Phone#LTE_ON_CDMA_TRUE}
      */
     public static int getLteOnCdmaModeStatic() {
-        int retVal = SystemProperties.getInt(TelephonyProperties.PROPERTY_NETWORK_LTE_ON_CDMA,
-                Phone.LTE_ON_CDMA_FALSE);
-        Log.d(LOG_TAG, "getLteOnCdmaMode=" + retVal);
+        int retVal;
+        String productType;
+
+        Matcher matcher = sProductTypePattern.matcher(sKernelCmdLine);
+        if (matcher.find()) {
+            productType = matcher.group(1);
+            if (sLteOnCdmaProductType.equals(productType)) {
+                retVal = Phone.LTE_ON_CDMA_TRUE;
+            } else {
+                retVal = Phone.LTE_ON_CDMA_FALSE;
+            }
+        } else {
+            retVal = Phone.LTE_ON_CDMA_FALSE;
+            productType = "";
+        }
+
+        Log.d(LOG_TAG, "getLteOnCdmaMode=" + retVal + " product_type='" + productType +
+                "' lteOnCdmaProductType='" + sLteOnCdmaProductType + "'");
         return retVal;
     }
 }
diff --git a/telephony/java/com/android/internal/telephony/DataConnection.java b/telephony/java/com/android/internal/telephony/DataConnection.java
index 0188cf1..3636baa 100644
--- a/telephony/java/com/android/internal/telephony/DataConnection.java
+++ b/telephony/java/com/android/internal/telephony/DataConnection.java
@@ -22,8 +22,10 @@
 import com.android.internal.util.State;
 import com.android.internal.util.StateMachine;
 
+import android.net.LinkAddress;
 import android.net.LinkCapabilities;
 import android.net.LinkProperties;
+import android.net.NetworkUtils;
 import android.net.ProxyProperties;
 import android.os.AsyncResult;
 import android.os.Bundle;
@@ -33,6 +35,7 @@
 import android.os.SystemProperties;
 import android.text.TextUtils;
 
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -202,6 +205,7 @@
     protected long lastFailTime;
     protected FailCause lastFailCause;
     protected static final String NULL_IP = "0.0.0.0";
+    private int mRefCount;
     Object userData;
 
     //***** Abstract methods
@@ -249,6 +253,8 @@
             Message m = dp.onCompletedMsg;
             if (TextUtils.equals(dp.reason, Phone.REASON_RADIO_TURNED_OFF)) {
                 discReason = RILConstants.DEACTIVATE_REASON_RADIO_OFF;
+            } else if (TextUtils.equals(dp.reason, Phone.REASON_PDP_RESET)) {
+                discReason = RILConstants.DEACTIVATE_REASON_PDP_RESET;
             }
         }
         if (phone.mCM.getRadioState().isOn()) {
@@ -408,49 +414,6 @@
         return mRetryMgr.configure(configStr);
     }
 
-    private AtomicInteger mRefCount = new AtomicInteger(0);
-
-    /**
-     * Set refCount.
-     *
-     * @param val is new refCount
-     */
-    public void setRefCount(int val) {
-        mRefCount.set(val);
-    }
-
-    /**
-     * Get refCount
-     *
-     * @return refCount
-     */
-    public int getRefCount() {
-        return mRefCount.get();
-    }
-
-    /**
-     * @return decrement and return refCount
-     *
-     * TODO: Consider using the refCount for defining the
-     * life time of a connection. When this goes zero the
-     * DataConnection could tear itself down.
-     */
-    public int decAndGetRefCount() {
-        int v = mRefCount.decrementAndGet();
-        if (v < 0) {
-            log("BUG: decAndGetRefCount caused refCount to be < 0");
-            mRefCount.set(0);
-        }
-        return v;
-     }
-
-    /**
-     * @return increment and return refCount
-     */
-    public int incAndGetRefCount() {
-        return mRefCount.incrementAndGet();
-    }
-
     /*
      * **************************************************************************
      * End members owned by DataConnectionTracker
@@ -466,6 +429,7 @@
         createTime = -1;
         lastFailTime = -1;
         lastFailCause = FailCause.NONE;
+        mRefCount = 0;
 
         mLinkProperties = new LinkProperties();
         mApn = null;
@@ -509,24 +473,72 @@
             result.mFailCause = FailCause.fromInt(response.status);
         } else {
             log("onSetupConnectionCompleted received DataCallState: " + response);
-
-            // Check if system property dns usable
-            boolean okToUseSystemPropertyDns = false;
             cid = response.cid;
-            String propertyPrefix = "net." + response.ifname + ".";
-            String dnsServers[] = new String[2];
-            dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1");
-            dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2");
-            okToUseSystemPropertyDns = isDnsOk(dnsServers);
-
             // set link properties based on data call response
-            result = response.setLinkProperties(mLinkProperties,
-                    okToUseSystemPropertyDns);
+            result = setLinkProperties(response, mLinkProperties);
         }
 
         return result;
     }
 
+    private DataCallState.SetupResult setLinkProperties(DataCallState response,
+            LinkProperties lp) {
+        // Check if system property dns usable
+        boolean okToUseSystemPropertyDns = false;
+        String propertyPrefix = "net." + response.ifname + ".";
+        String dnsServers[] = new String[2];
+        dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1");
+        dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2");
+        okToUseSystemPropertyDns = isDnsOk(dnsServers);
+
+        // set link properties based on data call response
+        return response.setLinkProperties(lp, okToUseSystemPropertyDns);
+    }
+
+    private DataConnectionAc.LinkPropertyChangeAction updateLinkProperty(
+                                                      DataCallState newState) {
+        DataConnectionAc.LinkPropertyChangeAction changed =
+                        DataConnectionAc.LinkPropertyChangeAction.NONE;
+
+        if (newState == null) return changed;
+
+        DataCallState.SetupResult result;
+        LinkProperties newLp = new LinkProperties();
+
+        // set link properties based on data call response
+        result = setLinkProperties(newState, newLp);
+        if (result != DataCallState.SetupResult.SUCCESS) {
+            if (DBG) log("UpdateLinkProperty failed : " + result);
+            return changed;
+        }
+        // copy HTTP proxy as it is not part DataCallState.
+        newLp.setHttpProxy(mLinkProperties.getHttpProxy());
+
+        if (DBG) log("old LP=" + mLinkProperties);
+        if (DBG) log("new LP=" + newLp);
+
+        // Check consistency of link address. Currently we expect
+        // only one "global" address is assigned per each IP type.
+        Collection<LinkAddress> oLinks = mLinkProperties.getLinkAddresses();
+        Collection<LinkAddress> nLinks = newLp.getLinkAddresses();
+        for (LinkAddress oldLink : oLinks) {
+            for (LinkAddress newLink : nLinks) {
+                if ((NetworkUtils.addressTypeMatches(oldLink.getAddress(),
+                                        newLink.getAddress())) &&
+                    (oldLink.equals(newLink) == false)) {
+                    return DataConnectionAc.LinkPropertyChangeAction.RESET;
+                }
+            }
+        }
+
+        if (mLinkProperties == null || !mLinkProperties.equals(newLp)) {
+            mLinkProperties = newLp;
+            changed = DataConnectionAc.LinkPropertyChangeAction.CHANGED;
+        }
+
+        return changed;
+    }
+
     /**
      * The parent state for all other states.
      */
@@ -597,23 +609,35 @@
                     mAc.replyToMessage(msg, DataConnectionAc.RSP_SET_LINK_PROPERTIES_HTTP_PROXY);
                     break;
                 }
+                case DataConnectionAc.REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE: {
+                    DataCallState newState = (DataCallState) msg.obj;
+                    DataConnectionAc.LinkPropertyChangeAction action = updateLinkProperty(newState);
+                    if (DBG) {
+                        log("REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE action="
+                            + action + " newState=" + newState);
+                    }
+                    mAc.replyToMessage(msg,
+                                   DataConnectionAc.RSP_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE,
+                                   action.ordinal());
+                    break;
+                }
                 case DataConnectionAc.REQ_GET_LINK_CAPABILITIES: {
                     LinkCapabilities lc = new LinkCapabilities(mCapabilities);
                     log("REQ_GET_LINK_CAPABILITIES linkCapabilities" + lc);
                     mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_LINK_CAPABILITIES, lc);
                     break;
                 }
-                case DataConnectionAc.REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE: {
-                    Bundle data = msg.getData();
-                    mLinkProperties = (LinkProperties) data.get("linkProperties");
-                    break;
-                }
                 case DataConnectionAc.REQ_RESET:
                     if (DBG) log("DcDefaultState: msg.what=REQ_RESET");
                     clearSettings();
                     mAc.replyToMessage(msg, DataConnectionAc.RSP_RESET);
                     transitionTo(mInactiveState);
                     break;
+                case DataConnectionAc.REQ_GET_REFCOUNT: {
+                    log("REQ_GET_REFCOUNT  refCount=" + mRefCount);
+                    mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_REFCOUNT, mRefCount);
+                    break;
+                }
 
                 case EVENT_CONNECT:
                     if (DBG) log("DcDefaultState: msg.what=EVENT_CONNECT, fail not expected");
@@ -714,9 +738,13 @@
                     break;
 
                 case EVENT_CONNECT:
-                    if (DBG) log("DcInactiveState msg.what=EVENT_CONNECT");
                     ConnectionParams cp = (ConnectionParams) msg.obj;
                     cp.tag = mTag;
+                    if (DBG) {
+                        log("DcInactiveState msg.what=EVENT_CONNECT." + "RefCount = "
+                                + mRefCount);
+                    }
+                    mRefCount = 1;
                     onConnect(cp);
                     transitionTo(mActivatingState);
                     retVal = HANDLED;
@@ -744,7 +772,15 @@
 
             switch (msg.what) {
                 case EVENT_DISCONNECT:
-                    if (DBG) log("DcActivatingState deferring msg.what=EVENT_DISCONNECT");
+                    if (DBG) log("DcActivatingState deferring msg.what=EVENT_DISCONNECT"
+                            + mRefCount);
+                    deferMessage(msg);
+                    retVal = HANDLED;
+                    break;
+
+                case EVENT_CONNECT:
+                    if (DBG) log("DcActivatingState deferring msg.what=EVENT_CONNECT refCount = "
+                            + mRefCount);
                     deferMessage(msg);
                     retVal = HANDLED;
                     break;
@@ -868,12 +904,28 @@
             boolean retVal;
 
             switch (msg.what) {
+                case EVENT_CONNECT:
+                    mRefCount++;
+                    if (DBG) log("DcActiveState msg.what=EVENT_CONNECT RefCount=" + mRefCount);
+                    if (msg.obj != null) {
+                        notifyConnectCompleted((ConnectionParams) msg.obj, FailCause.NONE);
+                    }
+                    retVal = HANDLED;
+                    break;
                 case EVENT_DISCONNECT:
-                    if (DBG) log("DcActiveState msg.what=EVENT_DISCONNECT");
-                    DisconnectParams dp = (DisconnectParams) msg.obj;
-                    dp.tag = mTag;
-                    tearDownData(dp);
-                    transitionTo(mDisconnectingState);
+                    mRefCount--;
+                    if (DBG) log("DcActiveState msg.what=EVENT_DISCONNECT RefCount=" + mRefCount);
+                    if (mRefCount == 0)
+                    {
+                        DisconnectParams dp = (DisconnectParams) msg.obj;
+                        dp.tag = mTag;
+                        tearDownData(dp);
+                        transitionTo(mDisconnectingState);
+                    } else {
+                        if (msg.obj != null) {
+                            notifyDisconnectCompleted((DisconnectParams) msg.obj);
+                        }
+                    }
                     retVal = HANDLED;
                     break;
 
@@ -896,6 +948,13 @@
             boolean retVal;
 
             switch (msg.what) {
+                case EVENT_CONNECT:
+                    if (DBG) log("DcDisconnectingState msg.what=EVENT_CONNECT. Defer. RefCount = "
+                            + mRefCount);
+                    deferMessage(msg);
+                    retVal = HANDLED;
+                    break;
+
                 case EVENT_DEACTIVATE_DONE:
                     if (DBG) log("DcDisconnectingState msg.what=EVENT_DEACTIVATE_DONE");
                     AsyncResult ar = (AsyncResult) msg.obj;
diff --git a/telephony/java/com/android/internal/telephony/DataConnectionAc.java b/telephony/java/com/android/internal/telephony/DataConnectionAc.java
index a9796dd..a0d9b0f 100644
--- a/telephony/java/com/android/internal/telephony/DataConnectionAc.java
+++ b/telephony/java/com/android/internal/telephony/DataConnectionAc.java
@@ -59,6 +59,29 @@
     public static final int REQ_RESET = BASE + 14;
     public static final int RSP_RESET = BASE + 15;
 
+    public static final int REQ_GET_REFCOUNT = BASE + 16;
+    public static final int RSP_GET_REFCOUNT = BASE + 17;
+
+    /**
+     * enum used to notify action taken or necessary to be
+     * taken after the link property is changed.
+     */
+    public enum LinkPropertyChangeAction {
+        NONE, CHANGED, RESET;
+
+        public static LinkPropertyChangeAction fromInt(int value) {
+            if (value == NONE.ordinal()) {
+                return NONE;
+            } else if (value == CHANGED.ordinal()) {
+                return CHANGED;
+            } else if (value == RESET.ordinal()) {
+                return RESET;
+            } else {
+                throw new RuntimeException("LinkPropertyChangeAction.fromInt: bad value=" + value);
+            }
+        }
+    }
+
     public DataConnectionAc(DataConnection dc, String logTag) {
         dataConnection = dc;
         mLogTag = logTag;
@@ -132,6 +155,40 @@
     }
 
     /**
+     * Request the Reference Count.
+     * Response {@link #rspRefCount}
+     */
+    public void reqRefCount() {
+        sendMessage(REQ_GET_REFCOUNT);
+        if (DBG) log("reqRefCount");
+    }
+
+    /**
+     * Evaluate a RSP_GET_REFCOUNT message and return the refCount.
+     *
+     * @param response Message
+     * @return ref count or -1 if an error
+     */
+    public int rspRefCount(Message response) {
+        int retVal = response.arg1;
+        if (DBG) log("rspRefCount=" + retVal);
+        return retVal;
+    }
+
+    /**
+     * @return connection id or -1 if an error
+     */
+    public int getRefCountSync() {
+        Message response = sendMessageSynchronously(REQ_GET_REFCOUNT);
+        if ((response != null) && (response.what == RSP_GET_REFCOUNT)) {
+            return rspRefCount(response);
+        } else {
+            log("rspRefCount error response=" + response);
+            return -1;
+        }
+    }
+
+    /**
      * Request the connections ApnSetting.
      * Response {@link #rspApnSetting}
      */
@@ -226,6 +283,38 @@
     }
 
     /**
+     * Request update LinkProperties from DataCallState
+     * Response {@link #rspUpdateLinkPropertiesDataCallState}
+     */
+    public void reqUpdateLinkPropertiesDataCallState(DataCallState newState) {
+        sendMessage(REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE, newState);
+        if (DBG) log("reqUpdateLinkPropertiesDataCallState");
+    }
+
+    public LinkPropertyChangeAction rspUpdateLinkPropertiesDataCallState(Message response) {
+        LinkPropertyChangeAction retVal = LinkPropertyChangeAction.fromInt(response.arg1);
+        if (DBG) log("rspUpdateLinkPropertiesState=" + retVal);
+        return retVal;
+    }
+
+    /**
+     * Update link properties in the data connection
+     *
+     * @return true if link property has been updated. false otherwise.
+     */
+    public LinkPropertyChangeAction updateLinkPropertiesDataCallStateSync(DataCallState newState) {
+        Message response =
+            sendMessageSynchronously(REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE, newState);
+        if ((response != null) &&
+            (response.what == RSP_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE)) {
+            return rspUpdateLinkPropertiesDataCallState(response);
+        } else {
+            log("getLinkProperties error response=" + response);
+            return LinkPropertyChangeAction.NONE;
+        }
+    }
+
+    /**
      * Request the connections LinkCapabilities.
      * Response {@link #rspLinkCapabilities}
      */
diff --git a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
index b7ac879..5ddfcd1 100644
--- a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
@@ -987,7 +987,7 @@
                     resetAllRetryCounts();
                     onTrySetupData(Phone.REASON_DATA_ENABLED);
                 } else {
-                    onCleanUpConnection(true, APN_DEFAULT_ID, Phone.REASON_DATA_DISABLED);
+                    onCleanUpAllConnections(Phone.REASON_DATA_DISABLED);
                 }
             }
         }
diff --git a/telephony/java/com/android/internal/telephony/IccCard.java b/telephony/java/com/android/internal/telephony/IccCard.java
index 1b49d2d..a516b49 100644
--- a/telephony/java/com/android/internal/telephony/IccCard.java
+++ b/telephony/java/com/android/internal/telephony/IccCard.java
@@ -18,13 +18,20 @@
 
 import static android.Manifest.permission.READ_PHONE_STATE;
 import android.app.ActivityManagerNative;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.res.Resources;
 import android.os.AsyncResult;
 import android.os.Handler;
 import android.os.Message;
+import android.os.Power;
+import android.os.PowerManager;
 import android.os.Registrant;
 import android.os.RegistrantList;
 import android.util.Log;
+import android.view.WindowManager;
 
 import com.android.internal.telephony.PhoneBase;
 import com.android.internal.telephony.CommandsInterface.RadioState;
@@ -32,6 +39,8 @@
 
 import android.os.SystemProperties;
 
+import com.android.internal.R;
+
 /**
  * {@hide}
  */
@@ -88,6 +97,8 @@
     private static final int EVENT_QUERY_FACILITY_FDN_DONE = 10;
     private static final int EVENT_CHANGE_FACILITY_FDN_DONE = 11;
     private static final int EVENT_ICC_STATUS_CHANGED = 12;
+    private static final int EVENT_CARD_REMOVED = 13;
+    private static final int EVENT_CARD_ADDED = 14;
 
     /*
       UNKNOWN is a transient state, for example, after uesr inputs ICC pin under
@@ -106,6 +117,11 @@
         public boolean isPinLocked() {
             return ((this == PIN_REQUIRED) || (this == PUK_REQUIRED));
         }
+
+        public boolean iccCardExist() {
+            return ((this == PIN_REQUIRED) || (this == PUK_REQUIRED)
+                    || (this == NETWORK_LOCKED) || (this == READY));
+        }
     }
 
     public State getState() {
@@ -400,6 +416,8 @@
         boolean transitionedIntoPinLocked;
         boolean transitionedIntoAbsent;
         boolean transitionedIntoNetworkLocked;
+        boolean isIccCardRemoved;
+        boolean isIccCardAdded;
 
         State oldState, newState;
 
@@ -416,24 +434,36 @@
         transitionedIntoAbsent = (oldState != State.ABSENT && newState == State.ABSENT);
         transitionedIntoNetworkLocked = (oldState != State.NETWORK_LOCKED
                 && newState == State.NETWORK_LOCKED);
+        isIccCardRemoved = (oldState != null &&
+                        oldState.iccCardExist() && newState == State.ABSENT);
+        isIccCardAdded = (oldState == State.ABSENT &&
+                        newState != null && newState.iccCardExist());
 
         if (transitionedIntoPinLocked) {
-            if(mDbg) log("Notify SIM pin or puk locked.");
+            if (mDbg) log("Notify SIM pin or puk locked.");
             mPinLockedRegistrants.notifyRegistrants();
             broadcastIccStateChangedIntent(INTENT_VALUE_ICC_LOCKED,
                     (newState == State.PIN_REQUIRED) ?
                        INTENT_VALUE_LOCKED_ON_PIN : INTENT_VALUE_LOCKED_ON_PUK);
         } else if (transitionedIntoAbsent) {
-            if(mDbg) log("Notify SIM missing.");
+            if (mDbg) log("Notify SIM missing.");
             mAbsentRegistrants.notifyRegistrants();
             broadcastIccStateChangedIntent(INTENT_VALUE_ICC_ABSENT, null);
         } else if (transitionedIntoNetworkLocked) {
-            if(mDbg) log("Notify SIM network locked.");
+            if (mDbg) log("Notify SIM network locked.");
             mNetworkLockedRegistrants.notifyRegistrants();
             broadcastIccStateChangedIntent(INTENT_VALUE_ICC_LOCKED,
                   INTENT_VALUE_LOCKED_NETWORK);
         }
 
+        if (isIccCardRemoved) {
+            mHandler.sendMessage(mHandler.obtainMessage(EVENT_CARD_REMOVED, null));
+        } else if (isIccCardAdded) {
+            mHandler.sendMessage(mHandler.obtainMessage(EVENT_CARD_ADDED, null));
+        }
+
+
+
         /*
          * TODO: We need to try to remove this, maybe if the RIL sends up a RIL_UNSOL_SIM_REFRESH?
          */
@@ -443,6 +473,48 @@
                 ((SIMRecords)mPhone.mIccRecords).onSimReady();
             }
         }
+
+    }
+
+    private void onIccSwap(boolean isAdded) {
+        // TODO: Here we assume the device can't handle SIM hot-swap
+        //      and has to reboot. We may want to add a property,
+        //      e.g. REBOOT_ON_SIM_SWAP, to indicate if modem support
+        //      hot-swap.
+        DialogInterface.OnClickListener listener = null;
+
+
+        // TODO: SimRecords is not reset while SIM ABSENT (only reset while
+        //       Radio_off_or_not_available). Have to reset in both both
+        //       added or removed situation.
+        listener = new DialogInterface.OnClickListener() {
+            @Override
+            public void onClick(DialogInterface dialog, int which) {
+                if (which == DialogInterface.BUTTON_POSITIVE) {
+                    if (mDbg) log("Reboot due to SIM swap");
+                    PowerManager pm = (PowerManager) mPhone.getContext()
+                    .getSystemService(Context.POWER_SERVICE);
+                    pm.reboot("SIM is added.");
+                }
+            }
+
+        };
+
+        Resources r = Resources.getSystem();
+
+        String title = (isAdded) ? r.getString(R.string.sim_added_title) :
+            r.getString(R.string.sim_removed_title);
+        String message = (isAdded) ? r.getString(R.string.sim_added_message) :
+            r.getString(R.string.sim_removed_message);
+        String buttonTxt = r.getString(R.string.sim_restart_button);
+
+        AlertDialog dialog = new AlertDialog.Builder(mPhone.getContext())
+            .setTitle(title)
+            .setMessage(message)
+            .setPositiveButton(buttonTxt, listener)
+            .create();
+        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
+        dialog.show();
     }
 
     /**
@@ -609,6 +681,12 @@
                     Log.d(mLogTag, "Received Event EVENT_ICC_STATUS_CHANGED");
                     mPhone.mCM.getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE));
                     break;
+                case EVENT_CARD_REMOVED:
+                    onIccSwap(false);
+                    break;
+                case EVENT_CARD_ADDED:
+                    onIccSwap(true);
+                    break;
                 default:
                     Log.e(mLogTag, "[IccCard] Unknown Event " + msg.what);
             }
diff --git a/telephony/java/com/android/internal/telephony/Phone.java b/telephony/java/com/android/internal/telephony/Phone.java
index ddf066e..48c5318 100644
--- a/telephony/java/com/android/internal/telephony/Phone.java
+++ b/telephony/java/com/android/internal/telephony/Phone.java
@@ -178,6 +178,7 @@
     static final String REASON_NW_TYPE_CHANGED = "nwTypeChanged";
     static final String REASON_DATA_DEPENDENCY_MET = "dependencyMet";
     static final String REASON_DATA_DEPENDENCY_UNMET = "dependencyUnmet";
+    static final String REASON_LINK_PROPERTIES_CHANGED = "linkPropertiesChanged";
 
     // Used for band mode selection methods
     static final int BM_UNSPECIFIED = 0; // selected by baseband automatically
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index f5d6c51..93fc9ce 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -113,6 +113,7 @@
     /* Deactivate data call reasons */
     int DEACTIVATE_REASON_NONE = 0;
     int DEACTIVATE_REASON_RADIO_OFF = 1;
+    int DEACTIVATE_REASON_PDP_RESET = 2;
 
 /*
 cat include/telephony/ril.h | \
diff --git a/telephony/java/com/android/internal/telephony/TelephonyProperties.java b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
index 4927006..4309309 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyProperties.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
@@ -72,10 +72,12 @@
      */
     static final String PROPERTY_OPERATOR_ISO_COUNTRY = "gsm.operator.iso-country";
 
-    /** 'true' if device supports both LTE and CDMA mode of operation.
-     *  Availability: Set only on devices supporting LTE and CDMA.
+    /**
+     * The contents of this property is the value of the kernel command line
+     * product_type variable that corresponds to a product that supports LTE on CDMA.
+     * {@see BaseCommands#getLteOnCdmaMode()}
      */
-    static final String PROPERTY_NETWORK_LTE_ON_CDMA = "telephony.lte_on_cdma";
+    static final String PROPERTY_LTE_ON_CDMA_PRODUCT_TYPE = "telephony.lteOnCdmaProductType";
 
     static final String CURRENT_ACTIVE_PHONE = "gsm.current.phone-type";
 
diff --git a/telephony/java/com/android/internal/telephony/cat/CatService.java b/telephony/java/com/android/internal/telephony/cat/CatService.java
index 33cc97e..fb53686 100644
--- a/telephony/java/com/android/internal/telephony/cat/CatService.java
+++ b/telephony/java/com/android/internal/telephony/cat/CatService.java
@@ -32,6 +32,7 @@
 
 
 import java.io.ByteArrayOutputStream;
+import java.util.Locale;
 
 /**
  * Enumeration for representing the tag value of COMPREHENSION-TLV objects. If
@@ -273,8 +274,20 @@
                 sendTerminalResponse(cmdParams.cmdDet, ResultCode.OK, false, 0, null);
                 break;
             case PROVIDE_LOCAL_INFORMATION:
-                sendTerminalResponse(cmdParams.cmdDet, ResultCode.OK, false, 0, null);
-                return;
+                ResponseData resp;
+                switch (cmdParams.cmdDet.commandQualifier) {
+                    case CommandParamsFactory.DTTZ_SETTING:
+                        resp = new DTTZResponseData(null);
+                        sendTerminalResponse(cmdParams.cmdDet, ResultCode.OK, false, 0, resp);
+                        break;
+                    case CommandParamsFactory.LANGUAGE_SETTING:
+                        resp = new LanguageResponseData(Locale.getDefault().getLanguage());
+                        sendTerminalResponse(cmdParams.cmdDet, ResultCode.OK, false, 0, resp);
+                        break;
+                    default:
+                        sendTerminalResponse(cmdParams.cmdDet, ResultCode.OK, false, 0, null);
+                        return;
+                }
             case LAUNCH_BROWSER:
             case SELECT_ITEM:
             case GET_INPUT:
diff --git a/telephony/java/com/android/internal/telephony/cat/CommandParamsFactory.java b/telephony/java/com/android/internal/telephony/cat/CommandParamsFactory.java
index 12204a0..686fe46 100644
--- a/telephony/java/com/android/internal/telephony/cat/CommandParamsFactory.java
+++ b/telephony/java/com/android/internal/telephony/cat/CommandParamsFactory.java
@@ -53,6 +53,7 @@
     static final int REFRESH_UICC_RESET                     = 0x04;
 
     // Command Qualifier values for PLI command
+    static final int DTTZ_SETTING                           = 0x03;
     static final int LANGUAGE_SETTING                       = 0x04;
 
     static synchronized CommandParamsFactory getInstance(RilMessageDecoder caller,
@@ -883,6 +884,10 @@
             throws ResultException {
         CatLog.d(this, "process ProvideLocalInfo");
         switch (cmdDet.commandQualifier) {
+            case DTTZ_SETTING:
+                CatLog.d(this, "PLI [DTTZ_SETTING]");
+                mCmdParams = new CommandParams(cmdDet);
+                break;
             case LANGUAGE_SETTING:
                 CatLog.d(this, "PLI [LANGUAGE_SETTING]");
                 mCmdParams = new CommandParams(cmdDet);
diff --git a/telephony/java/com/android/internal/telephony/cat/ResponseData.java b/telephony/java/com/android/internal/telephony/cat/ResponseData.java
index 95f0399..55a2b63 100644
--- a/telephony/java/com/android/internal/telephony/cat/ResponseData.java
+++ b/telephony/java/com/android/internal/telephony/cat/ResponseData.java
@@ -18,6 +18,8 @@
 
 import com.android.internal.telephony.EncodeException;
 import com.android.internal.telephony.GsmAlphabet;
+import java.util.Calendar;
+import com.android.internal.telephony.cat.AppInterface.CommandType;
 
 import java.io.ByteArrayOutputStream;
 import java.io.UnsupportedEncodingException;
@@ -147,4 +149,109 @@
     }
 }
 
+// For "PROVIDE LOCAL INFORMATION" command.
+// See TS 31.111 section 6.4.15/ETSI TS 102 223
+// TS 31.124 section 27.22.4.15 for test spec
+class LanguageResponseData extends ResponseData {
+    private String lang;
+
+    public LanguageResponseData(String lang) {
+        super();
+        this.lang = lang;
+    }
+
+    @Override
+    public void format(ByteArrayOutputStream buf) {
+        if (buf == null) {
+            return;
+        }
+
+        // Text string object
+        int tag = 0x80 | ComprehensionTlvTag.LANGUAGE.value();
+        buf.write(tag); // tag
+
+        byte[] data;
+
+        if (lang != null && lang.length() > 0) {
+            data = GsmAlphabet.stringToGsm8BitPacked(lang);
+        }
+        else {
+            data = new byte[0];
+        }
+
+        buf.write(data.length);
+
+        for (byte b : data) {
+            buf.write(b);
+        }
+    }
+}
+
+// For "PROVIDE LOCAL INFORMATION" command.
+// See TS 31.111 section 6.4.15/ETSI TS 102 223
+// TS 31.124 section 27.22.4.15 for test spec
+class DTTZResponseData extends ResponseData {
+    private Calendar calendar;
+
+    public DTTZResponseData(Calendar cal) {
+        super();
+        calendar = cal;
+    }
+
+    @Override
+    public void format(ByteArrayOutputStream buf) {
+        if (buf == null) {
+            return;
+        }
+
+        // DTTZ object
+        int tag = 0x80 | CommandType.PROVIDE_LOCAL_INFORMATION.value();
+        buf.write(tag); // tag
+
+        byte[] data = new byte[8];
+        byte btmp; // temp variable
+
+        data[0] = 0x07; // Write length of DTTZ data
+
+        if (calendar == null) {
+            calendar = Calendar.getInstance();
+        }
+        // Fill year byte
+        btmp = (byte) (calendar.get(java.util.Calendar.YEAR) % 100);
+        data[1] = (byte) (btmp / 10);
+        data[1] += (byte) ((btmp % 10) << 4);
+
+        // Fill month byte
+        btmp = (byte) (calendar.get(java.util.Calendar.MONTH) + 1);
+        data[2] = (byte) (btmp / 10);
+        data[2] += (byte) ((btmp % 10) << 4);
+
+        // Fill day byte
+        btmp = (byte) (calendar.get(java.util.Calendar.DATE));
+        data[3] = (byte) (btmp / 10);
+        data[3] += (byte) ((btmp % 10) << 4);
+
+        // Fill hour byte
+        btmp = (byte) (calendar.get(java.util.Calendar.HOUR_OF_DAY));
+        data[4] = (byte) (btmp / 10);
+        data[4] += (byte) ((btmp % 10) << 4);
+
+        // Fill minute byte
+        btmp = (byte) (calendar.get(java.util.Calendar.MINUTE));
+        data[5] = (byte) (btmp / 10);
+        data[5] += (byte) ((btmp % 10) << 4);
+
+        // Fill second byte
+        btmp = (byte) (calendar.get(java.util.Calendar.SECOND));
+        data[6] = (byte) (btmp / 10);
+        data[6] += (byte) ((btmp % 10) << 4);
+
+        // No time zone info
+        data[7] = (byte) 0xFF;
+
+        for (byte b : data) {
+            buf.write(b);
+        }
+    }
+}
 
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
index 375d0d1..e3e3d78 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
@@ -521,19 +521,7 @@
              * TODO: Make this configurable?
              */
             int nextReconnectDelay = mDataConnections.get(0).getRetryTimer();
-            log("Data Connection activate failed. Scheduling next attempt for "
-                    + (nextReconnectDelay / 1000) + "s");
-
-            AlarmManager am =
-                (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE);
-            Intent intent = new Intent(INTENT_RECONNECT_ALARM);
-            intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON, reason);
-            mReconnectIntent = PendingIntent.getBroadcast(
-                    mPhone.getContext(), 0, intent, 0);
-            am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
-                    SystemClock.elapsedRealtime() + nextReconnectDelay,
-                    mReconnectIntent);
-
+            startAlarmForReconnect(nextReconnectDelay, reason);
             mDataConnections.get(0).increaseRetryCount();
 
             if (!shouldPostNotification(lastFailCauseCode)) {
@@ -545,6 +533,22 @@
         }
     }
 
+    private void startAlarmForReconnect(int delay, String reason) {
+
+        log("Data Connection activate failed. Scheduling next attempt for "
+                + (delay / 1000) + "s");
+
+        AlarmManager am =
+            (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE);
+        Intent intent = new Intent(INTENT_RECONNECT_ALARM);
+        intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON, reason);
+        mReconnectIntent = PendingIntent.getBroadcast(
+                mPhone.getContext(), 0, intent, 0);
+        am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
+                SystemClock.elapsedRealtime() + delay, mReconnectIntent);
+
+    }
+
     private void notifyNoData(FailCause lastFailCauseCode) {
         setState(State.FAILED);
         notifyDataAvailability(null);
@@ -702,7 +706,7 @@
         mActiveApn = null;
         if (retryAfterDisconnected(reason)) {
           // Wait a bit before trying, so we're not tying up RIL command channel.
-          sendMessageDelayed(obtainMessage(EVENT_TRY_SETUP_DATA, reason), APN_DELAY_MILLIS);
+          startAlarmForReconnect(APN_DELAY_MILLIS, reason);
       }
     }
 
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
index e61af31..e1a6fef 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
@@ -127,10 +127,7 @@
         if (apnContext != null) {
             apnContext.setReason(reason);
             if (apnContext.getState() == State.FAILED) {
-                Message msg = obtainMessage(EVENT_CLEAN_UP_CONNECTION);
-                msg.arg1 = 0; // tearDown is false
-                msg.obj = (ApnContext)apnContext;
-                sendMessage(msg);
+                apnContext.setState(State.IDLE);
             }
             sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA, apnContext));
         }
@@ -615,28 +612,26 @@
      *
      * @param apnContext
      * @param tearDown
-     * @return refCount
+     * @return none
      */
-    private int releaseApnContext(ApnContext apnContext, boolean tearDown) {
+    private void releaseApnContext(ApnContext apnContext, boolean tearDown) {
         if (apnContext == null) {
             if (DBG) loge("releaseApnContext: apnContext null should not happen, ignore");
-            return -1;
+            return;
         }
         DataConnection dc = apnContext.getDataConnection();
         if (dc == null) {
             if (DBG) loge("releaseApnContext: apnContext dc == null should not happen, ignore");
-            return -1;
+            return;
         }
-        int refCount = dc.decAndGetRefCount();
-        if (DBG) log("releaseApnContext: dec refCount=" + refCount + " tearDown=" + tearDown);
-        if (tearDown && (refCount == 0)) {
+        if (tearDown) {
             if (DBG) log("releaseApnContext: tearing down");
             Message msg = obtainMessage(EVENT_DISCONNECT_DONE, apnContext);
             apnContext.getDataConnection().tearDown(apnContext.getReason(), msg);
         }
         apnContext.setDataConnection(null);
         apnContext.setDataConnectionAc(null);
-        return refCount;
+        return;
     }
 
     private void setupDataOnReadyApns(String reason) {
@@ -644,7 +639,7 @@
         for (ApnContext apnContext : mApnContexts.values()) {
             if (apnContext.isReady()) {
                 if (apnContext.getState() == State.FAILED) {
-                    cleanUpConnection(false, apnContext);
+                    cleanApnContextBeforeRestart(apnContext);
                     if (apnContext.getDataConnection() != null) {
                         apnContext.getDataConnection().resetRetryCount();
                     }
@@ -800,6 +795,34 @@
         if (DBG) {
             log("cleanUpConnection: tearDown=" + tearDown + " reason=" + apnContext.getReason());
         }
+        if (tearDown && cleanApnContextBeforeRestart(apnContext)) {
+            // if the request is tearDown and ApnContext does not hold an active connection,
+            // we're ok to return here.
+            return;
+        }
+
+        DataConnectionAc dcac = apnContext.getDataConnectionAc();
+        if (dcac != null) {
+            if (tearDown) {
+                apnContext.setState(State.DISCONNECTING);
+                releaseApnContext(apnContext, tearDown);
+            } else {
+                dcac.resetSync();
+                apnContext.setState(State.IDLE);
+                mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType());
+                apnContext.setDataConnection(null);
+                apnContext.setDataConnectionAc(null);
+            }
+        }
+    }
+
+    /**
+     * @param APNContext to clean
+     * @return true if ApnContext is not connected anymore.
+     *         false if ApnContext still holds a connection.
+     */
+    private boolean cleanApnContextBeforeRestart(ApnContext apnContext) {
+        if (apnContext == null) return true;
 
         // Clear the reconnect alarm, if set.
         if (apnContext.getReconnectIntent() != null) {
@@ -811,32 +834,16 @@
 
         if (apnContext.getState() == State.IDLE || apnContext.getState() == State.DISCONNECTING) {
             if (DBG) log("cleanUpConnection: state= " + apnContext.getState());
-            return;
+            return true;
         }
 
         if (apnContext.getState() == State.FAILED) {
-            if (DBG) log("cleanUpConnection: state is in FAILED");
             apnContext.setState(State.IDLE);
-            return;
+            return true;
         }
-
-        DataConnection conn = apnContext.getDataConnection();
-        if (conn != null) {
-            DataConnectionAc dcac = mDataConnectionAsyncChannels.get(conn.getDataConnectionId());
-            apnContext.setState(State.DISCONNECTING);
-            if (tearDown) {
-                releaseApnContext(apnContext, tearDown);
-            } else {
-                if (dcac != null) {
-                    dcac.resetSync();
-                }
-                apnContext.setState(State.IDLE);
-                mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType());
-            }
-        }
+        return false;
     }
 
-
     /**
      * @param types comma delimited list of APN types
      * @return array of APN types
@@ -927,37 +934,48 @@
             return false;
         }
 
-        dc = findReadyDataConnection(apn);
+        // First, check to see if ApnContext already has DC.
+        // This could happen if the retries are currently  engaged.
+        dc = (GsmDataConnection)apnContext.getDataConnection();
 
         if (dc == null) {
-            if (DBG) log("setupData: No ready GsmDataConnection found!");
-            // TODO: When allocating you are mapping type to id. If more than 1 free,
-            // then could findFreeDataConnection get the wrong one??
-            dc = findFreeDataConnection();
-        }
 
-        if (dc == null) {
-            dc = createDataConnection();
-        }
+            dc = (GsmDataConnection) checkForConnectionForApnContext(apnContext);
 
-        if (dc == null) {
-            if (DBG) log("setupData: No free GsmDataConnection found!");
-            return false;
-        }
+            if (dc == null) {
+                dc = findReadyDataConnection(apn);
+            }
 
-        dc.setProfileId( profileId );
-        dc.setActiveApnType(apnContext.getApnType());
-        int refCount = dc.incAndGetRefCount();
-        if (DBG) log("setupData: init dc and apnContext refCount=" + refCount);
+            if (dc == null) {
+                if (DBG) log("setupData: No ready GsmDataConnection found!");
+                // TODO: When allocating you are mapping type to id. If more than 1 free,
+                // then could findFreeDataConnection get the wrong one??
+                dc = findFreeDataConnection();
+            }
 
-        // configure retry count if no other Apn is using the same connection.
-        if (refCount == 1) {
-            configureRetry(dc, apnContext.getApnType());
+            if (dc == null) {
+                dc = createDataConnection();
+            }
+
+            if (dc == null) {
+                if (DBG) log("setupData: No free GsmDataConnection found!");
+                return false;
+            }
+
+            DataConnectionAc dcac = mDataConnectionAsyncChannels.get(dc.getDataConnectionId());
+            dc.setProfileId( profileId );
+            dc.setActiveApnType(apnContext.getApnType());
+            int refCount = dcac.getRefCountSync();
+            if (DBG) log("setupData: init dc and apnContext refCount=" + refCount);
+
+            // configure retry count if no other Apn is using the same connection.
+            if (refCount == 0) {
+                configureRetry(dc, apnContext.getApnType());
+            }
+            apnContext.setDataConnectionAc(mDataConnectionAsyncChannels.get(dc.getDataConnectionId()));
+            apnContext.setApnSetting(apn);
+            apnContext.setDataConnection(dc);
         }
-        DataConnectionAc dcac = mDataConnectionAsyncChannels.get(dc.getDataConnectionId());
-        apnContext.setDataConnectionAc(mDataConnectionAsyncChannels.get(dc.getDataConnectionId()));
-        apnContext.setApnSetting(apn);
-        apnContext.setDataConnection(dc);
 
         Message msg = obtainMessage();
         msg.what = EVENT_DATA_SETUP_COMPLETE;
@@ -970,23 +988,6 @@
         return true;
     }
 
-    private boolean dataCallStatesHasCID (ArrayList<DataCallState> states, int cid) {
-        for (int i = 0, s = states.size() ; i < s ; i++) {
-            if (states.get(i).cid == cid) return true;
-        }
-        return false;
-    }
-
-    private boolean dataCallStatesHasActiveCID (ArrayList<DataCallState> states, int cid) {
-        for (int i = 0, s = states.size() ; i < s ; i++) {
-            if ((states.get(i).cid == cid) && (states.get(i).active != 0)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
     /**
      * Handles changes to the APN database.
      */
@@ -1014,15 +1015,13 @@
     }
 
     /**
-     * @param explicitPoll if true, indicates that *we* polled for this
-     * update while state == CONNECTED rather than having it delivered
-     * via an unsolicited response (which could have happened at any
-     * previous state
+     * @param ar is the result of RIL_REQUEST_DATA_CALL_LIST
+     * or RIL_UNSOL_DATA_CALL_LIST_CHANGED
      */
     private void onDataStateChanged (AsyncResult ar) {
         ArrayList<DataCallState> dataCallStates;
 
-        if (DBG) log("onDataStateChanged(ar) E");
+        if (DBG) log("onDataStateChanged(ar): E");
         dataCallStates = (ArrayList<DataCallState>)(ar.result);
 
         if (ar.exception != null) {
@@ -1033,65 +1032,91 @@
             return;
         }
 
+        // Create a hash map to store the dataCallState of each call id
+        // TODO: Depends on how frequent the DATA_CALL_LIST got updated,
+        //       may cache response to reduce comparison.
+        HashMap<Integer, DataCallState> response;
+        response = new HashMap<Integer, DataCallState>();
+        if (DBG) log("onDataStateChanged(ar): DataCallState size=" + dataCallStates.size());
+        for (DataCallState dc : dataCallStates) {
+            response.put(dc.cid, dc);
+            if (DBG) log("onDataStateChanged(ar): " + dc.cid + ": " + dc.toString());
+        }
+
+        // For each connected apn, check if there is a matched active
+        // data call state, which has the same link properties.
+        if (DBG) log("    ApnContext size=" + mApnContexts.values().size());
         for (ApnContext apnContext : mApnContexts.values()) {
-            onDataStateChanged(dataCallStates, apnContext);
-        }
-        if (DBG) log("onDataStateChanged(ar) X");
-    }
-
-    private void onDataStateChanged (ArrayList<DataCallState> dataCallStates,
-                                     ApnContext apnContext) {
-        if (DBG) log("onDataStateChanged(dataCallState, apnContext):  apnContext=" + apnContext);
-
-        if (apnContext == null) {
-            // Should not happen
-            if (DBG) log("onDataStateChanged(dataCallState, apnContext):  ignore apnContext=null");
-            return;
-        }
-
-        if (apnContext.getState() == State.CONNECTED) {
-            // The way things are supposed to work, the PDP list
-            // should not contain the CID after it disconnects.
-            // However, the way things really work, sometimes the PDP
-            // context is still listed with active = false, which
-            // makes it hard to distinguish an activating context from
-            // an activated-and-then deactivated one.
+            if (DBG){
+                log("onDataStateChanged(ar): " + apnContext.toString());
+                if (apnContext.getDataConnection() != null) {
+                    log("onDataStateChanged(ar): " +  apnContext.getDataConnection().toString());
+                }
+            }
             DataConnectionAc dcac = apnContext.getDataConnectionAc();
             if (dcac == null) {
-                if (DBG) log("onDataStateChanged(dataCallState, apnContext):  dcac==null BAD NEWS");
-                return;
+                continue;
             }
-            int cid = dcac.getCidSync();
-            if (!dataCallStatesHasCID(dataCallStates, cid)) {
-                // It looks like the PDP context has deactivated.
-                // Tear everything down and try to reconnect.
+            int connectionId = dcac.getCidSync();
 
-                if (DBG) {
-                    log("onDataStateChanged(dataCallStates,apnContext) " +
-                        "PDP connection has dropped. Reconnecting");
+            if (apnContext.getState() == State.CONNECTED) {
+                // The way things are supposed to work, the PDP list
+                // should not contain the CID after it disconnects.
+                // However, the way things really work, sometimes the PDP
+                // context is still listed with active = false, which
+                // makes it hard to distinguish an activating context from
+                // an activated-and-then de-activated one.
+                if (response.containsKey(connectionId)) {
+                    DataCallState newState = response.get(connectionId);
+                    if (DBG) log("onDataStateChanged(ar): Found ConnId=" + connectionId
+                            + " newState=" + newState.toString());
+                    if (newState.active != 0) {
+                        boolean resetConnection;
+                        switch (dcac.updateLinkPropertiesDataCallStateSync(newState)) {
+                        case NONE:
+                            if (DBG) log("onDataStateChanged(ar): Found but no change, skip");
+                            resetConnection = false;
+                            break;
+                        case CHANGED:
+                            if (DBG) log("onDataStateChanged(ar): Found and changed, notify");
+                            mPhone.notifyDataConnection(Phone.REASON_LINK_PROPERTIES_CHANGED,
+                                                        apnContext.getApnType());
+                            // Temporary hack, at this time a transition from CDMA -> Global
+                            // fails so we'll hope for the best and not reset the connection.
+                            // @see bug/4455071
+                            if (SystemProperties.getBoolean("telephony.ignore-state-changes",
+                                                            true)) {
+                                log("onDataStateChanged(ar): STOPSHIP don't reset, continue");
+                                resetConnection = false;
+                            } else {
+                                // Things changed so reset connection, when hack is removed
+                                // this is the normal path.
+                                log("onDataStateChanged(ar): changed so resetting connection");
+                                resetConnection = true;
+                            }
+                            break;
+                        case RESET:
+                        default:
+                            if (DBG) log("onDataStateChanged(ar): an error, reset connection");
+                            resetConnection = true;
+                            break;
+                        }
+                        if (resetConnection == false) continue;
+                    }
                 }
+
+                if (DBG) log("onDataStateChanged(ar): reset connection.");
+
                 // Add an event log when the network drops PDP
-                int cellLocationId = getCellLocationId();
-                EventLog.writeEvent(EventLogTags.PDP_NETWORK_DROP, cellLocationId,
-                        TelephonyManager.getDefault().getNetworkType());
-
-                cleanUpConnection(true, apnContext);
-            } else if (!dataCallStatesHasActiveCID(dataCallStates,
-                    apnContext.getDataConnectionAc().getCidSync())) {
-
-                if (DBG) {
-                    log("onDataStateChanged(dataCallStates,apnContext) " +
-                        "PDP connection has dropped (active=false case). Reconnecting");
-                }
-
-                // Log the network drop on the event log.
-                int cellLocationId = getCellLocationId();
-                EventLog.writeEvent(EventLogTags.PDP_NETWORK_DROP, cellLocationId,
+                int cid = getCellLocationId();
+                EventLog.writeEvent(EventLogTags.PDP_NETWORK_DROP, cid,
                         TelephonyManager.getDefault().getNetworkType());
 
                 cleanUpConnection(true, apnContext);
             }
         }
+
+        if (DBG) log("onDataStateChanged(ar): X");
     }
 
     private void notifyDefaultData(ApnContext apnContext) {
@@ -1219,10 +1244,30 @@
             preTxPkts = mTxPkts;
             preRxPkts = mRxPkts;
 
-            mTxPkts = TrafficStats.getMobileTxPackets();
-            mRxPkts = TrafficStats.getMobileRxPackets();
+            long txSum = 0, rxSum = 0;
+            for (ApnContext apnContext : mApnContexts.values()) {
+                if (apnContext.getState() == State.CONNECTED) {
+                    DataConnectionAc dcac = apnContext.getDataConnectionAc();
+                    if (dcac == null) continue;
 
-            //log("rx " + String.valueOf(rxPkts) + " tx " + String.valueOf(txPkts));
+                    LinkProperties linkProp = dcac.getLinkPropertiesSync();
+                    if (linkProp == null) continue;
+
+                    String iface = linkProp.getInterfaceName();
+
+                    if (iface != null) {
+                        long stats = TrafficStats.getTxPackets(iface);
+                        if (stats > 0) txSum += stats;
+                        stats = TrafficStats.getRxPackets(iface);
+                        if (stats > 0) rxSum += stats;
+                    }
+                }
+            }
+
+            mTxPkts = txSum;
+            mRxPkts = rxSum;
+
+            // log("tx " + mTxPkts + " rx " + mRxPkts);
 
             if (mNetStatPollEnabled && (preTxPkts > 0 || preRxPkts > 0)) {
                 sent = mTxPkts - preTxPkts;
@@ -1338,7 +1383,8 @@
             loge("reconnectAfterFail: apnContext == null, impossible");
             return;
         }
-        if (apnContext.getState() == State.FAILED) {
+        if ((apnContext.getState() == State.FAILED) &&
+            (apnContext.getDataConnection() != null)) {
             if (!apnContext.getDataConnection().isRetryNeeded()) {
                 if (!apnContext.getApnType().equals(Phone.APN_TYPE_DEFAULT)) {
                     mPhone.notifyDataConnection(Phone.REASON_APN_FAILED, apnContext.getApnType());
@@ -1358,23 +1404,7 @@
             }
 
             int nextReconnectDelay = apnContext.getDataConnection().getRetryTimer();
-            if (DBG) {
-                log("reconnectAfterFail: activate failed. Scheduling next attempt for "
-                    + (nextReconnectDelay / 1000) + "s");
-            }
-
-            AlarmManager am =
-                (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE);
-            Intent intent = new Intent(INTENT_RECONNECT_ALARM);
-            intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON, apnContext.getReason());
-            // Should put an extra of apn type?
-            intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_TYPE, apnContext.getApnType());
-            apnContext.setReconnectIntent(PendingIntent.getBroadcast (
-                    mPhone.getContext(), 0, intent, 0));
-            am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
-                    SystemClock.elapsedRealtime() + nextReconnectDelay,
-                    apnContext.getReconnectIntent());
-
+            startAlarmForReconnect(nextReconnectDelay, apnContext);
             apnContext.getDataConnection().increaseRetryCount();
 
             if (!shouldPostNotification(lastFailCauseCode)) {
@@ -1388,6 +1418,25 @@
         }
     }
 
+    private void startAlarmForReconnect(int delay, ApnContext apnContext) {
+
+        if (DBG) {
+            log("Schedule alarm for reconnect: activate failed. Scheduling next attempt for "
+                + (delay / 1000) + "s");
+        }
+
+        AlarmManager am =
+            (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE);
+        Intent intent = new Intent(INTENT_RECONNECT_ALARM);
+        intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_REASON, apnContext.getReason());
+        intent.putExtra(INTENT_RECONNECT_ALARM_EXTRA_TYPE, apnContext.getApnType());
+        apnContext.setReconnectIntent(PendingIntent.getBroadcast (
+                mPhone.getContext(), 0, intent, 0));
+        am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
+                SystemClock.elapsedRealtime() + delay, apnContext.getReconnectIntent());
+
+    }
+
     private void notifyNoData(GsmDataConnection.FailCause lastFailCauseCode,
                               ApnContext apnContext) {
         if (DBG) log( "notifyNoData: type=" + apnContext.getApnType());
@@ -1442,23 +1491,10 @@
                 } else {
                     apnContext.setReason(Phone.REASON_DATA_ENABLED);
                 }
-                DataConnection conn = checkForConnectionForApnContext(apnContext);
-                if (conn == null) {
-                    if (apnContext.getState() == State.FAILED) {
-                        apnContext.setState(State.IDLE);
-                    }
-                    trySetup = true;
-                } else {
-                    int refCount = conn.incAndGetRefCount();
-                    apnContext.setDataConnection(conn);
-                    apnContext.setDataConnectionAc(
-                            mDataConnectionAsyncChannels.get(conn.getDataConnectionId()));
-                    if (DBG) {
-                        log("applyNewState: Found existing connection for " +
-                                apnContext.getApnType() + " inc refCount=" + refCount +
-                                " conn=" + conn);
-                    }
+                if (apnContext.getState() == State.FAILED) {
+                    apnContext.setState(State.IDLE);
                 }
+                trySetup = true;
             }
         }
         apnContext.setEnabled(enabled);
@@ -1593,7 +1629,7 @@
 
             if (DBG) {
                 log(String.format("onDataSetupComplete: success apn=%s",
-                    apnContext.getWaitingApns().get(0).apn) + " refCount=" + dc.getRefCount());
+                    apnContext.getWaitingApns().get(0).apn));
             }
             ApnSetting apn = apnContext.getApnSetting();
             if (apn.proxy != null && apn.proxy.length() != 0) {
@@ -1660,6 +1696,11 @@
                     }
                     apnContext.setState(State.FAILED);
                     mPhone.notifyDataConnection(Phone.REASON_APN_FAILED, apnContext.getApnType());
+
+                    releaseApnContext(apnContext, false);
+                    if (DBG) {
+                        log("onDataSetupComplete: permanent error apn=%s" + apnString );
+                    }
                 } else {
                     if (DBG) log("onDataSetupComplete: Not all permanent failures, retry");
                     startDelayedRetry(cause, apnContext);
@@ -1669,13 +1710,7 @@
                 apnContext.setState(State.SCANNING);
                 // Wait a bit before trying the next APN, so that
                 // we're not tying up the RIL command channel
-                sendMessageDelayed(obtainMessage(EVENT_TRY_SETUP_DATA, apnContext),
-                        APN_DELAY_MILLIS);
-            }
-
-            int refCount = releaseApnContext(apnContext, false);
-            if (DBG) {
-                log("onDataSetupComplete: error apn=%s" + apnString + " refCount=" + refCount);
+                startAlarmForReconnect(APN_DELAY_MILLIS, apnContext);
             }
         }
     }
@@ -1715,7 +1750,7 @@
             // Wait a bit before trying the next APN, so that
             // we're not tying up the RIL command channel.
             // This also helps in any external dependency to turn off the context.
-            sendMessageDelayed(obtainMessage(EVENT_TRY_SETUP_DATA, apnContext),APN_DELAY_MILLIS);
+            startAlarmForReconnect(APN_DELAY_MILLIS, apnContext);
         }
     }
 
@@ -1758,7 +1793,10 @@
     protected void onCleanUpConnection(boolean tearDown, int apnId, String reason) {
         if (DBG) log("onCleanUpConnection");
         ApnContext apnContext = mApnContexts.get(apnIdToType(apnId));
-        cleanUpConnection(tearDown, apnContext);
+        if (apnContext != null) {
+            apnContext.setReason(reason);
+            cleanUpConnection(tearDown, apnContext);
+        }
     }
 
     protected boolean isConnected() {
@@ -2121,7 +2159,7 @@
 
     @Override
     protected void log(String s) {
-        Log.d(LOG_TAG, "[GsmDCT] " + s);
+        Log.d(LOG_TAG, "[GsmDCT] "+ s);
     }
 
     @Override
diff --git a/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java b/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java
index 27cde78..891c7cb 100755
--- a/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java
+++ b/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java
@@ -496,11 +496,6 @@
             return null;
         }
 
-        // STOPSHIP: to be removed
-        if (BaseCommands.getLteOnCdmaModeStatic() == Phone.LTE_ON_CDMA_TRUE) {
-            Log.e(LOG_TAG, "getOperatorNumeric: STOPSHIP bad numeric operators in lte");
-            return SystemProperties.get("ro.cdma.home.operator.numeric", "310004");
-        }
         // Length = length of MCC + length of MNC
         // length of mcc = 3 (TS 23.003 Section 2.2)
         return imsi.substring(0, 3 + mncLength);
diff --git a/telephony/java/com/android/internal/telephony/gsm/SimCard.java b/telephony/java/com/android/internal/telephony/gsm/SimCard.java
index b7b0af3..643f709 100644
--- a/telephony/java/com/android/internal/telephony/gsm/SimCard.java
+++ b/telephony/java/com/android/internal/telephony/gsm/SimCard.java
@@ -50,6 +50,7 @@
 
         if(mPhone.getLteOnCdmaMode() == Phone.LTE_ON_CDMA_TRUE) {
             mPhone.mCM.registerForNVReady(mHandler, EVENT_ICC_READY, null);
+            mPhone.mCM.registerForIccStatusChanged(mHandler, EVENT_ICC_LOCKED_OR_ABSENT, null);
         }
     }
 
@@ -60,6 +61,11 @@
         mPhone.mCM.unregisterForSIMLockedOrAbsent(mHandler);
         mPhone.mCM.unregisterForOffOrNotAvailable(mHandler);
         mPhone.mCM.unregisterForSIMReady(mHandler);
+
+        if(mPhone.getLteOnCdmaMode() == Phone.LTE_ON_CDMA_TRUE) {
+            mPhone.mCM.unregisterForNVReady(mHandler);
+            mPhone.mCM.unregisterForIccStatusChanged(mHandler);
+        }
     }
 
     @Override
diff --git a/tests/BiDiTests/AndroidManifest.xml b/tests/BiDiTests/AndroidManifest.xml
index 727f980..8a77519 100644
--- a/tests/BiDiTests/AndroidManifest.xml
+++ b/tests/BiDiTests/AndroidManifest.xml
@@ -14,24 +14,49 @@
      limitations under the License.
 -->
 
-<!-- Declare the contents of this Android application.  The namespace
-     attribute brings in the Android platform namespace, and the package
-     supplies a unique name for the application.  When writing your
-     own application, the package name must be changed from "com.example.*"
-     to come from a domain that you own or have control over. -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.bidi"
     android:versionCode="1"
     android:versionName="1.0">
 
     <application android:label="BiDiTests">
-        <activity android:name="BiDiTestActivity"
-                android:windowSoftInputMode="stateAlwaysHidden">
+
+        <activity android:name=".BiDiTestActivity"
+            android:windowSoftInputMode="stateAlwaysHidden">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
 
+        <activity android:name=".BiDiTestBasicActivity"
+                android:windowSoftInputMode="stateAlwaysHidden">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".BiDiTestCanvasActivity"
+                  android:windowSoftInputMode="stateAlwaysHidden">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".BiDiTestLinearLayoutLtrActivity"
+                  android:windowSoftInputMode="stateAlwaysHidden">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".BiDiTestLinearLayoutRtlActivity"
+                  android:windowSoftInputMode="stateAlwaysHidden">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+
     </application>
+
 </manifest>
\ No newline at end of file
diff --git a/tests/BiDiTests/res/layout/biditest_main.xml b/tests/BiDiTests/res/layout/basic.xml
similarity index 79%
rename from tests/BiDiTests/res/layout/biditest_main.xml
rename to tests/BiDiTests/res/layout/basic.xml
index 044a355..c4807ff 100644
--- a/tests/BiDiTests/res/layout/biditest_main.xml
+++ b/tests/BiDiTests/res/layout/basic.xml
@@ -20,7 +20,7 @@
     android:layout_height="match_parent">
 
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-        android:orientation="horizontal"
+        android:orientation="vertical"
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
 
@@ -39,7 +39,7 @@
                   android:text="@string/textview_text"
         />
 
-        <EditText android:id="@+id/textview"
+        <EditText android:id="@+id/edittext"
                   android:layout_height="wrap_content"
                   android:layout_width="match_parent"
                   android:textSize="32dip"
@@ -47,16 +47,4 @@
 
     </LinearLayout>
 
-    <SeekBar android:id="@+id/seekbar"
-               android:layout_height="wrap_content"
-               android:layout_width="match_parent"
-               />
-
-    <view class="com.android.bidi.BiDiTestView"
-        android:id="@+id/main"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="#FF0000"
-    />
-
 </LinearLayout>
\ No newline at end of file
diff --git a/tests/BiDiTests/res/layout/canvas.xml b/tests/BiDiTests/res/layout/canvas.xml
new file mode 100644
index 0000000..371cc23
--- /dev/null
+++ b/tests/BiDiTests/res/layout/canvas.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <SeekBar android:id="@+id/seekbar"
+               android:layout_height="wrap_content"
+               android:layout_width="match_parent"
+               />
+
+    <view class="com.android.bidi.BiDiTestView"
+        android:id="@+id/testview"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="#FF0000"
+    />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/BiDiTests/res/layout/linear_layout_ltr.xml b/tests/BiDiTests/res/layout/linear_layout_ltr.xml
new file mode 100644
index 0000000..a95fb0e
--- /dev/null
+++ b/tests/BiDiTests/res/layout/linear_layout_ltr.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/layouttest"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:horizontalDirection="ltr">
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="horizontal"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:horizontalDirection="inherit">
+
+       <Button android:layout_height="wrap_content"
+               android:layout_width="wrap_content"
+               android:text="@string/button1_text"
+               android:textSize="32dip"
+        />
+
+        <TextView android:id="@+id/textview"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:textSize="32dip"
+                  android:text="@string/textview_text"
+        />
+
+        <Button android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/button2_text"
+                android:textSize="32dip"
+         />
+
+    </LinearLayout>
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="horizontal"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:horizontalDirection="ltr">
+
+       <Button android:layout_height="wrap_content"
+               android:layout_width="wrap_content"
+               android:text="@string/button1_text"
+               android:textSize="32dip"
+        />
+
+        <TextView android:id="@+id/textview"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:textSize="32dip"
+                  android:text="@string/textview_text"
+        />
+
+        <Button android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/button2_text"
+                android:textSize="32dip"
+         />
+
+    </LinearLayout>
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="horizontal"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:horizontalDirection="rtl">
+
+       <Button android:layout_height="wrap_content"
+               android:layout_width="wrap_content"
+               android:text="@string/button1_text"
+               android:textSize="32dip"
+        />
+
+        <TextView android:id="@+id/textview"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:textSize="32dip"
+                  android:text="@string/textview_text"
+        />
+
+        <Button android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/button2_text"
+                android:textSize="32dip"
+         />
+
+    </LinearLayout>
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:horizontalDirection="inherit">
+
+       <Button android:layout_height="wrap_content"
+               android:layout_width="wrap_content"
+               android:text="@string/button1_text"
+               android:textSize="32dip"
+        />
+
+        <TextView android:id="@+id/textview"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:textSize="32dip"
+                  android:text="@string/textview_text"
+        />
+
+        <Button android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/button2_text"
+                android:textSize="32dip"
+         />
+
+    </LinearLayout>
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:horizontalDirection="ltr">
+
+       <Button android:layout_height="wrap_content"
+               android:layout_width="wrap_content"
+               android:text="@string/button1_text"
+               android:textSize="32dip"
+        />
+
+        <TextView android:id="@+id/textview"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:textSize="32dip"
+                  android:text="@string/textview_text"
+        />
+
+        <Button android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/button2_text"
+                android:textSize="32dip"
+         />
+
+    </LinearLayout>
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:horizontalDirection="rtl">
+
+       <Button android:layout_height="wrap_content"
+               android:layout_width="wrap_content"
+               android:text="@string/button1_text"
+               android:textSize="32dip"
+        />
+
+        <TextView android:id="@+id/textview"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:textSize="32dip"
+                  android:text="@string/textview_text"
+        />
+
+        <Button android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/button2_text"
+                android:textSize="32dip"
+         />
+
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/BiDiTests/res/layout/linear_layout_rtl.xml b/tests/BiDiTests/res/layout/linear_layout_rtl.xml
new file mode 100644
index 0000000..0d60950
--- /dev/null
+++ b/tests/BiDiTests/res/layout/linear_layout_rtl.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/layouttest"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:horizontalDirection="rtl">
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="horizontal"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:horizontalDirection="inherit">
+
+       <Button android:layout_height="wrap_content"
+               android:layout_width="wrap_content"
+               android:text="@string/button1_text"
+               android:textSize="32dip"
+        />
+
+        <TextView android:id="@+id/textview"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:textSize="32dip"
+                  android:text="@string/textview_text"
+        />
+
+        <Button android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/button2_text"
+                android:textSize="32dip"
+         />
+
+    </LinearLayout>
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="horizontal"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:horizontalDirection="ltr">
+
+       <Button android:layout_height="wrap_content"
+               android:layout_width="wrap_content"
+               android:text="@string/button1_text"
+               android:textSize="32dip"
+        />
+
+        <TextView android:id="@+id/textview"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:textSize="32dip"
+                  android:text="@string/textview_text"
+        />
+
+        <Button android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/button2_text"
+                android:textSize="32dip"
+         />
+
+    </LinearLayout>
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="horizontal"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:horizontalDirection="rtl">
+
+       <Button android:layout_height="wrap_content"
+               android:layout_width="wrap_content"
+               android:text="@string/button1_text"
+               android:textSize="32dip"
+        />
+
+        <TextView android:id="@+id/textview"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:textSize="32dip"
+                  android:text="@string/textview_text"
+        />
+
+        <Button android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/button2_text"
+                android:textSize="32dip"
+         />
+
+    </LinearLayout>
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:horizontalDirection="inherit">
+
+       <Button android:layout_height="wrap_content"
+               android:layout_width="wrap_content"
+               android:text="@string/button1_text"
+               android:textSize="32dip"
+        />
+
+        <TextView android:id="@+id/textview"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:textSize="32dip"
+                  android:text="@string/textview_text"
+        />
+
+        <Button android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/button2_text"
+                android:textSize="32dip"
+         />
+
+    </LinearLayout>
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:horizontalDirection="ltr">
+
+       <Button android:layout_height="wrap_content"
+               android:layout_width="wrap_content"
+               android:text="@string/button1_text"
+               android:textSize="32dip"
+        />
+
+        <TextView android:id="@+id/textview"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:textSize="32dip"
+                  android:text="@string/textview_text"
+        />
+
+        <Button android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/button2_text"
+                android:textSize="32dip"
+         />
+
+    </LinearLayout>
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:horizontalDirection="rtl">
+
+       <Button android:layout_height="wrap_content"
+               android:layout_width="wrap_content"
+               android:text="@string/button1_text"
+               android:textSize="32dip"
+        />
+
+        <TextView android:id="@+id/textview"
+                  android:layout_height="wrap_content"
+                  android:layout_width="wrap_content"
+                  android:textSize="32dip"
+                  android:text="@string/textview_text"
+        />
+
+        <Button android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/button2_text"
+                android:textSize="32dip"
+         />
+
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/BiDiTests/res/layout/main.xml b/tests/BiDiTests/res/layout/main.xml
new file mode 100644
index 0000000..e39d1d6
--- /dev/null
+++ b/tests/BiDiTests/res/layout/main.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@android:id/tabhost"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+
+    <LinearLayout
+        android:orientation="vertical"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:padding="5dp">
+
+        <TabWidget
+            android:id="@android:id/tabs"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content" />
+
+        <FrameLayout
+            android:id="@android:id/tabcontent"
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent"
+            android:padding="5dp" />
+
+    </LinearLayout>
+
+</TabHost>
diff --git a/tests/BiDiTests/res/values/strings.xml b/tests/BiDiTests/res/values/strings.xml
index c272df1..3795d4b 100644
--- a/tests/BiDiTests/res/values/strings.xml
+++ b/tests/BiDiTests/res/values/strings.xml
@@ -14,6 +14,9 @@
 -->
 <resources>
     <string name="button_text">Button</string>
+    <string name="button1_text">Button1</string>
+    <string name="button2_text">Button2</string>
+    <string name="button_requestlayout_text">Request Layout</string>
     <string name="textview_text">This is a text for a TextView</string>
     <string name="edittext_text">mmmmmmmmmmmmmmmmmmmmmmmm</string>
     <string name="normal_text">Normal String</string>
diff --git a/tests/BiDiTests/src/com/android/bidi/BiDiTestActivity.java b/tests/BiDiTests/src/com/android/bidi/BiDiTestActivity.java
index 6c71574..0d9b4f7 100644
--- a/tests/BiDiTests/src/com/android/bidi/BiDiTestActivity.java
+++ b/tests/BiDiTests/src/com/android/bidi/BiDiTestActivity.java
@@ -16,56 +16,43 @@
 
 package com.android.bidi;
 
-import android.app.Activity;
+import android.app.TabActivity;
+import android.content.Intent;
 import android.os.Bundle;
-import android.util.Log;
-import android.view.View;
-import android.widget.SeekBar;
+import android.widget.TabHost;
 
-import static com.android.bidi.BiDiTestConstants.FONT_MIN_SIZE;
-import static com.android.bidi.BiDiTestConstants.FONT_MAX_SIZE;
-
-public class BiDiTestActivity extends Activity {
-
-    static final String TAG = "BiDiTestActivity";
-
-    static final int INIT_TEXT_SIZE = (FONT_MAX_SIZE - FONT_MIN_SIZE) / 2;
-
-    private BiDiTestView textView;
-    private SeekBar textSizeSeekBar;
+public class BiDiTestActivity extends TabActivity {
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        setContentView(R.layout.biditest_main);
+        setContentView(R.layout.main);
 
-        textView = (BiDiTestView) findViewById(R.id.main);
-        textView.setCurrentTextSize(INIT_TEXT_SIZE);
+        TabHost tabHost = getTabHost();
+        TabHost.TabSpec spec;
+        Intent intent;
 
-        textSizeSeekBar = (SeekBar) findViewById(R.id.seekbar);
-        textSizeSeekBar.setProgress(INIT_TEXT_SIZE);
-        textSizeSeekBar.setMax(FONT_MAX_SIZE - FONT_MIN_SIZE);
+        // Create an Intent to launch an Activity for the tab (to be reused)
+        intent = new Intent().setClass(this, BiDiTestBasicActivity.class);
 
-        textSizeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
-            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-                textView.setCurrentTextSize(FONT_MIN_SIZE + progress);
-            }
+        // Initialize a TabSpec for each tab and add it to the TabHost
+        spec = tabHost.newTabSpec("basic").setIndicator("Basic").setContent(intent);
+        tabHost.addTab(spec);
 
-            public void onStartTrackingTouch(SeekBar seekBar) {
-            }
+        // Do the same for the other tabs
+        intent = new Intent().setClass(this, BiDiTestCanvasActivity.class);
+        spec = tabHost.newTabSpec("canvas").setIndicator("Canvas").setContent(intent);
+        tabHost.addTab(spec);
 
-            public void onStopTrackingTouch(SeekBar seekBar) {
-            }
-        });
-    }
+        intent = new Intent().setClass(this, BiDiTestLinearLayoutLtrActivity.class);
+        spec = tabHost.newTabSpec("layout-ltr").setIndicator("LinearLayout LTR").setContent(intent);
+        tabHost.addTab(spec);
 
-    @Override
-    protected void onResume() {
-        super.onResume();
-    }
+        intent = new Intent().setClass(this, BiDiTestLinearLayoutRtlActivity.class);
+        spec = tabHost.newTabSpec("layout-rtl").setIndicator("LinearLayout RTL").setContent(intent);
+        tabHost.addTab(spec);
 
-    public void onButtonClick(View v) {
-        Log.v(TAG, "onButtonClick");
+        tabHost.setCurrentTab(0);
     }
 }
\ No newline at end of file
diff --git a/tests/BiDiTests/src/com/android/bidi/BiDiTestBasicActivity.java b/tests/BiDiTests/src/com/android/bidi/BiDiTestBasicActivity.java
new file mode 100644
index 0000000..2a8de04
--- /dev/null
+++ b/tests/BiDiTests/src/com/android/bidi/BiDiTestBasicActivity.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2011 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 com.android.bidi;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class BiDiTestBasicActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.basic);
+    }
+}
diff --git a/tests/BiDiTests/src/com/android/bidi/BiDiTestCanvasActivity.java b/tests/BiDiTests/src/com/android/bidi/BiDiTestCanvasActivity.java
new file mode 100644
index 0000000..3ab75d5
--- /dev/null
+++ b/tests/BiDiTests/src/com/android/bidi/BiDiTestCanvasActivity.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2011 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 com.android.bidi;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.widget.SeekBar;
+
+import static com.android.bidi.BiDiTestConstants.FONT_MAX_SIZE;
+import static com.android.bidi.BiDiTestConstants.FONT_MIN_SIZE;
+
+public class BiDiTestCanvasActivity extends Activity {
+
+    static final int INIT_TEXT_SIZE = (FONT_MAX_SIZE - FONT_MIN_SIZE) / 2;
+
+    private BiDiTestView testView;
+    private SeekBar textSizeSeekBar;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.canvas);
+
+        testView = (BiDiTestView) findViewById(R.id.testview);
+        testView.setCurrentTextSize(INIT_TEXT_SIZE);
+
+        textSizeSeekBar = (SeekBar) findViewById(R.id.seekbar);
+        textSizeSeekBar.setProgress(INIT_TEXT_SIZE);
+        textSizeSeekBar.setMax(FONT_MAX_SIZE - FONT_MIN_SIZE);
+
+        textSizeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+                testView.setCurrentTextSize(FONT_MIN_SIZE + progress);
+            }
+
+            public void onStartTrackingTouch(SeekBar seekBar) {
+            }
+
+            public void onStopTrackingTouch(SeekBar seekBar) {
+            }
+        });
+    }
+}
diff --git a/tests/BiDiTests/src/com/android/bidi/BiDiTestLinearLayoutLtrActivity.java b/tests/BiDiTests/src/com/android/bidi/BiDiTestLinearLayoutLtrActivity.java
new file mode 100644
index 0000000..6d8f11d
--- /dev/null
+++ b/tests/BiDiTests/src/com/android/bidi/BiDiTestLinearLayoutLtrActivity.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2011 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 com.android.bidi;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.widget.LinearLayout;
+
+public class BiDiTestLinearLayoutLtrActivity extends Activity {
+
+    private LinearLayout layout;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.linear_layout_ltr);
+
+        layout = (LinearLayout) findViewById(R.id.layouttest);
+    }
+}
diff --git a/tests/BiDiTests/src/com/android/bidi/BiDiTestLinearLayoutRtlActivity.java b/tests/BiDiTests/src/com/android/bidi/BiDiTestLinearLayoutRtlActivity.java
new file mode 100644
index 0000000..0130793
--- /dev/null
+++ b/tests/BiDiTests/src/com/android/bidi/BiDiTestLinearLayoutRtlActivity.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2011 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 com.android.bidi;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.widget.LinearLayout;
+
+public class BiDiTestLinearLayoutRtlActivity extends Activity {
+
+    private LinearLayout layout;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.linear_layout_rtl);
+
+        layout = (LinearLayout) findViewById(R.id.layouttest);
+    }
+}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java b/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java
index ee5bb5d..d883a32 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java
@@ -100,7 +100,7 @@
             throw new RuntimeException("No test specified");
         }
 
-        TestShellActivity activity = (TestShellActivity) getActivity();
+        final TestShellActivity activity = (TestShellActivity) getActivity();
 
         Log.v(LOGTAG, "About to run tests, calling gc first...");
         freeMem();
@@ -109,7 +109,13 @@
         runTestAndWaitUntilDone(activity, runner.mTestPath, runner.mTimeoutInMillis,
                 runner.mGetDrawTime, runner.mSaveImagePath);
 
-        activity.clearCache();
+        getInstrumentation().runOnMainSync(new Runnable() {
+
+            @Override
+            public void run() {
+                activity.clearCache();
+            }
+        });
         if (mForwardServer != null) {
             mForwardServer.stop();
             mForwardServer = null;
diff --git a/tests/DumpRenderTree2/assets/run_apache2.py b/tests/DumpRenderTree2/assets/run_apache2.py
index b4a8685..3806599 100755
--- a/tests/DumpRenderTree2/assets/run_apache2.py
+++ b/tests/DumpRenderTree2/assets/run_apache2.py
@@ -79,8 +79,8 @@
   # complete set of tests and the required scripts.
   directives += " -c \"DocumentRoot " + os.path.join(layout_tests_path, "http", "tests/") + "\""
   directives += " -c \"Alias /LayoutTests " + layout_tests_path + "\""
-  directives += " -c \"Alias /WebKitTools/DumpRenderTree/android " + \
-    os.path.join(webkit_path, "WebKitTools", "DumpRenderTree", "android") + "\""
+  directives += " -c \"Alias /Tools/DumpRenderTree/android " + \
+    os.path.join(webkit_path, "Tools", "DumpRenderTree", "android") + "\""
   directives += " -c \"Alias /ThirdPartyProject.prop " + \
     os.path.join(webkit_path, "ThirdPartyProject.prop") + "\""
 
diff --git a/tests/DumpRenderTree2/assets/run_layout_tests.py b/tests/DumpRenderTree2/assets/run_layout_tests.py
index 3b8c09a..161416a 100755
--- a/tests/DumpRenderTree2/assets/run_layout_tests.py
+++ b/tests/DumpRenderTree2/assets/run_layout_tests.py
@@ -44,9 +44,15 @@
   logging.info("Running the tests...")
   logging.debug("Command = %s" % cmd)
   (stdoutdata, stderrdata) = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
+  if stderrdata != "":
+    logging.info("Failed to start tests:\n%s", stderrdata)
+    return
   if re.search("^INSTRUMENTATION_STATUS_CODE: -1", stdoutdata, re.MULTILINE) != None:
     logging.info("Failed to run the tests. Is DumpRenderTree2 installed on the device?")
     return
+  if re.search("^OK \([0-9]+ tests?\)", stdoutdata, re.MULTILINE) == None:
+    logging.info("DumpRenderTree2 failed to run correctly:\n%s", stdoutdata)
+    return
 
   logging.info("Downloading the summaries...")
 
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java
index d1aba437..54cbfda 100644
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java
+++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/FsUtils.java
@@ -63,7 +63,7 @@
     public static final String LOG_TAG = "FsUtils";
 
     private static final String SCRIPT_URL = ForwarderManager.getHostSchemePort(false) +
-            "WebKitTools/DumpRenderTree/android/get_layout_tests_dir_contents.php";
+            "Tools/DumpRenderTree/android/get_layout_tests_dir_contents.php";
 
     private static final int HTTP_TIMEOUT_MS = 5000;
 
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java
index d9f5dd4..f59da37 100644
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java
+++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java
@@ -398,6 +398,11 @@
     }
 
     private void startTests() {
+        // This is called when the tests are started and after each crash.
+        // We only send the reset message in the former case.
+        if (mCurrentTestIndex <= 0) {
+            sendResetMessage();
+        }
         if (mCurrentTestIndex == 0) {
             sendFirstTestMessage();
         }
@@ -405,6 +410,15 @@
         runNextTest();
     }
 
+    private void sendResetMessage() {
+        try {
+            Message serviceMsg = Message.obtain(null, ManagerService.MSG_RESET);
+            mManagerServiceMessenger.send(serviceMsg);
+        } catch (RemoteException e) {
+            Log.e(LOG_TAG, "Error sending message to manager service:", e);
+        }
+    }
+
     private void sendFirstTestMessage() {
         try {
             Message serviceMsg = Message.obtain(null, ManagerService.MSG_FIRST_TEST);
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java
index e4df62d..4783cc7 100644
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java
+++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java
@@ -66,6 +66,7 @@
     static final int MSG_ALL_TESTS_FINISHED = 1;
     static final int MSG_FIRST_TEST = 2;
     static final int MSG_CURRENT_TEST_CRASHED = 3;
+    static final int MSG_RESET = 4;
 
     /**
      * This handler is purely for IPC. It is used to create mMessenger
@@ -75,8 +76,11 @@
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
-                case MSG_FIRST_TEST:
+                case MSG_RESET:
                     mSummarizer.reset();
+                    break;
+
+                case MSG_FIRST_TEST:
                     Bundle bundle = msg.getData();
                     ensureNextTestSetup(bundle.getString("firstTest"), bundle.getInt("index"));
                     break;
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/Summarizer.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/Summarizer.java
index 65c6964..bae8e6b 100644
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/Summarizer.java
+++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/Summarizer.java
@@ -568,7 +568,7 @@
         URL url = null;
         try {
             url = new URL("http", "localhost", ForwarderManager.HTTP_PORT,
-                    "/WebKitTools/DumpRenderTree/android/view_source.php?src=" +
+                    "/Tools/DumpRenderTree/android/view_source.php?src=" +
                     relativePath);
         } catch (MalformedURLException e) {
             assert false : "relativePath=" + relativePath;
diff --git a/tests/HwAccelerationTest/AndroidManifest.xml b/tests/HwAccelerationTest/AndroidManifest.xml
index c1aa215..35f2b9b 100644
--- a/tests/HwAccelerationTest/AndroidManifest.xml
+++ b/tests/HwAccelerationTest/AndroidManifest.xml
@@ -376,7 +376,7 @@
 
         <activity
                 android:name="ListActivity"
-                android:label="_List">
+                android:label="__List">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/TextActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/TextActivity.java
index 3c8432e..7bf25cf 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/TextActivity.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/TextActivity.java
@@ -38,6 +38,7 @@
         private final Paint mStrikePaint;
         private final Paint mScaledPaint;
         private final Paint mSkewPaint;
+        private final Paint mHugePaint;
 
         CustomTextView(Context c) {
             super(c);
@@ -64,6 +65,11 @@
             mSkewPaint.setAntiAlias(true);
             mSkewPaint.setTextSize(16.0f);
             mSkewPaint.setShadowLayer(3.0f, 3.0f, 3.0f, 0xff000000);
+
+            mHugePaint = new Paint();
+            mHugePaint.setAntiAlias(true);
+            mHugePaint.setColor(0xff000000);
+            mHugePaint.setTextSize(300f);
         }
 
         @Override
@@ -98,7 +104,9 @@
             mLargePaint.setAlpha(255);
             mLargePaint.setColor(0xff000000);
             mLargePaint.clearShadowLayer();
-            
+
+            canvas.drawText("Hello!", 500, 600, mHugePaint);
+
             canvas.drawText("Hello OpenGL renderer!", 500, 40, mStrikePaint);
             mStrikePaint.setStrikeThruText(true);
             canvas.drawText("Hello OpenGL renderer!", 500, 70, mStrikePaint);
@@ -106,7 +114,7 @@
             canvas.drawText("Hello OpenGL renderer!", 500, 100, mStrikePaint);
             mStrikePaint.setStrikeThruText(false);
             mStrikePaint.setUnderlineText(true);
-            
+
             mSkewPaint.setTextSkewX(-0.25f);
             canvas.drawText("Hello OpenGL renderer!", 980, 200, mSkewPaint);
             mSkewPaint.setTextSkewX(0.5f);
@@ -120,11 +128,12 @@
             canvas.drawText("Hello OpenGL renderer!", 500, 230, mScaledPaint);
             mScaledPaint.setTextScaleX(2.0f);
             canvas.drawText("Hello OpenGL renderer!", 500, 260, mScaledPaint);
-            
+
             canvas.save();
             canvas.clipRect(150.0f, 220.0f, 450.0f, 320.0f);
             canvas.drawText("Hello OpenGL renderer!", 100, 300, mLargePaint);
             canvas.restore();
+
         }
     }
 }
diff --git a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java
index 7cd55fa..5377f12 100644
--- a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java
+++ b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java
@@ -81,8 +81,6 @@
     private Sampler mLinearWrap;
     private Sampler mMipLinearWrap;
     private Sampler mNearestClamp;
-    private Sampler mMipLinearAniso8;
-    private Sampler mMipLinearAniso15;
 
     private ProgramStore mProgStoreBlendNoneDepth;
     private ProgramStore mProgStoreBlendNone;
@@ -123,10 +121,6 @@
 
     Font mFontSans;
     Font mFontSerif;
-    Font mFontSerifBold;
-    Font mFontSerifItalic;
-    Font mFontSerifBoldItalic;
-    Font mFontMono;
     private Allocation mTextAlloc;
 
     private ScriptC_rsbench mScript;
@@ -410,20 +404,11 @@
         mFontSans = Font.create(mRS, mRes, "sans-serif", Font.Style.NORMAL, 8);
         mFontSerif = Font.create(mRS, mRes, "serif", Font.Style.NORMAL, 8);
         // Create fonts by family and style
-        mFontSerifBold = Font.create(mRS, mRes, "serif", Font.Style.BOLD, 8);
-        mFontSerifItalic = Font.create(mRS, mRes, "serif", Font.Style.ITALIC, 8);
-        mFontSerifBoldItalic = Font.create(mRS, mRes, "serif", Font.Style.BOLD_ITALIC, 8);
-        mFontMono = Font.create(mRS, mRes, "mono", Font.Style.NORMAL, 8);
 
         mTextAlloc = Allocation.createFromString(mRS, "String from allocation", Allocation.USAGE_SCRIPT);
 
         mScript.set_gFontSans(mFontSans);
         mScript.set_gFontSerif(mFontSerif);
-        mScript.set_gFontSerifBold(mFontSerifBold);
-        mScript.set_gFontSerifItalic(mFontSerifItalic);
-        mScript.set_gFontSerifBoldItalic(mFontSerifBoldItalic);
-        mScript.set_gFontMono(mFontMono);
-        mScript.set_gTextAlloc(mTextAlloc);
     }
 
     private void initMesh() {
@@ -456,21 +441,9 @@
         mNearestClamp = Sampler.CLAMP_NEAREST(mRS);
         mMipLinearWrap = Sampler.WRAP_LINEAR_MIP_LINEAR(mRS);
 
-        bs = new Sampler.Builder(mRS);
-        bs.setMinification(Sampler.Value.LINEAR_MIP_LINEAR);
-        bs.setMagnification(Sampler.Value.LINEAR);
-        bs.setWrapS(Sampler.Value.WRAP);
-        bs.setWrapT(Sampler.Value.WRAP);
-        bs.setAnisotropy(8.0f);
-        mMipLinearAniso8 = bs.create();
-        bs.setAnisotropy(15.0f);
-        mMipLinearAniso15 = bs.create();
-
         mScript.set_gLinearClamp(mLinearClamp);
         mScript.set_gLinearWrap(mLinearWrap);
         mScript.set_gMipLinearWrap(mMipLinearWrap);
-        mScript.set_gMipLinearAniso8(mMipLinearAniso8);
-        mScript.set_gMipLinearAniso15(mMipLinearAniso15);
         mScript.set_gNearestClamp(mNearestClamp);
     }
 
diff --git a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs
index 198e3f8..e7f5cd4 100644
--- a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs
+++ b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs
@@ -52,19 +52,12 @@
 
 rs_font gFontSans;
 rs_font gFontSerif;
-rs_font gFontSerifBold;
-rs_font gFontSerifItalic;
-rs_font gFontSerifBoldItalic;
-rs_font gFontMono;
-rs_allocation gTextAlloc;
 
 int gDisplayMode;
 
 rs_sampler gLinearClamp;
 rs_sampler gLinearWrap;
 rs_sampler gMipLinearWrap;
-rs_sampler gMipLinearAniso8;
-rs_sampler gMipLinearAniso15;
 rs_sampler gNearestClamp;
 
 rs_program_raster gCullBack;
@@ -117,8 +110,8 @@
     rs_font fonts[5];
     fonts[0] = gFontSans;
     fonts[1] = gFontSerif;
-    fonts[2] = gFontSerifBold;
-    fonts[3] = gFontSerifBoldItalic;
+    fonts[2] = gFontSans;
+    fonts[3] = gFontSerif;
     fonts[4] = gFontSans;
 
     uint width = gRenderSurfaceW;
@@ -183,52 +176,6 @@
     }
 }
 
-static void displayBlendingSamples() {
-    int i;
-
-    bindProgramVertexOrtho();
-    rs_matrix4x4 matrix;
-    rsMatrixLoadIdentity(&matrix);
-    rsgProgramVertexLoadModelMatrix(&matrix);
-
-    rsgBindProgramFragment(gProgFragmentColor);
-
-    rsgBindProgramStore(gProgStoreBlendNone);
-    for (i = 0; i < 3; i ++) {
-        float iPlusOne = (float)(i + 1);
-        rsgProgramFragmentConstantColor(gProgFragmentColor,
-                                        0.1f*iPlusOne, 0.2f*iPlusOne, 0.3f*iPlusOne, 1);
-        float yPos = 150 * (float)i;
-        rsgDrawRect(0, yPos, 200, yPos + 200, 0);
-    }
-
-    rsgBindProgramStore(gProgStoreBlendAlpha);
-    for (i = 0; i < 3; i ++) {
-        float iPlusOne = (float)(i + 1);
-        rsgProgramFragmentConstantColor(gProgFragmentColor,
-                                        0.2f*iPlusOne, 0.3f*iPlusOne, 0.1f*iPlusOne, 0.5);
-        float yPos = 150 * (float)i;
-        rsgDrawRect(150, yPos, 350, yPos + 200, 0);
-    }
-
-    rsgBindProgramStore(gProgStoreBlendAdd);
-    for (i = 0; i < 3; i ++) {
-        float iPlusOne = (float)(i + 1);
-        rsgProgramFragmentConstantColor(gProgFragmentColor,
-                                        0.3f*iPlusOne, 0.1f*iPlusOne, 0.2f*iPlusOne, 0.5);
-        float yPos = 150 * (float)i;
-        rsgDrawRect(300, yPos, 500, yPos + 200, 0);
-    }
-
-
-    rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f);
-    rsgBindFont(gFontMono);
-    rsgDrawText("No Blending", 10, 50);
-    rsgDrawText("Alpha Blending", 160, 150);
-    rsgDrawText("Additive Blending", 320, 250);
-
-}
-
 static void displayMeshSamples(int meshNum) {
 
     bindProgramVertexOrtho();
@@ -251,61 +198,6 @@
     }
 }
 
-static void displayTextureSamplers() {
-
-    bindProgramVertexOrtho();
-    rs_matrix4x4 matrix;
-    rsMatrixLoadIdentity(&matrix);
-    rsgProgramVertexLoadModelMatrix(&matrix);
-
-    // Fragment shader with texture
-    rsgBindProgramStore(gProgStoreBlendNone);
-    rsgBindProgramFragment(gProgFragmentTexture);
-    rsgBindTexture(gProgFragmentTexture, 0, gTexOpaque);
-
-    // Linear clamp
-    rsgBindSampler(gProgFragmentTexture, 0, gLinearClamp);
-    float startX = 0, startY = 0;
-    float width = 300, height = 300;
-    rsgDrawQuadTexCoords(startX, startY, 0, 0, 0,
-                         startX, startY + height, 0, 0, 1.1,
-                         startX + width, startY + height, 0, 1.1, 1.1,
-                         startX + width, startY, 0, 1.1, 0);
-
-    // Linear Wrap
-    rsgBindSampler(gProgFragmentTexture, 0, gLinearWrap);
-    startX = 0; startY = 300;
-    width = 300; height = 300;
-    rsgDrawQuadTexCoords(startX, startY, 0, 0, 0,
-                         startX, startY + height, 0, 0, 1.1,
-                         startX + width, startY + height, 0, 1.1, 1.1,
-                         startX + width, startY, 0, 1.1, 0);
-
-    // Nearest
-    rsgBindSampler(gProgFragmentTexture, 0, gNearestClamp);
-    startX = 300; startY = 0;
-    width = 300; height = 300;
-    rsgDrawQuadTexCoords(startX, startY, 0, 0, 0,
-                         startX, startY + height, 0, 0, 1.1,
-                         startX + width, startY + height, 0, 1.1, 1.1,
-                         startX + width, startY, 0, 1.1, 0);
-
-    rsgBindSampler(gProgFragmentTexture, 0, gMipLinearWrap);
-    startX = 300; startY = 300;
-    width = 300; height = 300;
-    rsgDrawQuadTexCoords(startX, startY, 0, 0, 0,
-                         startX, startY + height, 0, 0, 1.5,
-                         startX + width, startY + height, 0, 1.5, 1.5,
-                         startX + width, startY, 0, 1.5, 0);
-
-    rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f);
-    rsgBindFont(gFontMono);
-    rsgDrawText("Filtering: linear clamp", 10, 290);
-    rsgDrawText("Filtering: linear wrap", 10, 590);
-    rsgDrawText("Filtering: nearest clamp", 310, 290);
-    rsgDrawText("Filtering: miplinear wrap", 310, 590);
-}
-
 static float gTorusRotation = 0;
 static void updateModelMatrix(rs_matrix4x4 *matrix, void *buffer) {
     if (buffer == 0) {
@@ -354,7 +246,6 @@
     }
 }
 
-
 // Quick hack to get some geometry numbers
 static void displaySimpleGeoSamples(bool useTexture, int numMeshes) {
     rsgBindProgramVertex(gProgVertex);
@@ -545,66 +436,6 @@
     }
 }
 
-static float gAnisoTime = 0.0f;
-static uint anisoMode = 0;
-static void displayAnisoSample() {
-
-    gAnisoTime += gDt;
-
-    rsgBindProgramVertex(gProgVertex);
-    float aspect = (float)gRenderSurfaceW / (float)gRenderSurfaceH;
-    rs_matrix4x4 proj;
-    rsMatrixLoadPerspective(&proj, 30.0f, aspect, 0.1f, 100.0f);
-    rsgProgramVertexLoadProjectionMatrix(&proj);
-
-    rs_matrix4x4 matrix;
-    // Fragment shader with texture
-    rsgBindProgramStore(gProgStoreBlendNone);
-    rsgBindProgramFragment(gProgFragmentTexture);
-    rsMatrixLoadTranslate(&matrix, 0.0f, 0.0f, -10.0f);
-    rsMatrixRotate(&matrix, -80, 1.0f, 0.0f, 0.0f);
-    rsgProgramVertexLoadModelMatrix(&matrix);
-
-    rsgBindProgramRaster(gCullNone);
-
-    rsgBindTexture(gProgFragmentTexture, 0, gTexChecker);
-
-    if (gAnisoTime >= 5.0f) {
-        gAnisoTime = 0.0f;
-        anisoMode ++;
-        anisoMode = anisoMode % 3;
-    }
-
-    if (anisoMode == 0) {
-        rsgBindSampler(gProgFragmentTexture, 0, gMipLinearAniso8);
-    } else if (anisoMode == 1) {
-        rsgBindSampler(gProgFragmentTexture, 0, gMipLinearAniso15);
-    } else {
-        rsgBindSampler(gProgFragmentTexture, 0, gMipLinearWrap);
-    }
-
-    float startX = -15;
-    float startY = -15;
-    float width = 30;
-    float height = 30;
-    rsgDrawQuadTexCoords(startX, startY, 0, 0, 0,
-                         startX, startY + height, 0, 0, 10,
-                         startX + width, startY + height, 0, 10, 10,
-                         startX + width, startY, 0, 10, 0);
-
-    rsgBindProgramRaster(gCullBack);
-
-    rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f);
-    rsgBindFont(gFontMono);
-    if (anisoMode == 0) {
-        rsgDrawText("Anisotropic filtering 8", 10, 40);
-    } else if (anisoMode == 1) {
-        rsgDrawText("Anisotropic filtering 15", 10, 40);
-    } else {
-        rsgDrawText("Miplinear filtering", 10, 40);
-    }
-}
-
 static bool checkInit() {
 
     static int countdown = 5;
@@ -613,20 +444,17 @@
     if(countdown > 1) {
         displayFontSamples(5);
         displaySingletexFill(true, 3);
-        displayBlendingSamples();
         displayMeshSamples(0);
         displayMeshSamples(1);
         displayMeshSamples(2);
-        displayTextureSamplers();
         displayMultitextureSample(true, 5);
-        displayAnisoSample();
         displayPixelLightSamples(1, false);
         displayPixelLightSamples(1, true);
         countdown --;
         rsgClearColor(0.2f, 0.2f, 0.2f, 0.0f);
 
         rsgFontColor(0.9f, 0.9f, 0.95f, 1.0f);
-        rsgBindFont(gFontSerifBoldItalic);
+        rsgBindFont(gFontSerif);
         if (countdown == 1) {
             rsgDrawText("Rendering", 50, 50);
         } else {
@@ -831,7 +659,7 @@
     uint width = rsgGetWidth();
     uint height = rsgGetHeight();
     rsgFontColor(0.9f, 0.9f, 0.95f, 1.0f);
-    rsgBindFont(gFontSerifBoldItalic);
+    rsgBindFont(gFontSerif);
     rsgMeasureText(text, &left, &right, &top, &bottom);
     rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f);
     rsgDrawText(text, 2 -left, height - 2 + bottom);
diff --git a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/shader_def.rsh b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/shader_def.rsh
index 1d77ea9..648359c 100644
--- a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/shader_def.rsh
+++ b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/shader_def.rsh
@@ -30,15 +30,6 @@
     float light1_CosinePower;
 } VertexShaderConstants;
 
-typedef struct VertexShaderConstants2_s {
-    rs_matrix4x4 model[2];
-    rs_matrix4x4 proj;
-    float4 light_Posision[2];
-    float light_Diffuse[2];
-    float light_Specular[2];
-    float light_CosinePower[2];
-} VertexShaderConstants2;
-
 typedef struct VertexShaderConstants3_s {
     rs_matrix4x4 model;
     rs_matrix4x4 proj;
diff --git a/tools/aapt/AaptAssets.cpp b/tools/aapt/AaptAssets.cpp
index a2271d9..4894196 100644
--- a/tools/aapt/AaptAssets.cpp
+++ b/tools/aapt/AaptAssets.cpp
@@ -142,17 +142,10 @@
         return 0;
     }
 
-    // screen layout size
-    if (getScreenLayoutSizeName(part.string(), &config)) {
-        *axis = AXIS_SCREENLAYOUTSIZE;
-        *value = (config.screenLayout&ResTable_config::MASK_SCREENSIZE);
-        return 0;
-    }
-
-    // screen layout long
-    if (getScreenLayoutLongName(part.string(), &config)) {
-        *axis = AXIS_SCREENLAYOUTLONG;
-        *value = (config.screenLayout&ResTable_config::MASK_SCREENLONG);
+    // smallest screen dp width
+    if (getSmallestScreenWidthDpName(part.string(), &config)) {
+        *axis = AXIS_SMALLESTSCREENWIDTHDP;
+        *value = config.smallestScreenWidthDp;
         return 0;
     }
 
@@ -170,6 +163,20 @@
         return 0;
     }
 
+    // screen layout size
+    if (getScreenLayoutSizeName(part.string(), &config)) {
+        *axis = AXIS_SCREENLAYOUTSIZE;
+        *value = (config.screenLayout&ResTable_config::MASK_SCREENSIZE);
+        return 0;
+    }
+
+    // screen layout long
+    if (getScreenLayoutLongName(part.string(), &config)) {
+        *axis = AXIS_SCREENLAYOUTLONG;
+        *value = (config.screenLayout&ResTable_config::MASK_SCREENLONG);
+        return 0;
+    }
+
     // orientation
     if (getOrientationName(part.string(), &config)) {
         *axis = AXIS_ORIENTATION;
@@ -257,7 +264,7 @@
 
     String8 mcc, mnc, loc, layoutsize, layoutlong, orient, den;
     String8 touch, key, keysHidden, nav, navHidden, size, vers;
-    String8 uiModeType, uiModeNight, widthdp, heightdp;
+    String8 uiModeType, uiModeNight, smallestwidthdp, widthdp, heightdp;
 
     const char *p = dir;
     const char *q;
@@ -344,8 +351,8 @@
         //printf("not region: %s\n", part.string());
     }
 
-    if (getScreenLayoutSizeName(part.string())) {
-        layoutsize = part;
+    if (getSmallestScreenWidthDpName(part.string())) {
+        smallestwidthdp = part;
 
         index++;
         if (index == N) {
@@ -353,19 +360,7 @@
         }
         part = parts[index];
     } else {
-        //printf("not screen layout size: %s\n", part.string());
-    }
-
-    if (getScreenLayoutLongName(part.string())) {
-        layoutlong = part;
-
-        index++;
-        if (index == N) {
-            goto success;
-        }
-        part = parts[index];
-    } else {
-        //printf("not screen layout long: %s\n", part.string());
+        //printf("not smallest screen width dp: %s\n", part.string());
     }
 
     if (getScreenWidthDpName(part.string())) {
@@ -392,6 +387,30 @@
         //printf("not screen height dp: %s\n", part.string());
     }
 
+    if (getScreenLayoutSizeName(part.string())) {
+        layoutsize = part;
+
+        index++;
+        if (index == N) {
+            goto success;
+        }
+        part = parts[index];
+    } else {
+        //printf("not screen layout size: %s\n", part.string());
+    }
+
+    if (getScreenLayoutLongName(part.string())) {
+        layoutlong = part;
+
+        index++;
+        if (index == N) {
+            goto success;
+        }
+        part = parts[index];
+    } else {
+        //printf("not screen layout long: %s\n", part.string());
+    }
+
     // orientation
     if (getOrientationName(part.string())) {
         orient = part;
@@ -541,6 +560,7 @@
     this->locale = loc;
     this->screenLayoutSize = layoutsize;
     this->screenLayoutLong = layoutlong;
+    this->smallestScreenWidthDp = smallestwidthdp;
     this->screenWidthDp = widthdp;
     this->screenHeightDp = heightdp;
     this->orientation = orient;
@@ -570,14 +590,16 @@
     s += ",";
     s += this->locale;
     s += ",";
-    s += screenLayoutSize;
-    s += ",";
-    s += screenLayoutLong;
+    s += smallestScreenWidthDp;
     s += ",";
     s += screenWidthDp;
     s += ",";
     s += screenHeightDp;
     s += ",";
+    s += screenLayoutSize;
+    s += ",";
+    s += screenLayoutLong;
+    s += ",";
     s += this->orientation;
     s += ",";
     s += uiModeType;
@@ -618,13 +640,9 @@
         s += "-";
         s += locale;
     }
-    if (this->screenLayoutSize != "") {
+    if (this->smallestScreenWidthDp != "") {
         s += "-";
-        s += screenLayoutSize;
-    }
-    if (this->screenLayoutLong != "") {
-        s += "-";
-        s += screenLayoutLong;
+        s += smallestScreenWidthDp;
     }
     if (this->screenWidthDp != "") {
         s += "-";
@@ -634,6 +652,14 @@
         s += "-";
         s += screenHeightDp;
     }
+    if (this->screenLayoutSize != "") {
+        s += "-";
+        s += screenLayoutSize;
+    }
+    if (this->screenLayoutLong != "") {
+        s += "-";
+        s += screenLayoutLong;
+    }
     if (this->orientation != "") {
         s += "-";
         s += orientation;
@@ -887,6 +913,11 @@
               (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
               | ResTable_config::UI_MODE_TYPE_CAR;
         return true;
+    } else if (strcmp(name, "television") == 0) {
+      if (out) out->uiMode =
+              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
+              | ResTable_config::UI_MODE_TYPE_TELEVISION;
+        return true;
     }
 
     return false;
@@ -1126,6 +1157,31 @@
     return true;
 }
 
+bool AaptGroupEntry::getSmallestScreenWidthDpName(const char* name, ResTable_config* out)
+{
+    if (strcmp(name, kWildcardName) == 0) {
+        if (out) {
+            out->smallestScreenWidthDp = out->SCREENWIDTH_ANY;
+        }
+        return true;
+    }
+
+    if (*name != 's') return false;
+    name++;
+    if (*name != 'w') return false;
+    name++;
+    const char* x = name;
+    while (*x >= '0' && *x <= '9') x++;
+    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
+    String8 xName(name, x-name);
+
+    if (out) {
+        out->smallestScreenWidthDp = (uint16_t)atoi(xName.string());
+    }
+
+    return true;
+}
+
 bool AaptGroupEntry::getScreenWidthDpName(const char* name, ResTable_config* out)
 {
     if (strcmp(name, kWildcardName) == 0) {
@@ -1206,10 +1262,11 @@
     if (v == 0) v = mnc.compare(o.mnc);
     if (v == 0) v = locale.compare(o.locale);
     if (v == 0) v = vendor.compare(o.vendor);
-    if (v == 0) v = screenLayoutSize.compare(o.screenLayoutSize);
-    if (v == 0) v = screenLayoutLong.compare(o.screenLayoutLong);
+    if (v == 0) v = smallestScreenWidthDp.compare(o.smallestScreenWidthDp);
     if (v == 0) v = screenWidthDp.compare(o.screenWidthDp);
     if (v == 0) v = screenHeightDp.compare(o.screenHeightDp);
+    if (v == 0) v = screenLayoutSize.compare(o.screenLayoutSize);
+    if (v == 0) v = screenLayoutLong.compare(o.screenLayoutLong);
     if (v == 0) v = orientation.compare(o.orientation);
     if (v == 0) v = uiModeType.compare(o.uiModeType);
     if (v == 0) v = uiModeNight.compare(o.uiModeNight);
@@ -1231,10 +1288,11 @@
     getMccName(mcc.string(), &params);
     getMncName(mnc.string(), &params);
     getLocaleName(locale.string(), &params);
-    getScreenLayoutSizeName(screenLayoutSize.string(), &params);
-    getScreenLayoutLongName(screenLayoutLong.string(), &params);
+    getSmallestScreenWidthDpName(smallestScreenWidthDp.string(), &params);
     getScreenWidthDpName(screenWidthDp.string(), &params);
     getScreenHeightDpName(screenHeightDp.string(), &params);
+    getScreenLayoutSizeName(screenLayoutSize.string(), &params);
+    getScreenLayoutLongName(screenLayoutLong.string(), &params);
     getOrientationName(orientation.string(), &params);
     getUiModeTypeName(uiModeType.string(), &params);
     getUiModeNightName(uiModeNight.string(), &params);
@@ -1249,9 +1307,10 @@
     
     // Fix up version number based on specified parameters.
     int minSdk = 0;
-    if (params.screenWidthDp != ResTable_config::SCREENWIDTH_ANY
+    if (params.smallestScreenWidthDp != ResTable_config::SCREENWIDTH_ANY
+            || params.screenWidthDp != ResTable_config::SCREENWIDTH_ANY
             || params.screenHeightDp != ResTable_config::SCREENHEIGHT_ANY) {
-        minSdk = SDK_ICS;
+        minSdk = SDK_HONEYCOMB_MR2;
     } else if ((params.uiMode&ResTable_config::MASK_UI_MODE_TYPE)
                 != ResTable_config::UI_MODE_TYPE_ANY
             ||  (params.uiMode&ResTable_config::MASK_UI_MODE_NIGHT)
diff --git a/tools/aapt/AaptAssets.h b/tools/aapt/AaptAssets.h
index e5afd1b..65743d8 100644
--- a/tools/aapt/AaptAssets.h
+++ b/tools/aapt/AaptAssets.h
@@ -42,6 +42,7 @@
     AXIS_NAVHIDDEN,
     AXIS_NAVIGATION,
     AXIS_SCREENSIZE,
+    AXIS_SMALLESTSCREENWIDTHDP,
     AXIS_SCREENWIDTHDP,
     AXIS_SCREENHEIGHTDP,
     AXIS_VERSION
@@ -54,7 +55,7 @@
     SDK_ECLAIR_0_1 = 6,
     SDK_MR1 = 7,
     SDK_FROYO = 8,
-    SDK_ICS = 13,
+    SDK_HONEYCOMB_MR2 = 13,
 };
 
 /**
@@ -72,10 +73,11 @@
     String8 mnc;
     String8 locale;
     String8 vendor;
-    String8 screenLayoutSize;
-    String8 screenLayoutLong;
+    String8 smallestScreenWidthDp;
     String8 screenWidthDp;
     String8 screenHeightDp;
+    String8 screenLayoutSize;
+    String8 screenLayoutLong;
     String8 orientation;
     String8 uiModeType;
     String8 uiModeNight;
@@ -107,6 +109,7 @@
     static bool getNavigationName(const char* name, ResTable_config* out = NULL);
     static bool getNavHiddenName(const char* name, ResTable_config* out = NULL);
     static bool getScreenSizeName(const char* name, ResTable_config* out = NULL);
+    static bool getSmallestScreenWidthDpName(const char* name, ResTable_config* out = NULL);
     static bool getScreenWidthDpName(const char* name, ResTable_config* out = NULL);
     static bool getScreenHeightDpName(const char* name, ResTable_config* out = NULL);
     static bool getVersionName(const char* name, ResTable_config* out = NULL);
diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp
index a88476e..5c5b4fd 100644
--- a/tools/aapt/ResourceTable.cpp
+++ b/tools/aapt/ResourceTable.cpp
@@ -2607,6 +2607,9 @@
     if (!match(AXIS_SCREENSIZE, config.screenSize)) {
         return false;
     }
+    if (!match(AXIS_SMALLESTSCREENWIDTHDP, config.smallestScreenWidthDp)) {
+        return false;
+    }
     if (!match(AXIS_SCREENWIDTHDP, config.screenWidthDp)) {
         return false;
     }
@@ -2809,7 +2812,8 @@
                 ConfigDescription config = t->getUniqueConfigs().itemAt(ci);
 
                 NOISY(printf("Writing config %d config: imsi:%d/%d lang:%c%c cnt:%c%c "
-                     "orien:%d ui:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d %ddp x %ddp\n",
+                     "orien:%d ui:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d "
+                     "sw%ddp w%ddp h%ddp\n",
                       ti+1,
                       config.mcc, config.mnc,
                       config.language[0] ? config.language[0] : '-',
@@ -2825,6 +2829,7 @@
                       config.navigation,
                       config.screenWidth,
                       config.screenHeight,
+                      config.smallestScreenWidthDp,
                       config.screenWidthDp,
                       config.screenHeightDp));
                       
@@ -2849,7 +2854,8 @@
                 tHeader->entriesStart = htodl(typeSize);
                 tHeader->config = config;
                 NOISY(printf("Writing type %d config: imsi:%d/%d lang:%c%c cnt:%c%c "
-                     "orien:%d ui:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d %ddp x %ddp\n",
+                     "orien:%d ui:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d "
+                     "sw%ddp w%ddp h%ddp\n",
                       ti+1,
                       tHeader->config.mcc, tHeader->config.mnc,
                       tHeader->config.language[0] ? tHeader->config.language[0] : '-',
@@ -2865,6 +2871,7 @@
                       tHeader->config.navigation,
                       tHeader->config.screenWidth,
                       tHeader->config.screenHeight,
+                      tHeader->config.smallestScreenWidthDp,
                       tHeader->config.screenWidthDp,
                       tHeader->config.screenHeightDp));
                 tHeader->config.swapHtoD();
@@ -3448,7 +3455,8 @@
     if (e == NULL) {
         if (config != NULL) {
             NOISY(printf("New entry at %s:%d: imsi:%d/%d lang:%c%c cnt:%c%c "
-                    "orien:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d %ddp x %ddp\n",
+                    "orien:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d "
+                    "sw%ddp w%ddp h%ddp\n",
                       sourcePos.file.string(), sourcePos.line,
                       config->mcc, config->mnc,
                       config->language[0] ? config->language[0] : '-',
@@ -3463,6 +3471,7 @@
                       config->navigation,
                       config->screenWidth,
                       config->screenHeight,
+                      config->smallestScreenWidthDp,
                       config->screenWidthDp,
                       config->screenHeightDp));
         } else {
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
index 3c0c9a4..144ec42 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
@@ -201,7 +201,8 @@
                 Capability.VIEW_MANIPULATION,
                 Capability.PLAY_ANIMATION,
                 Capability.ANIMATED_VIEW_MANIPULATION,
-                Capability.ADAPTER_BINDING);
+                Capability.ADAPTER_BINDING,
+                Capability.EXTENDED_VIEWINFO);
 
 
         BridgeAssetManager.initSystem();
@@ -399,15 +400,6 @@
         throw new IllegalArgumentException("viewObject is not a View");
     }
 
-    @Override
-    public int getViewBaseline(Object viewObject) {
-        if (viewObject instanceof View) {
-            return ((View) viewObject).getBaseline();
-        }
-
-        throw new IllegalArgumentException("viewObject is not a View");
-    }
-
     /**
      * Returns the lock for the bridge
      */
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/MockView.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/MockView.java
index 1ca3182..3d50b2a 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/MockView.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/MockView.java
@@ -19,21 +19,23 @@
 import android.content.Context;
 import android.graphics.Canvas;
 import android.util.AttributeSet;
+import android.view.Gravity;
 import android.widget.TextView;
 
 /**
  * Base class for mocked views.
- * 
+ *
  * TODO: implement onDraw and draw a rectangle in a random color with the name of the class
  * (or better the id of the view).
  */
 public class MockView extends TextView {
-    
+
     public MockView(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
-        
+
         setText(this.getClass().getSimpleName());
         setTextColor(0xFF000000);
+        setGravity(Gravity.CENTER);
     }
 
     @Override
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
index c53cb23..b800519 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
@@ -74,6 +74,7 @@
 import android.view.View.AttachInfo;
 import android.view.View.MeasureSpec;
 import android.view.ViewGroup.LayoutParams;
+import android.view.ViewGroup.MarginLayoutParams;
 import android.widget.AbsListView;
 import android.widget.AbsSpinner;
 import android.widget.AdapterView;
@@ -513,7 +514,7 @@
                 mViewRoot.draw(mCanvas);
             }
 
-            mViewInfoList = startVisitingViews(mViewRoot, 0);
+            mViewInfoList = startVisitingViews(mViewRoot, 0, params.getExtendedViewInfoMode());
 
             // success!
             return SUCCESS.createResult();
@@ -1255,7 +1256,7 @@
         }
     }
 
-    private List<ViewInfo> startVisitingViews(View view, int offset) {
+    private List<ViewInfo> startVisitingViews(View view, int offset, boolean setExtendedInfo) {
         if (view == null) {
             return null;
         }
@@ -1264,7 +1265,7 @@
         offset += view.getTop();
 
         if (view == mContentRoot) {
-            return visitAllChildren(mContentRoot, offset);
+            return visitAllChildren(mContentRoot, offset, setExtendedInfo);
         }
 
         // otherwise, look for mContentRoot in the children
@@ -1272,7 +1273,8 @@
             ViewGroup group = ((ViewGroup) view);
 
             for (int i = 0; i < group.getChildCount(); i++) {
-                List<ViewInfo> list = startVisitingViews(group.getChildAt(i), offset);
+                List<ViewInfo> list = startVisitingViews(group.getChildAt(i), offset,
+                        setExtendedInfo);
                 if (list != null) {
                     return list;
                 }
@@ -1287,8 +1289,9 @@
      * bounds of all the views.
      * @param view the root View
      * @param offset an offset for the view bounds.
+     * @param setExtendedInfo whether to set the extended view info in the {@link ViewInfo} object.
      */
-    private ViewInfo visit(View view, int offset) {
+    private ViewInfo visit(View view, int offset, boolean setExtendedInfo) {
         if (view == null) {
             return null;
         }
@@ -1298,9 +1301,22 @@
                 view.getLeft(), view.getTop() + offset, view.getRight(), view.getBottom() + offset,
                 view, view.getLayoutParams());
 
+        if (setExtendedInfo) {
+            MarginLayoutParams marginParams = null;
+            LayoutParams params = view.getLayoutParams();
+            if (params instanceof MarginLayoutParams) {
+                marginParams = (MarginLayoutParams) params;
+            }
+            result.setExtendedInfo(view.getBaseline(),
+                    marginParams != null ? marginParams.leftMargin : 0,
+                    marginParams != null ? marginParams.topMargin : 0,
+                    marginParams != null ? marginParams.rightMargin : 0,
+                    marginParams != null ? marginParams.bottomMargin : 0);
+        }
+
         if (view instanceof ViewGroup) {
             ViewGroup group = ((ViewGroup) view);
-            result.setChildren(visitAllChildren(group, 0 /*offset*/));
+            result.setChildren(visitAllChildren(group, 0 /*offset*/, setExtendedInfo));
         }
 
         return result;
@@ -1311,15 +1327,17 @@
      * containing the bounds of all the views.
      * @param view the root View
      * @param offset an offset for the view bounds.
+     * @param setExtendedInfo whether to set the extended view info in the {@link ViewInfo} object.
      */
-    private List<ViewInfo> visitAllChildren(ViewGroup viewGroup, int offset) {
+    private List<ViewInfo> visitAllChildren(ViewGroup viewGroup, int offset,
+            boolean setExtendedInfo) {
         if (viewGroup == null) {
             return null;
         }
 
         List<ViewInfo> children = new ArrayList<ViewInfo>();
         for (int i = 0; i < viewGroup.getChildCount(); i++) {
-            children.add(visit(viewGroup.getChildAt(i), offset));
+            children.add(visit(viewGroup.getChildAt(i), offset, setExtendedInfo));
         }
         return children;
     }
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index 16a61db..0757efd 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -87,7 +87,7 @@
 
     void releaseMulticastLock();
 
-    boolean setWifiApEnabled(in WifiConfiguration wifiConfig, boolean enable);
+    void setWifiApEnabled(in WifiConfiguration wifiConfig, boolean enable);
 
     int getWifiApEnabledState();
 
diff --git a/wifi/java/android/net/wifi/WifiApConfigStore.java b/wifi/java/android/net/wifi/WifiApConfigStore.java
new file mode 100644
index 0000000..bb5427d
--- /dev/null
+++ b/wifi/java/android/net/wifi/WifiApConfigStore.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2010 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.net.wifi;
+
+import android.content.Context;
+import android.net.wifi.WifiConfiguration.KeyMgmt;
+import android.os.Environment;
+import android.os.Message;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.util.Log;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.util.UUID;
+
+import com.android.internal.R;
+
+
+/**
+ * Provides API to the WifiStateMachine for doing read/write access
+ * to soft access point configuration
+ */
+class WifiApConfigStore {
+
+    private static Context sContext;
+    private static final String TAG = "WifiApConfigStore";
+
+    private static final String AP_CONFIG_FILE = Environment.getDataDirectory() +
+        "/misc/wifi/softap.conf";
+
+    private static final int AP_CONFIG_FILE_VERSION = 1;
+
+    private static WifiConfiguration sApConfig = new WifiConfiguration();
+    private static final Object sApConfigLock = new Object();
+
+    private static FileReadWriteHandler sFileReadWriteHandler;
+    private static final int READ_AP_CONFIG               = 1;
+    private static final int WRITE_AP_CONFIG              = 2;
+
+    static void initialize(Context context) {
+        sContext = context;
+
+        /* File operations happen on a seperate thread */
+        HandlerThread configThread = new HandlerThread("WifiApConfigStore");
+        configThread.start();
+        sFileReadWriteHandler = new FileReadWriteHandler(configThread.getLooper());
+        Message.obtain(sFileReadWriteHandler, READ_AP_CONFIG).sendToTarget();
+    }
+
+
+    static void setApConfiguration(WifiConfiguration config) {
+        synchronized (sApConfigLock) {
+            sApConfig = config;
+        }
+        Message.obtain(sFileReadWriteHandler, WRITE_AP_CONFIG, new WifiConfiguration(config))
+            .sendToTarget();
+    }
+
+    static WifiConfiguration getApConfiguration() {
+        synchronized (sApConfigLock) {
+            return new WifiConfiguration(sApConfig);
+        }
+    }
+
+    /**
+     * File read/write handler
+     */
+    private static class FileReadWriteHandler extends Handler {
+
+        public FileReadWriteHandler(android.os.Looper looper) {
+            super(looper);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case WRITE_AP_CONFIG:
+                    writeApConfiguration((WifiConfiguration) msg.obj);
+                    break;
+                case READ_AP_CONFIG:
+                    readApConfiguration();
+                    break;
+                default:
+                    Log.e(TAG, "Unknown command in FileReadWriteHandler: " + msg);
+                    break;
+            }
+        }
+
+        private static void writeApConfiguration(final WifiConfiguration config) {
+            DataOutputStream out = null;
+            try {
+                out = new DataOutputStream(new BufferedOutputStream(
+                            new FileOutputStream(AP_CONFIG_FILE)));
+
+                out.writeInt(AP_CONFIG_FILE_VERSION);
+                out.writeUTF(config.SSID);
+                int authType = config.getAuthType();
+                out.writeInt(authType);
+                if(authType != KeyMgmt.NONE) {
+                    out.writeUTF(config.preSharedKey);
+                }
+            } catch (IOException e) {
+                Log.e(TAG, "Error writing hotspot configuration" + e);
+            } finally {
+                if (out != null) {
+                    try {
+                        out.close();
+                    } catch (IOException e) {}
+                }
+            }
+        }
+
+        private static void readApConfiguration() {
+            DataInputStream in = null;
+            try {
+                WifiConfiguration config = new WifiConfiguration();
+                in = new DataInputStream(new BufferedInputStream(new FileInputStream(
+                                AP_CONFIG_FILE)));
+
+                int version = in.readInt();
+                if (version != 1) {
+                    Log.e(TAG, "Bad version on hotspot configuration file, set defaults");
+                    setDefaultApConfiguration();
+                    return;
+                }
+                config.SSID = in.readUTF();
+                int authType = in.readInt();
+                config.allowedKeyManagement.set(authType);
+                if (authType != KeyMgmt.NONE) {
+                    config.preSharedKey = in.readUTF();
+                }
+                synchronized (sApConfigLock) {
+                    sApConfig = config;
+                }
+            } catch (IOException ignore) {
+                setDefaultApConfiguration();
+            } finally {
+                if (in != null) {
+                    try {
+                        in.close();
+                    } catch (IOException e) {}
+                }
+            }
+        }
+
+        /* Generate a default WPA2 based configuration with a random password.
+           We are changing the Wifi Ap configuration storage from secure settings to a
+           flat file accessible only by the system. A WPA2 based default configuration
+           will keep the device secure after the update */
+        private static void setDefaultApConfiguration() {
+            WifiConfiguration config = new WifiConfiguration();
+            config.SSID = sContext.getString(R.string.wifi_tether_configure_ssid_default);
+            config.allowedKeyManagement.set(KeyMgmt.WPA2_PSK);
+            String randomUUID = UUID.randomUUID().toString();
+            //first 12 chars from xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
+            config.preSharedKey = randomUUID.substring(0, 8) + randomUUID.substring(9,13);
+            setApConfiguration(config);
+        }
+    }
+}
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index d40f146..9d1bdd4 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -898,7 +898,8 @@
      */
     public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) {
         try {
-            return mService.setWifiApEnabled(wifiConfig, enabled);
+            mService.setWifiApEnabled(wifiConfig, enabled);
+            return true;
         } catch (RemoteException e) {
             return false;
         }
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 9125037..bd6da64 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -200,8 +200,12 @@
     static final int CMD_START_AP                         = BASE + 21;
     /* Stop the soft access point */
     static final int CMD_STOP_AP                          = BASE + 22;
+    /* Set the soft access point configuration */
+    static final int CMD_SET_AP_CONFIG                    = BASE + 23;
+    /* Get the soft access point configuration */
+    static final int CMD_GET_AP_CONFIG                    = BASE + 24;
 
-    static final int CMD_BLUETOOTH_ADAPTER_STATE_CHANGE   = BASE + 23;
+    static final int CMD_BLUETOOTH_ADAPTER_STATE_CHANGE   = BASE + 25;
 
     /* Supplicant events */
     /* Connection to supplicant established */
@@ -365,6 +369,10 @@
     private static final int MIN_RSSI = -200;
     private static final int MAX_RSSI = 256;
 
+    /* Constants to indicate if soft ap is running or stopped */
+    private static final int SOFT_AP_STOPPED = 0;
+    private static final int SOFT_AP_RUNNING = 1;
+
     /* Default parent state */
     private State mDefaultState = new DefaultState();
     /* Temporary initial state */
@@ -483,7 +491,7 @@
         mNetworkInfo.setIsAvailable(false);
         mLinkProperties.clear();
         mLastBssid = null;
-        mLastNetworkId = -1;
+        mLastNetworkId = WifiConfiguration.INVALID_NETWORK_ID;
         mLastSignalLevel = -1;
 
         mAlarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
@@ -609,6 +617,17 @@
         }
     }
 
+    public void setWifiApConfiguration(WifiConfiguration config) {
+        sendMessage(obtainMessage(CMD_SET_AP_CONFIG, config));
+    }
+
+    public WifiConfiguration syncGetWifiApConfiguration(AsyncChannel channel) {
+        Message resultMsg = channel.sendMessageSynchronously(CMD_GET_AP_CONFIG);
+        WifiConfiguration ret = (WifiConfiguration) resultMsg.obj;
+        resultMsg.recycle();
+        return ret;
+    }
+
     /**
      * TODO: doc
      */
@@ -818,11 +837,12 @@
     }
 
     public void connectNetwork(WifiConfiguration wifiConfig) {
-        /* arg1 is used to indicate netId, force a netId value of -1 when
-         * we are passing a configuration since the default value of
-         * 0 is a valid netId
+        /* arg1 is used to indicate netId, force a netId value of
+         * WifiConfiguration.INVALID_NETWORK_ID when we are passing
+         * a configuration since the default value of 0 is a valid netId
          */
-        sendMessage(obtainMessage(CMD_CONNECT_NETWORK, -1, 0, wifiConfig));
+        sendMessage(obtainMessage(CMD_CONNECT_NETWORK, WifiConfiguration.INVALID_NETWORK_ID,
+                0, wifiConfig));
     }
 
     public void saveNetwork(WifiConfiguration wifiConfig) {
@@ -1426,7 +1446,7 @@
         mWifiInfo.setInetAddress(null);
         mWifiInfo.setBSSID(null);
         mWifiInfo.setSSID(null);
-        mWifiInfo.setNetworkId(-1);
+        mWifiInfo.setNetworkId(WifiConfiguration.INVALID_NETWORK_ID);
         mWifiInfo.setRssi(MIN_RSSI);
         mWifiInfo.setLinkSpeed(-1);
 
@@ -1438,7 +1458,7 @@
         mLinkProperties.clear();
 
         mLastBssid= null;
-        mLastNetworkId = -1;
+        mLastNetworkId = WifiConfiguration.INVALID_NETWORK_ID;
 
     }
 
@@ -1533,7 +1553,31 @@
          */
         WifiNative.disconnectCommand();
         WifiNative.reconnectCommand();
+    }
 
+    private boolean startSoftApWithConfig(WifiConfiguration config, int currentStatus) {
+        if (config == null) {
+            config = WifiApConfigStore.getApConfiguration();
+        } else {
+            WifiApConfigStore.setApConfiguration(config);
+        }
+        try {
+            if (currentStatus == SOFT_AP_STOPPED) {
+                nwService.startAccessPoint(config, mInterfaceName, SOFTAP_IFACE);
+            } else if (currentStatus == SOFT_AP_RUNNING) {
+                nwService.setAccessPoint(config, mInterfaceName, SOFTAP_IFACE);
+            }
+        } catch (Exception e) {
+            Log.e(TAG, "Exception in softap start " + e);
+            try {
+                nwService.stopAccessPoint();
+                nwService.startAccessPoint(config, mInterfaceName, SOFTAP_IFACE);
+            } catch (Exception ee) {
+                Log.e(TAG, "Exception during softap restart : " + ee);
+                return false;
+            }
+        }
+        return true;
     }
 
 
@@ -1671,6 +1715,13 @@
                 case CMD_ENABLE_BACKGROUND_SCAN:
                     mEnableBackgroundScan = (message.arg1 == 1);
                     break;
+                case CMD_SET_AP_CONFIG:
+                    WifiApConfigStore.setApConfiguration((WifiConfiguration) message.obj);
+                    break;
+                case CMD_GET_AP_CONFIG:
+                    WifiConfiguration config = WifiApConfigStore.getApConfiguration();
+                    mReplyChannel.replyToMessage(message, message.what, config);
+                    break;
                     /* Discard */
                 case CMD_LOAD_DRIVER:
                 case CMD_UNLOAD_DRIVER:
@@ -1733,6 +1784,8 @@
             // 50021 wifi_state_changed (custom|1|5)
             EventLog.writeEvent(EVENTLOG_WIFI_STATE_CHANGED, getName());
 
+            WifiApConfigStore.initialize(mContext);
+
             if (WifiNative.isDriverLoaded()) {
                 transitionTo(mDriverLoadedState);
             }
@@ -1845,26 +1898,14 @@
                     }
                     break;
                 case CMD_START_AP:
-                    try {
-                        nwService.startAccessPoint((WifiConfiguration) message.obj,
-                                    mInterfaceName,
-                                    SOFTAP_IFACE);
-                    } catch (Exception e) {
-                        Log.e(TAG, "Exception in softap start " + e);
-                        try {
-                            nwService.stopAccessPoint();
-                            nwService.startAccessPoint((WifiConfiguration) message.obj,
-                                    mInterfaceName,
-                                    SOFTAP_IFACE);
-                        } catch (Exception ee) {
-                            Log.e(TAG, "Exception during softap restart : " + ee);
-                            sendMessage(obtainMessage(CMD_UNLOAD_DRIVER, WIFI_AP_STATE_FAILED, 0));
-                            break;
-                        }
+                    if (startSoftApWithConfig((WifiConfiguration) message.obj, SOFT_AP_STOPPED)) {
+                        Log.d(TAG, "Soft AP start successful");
+                        setWifiApState(WIFI_AP_STATE_ENABLED);
+                        transitionTo(mSoftApStartedState);
+                    } else {
+                        Log.d(TAG, "Soft AP start failed");
+                        sendMessage(obtainMessage(CMD_UNLOAD_DRIVER, WIFI_AP_STATE_FAILED, 0));
                     }
-                    Log.d(TAG, "Soft AP start successful");
-                    setWifiApState(WIFI_AP_STATE_ENABLED);
-                    transitionTo(mSoftApStartedState);
                     break;
                 default:
                     return NOT_HANDLED;
@@ -2010,7 +2051,7 @@
                     mWpsStateMachine.sendMessage(CMD_RESET_WPS_STATE);
                     /* Initialize data structures */
                     mLastBssid = null;
-                    mLastNetworkId = -1;
+                    mLastNetworkId = WifiConfiguration.INVALID_NETWORK_ID;
                     mLastSignalLevel = -1;
 
                     mWifiInfo.setMacAddress(WifiNative.getMacAddressCommand());
@@ -2505,7 +2546,10 @@
                     // Network id is only valid when we start connecting
                     if (SupplicantState.isConnecting(state)) {
                         mWifiInfo.setNetworkId(stateChangeResult.networkId);
+                    } else {
+                        mWifiInfo.setNetworkId(WifiConfiguration.INVALID_NETWORK_ID);
                     }
+
                     if (state == SupplicantState.ASSOCIATING) {
                         /* BSSID is valid only in ASSOCIATING state */
                         mWifiInfo.setBSSID(stateChangeResult.BSSID);
@@ -3025,21 +3069,13 @@
                     break;
                 case CMD_START_AP:
                     Log.d(TAG,"SoftAP set on a running access point");
-                    try {
-                        nwService.setAccessPoint((WifiConfiguration) message.obj,
-                                    mInterfaceName,
-                                    SOFTAP_IFACE);
-                    } catch(Exception e) {
-                        Log.e(TAG, "Exception in softap set " + e);
-                        try {
-                            nwService.stopAccessPoint();
-                            nwService.startAccessPoint((WifiConfiguration) message.obj,
-                                    mInterfaceName,
-                                    SOFTAP_IFACE);
-                        } catch (Exception ee) {
-                            Log.e(TAG, "Could not restart softap after set failed " + ee);
-                            sendMessage(obtainMessage(CMD_UNLOAD_DRIVER, WIFI_AP_STATE_FAILED, 0));
-                        }
+                    if (startSoftApWithConfig((WifiConfiguration) message.obj, SOFT_AP_RUNNING)) {
+                        Log.d(TAG, "Soft AP start successful");
+                        setWifiApState(WIFI_AP_STATE_ENABLED);
+                        transitionTo(mSoftApStartedState);
+                    } else {
+                        Log.d(TAG, "Soft AP start failed");
+                        sendMessage(obtainMessage(CMD_UNLOAD_DRIVER, WIFI_AP_STATE_FAILED, 0));
                     }
                     break;
                 /* Fail client mode operation when soft AP is enabled */