Merge "framework/base changes to add new voicemail provider sample."
diff --git a/Android.mk b/Android.mk
index 9b13f06..c838600 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 \
@@ -109,9 +110,11 @@
 	core/java/android/net/IConnectivityManager.aidl \
 	core/java/android/net/INetworkManagementEventObserver.aidl \
 	core/java/android/net/IThrottleManager.aidl \
+	core/java/android/net/INetworkPolicyManager.aidl \
 	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 \
@@ -159,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 \
@@ -360,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
@@ -585,7 +589,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 13fc169..2f5b9b4 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -445,7 +445,7 @@
     field public static final int fromXScale = 16843202; // 0x10101c2
     field public static final int fromYDelta = 16843208; // 0x10101c8
     field public static final int fromYScale = 16843204; // 0x10101c4
-    field public static final int fullBackupAgent = 16843628; // 0x101036c
+    field public static final int fullBackupAgent = 16843629; // 0x101036d
     field public static final int fullBright = 16842954; // 0x10100ca
     field public static final int fullDark = 16842950; // 0x10100c6
     field public static final int functionalTest = 16842787; // 0x1010023
@@ -476,6 +476,7 @@
     field public static final int hint = 16843088; // 0x1010150
     field public static final int homeAsUpIndicator = 16843531; // 0x101030b
     field public static final int homeLayout = 16843549; // 0x101031d
+    field public static final int horizontalDirection = 16843628; // 0x101036c
     field public static final int horizontalDivider = 16843053; // 0x101012d
     field public static final int horizontalGap = 16843327; // 0x101023f
     field public static final int horizontalScrollViewStyle = 16843603; // 0x1010353
@@ -865,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
@@ -1976,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);
@@ -5399,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;
@@ -5988,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
@@ -6000,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;
@@ -6014,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;
   }
@@ -8838,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
   }
@@ -9014,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();
@@ -9678,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
@@ -9691,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";
@@ -9727,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
@@ -10052,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;
@@ -10112,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);
@@ -11633,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();
@@ -11644,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();
   }
@@ -13916,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();
@@ -17136,7 +17158,7 @@
 package android.speech.tts {
 
   public abstract class SynthesisRequest {
-    ctor public SynthesisRequest(java.lang.String);
+    ctor public SynthesisRequest(java.lang.String, android.os.Bundle);
     method public abstract int audioAvailable(byte[], int, int);
     method public abstract int completeAudioAvailable(int, int, int, byte[], int, int);
     method public abstract int done();
@@ -17144,6 +17166,7 @@
     method public java.lang.String getCountry();
     method public java.lang.String getLanguage();
     method public abstract int getMaxBufferSize();
+    method public android.os.Bundle getParams();
     method public int getPitch();
     method public int getSpeechRate();
     method public java.lang.String getText();
@@ -19358,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 {
@@ -21269,6 +21296,7 @@
     method public boolean isInEditMode();
     method public boolean isInTouchMode();
     method public boolean isLayoutRequested();
+    method public boolean isLayoutRtl();
     method public boolean isLongClickable();
     method public boolean isOpaque();
     method protected boolean isPaddingOffsetRequired();
@@ -21421,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);
@@ -21838,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);
@@ -21851,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);
@@ -22238,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);
@@ -24007,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);
@@ -25194,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();
@@ -25214,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();
@@ -25285,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/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index 8a9144c..38cacdd 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -25,6 +25,7 @@
 import android.app.IInstrumentationWatcher;
 import android.app.Instrumentation;
 import android.content.ComponentName;
+import android.content.Context;
 import android.content.IIntentReceiver;
 import android.content.Intent;
 import android.net.Uri;
@@ -109,6 +110,8 @@
             runMonitor();
         } else if (op.equals("screen-compat")) {
             runScreenCompat();
+        } else if (op.equals("display-size")) {
+            runDisplaySize();
         } else {
             throw new IllegalArgumentException("Unknown command: " + op);
         }
@@ -804,6 +807,53 @@
         } while (packageName != null);
     }
 
+    private void runDisplaySize() throws Exception {
+        String size = nextArgRequired();
+        int m, n;
+        if ("reset".equals(size)) {
+            m = n = -1;
+        } else {
+            int div = size.indexOf('x');
+            if (div <= 0 || div >= (size.length()-1)) {
+                System.err.println("Error: bad size " + size);
+                showUsage();
+                return;
+            }
+            String mstr = size.substring(0, div);
+            String nstr = size.substring(div+1);
+            try {
+                m = Integer.parseInt(mstr);
+                n = Integer.parseInt(nstr);
+            } catch (NumberFormatException e) {
+                System.err.println("Error: bad number " + e);
+                showUsage();
+                return;
+            }
+        }
+
+        if (m < n) {
+            int tmp = m;
+            m = n;
+            n = tmp;
+        }
+
+        IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.checkService(
+                Context.WINDOW_SERVICE));
+        if (wm == null) {
+            System.err.println(NO_SYSTEM_ERROR_CODE);
+            throw new AndroidException("Can't connect to window manager; is the system running?");
+        }
+
+        try {
+            if (m >= 0 && n >= 0) {
+                wm.setForcedDisplaySize(m, n);
+            } else {
+                wm.clearForcedDisplaySize();
+            }
+        } catch (RemoteException e) {
+       }
+    }
+
     private class IntentReceiver extends IIntentReceiver.Stub {
         private boolean mFinished = false;
 
@@ -986,6 +1036,8 @@
                 "\n" +
                 "    control screen compatibility: am screen-compat [on|off] [package]\n" +
                 "\n" +
+                "    override display size: am display-size [reset|MxN]\n" +
+                "\n" +
                 "    <INTENT> specifications include these flags:\n" +
                 "        [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]\n" +
                 "        [-c <CATEGORY> [-c <CATEGORY>] ...]\n" +
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/bu/src/com/android/commands/bu/Backup.java b/cmds/bu/src/com/android/commands/bu/Backup.java
index 2b8d6aa..f3f04326 100644
--- a/cmds/bu/src/com/android/commands/bu/Backup.java
+++ b/cmds/bu/src/com/android/commands/bu/Backup.java
@@ -27,10 +27,11 @@
 import java.util.ArrayList;
 
 public final class Backup {
-    static final String TAG = "Backup";
+    static final String TAG = "bu";
 
-    private static String[] mArgs;
-    private int mNextArg;
+    static String[] mArgs;
+    int mNextArg;
+    IBackupManager mBackupManager;
 
     public static void main(String[] args) {
         mArgs = args;
@@ -43,12 +44,23 @@
     }
 
     public void run() {
-        IBackupManager bmgr = IBackupManager.Stub.asInterface(ServiceManager.getService("backup"));
-        if (bmgr == null) {
+        mBackupManager = IBackupManager.Stub.asInterface(ServiceManager.getService("backup"));
+        if (mBackupManager == null) {
             System.err.println("ERROR: could not contact backup manager");
             return;
         }
 
+        String arg = nextArg();
+        if (arg.equals("backup")) {
+            doFullBackup();
+        } else if (arg.equals("restore")) {
+            doFullRestore();
+        } else {
+            System.err.println("ERROR: invalid operation '" + arg + "'");
+        }
+    }
+
+    private void doFullBackup() {
         ArrayList<String> packages = new ArrayList<String>();
         boolean saveApks = false;
         boolean saveShared = false;
@@ -56,7 +68,6 @@
 
         String arg;
         while ((arg = nextArg()) != null) {
-            
             if (arg.startsWith("-")) {
                 if ("-apk".equals(arg)) {
                     saveApks = true;
@@ -69,8 +80,9 @@
                 } else if ("-all".equals(arg)) {
                     doEverything = true;
                 } else {
-                    System.err.println("ERROR: unknown flag " + arg);
-                    return;
+                    System.err.println("WARNING: unknown backup flag " + arg);
+                    Log.w(TAG, "Unknown backup flag " + arg);
+                    continue;
                 }
             } else {
                 // Not a flag; treat as a package name
@@ -79,19 +91,22 @@
         }
 
         if (doEverything && packages.size() > 0) {
-            System.err.println("ERROR: -all used with specific package set");
-            return;
+            System.err.println("WARNING: -all used with explicit backup package set");
+            Log.w(TAG, "-all passed for backup along with specific package names");
         }
 
-        if (!doEverything && packages.size() == 0) {
-            System.err.println("ERROR: no packages supplied and -all not used");
+        if (!doEverything && !saveShared && packages.size() == 0) {
+            System.err.println(
+                    "ERROR: no packages supplied for backup and neither -shared nor -all given");
+            Log.e(TAG, "no backup packages supplied and neither -shared nor -all given");
             return;
         }
 
         try {
             ParcelFileDescriptor fd = ParcelFileDescriptor.dup(FileDescriptor.out);
             String[] packArray = new String[packages.size()];
-            bmgr.fullBackup(fd, saveApks, saveShared, doEverything, packages.toArray(packArray));
+            mBackupManager.fullBackup(fd, saveApks, saveShared, doEverything,
+                    packages.toArray(packArray));
         } catch (IOException e) {
             System.err.println("ERROR: cannot dup System.out");
         } catch (RemoteException e) {
@@ -99,6 +114,9 @@
         }
     }
 
+    private void doFullRestore() {
+    }
+
     private String nextArg() {
         if (mNextArg >= mArgs.length) {
             return null;
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 b8cb165..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");
@@ -1942,8 +1942,9 @@
                     com.android.internal.R.styleable.AndroidManifestActivity_configChanges,
                     0);
             if (owner.applicationInfo.targetSdkVersion
-                        < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
-                a.info.configChanges |= ActivityInfo.CONFIG_SCREEN_SIZE;
+                        < android.os.Build.VERSION_CODES.HONEYCOMB_MR2) {
+                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/gesture/Gesture.java b/core/java/android/gesture/Gesture.java
index 300cd28..c6a2a87 100755
--- a/core/java/android/gesture/Gesture.java
+++ b/core/java/android/gesture/Gesture.java
@@ -36,7 +36,7 @@
 /**
  * A gesture is a hand-drawn shape on a touch screen. It can have one or multiple strokes.
  * Each stroke is a sequence of timed points. A user-defined gesture can be recognized by 
- * a GestureLibrary and a built-in alphabet gesture can be recognized by a LetterRecognizer. 
+ * a GestureLibrary. 
  */
 
 public class Gesture implements Parcelable {
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
new file mode 100644
index 0000000..d9351ee
--- /dev/null
+++ b/core/java/android/net/INetworkPolicyManager.aidl
@@ -0,0 +1,31 @@
+/*
+ * 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;
+
+/**
+ * Interface that creates and modifies network policy rules.
+ *
+ * {@hide}
+ */
+interface INetworkPolicyManager {
+
+    void setUidPolicy(int uid, int policy);
+    int getUidPolicy(int uid);
+
+    // TODO: build API to surface stats details for settings UI
+
+}
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
new file mode 100644
index 0000000..1913aa7
--- /dev/null
+++ b/core/java/android/net/NetworkPolicyManager.java
@@ -0,0 +1,73 @@
+/*
+ * 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.content.Context;
+import android.os.RemoteException;
+
+/**
+ * Manager for creating and modifying network policy rules.
+ *
+ * {@hide}
+ */
+public class NetworkPolicyManager {
+
+    /** No specific network policy, use system default. */
+    public static final int POLICY_NONE = 0x0;
+    /** Reject network usage when application in background. */
+    public static final int POLICY_REJECT_BACKGROUND = 0x1;
+    /** Reject network usage on paid network connections. */
+    public static final int POLICY_REJECT_PAID = 0x2;
+    /** Application should conserve data. */
+    public static final int POLICY_CONSERVE_DATA = 0x4;
+
+    private INetworkPolicyManager mService;
+
+    public NetworkPolicyManager(INetworkPolicyManager service) {
+        if (service == null) {
+            throw new IllegalArgumentException("missing INetworkPolicyManager");
+        }
+        mService = service;
+    }
+
+    public static NetworkPolicyManager getSystemService(Context context) {
+        return (NetworkPolicyManager) context.getSystemService(Context.NETWORK_POLICY_SERVICE);
+    }
+
+    /**
+     * Set policy flags for specific UID.
+     *
+     * @param policy {@link #POLICY_NONE} or combination of
+     *            {@link #POLICY_REJECT_BACKGROUND}, {@link #POLICY_REJECT_PAID},
+     *            or {@link #POLICY_CONSERVE_DATA}.
+     */
+    public void setUidPolicy(int uid, int policy) {
+        try {
+            mService.setUidPolicy(uid, policy);
+        } catch (RemoteException e) {
+        }
+    }
+
+    public int getUidPolicy(int uid) {
+        try {
+            return mService.getUidPolicy(uid);
+        } catch (RemoteException e) {
+            return POLICY_NONE;
+        }
+    }
+
+}
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 e308c2c..11f9445 100644
--- a/core/java/android/os/Environment.java
+++ b/core/java/android/os/Environment.java
@@ -16,12 +16,13 @@
 
 package android.os;
 
-import java.io.File;
-
 import android.content.res.Resources;
 import android.os.storage.IMountService;
+import android.os.storage.StorageVolume;
 import android.util.Log;
 
+import java.io.File;
+
 /**
  * Provides access to environment variables.
  */
@@ -35,7 +36,25 @@
 
     private static final Object mLock = new Object();
 
-    private volatile static Boolean mIsExternalStorageEmulated = null;
+    private volatile static StorageVolume mPrimaryVolume = null;
+
+    private static StorageVolume getPrimaryVolume() {
+        if (mPrimaryVolume == null) {
+            synchronized (mLock) {
+                if (mPrimaryVolume == null) {
+                    try {
+                        IMountService mountService = IMountService.Stub.asInterface(ServiceManager
+                                .getService("mount"));
+                        Parcelable[] volumes = mountService.getVolumeList();
+                        mPrimaryVolume = (StorageVolume)volumes[0];
+                    } catch (Exception e) {
+                        Log.e(TAG, "couldn't talk to MountService", e);
+                    }
+                }
+            }
+        }
+        return mPrimaryVolume;
+    }
 
     /**
      * Gets the Android root directory.
@@ -94,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
@@ -338,54 +357,54 @@
     }
 
     /**
-     * getExternalStorageState() returns MEDIA_REMOVED if the media is not present. 
+     * {@link #getExternalStorageState()} returns MEDIA_REMOVED if the media is not present.
      */
     public static final String MEDIA_REMOVED = "removed";
      
     /**
-     * getExternalStorageState() returns MEDIA_UNMOUNTED if the media is present
+     * {@link #getExternalStorageState()} returns MEDIA_UNMOUNTED if the media is present
      * but not mounted. 
      */
     public static final String MEDIA_UNMOUNTED = "unmounted";
 
     /**
-     * getExternalStorageState() returns MEDIA_CHECKING if the media is present
+     * {@link #getExternalStorageState()} returns MEDIA_CHECKING if the media is present
      * and being disk-checked
      */
     public static final String MEDIA_CHECKING = "checking";
 
     /**
-     * getExternalStorageState() returns MEDIA_NOFS if the media is present
+     * {@link #getExternalStorageState()} returns MEDIA_NOFS if the media is present
      * but is blank or is using an unsupported filesystem
      */
     public static final String MEDIA_NOFS = "nofs";
 
     /**
-     * getExternalStorageState() returns MEDIA_MOUNTED if the media is present
+     * {@link #getExternalStorageState()} returns MEDIA_MOUNTED if the media is present
      * and mounted at its mount point with read/write access. 
      */
     public static final String MEDIA_MOUNTED = "mounted";
 
     /**
-     * getExternalStorageState() returns MEDIA_MOUNTED_READ_ONLY if the media is present
+     * {@link #getExternalStorageState()} returns MEDIA_MOUNTED_READ_ONLY if the media is present
      * and mounted at its mount point with read only access. 
      */
     public static final String MEDIA_MOUNTED_READ_ONLY = "mounted_ro";
 
     /**
-     * getExternalStorageState() returns MEDIA_SHARED if the media is present
+     * {@link #getExternalStorageState()} returns MEDIA_SHARED if the media is present
      * not mounted, and shared via USB mass storage. 
      */
     public static final String MEDIA_SHARED = "shared";
 
     /**
-     * getExternalStorageState() returns MEDIA_BAD_REMOVAL if the media was
+     * {@link #getExternalStorageState()} returns MEDIA_BAD_REMOVAL if the media was
      * removed before it was unmounted. 
      */
     public static final String MEDIA_BAD_REMOVAL = "bad_removal";
 
     /**
-     * getExternalStorageState() returns MEDIA_UNMOUNTABLE if the media is present
+     * {@link #getExternalStorageState()} returns MEDIA_UNMOUNTABLE if the media is present
      * but cannot be mounted.  Typically this happens if the file system on the
      * media is corrupted. 
      */
@@ -416,9 +435,8 @@
      * <p>See {@link #getExternalStorageDirectory()} for more information.
      */
     public static boolean isExternalStorageRemovable() {
-        if (isExternalStorageEmulated()) return false;
-        return Resources.getSystem().getBoolean(
-                com.android.internal.R.bool.config_externalStorageRemovable);
+        StorageVolume volume = getPrimaryVolume();
+        return (volume != null && volume.isRemovable());
     }
 
     /**
@@ -435,23 +453,8 @@
      * android.content.ComponentName, boolean)} for additional details.
      */
     public static boolean isExternalStorageEmulated() {
-        if (mIsExternalStorageEmulated == null) {
-            synchronized (mLock) {
-                if (mIsExternalStorageEmulated == null) {
-                    boolean externalStorageEmulated;
-                    try {
-                        IMountService mountService = IMountService.Stub.asInterface(ServiceManager
-                                .getService("mount"));
-                        externalStorageEmulated = mountService.isExternalStorageEmulated();
-                        mIsExternalStorageEmulated = Boolean.valueOf(externalStorageEmulated);
-                    } catch (Exception e) {
-                        Log.e(TAG, "couldn't talk to MountService", e);
-                        return false;
-                    }
-                }
-            }
-        }
-        return mIsExternalStorageEmulated;
+        StorageVolume volume = getPrimaryVolume();
+        return (volume != null && volume.isEmulated());
     }
 
     static File getDirectory(String variableName, String defaultPath) {
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/IMountService.java b/core/java/android/os/storage/IMountService.java
index 27da3c3..c2dc8ae 100644
--- a/core/java/android/os/storage/IMountService.java
+++ b/core/java/android/os/storage/IMountService.java
@@ -20,7 +20,9 @@
 import android.os.IBinder;
 import android.os.IInterface;
 import android.os.Parcel;
+import android.os.Parcelable;
 import android.os.RemoteException;
+import android.os.storage.StorageVolume;
 
 /**
  * WARNING! Update IMountService.h and IMountService.cpp if you change this
@@ -638,15 +640,15 @@
                 return _result;
             }
 
-            public String[] getVolumeList() throws RemoteException {
+            public Parcelable[] getVolumeList() throws RemoteException {
                 Parcel _data = Parcel.obtain();
                 Parcel _reply = Parcel.obtain();
-                String[] _result;
+                Parcelable[] _result;
                 try {
                     _data.writeInterfaceToken(DESCRIPTOR);
                     mRemote.transact(Stub.TRANSACTION_getVolumeList, _data, _reply, 0);
                     _reply.readException();
-                    _result = _reply.readStringArray();
+                    _result = _reply.readParcelableArray(StorageVolume.class.getClassLoader());
                 } finally {
                     _reply.recycle();
                     _data.recycle();
@@ -1024,9 +1026,9 @@
                 }
                 case TRANSACTION_getVolumeList: {
                     data.enforceInterface(DESCRIPTOR);
-                    String[] result = getVolumeList();
+                    Parcelable[] result = getVolumeList();
                     reply.writeNoException();
-                    reply.writeStringArray(result);
+                    reply.writeParcelableArray(result, 0);
                     return true;
                 }
             }
@@ -1207,5 +1209,5 @@
     /**
      * Returns list of all mountable volumes.
      */
-    public String[] getVolumeList() throws RemoteException;
+    public Parcelable[] getVolumeList() throws RemoteException;
 }
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 234057b..6fd1d00 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -19,6 +19,7 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
+import android.os.Parcelable;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.util.Log;
@@ -545,12 +546,34 @@
      * Returns list of all mountable volumes.
      * @hide
      */
-    public String[] getVolumeList() {
+    public StorageVolume[] getVolumeList() {
         try {
-            return mMountService.getVolumeList();
+            Parcelable[] list = mMountService.getVolumeList();
+            if (list == null) return new StorageVolume[0];
+            int length = list.length;
+            StorageVolume[] result = new StorageVolume[length];
+            for (int i = 0; i < length; i++) {
+                result[i] = (StorageVolume)list[i];
+            }
+            return result;
         } catch (RemoteException e) {
             Log.e(TAG, "Failed to get volume list", e);
             return null;
         }
     }
+
+    /**
+     * Returns list of paths for all mountable volumes.
+     * @hide
+     */
+    public String[] getVolumePaths() {
+        StorageVolume[] volumes = getVolumeList();
+        if (volumes == null) return null;
+        int count = volumes.length;
+        String[] paths = new String[count];
+        for (int i = 0; i < count; i++) {
+            paths[i] = volumes[i].getPath();
+        }
+        return paths;
+    }
 }
diff --git a/core/java/android/os/storage/StorageVolume.aidl b/core/java/android/os/storage/StorageVolume.aidl
new file mode 100644
index 0000000..d689917
--- /dev/null
+++ b/core/java/android/os/storage/StorageVolume.aidl
@@ -0,0 +1,19 @@
+/*
+ * 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.os.storage;
+
+parcelable StorageVolume;
diff --git a/core/java/android/os/storage/StorageVolume.java b/core/java/android/os/storage/StorageVolume.java
new file mode 100644
index 0000000..bc6e993
--- /dev/null
+++ b/core/java/android/os/storage/StorageVolume.java
@@ -0,0 +1,185 @@
+/*
+ * 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.os.storage;
+
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.Log;
+
+/**
+ * A class representing a storage volume
+ * @hide
+ */
+public class StorageVolume implements Parcelable {
+
+    private static final String TAG = "StorageVolume";
+
+    private final String mPath;
+    private final String mDescription;
+    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) {
+        mPath = path;
+        mDescription = description;
+        mRemovable = removable;
+        mEmulated = emulated;
+        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.
+     *
+     * @return the mount path
+     */
+    public String getPath() {
+        return mPath;
+    }
+
+    /**
+     * Returns a user visible description of the volume.
+     *
+     * @return the volume description
+     */
+    public String getDescription() {
+        return mDescription;
+    }
+
+    /**
+     * Returns true if the volume is removable.
+     *
+     * @return is removable
+     */
+    public boolean isRemovable() {
+        return mRemovable;
+    }
+
+    /**
+     * Returns true if the volume is emulated.
+     *
+     * @return is removable
+     */
+    public boolean isEmulated() {
+        return mEmulated;
+    }
+
+    /**
+     * 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
+     * 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.
+     *
+     * @return MTP reserve space
+     */
+    public int getMtpReserveSpace() {
+        return mMtpReserveSpace;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof StorageVolume && mPath != null) {
+            StorageVolume volume = (StorageVolume)obj;
+            return (mPath.equals(volume.mPath));
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return mPath.hashCode();
+    }
+
+    @Override
+    public String toString() {
+        return mPath;
+    }
+
+    public static final Parcelable.Creator<StorageVolume> CREATOR =
+        new Parcelable.Creator<StorageVolume>() {
+        public StorageVolume createFromParcel(Parcel in) {
+            String path = in.readString();
+            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, storageId);
+        }
+
+        public StorageVolume[] newArray(int size) {
+            return new StorageVolume[size];
+        }
+    };
+
+    public int describeContents() {
+        return 0;
+    }
+
+    public void writeToParcel(Parcel parcel, int flags) {
+        parcel.writeString(mPath);
+        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 570b801..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
          */
@@ -3737,6 +3744,23 @@
                 "setup_prepaid_detection_redir_host";
 
         /**
+         * The user's preferred "dream" (interactive screensaver) component.
+         *
+         * This component will be launched by the PhoneWindowManager after the user's chosen idle
+         * timeout (specified by {@link #DREAM_TIMEOUT}).
+         * @hide
+         */
+        public static final String DREAM_COMPONENT =
+                "dream_component";
+
+        /**
+         * The delay before a "dream" is started (set to 0 to disable).
+         * @hide
+         */
+        public static final String DREAM_TIMEOUT =
+                "dream_timeout";
+
+        /**
          * @hide
          */
         public static final String[] SETTINGS_TO_BACKUP = {
diff --git a/core/java/android/server/BluetoothInputProfileHandler.java b/core/java/android/server/BluetoothInputProfileHandler.java
index e6513fd..247e297 100644
--- a/core/java/android/server/BluetoothInputProfileHandler.java
+++ b/core/java/android/server/BluetoothInputProfileHandler.java
@@ -60,7 +60,7 @@
         return sInstance;
     }
 
-    synchronized boolean connectInputDevice(BluetoothDevice device,
+    boolean connectInputDevice(BluetoothDevice device,
                                             BluetoothDeviceProfileState state) {
         String objectPath = mBluetoothService.getObjectPathFromAddress(device.getAddress());
         if (objectPath == null ||
@@ -78,7 +78,7 @@
         return false;
     }
 
-    synchronized boolean connectInputDeviceInternal(BluetoothDevice device) {
+    boolean connectInputDeviceInternal(BluetoothDevice device) {
         String objectPath = mBluetoothService.getObjectPathFromAddress(device.getAddress());
         handleInputDeviceStateChange(device, BluetoothInputDevice.STATE_CONNECTING);
         if (!mBluetoothService.connectInputDeviceNative(objectPath)) {
@@ -88,7 +88,7 @@
         return true;
     }
 
-    synchronized boolean disconnectInputDevice(BluetoothDevice device,
+    boolean disconnectInputDevice(BluetoothDevice device,
                                                BluetoothDeviceProfileState state) {
         String objectPath = mBluetoothService.getObjectPathFromAddress(device.getAddress());
         if (objectPath == null ||
@@ -105,7 +105,7 @@
         return false;
     }
 
-    synchronized boolean disconnectInputDeviceInternal(BluetoothDevice device) {
+    boolean disconnectInputDeviceInternal(BluetoothDevice device) {
         String objectPath = mBluetoothService.getObjectPathFromAddress(device.getAddress());
         handleInputDeviceStateChange(device, BluetoothInputDevice.STATE_DISCONNECTING);
         if (!mBluetoothService.disconnectInputDeviceNative(objectPath)) {
@@ -115,31 +115,31 @@
         return true;
     }
 
-    synchronized int getInputDeviceConnectionState(BluetoothDevice device) {
+    int getInputDeviceConnectionState(BluetoothDevice device) {
         if (mInputDevices.get(device) == null) {
             return BluetoothInputDevice.STATE_DISCONNECTED;
         }
         return mInputDevices.get(device);
     }
 
-    synchronized List<BluetoothDevice> getConnectedInputDevices() {
+    List<BluetoothDevice> getConnectedInputDevices() {
         List<BluetoothDevice> devices = lookupInputDevicesMatchingStates(
             new int[] {BluetoothInputDevice.STATE_CONNECTED});
         return devices;
     }
 
-    synchronized List<BluetoothDevice> getInputDevicesMatchingConnectionStates(int[] states) {
+    List<BluetoothDevice> getInputDevicesMatchingConnectionStates(int[] states) {
         List<BluetoothDevice> devices = lookupInputDevicesMatchingStates(states);
         return devices;
     }
 
-    synchronized int getInputDevicePriority(BluetoothDevice device) {
+    int getInputDevicePriority(BluetoothDevice device) {
         return Settings.Secure.getInt(mContext.getContentResolver(),
                 Settings.Secure.getBluetoothInputDevicePriorityKey(device.getAddress()),
                 BluetoothInputDevice.PRIORITY_UNDEFINED);
     }
 
-    synchronized boolean setInputDevicePriority(BluetoothDevice device, int priority) {
+    boolean setInputDevicePriority(BluetoothDevice device, int priority) {
         if (!BluetoothAdapter.checkBluetoothAddress(device.getAddress())) {
             return false;
         }
@@ -148,7 +148,7 @@
                 priority);
     }
 
-    synchronized List<BluetoothDevice> lookupInputDevicesMatchingStates(int[] states) {
+    List<BluetoothDevice> lookupInputDevicesMatchingStates(int[] states) {
         List<BluetoothDevice> inputDevices = new ArrayList<BluetoothDevice>();
 
         for (BluetoothDevice device: mInputDevices.keySet()) {
@@ -163,7 +163,7 @@
         return inputDevices;
     }
 
-    private synchronized void handleInputDeviceStateChange(BluetoothDevice device, int state) {
+    private void handleInputDeviceStateChange(BluetoothDevice device, int state) {
         int prevState;
         if (mInputDevices.get(device) == null) {
             prevState = BluetoothInputDevice.STATE_DISCONNECTED;
@@ -194,7 +194,7 @@
         mBluetoothService.sendConnectionStateChange(device, state, prevState);
     }
 
-    synchronized void handleInputDevicePropertyChange(String address, boolean connected) {
+    void handleInputDevicePropertyChange(String address, boolean connected) {
         int state = connected ? BluetoothInputDevice.STATE_CONNECTED :
             BluetoothInputDevice.STATE_DISCONNECTED;
         BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
@@ -202,7 +202,7 @@
         handleInputDeviceStateChange(device, state);
     }
 
-    synchronized void setInitialInputDevicePriority(BluetoothDevice device, int state) {
+    void setInitialInputDevicePriority(BluetoothDevice device, int state) {
         switch (state) {
             case BluetoothDevice.BOND_BONDED:
                 if (getInputDevicePriority(device) == BluetoothInputDevice.PRIORITY_UNDEFINED) {
diff --git a/core/java/android/server/BluetoothPanProfileHandler.java b/core/java/android/server/BluetoothPanProfileHandler.java
index 8925856..0d63e19 100644
--- a/core/java/android/server/BluetoothPanProfileHandler.java
+++ b/core/java/android/server/BluetoothPanProfileHandler.java
@@ -76,17 +76,17 @@
         }
     }
 
-    static synchronized BluetoothPanProfileHandler getInstance(Context context,
+    static BluetoothPanProfileHandler getInstance(Context context,
             BluetoothService service) {
         if (sInstance == null) sInstance = new BluetoothPanProfileHandler(context, service);
         return sInstance;
     }
 
-    synchronized boolean isTetheringOn() {
+    boolean isTetheringOn() {
         return mTetheringOn;
     }
 
-    synchronized boolean allowIncomingTethering() {
+    boolean allowIncomingTethering() {
         if (isTetheringOn() && getConnectedPanDevices().size() < mMaxPanDevices)
             return true;
         return false;
@@ -94,7 +94,7 @@
 
     private BroadcastReceiver mTetheringReceiver = null;
 
-    synchronized void setBluetoothTethering(boolean value) {
+    void setBluetoothTethering(boolean value) {
         if (!value) {
             disconnectPanServerDevices();
         }
@@ -104,7 +104,7 @@
             filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
             mTetheringReceiver = new BroadcastReceiver() {
                 @Override
-                public synchronized void onReceive(Context context, Intent intent) {
+                public void onReceive(Context context, Intent intent) {
                     if (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_OFF)
                             == BluetoothAdapter.STATE_ON) {
                         mTetheringOn = true;
@@ -118,7 +118,7 @@
         }
     }
 
-    synchronized int getPanDeviceConnectionState(BluetoothDevice device) {
+    int getPanDeviceConnectionState(BluetoothDevice device) {
         BluetoothPanDevice panDevice = mPanDevices.get(device);
         if (panDevice == null) {
             return BluetoothPan.STATE_DISCONNECTED;
@@ -126,7 +126,7 @@
         return panDevice.mState;
     }
 
-    synchronized boolean connectPanDevice(BluetoothDevice device) {
+    boolean connectPanDevice(BluetoothDevice device) {
         String objectPath = mBluetoothService.getObjectPathFromAddress(device.getAddress());
         if (DBG) Log.d(TAG, "connect PAN(" + objectPath + ")");
         if (getPanDeviceConnectionState(device) != BluetoothPan.STATE_DISCONNECTED) {
@@ -158,7 +158,7 @@
         }
     }
 
-    private synchronized boolean disconnectPanServerDevices() {
+    private boolean disconnectPanServerDevices() {
         debugLog("disconnect all PAN devices");
 
         for (BluetoothDevice device: mPanDevices.keySet()) {
@@ -187,7 +187,7 @@
         return true;
     }
 
-    synchronized List<BluetoothDevice> getConnectedPanDevices() {
+    List<BluetoothDevice> getConnectedPanDevices() {
         List<BluetoothDevice> devices = new ArrayList<BluetoothDevice>();
 
         for (BluetoothDevice device: mPanDevices.keySet()) {
@@ -198,7 +198,7 @@
         return devices;
     }
 
-    synchronized List<BluetoothDevice> getPanDevicesMatchingConnectionStates(int[] states) {
+    List<BluetoothDevice> getPanDevicesMatchingConnectionStates(int[] states) {
         List<BluetoothDevice> devices = new ArrayList<BluetoothDevice>();
 
         for (BluetoothDevice device: mPanDevices.keySet()) {
@@ -213,7 +213,7 @@
         return devices;
     }
 
-    synchronized boolean disconnectPanDevice(BluetoothDevice device) {
+    boolean disconnectPanDevice(BluetoothDevice device) {
         String objectPath = mBluetoothService.getObjectPathFromAddress(device.getAddress());
         debugLog("disconnect PAN(" + objectPath + ")");
 
@@ -249,7 +249,7 @@
         return true;
     }
 
-    synchronized void handlePanDeviceStateChange(BluetoothDevice device,
+    void handlePanDeviceStateChange(BluetoothDevice device,
                                                  String iface, int state, int role) {
         int prevState;
         String ifaceAddr = null;
@@ -304,7 +304,7 @@
         mBluetoothService.sendConnectionStateChange(device, state, prevState);
     }
 
-    synchronized void handlePanDeviceStateChange(BluetoothDevice device,
+    void handlePanDeviceStateChange(BluetoothDevice device,
                                                  int state, int role) {
         handlePanDeviceStateChange(device, null, state, role);
     }
@@ -343,7 +343,7 @@
     }
 
     // configured when we start tethering
-    private synchronized String enableTethering(String iface) {
+    private String enableTethering(String iface) {
         debugLog("updateTetherState:" + iface);
 
         IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
diff --git a/core/java/android/server/BluetoothService.java b/core/java/android/server/BluetoothService.java
old mode 100644
new mode 100755
index f98d275..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;
     }
 
@@ -1928,120 +1928,163 @@
     }
 
     /**** Handlers for PAN  Profile ****/
+    // TODO: This needs to be converted to a state machine.
 
-    public synchronized boolean isTetheringOn() {
+    public boolean isTetheringOn() {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
-        return mBluetoothPanProfileHandler.isTetheringOn();
+        synchronized (mBluetoothPanProfileHandler) {
+            return mBluetoothPanProfileHandler.isTetheringOn();
+        }
     }
 
-    /*package*/ synchronized boolean allowIncomingTethering() {
-        return mBluetoothPanProfileHandler.allowIncomingTethering();
+    /*package*/boolean allowIncomingTethering() {
+        synchronized (mBluetoothPanProfileHandler) {
+            return mBluetoothPanProfileHandler.allowIncomingTethering();
+        }
     }
 
-    public synchronized void setBluetoothTethering(boolean value) {
+    public void setBluetoothTethering(boolean value) {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
-        mBluetoothPanProfileHandler.setBluetoothTethering(value);
+        synchronized (mBluetoothPanProfileHandler) {
+            mBluetoothPanProfileHandler.setBluetoothTethering(value);
+        }
     }
 
-    public synchronized int getPanDeviceConnectionState(BluetoothDevice device) {
+    public int getPanDeviceConnectionState(BluetoothDevice device) {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
-        return mBluetoothPanProfileHandler.getPanDeviceConnectionState(device);
+        synchronized (mBluetoothPanProfileHandler) {
+            return mBluetoothPanProfileHandler.getPanDeviceConnectionState(device);
+        }
     }
 
-    public synchronized boolean connectPanDevice(BluetoothDevice device) {
+    public boolean connectPanDevice(BluetoothDevice device) {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
             "Need BLUETOOTH_ADMIN permission");
-        return mBluetoothPanProfileHandler.connectPanDevice(device);
+        synchronized (mBluetoothPanProfileHandler) {
+            return mBluetoothPanProfileHandler.connectPanDevice(device);
+        }
     }
 
-    public synchronized List<BluetoothDevice> getConnectedPanDevices() {
+    public List<BluetoothDevice> getConnectedPanDevices() {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
-        return mBluetoothPanProfileHandler.getConnectedPanDevices();
+        synchronized (mBluetoothPanProfileHandler) {
+            return mBluetoothPanProfileHandler.getConnectedPanDevices();
+        }
     }
 
-    public synchronized List<BluetoothDevice> getPanDevicesMatchingConnectionStates(
+    public List<BluetoothDevice> getPanDevicesMatchingConnectionStates(
             int[] states) {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
-        return mBluetoothPanProfileHandler.getPanDevicesMatchingConnectionStates(states);
+        synchronized (mBluetoothPanProfileHandler) {
+            return mBluetoothPanProfileHandler.getPanDevicesMatchingConnectionStates(states);
+        }
     }
 
-    public synchronized boolean disconnectPanDevice(BluetoothDevice device) {
+    public boolean disconnectPanDevice(BluetoothDevice device) {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
             "Need BLUETOOTH_ADMIN permission");
-        return mBluetoothPanProfileHandler.disconnectPanDevice(device);
+        synchronized (mBluetoothPanProfileHandler) {
+            return mBluetoothPanProfileHandler.disconnectPanDevice(device);
+        }
     }
 
-    /*package*/ synchronized void handlePanDeviceStateChange(BluetoothDevice device,
+    /*package*/void handlePanDeviceStateChange(BluetoothDevice device,
                                                              String iface,
                                                              int state,
                                                              int role) {
-        mBluetoothPanProfileHandler.handlePanDeviceStateChange(device, iface, state, role);
+        synchronized (mBluetoothPanProfileHandler) {
+            mBluetoothPanProfileHandler.handlePanDeviceStateChange(device, iface, state, role);
+        }
     }
 
-    /*package*/ synchronized void handlePanDeviceStateChange(BluetoothDevice device,
+    /*package*/void handlePanDeviceStateChange(BluetoothDevice device,
                                                              int state, int role) {
-        mBluetoothPanProfileHandler.handlePanDeviceStateChange(device, null, state, role);
+        synchronized (mBluetoothPanProfileHandler) {
+            mBluetoothPanProfileHandler.handlePanDeviceStateChange(device, null, state, role);
+        }
     }
 
     /**** Handlers for Input Device Profile ****/
+    // This needs to be converted to state machine
 
-    public synchronized boolean connectInputDevice(BluetoothDevice device) {
+    public boolean connectInputDevice(BluetoothDevice device) {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
                                                 "Need BLUETOOTH_ADMIN permission");
         BluetoothDeviceProfileState state = mDeviceProfileState.get(device.getAddress());
-        return mBluetoothInputProfileHandler.connectInputDevice(device, state);
+        synchronized (mBluetoothInputProfileHandler) {
+            return mBluetoothInputProfileHandler.connectInputDevice(device, state);
+        }
     }
 
-    public synchronized boolean connectInputDeviceInternal(BluetoothDevice device) {
-        return mBluetoothInputProfileHandler.connectInputDeviceInternal(device);
+    public boolean connectInputDeviceInternal(BluetoothDevice device) {
+        synchronized (mBluetoothInputProfileHandler) {
+            return mBluetoothInputProfileHandler.connectInputDeviceInternal(device);
+        }
     }
 
-    public synchronized boolean disconnectInputDevice(BluetoothDevice device) {
+    public boolean disconnectInputDevice(BluetoothDevice device) {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
                                                 "Need BLUETOOTH_ADMIN permission");
         BluetoothDeviceProfileState state = mDeviceProfileState.get(device.getAddress());
-        return mBluetoothInputProfileHandler.disconnectInputDevice(device, state);
+        synchronized (mBluetoothInputProfileHandler) {
+            return mBluetoothInputProfileHandler.disconnectInputDevice(device, state);
+        }
     }
 
-    public synchronized boolean disconnectInputDeviceInternal(BluetoothDevice device) {
-        return mBluetoothInputProfileHandler.disconnectInputDeviceInternal(device);
+    public boolean disconnectInputDeviceInternal(BluetoothDevice device) {
+        synchronized (mBluetoothInputProfileHandler) {
+            return mBluetoothInputProfileHandler.disconnectInputDeviceInternal(device);
+        }
     }
 
-    public synchronized int getInputDeviceConnectionState(BluetoothDevice device) {
+    public int getInputDeviceConnectionState(BluetoothDevice device) {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
-        return mBluetoothInputProfileHandler.getInputDeviceConnectionState(device);
-
+        synchronized (mBluetoothInputProfileHandler) {
+            return mBluetoothInputProfileHandler.getInputDeviceConnectionState(device);
+        }
     }
 
-    public synchronized List<BluetoothDevice> getConnectedInputDevices() {
+    public List<BluetoothDevice> getConnectedInputDevices() {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
-        return mBluetoothInputProfileHandler.getConnectedInputDevices();
+        synchronized (mBluetoothInputProfileHandler) {
+            return mBluetoothInputProfileHandler.getConnectedInputDevices();
+        }
     }
 
-    public synchronized List<BluetoothDevice> getInputDevicesMatchingConnectionStates(
+    public List<BluetoothDevice> getInputDevicesMatchingConnectionStates(
             int[] states) {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
-        return mBluetoothInputProfileHandler.getInputDevicesMatchingConnectionStates(states);
+        synchronized (mBluetoothInputProfileHandler) {
+            return mBluetoothInputProfileHandler.getInputDevicesMatchingConnectionStates(states);
+        }
     }
 
 
-    public synchronized int getInputDevicePriority(BluetoothDevice device) {
+    public int getInputDevicePriority(BluetoothDevice device) {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
-        return mBluetoothInputProfileHandler.getInputDevicePriority(device);
+        synchronized (mBluetoothInputProfileHandler) {
+            return mBluetoothInputProfileHandler.getInputDevicePriority(device);
+        }
     }
 
-    public synchronized boolean setInputDevicePriority(BluetoothDevice device, int priority) {
+    public boolean setInputDevicePriority(BluetoothDevice device, int priority) {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
                                                 "Need BLUETOOTH_ADMIN permission");
-        return mBluetoothInputProfileHandler.setInputDevicePriority(device, priority);
+        synchronized (mBluetoothInputProfileHandler) {
+            return mBluetoothInputProfileHandler.setInputDevicePriority(device, priority);
+        }
     }
 
-    /*package*/synchronized List<BluetoothDevice> lookupInputDevicesMatchingStates(int[] states) {
-        return mBluetoothInputProfileHandler.lookupInputDevicesMatchingStates(states);
+    /*package*/List<BluetoothDevice> lookupInputDevicesMatchingStates(int[] states) {
+        synchronized (mBluetoothInputProfileHandler) {
+            return mBluetoothInputProfileHandler.lookupInputDevicesMatchingStates(states);
+        }
     }
 
-    /*package*/ synchronized void handleInputDevicePropertyChange(String address, boolean connected) {
-        mBluetoothInputProfileHandler.handleInputDevicePropertyChange(address, connected);
+    /*package*/void handleInputDevicePropertyChange(String address, boolean connected) {
+        synchronized (mBluetoothInputProfileHandler) {
+            mBluetoothInputProfileHandler.handleInputDevicePropertyChange(address, connected);
+        }
     }
 
     public boolean connectHeadset(String address) {
diff --git a/core/java/android/speech/tts/FileSynthesisRequest.java b/core/java/android/speech/tts/FileSynthesisRequest.java
index 7efc264..62be2bf 100644
--- a/core/java/android/speech/tts/FileSynthesisRequest.java
+++ b/core/java/android/speech/tts/FileSynthesisRequest.java
@@ -16,6 +16,7 @@
 package android.speech.tts;
 
 import android.media.AudioFormat;
+import android.os.Bundle;
 import android.util.Log;
 
 import java.io.File;
@@ -47,8 +48,8 @@
     private boolean mStopped = false;
     private boolean mDone = false;
 
-    FileSynthesisRequest(String text, File fileName) {
-        super(text);
+    FileSynthesisRequest(String text, Bundle params, File fileName) {
+        super(text, params);
         mFileName = fileName;
     }
 
diff --git a/core/java/android/speech/tts/PlaybackSynthesisRequest.java b/core/java/android/speech/tts/PlaybackSynthesisRequest.java
index dc5ff70..d698b54 100644
--- a/core/java/android/speech/tts/PlaybackSynthesisRequest.java
+++ b/core/java/android/speech/tts/PlaybackSynthesisRequest.java
@@ -17,6 +17,8 @@
 
 import android.media.AudioFormat;
 import android.media.AudioTrack;
+import android.os.Bundle;
+import android.os.Handler;
 import android.util.Log;
 
 /**
@@ -48,15 +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, int streamType, float volume, float pan) {
-        super(text);
+    PlaybackSynthesisRequest(String text, Bundle params,
+            int streamType, float volume, float pan, Handler audioTrackHandler) {
+        super(text, params);
         mStreamType = streamType;
         mVolume = volume;
         mPan = pan;
+        mAudioTrackHandler = audioTrackHandler;
+        mWriteErrorOccured = false;
     }
 
     @Override
@@ -68,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
@@ -144,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;
@@ -156,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;
         }
     }
 
@@ -179,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/SynthesisRequest.java b/core/java/android/speech/tts/SynthesisRequest.java
index 6df9af2..57ae10d 100644
--- a/core/java/android/speech/tts/SynthesisRequest.java
+++ b/core/java/android/speech/tts/SynthesisRequest.java
@@ -15,6 +15,8 @@
  */
 package android.speech.tts;
 
+import android.os.Bundle;
+
 /**
  * A request for speech synthesis given to a TTS engine for processing.
  *
@@ -28,14 +30,16 @@
 public abstract class SynthesisRequest {
 
     private final String mText;
+    private final Bundle mParams;
     private String mLanguage;
     private String mCountry;
     private String mVariant;
     private int mSpeechRate;
     private int mPitch;
 
-    public SynthesisRequest(String text) {
+    public SynthesisRequest(String text, Bundle params) {
         mText = text;
+        mParams = new Bundle(params);
     }
 
     /**
@@ -104,6 +108,13 @@
     }
 
     /**
+     * Gets the additional params, if any.
+     */
+    public Bundle getParams() {
+        return mParams;
+    }
+
+    /**
      * Gets the maximum number of bytes that the TTS engine can pass in a single call of
      * {@link #audioAvailable}. This does not apply to {@link #completeAudioAvailable}.
      */
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
index 1d26c22..4b19469 100755
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -80,13 +80,13 @@
     public static final int LANG_COUNTRY_VAR_AVAILABLE = 2;
 
     /**
-     * Denotes the language is available for the language and country specified 
+     * Denotes the language is available for the language and country specified
      * by the locale, but not the variant.
      */
     public static final int LANG_COUNTRY_AVAILABLE = 1;
 
     /**
-     * Denotes the language is available for the language by the locale, 
+     * Denotes the language is available for the language by the locale,
      * but not the country and variant.
      */
     public static final int LANG_AVAILABLE = 0;
@@ -424,6 +424,7 @@
     private final Map<String, Uri> mEarcons;
     private final Map<String, Uri> mUtterances;
     private final Bundle mParams = new Bundle();
+    private String mCurrentEngine = null;
 
     /**
      * The constructor for the TextToSpeech class, using the default TTS engine.
@@ -524,6 +525,7 @@
             dispatchOnInit(ERROR);
             return false;
         } else {
+            mCurrentEngine = engine;
             return true;
         }
     }
@@ -685,6 +687,10 @@
      *            {@link Engine#KEY_PARAM_UTTERANCE_ID},
      *            {@link Engine#KEY_PARAM_VOLUME},
      *            {@link Engine#KEY_PARAM_PAN}.
+     *            Engine specific parameters may be passed in but the parameter keys
+     *            must be prefixed by the name of the engine they are intended for. For example
+     *            the keys "com.svox.pico_foo" and "com.svox.pico:bar" will be passed to the
+     *            engine named "com.svox.pico" if it is being used.
      *
      * @return {@link #ERROR} or {@link #SUCCESS}.
      */
@@ -714,6 +720,10 @@
      *            Supported parameter names:
      *            {@link Engine#KEY_PARAM_STREAM},
      *            {@link Engine#KEY_PARAM_UTTERANCE_ID}.
+     *            Engine specific parameters may be passed in but the parameter keys
+     *            must be prefixed by the name of the engine they are intended for. For example
+     *            the keys "com.svox.pico_foo" and "com.svox.pico:bar" will be passed to the
+     *            engine named "com.svox.pico" if it is being used.
      *
      * @return {@link #ERROR} or {@link #SUCCESS}.
      */
@@ -741,6 +751,10 @@
      * @param params Parameters for the request. Can be null.
      *            Supported parameter names:
      *            {@link Engine#KEY_PARAM_UTTERANCE_ID}.
+     *            Engine specific parameters may be passed in but the parameter keys
+     *            must be prefixed by the name of the engine they are intended for. For example
+     *            the keys "com.svox.pico_foo" and "com.svox.pico:bar" will be passed to the
+     *            engine named "com.svox.pico" if it is being used.
      *
      * @return {@link #ERROR} or {@link #SUCCESS}.
      */
@@ -922,6 +936,10 @@
      * @param params Parameters for the request. Can be null.
      *            Supported parameter names:
      *            {@link Engine#KEY_PARAM_UTTERANCE_ID}.
+     *            Engine specific parameters may be passed in but the parameter keys
+     *            must be prefixed by the name of the engine they are intended for. For example
+     *            the keys "com.svox.pico_foo" and "com.svox.pico:bar" will be passed to the
+     *            engine named "com.svox.pico" if it is being used.
      * @param filename Absolute file filename to write the generated audio data to.It should be
      *            something like "/sdcard/myappsounds/mysound.wav".
      *
@@ -945,6 +963,19 @@
             copyStringParam(bundle, params, Engine.KEY_PARAM_UTTERANCE_ID);
             copyFloatParam(bundle, params, Engine.KEY_PARAM_VOLUME);
             copyFloatParam(bundle, params, Engine.KEY_PARAM_PAN);
+
+            // Copy over all parameters that start with the name of the
+            // engine that we are currently connected to. The engine is
+            // free to interpret them as it chooses.
+            if (!TextUtils.isEmpty(mCurrentEngine)) {
+                for (Map.Entry<String, String> entry : params.entrySet()) {
+                    final String key = entry.getKey();
+                    if (key != null && key.startsWith(mCurrentEngine)) {
+                        bundle.putString(key, entry.getValue());
+                    }
+                }
+            }
+
             return bundle;
         } else {
             return mParams;
diff --git a/core/java/android/speech/tts/TextToSpeechService.java b/core/java/android/speech/tts/TextToSpeechService.java
index 590e2ef..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();
@@ -318,7 +324,7 @@
      */
     private static abstract class SpeechItem {
         private final String mCallingApp;
-        private final Bundle mParams;
+        protected final Bundle mParams;
         private boolean mStarted = false;
         private boolean mStopped = false;
 
@@ -443,7 +449,8 @@
         }
 
         protected SynthesisRequest createSynthesisRequest() {
-            return new PlaybackSynthesisRequest(mText, getStreamType(), getVolume(), getPan());
+            return new PlaybackSynthesisRequest(mText, mParams,
+                    getStreamType(), getVolume(), getPan(), mAudioTrackHandler);
         }
 
         private void setRequestParams(SynthesisRequest request) {
@@ -513,7 +520,7 @@
 
         @Override
         protected SynthesisRequest createSynthesisRequest() {
-            return new FileSynthesisRequest(getText(), mFile);
+            return new FileSynthesisRequest(getText(), mParams, mFile);
         }
 
         /**
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/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 0be02a6..adafb59 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -56,6 +56,9 @@
     void getDisplaySize(out Point size);
     int getMaximumSizeDimension();
 
+    void setForcedDisplaySize(int longDimen, int shortDimen);
+    void clearForcedDisplaySize();
+
     // These can only be called when injecting events to your own window,
     // or by holding the INJECT_EVENTS permission.  These methods may block
     // until pending input events are finished being dispatched even when 'sync' is false.
diff --git a/core/java/android/view/LayoutInflater.java b/core/java/android/view/LayoutInflater.java
index 81346b4..332a0fa 100644
--- a/core/java/android/view/LayoutInflater.java
+++ b/core/java/android/view/LayoutInflater.java
@@ -16,6 +16,10 @@
 
 package android.view;
 
+import android.graphics.Canvas;
+import android.os.Handler;
+import android.os.Message;
+import android.widget.FrameLayout;
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -83,6 +87,7 @@
 
     private static final String TAG_MERGE = "merge";
     private static final String TAG_INCLUDE = "include";
+    private static final String TAG_1995 = "blink";
     private static final String TAG_REQUEST_FOCUS = "requestFocus";
 
     /**
@@ -454,7 +459,12 @@
                     rInflate(parser, root, attrs, false);
                 } else {
                     // Temp is the root view that was found in the xml
-                    View temp = createViewFromTag(root, name, attrs);
+                    View temp;
+                    if (TAG_1995.equals(name)) {
+                        temp = new BlinkLayout(mContext, attrs);
+                    } else {
+                        temp = createViewFromTag(root, name, attrs);
+                    }
 
                     ViewGroup.LayoutParams params = null;
 
@@ -605,10 +615,9 @@
      * Throw an exception because the specified class is not allowed to be inflated.
      */
     private void failNotAllowed(String name, String prefix, AttributeSet attrs) {
-        InflateException ie = new InflateException(attrs.getPositionDescription()
+        throw new InflateException(attrs.getPositionDescription()
                 + ": Class not allowed to be inflated "
                 + (prefix != null ? (prefix + name) : name));
-        throw ie;
     }
 
     /**
@@ -720,6 +729,12 @@
                 parseInclude(parser, parent, attrs);
             } else if (TAG_MERGE.equals(name)) {
                 throw new InflateException("<merge /> must be the root element");
+            } else if (TAG_1995.equals(name)) {
+                final View view = new BlinkLayout(mContext, attrs);
+                final ViewGroup viewGroup = (ViewGroup) parent;
+                final ViewGroup.LayoutParams params = viewGroup.generateLayoutParams(attrs);
+                rInflate(parser, view, attrs, true);
+                viewGroup.addView(view, params);                
             } else {
                 final View view = createViewFromTag(parent, name, attrs);
                 final ViewGroup viewGroup = (ViewGroup) parent;
@@ -847,5 +862,64 @@
                 parser.getDepth() > currentDepth) && type != XmlPullParser.END_DOCUMENT) {
             // Empty
         }
-    }    
+    }
+
+    private static class BlinkLayout extends FrameLayout {
+        private static final int MESSAGE_BLINK = 0x42;
+        private static final int BLINK_DELAY = 500;
+
+        private boolean mBlink;
+        private boolean mBlinkState;
+        private final Handler mHandler;
+
+        public BlinkLayout(Context context, AttributeSet attrs) {
+            super(context, attrs);
+            mHandler = new Handler(new Handler.Callback() {
+                @Override
+                public boolean handleMessage(Message msg) {
+                    if (msg.what == MESSAGE_BLINK) {
+                        if (mBlink) {
+                            mBlinkState = !mBlinkState;
+                            makeBlink();
+                        }
+                        invalidate();
+                        return true;
+                    }
+                    return false;
+                }
+            });
+        }
+
+        private void makeBlink() {
+            Message message = mHandler.obtainMessage(MESSAGE_BLINK);
+            mHandler.sendMessageDelayed(message, BLINK_DELAY);
+        }
+
+        @Override
+        protected void onAttachedToWindow() {
+            super.onAttachedToWindow();
+
+            mBlink = true;
+            mBlinkState = true;
+
+            makeBlink();
+        }
+
+        @Override
+        protected void onDetachedFromWindow() {
+            super.onDetachedFromWindow();
+
+            mBlink = false;
+            mBlinkState = true;
+
+            mHandler.removeMessages(MESSAGE_BLINK);
+        }
+
+        @Override
+        protected void dispatchDraw(Canvas canvas) {
+            if (mBlinkState) {
+                super.dispatchDraw(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 dc920a7..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;
@@ -951,6 +949,43 @@
     static final int PARENT_SAVE_DISABLED_MASK = 0x20000000;
 
     /**
+     * Horizontal direction of this view is from Left to Right.
+     * Use with {@link #setHorizontalDirection}.
+     * {@hide}
+     */
+    public static final int HORIZONTAL_DIRECTION_LTR = 0x00000000;
+
+    /**
+     * Horizontal direction of this view is from Right to Left.
+     * Use with {@link #setHorizontalDirection}.
+     * {@hide}
+     */
+    public static final int HORIZONTAL_DIRECTION_RTL = 0x40000000;
+
+    /**
+     * Horizontal direction of this view is inherited from its parent.
+     * Use with {@link #setHorizontalDirection}.
+     * {@hide}
+     */
+    public static final int HORIZONTAL_DIRECTION_INHERIT = 0x80000000;
+
+    /**
+     * Horizontal direction of this view is from deduced from the default language
+     * script for the locale. Use with {@link #setHorizontalDirection}.
+     * {@hide}
+     */
+    public static final int HORIZONTAL_DIRECTION_LOCALE = 0xC0000000;
+
+    /**
+     * Mask for use with setFlags indicating bits used for horizontalDirection.
+     * {@hide}
+     */
+    static final int HORIZONTAL_DIRECTION_MASK = 0xC0000000;
+
+    private static final int[] HORIZONTAL_DIRECTION_FLAGS = { HORIZONTAL_DIRECTION_LTR,
+            HORIZONTAL_DIRECTION_RTL, HORIZONTAL_DIRECTION_INHERIT, HORIZONTAL_DIRECTION_LOCALE};
+
+    /**
      * View flag indicating whether {@link #addFocusables(ArrayList, int, int)}
      * should add all focusable Views regardless if they are focusable in touch mode.
      */
@@ -1672,6 +1707,13 @@
      */
     static final int DRAG_HOVERED                 = 0x00000002;
 
+    /**
+     * Indicates whether the view is drawn in right-to-left direction.
+     *
+     * @hide
+     */
+    static final int RESOLVED_LAYOUT_RTL          = 0x00000004;
+
     /* End of masks for mPrivateFlags2 */
 
     static final int DRAG_MASK = DRAG_CAN_ACCEPT | DRAG_HOVERED;
@@ -2598,6 +2640,13 @@
                         viewFlagMasks |= VISIBILITY_MASK;
                     }
                     break;
+                case com.android.internal.R.styleable.View_horizontalDirection:
+                  final int layoutDirection = a.getInt(attr, 0);
+                  if (layoutDirection != 0) {
+                      viewFlagValues |= HORIZONTAL_DIRECTION_FLAGS[layoutDirection];
+                      viewFlagMasks |= HORIZONTAL_DIRECTION_MASK;
+                  }
+                  break;
                 case com.android.internal.R.styleable.View_drawingCacheQuality:
                     final int cacheQuality = a.getInt(attr, 0);
                     if (cacheQuality != 0) {
@@ -4072,6 +4121,41 @@
     }
 
     /**
+     * Returns the horizontal direction for this view.
+     *
+     * @return One of {@link #HORIZONTAL_DIRECTION_LTR},
+     *   {@link #HORIZONTAL_DIRECTION_RTL},
+     *   {@link #HORIZONTAL_DIRECTION_INHERIT} or
+     *   {@link #HORIZONTAL_DIRECTION_LOCALE}.
+     * @attr ref android.R.styleable#View_horizontalDirection
+     * @hide
+     */
+    @ViewDebug.ExportedProperty(mapping = {
+        @ViewDebug.IntToString(from = HORIZONTAL_DIRECTION_LTR,     to = "LTR"),
+        @ViewDebug.IntToString(from = HORIZONTAL_DIRECTION_RTL,     to = "RTL"),
+        @ViewDebug.IntToString(from = HORIZONTAL_DIRECTION_INHERIT, to = "INHERIT"),
+        @ViewDebug.IntToString(from = HORIZONTAL_DIRECTION_LOCALE,  to = "LOCALE")
+    })
+    public int getHorizontalDirection() {
+        return mViewFlags & HORIZONTAL_DIRECTION_MASK;
+    }
+
+    /**
+     * Set the horizontal direction for this view.
+     *
+     * @param horizontalDirection One of {@link #HORIZONTAL_DIRECTION_LTR},
+     *   {@link #HORIZONTAL_DIRECTION_RTL},
+     *   {@link #HORIZONTAL_DIRECTION_INHERIT} or
+     *   {@link #HORIZONTAL_DIRECTION_LOCALE}.
+     * @attr ref android.R.styleable#View_horizontalDirection
+     * @hide
+     */
+    @RemotableViewMethod
+    public void setHorizontalDirection(int horizontalDirection) {
+        setFlags(horizontalDirection, HORIZONTAL_DIRECTION_MASK);
+    }
+
+    /**
      * If this view doesn't do any drawing on its own, set this flag to
      * allow further optimizations. By default, this flag is not set on
      * View, but could be set on some View subclasses such as ViewGroup.
@@ -5873,6 +5957,10 @@
                 mParent.recomputeViewAttributes(this);
             }
         }
+
+        if ((changed & HORIZONTAL_DIRECTION_MASK) != 0) {
+            requestLayout();
+        }
     }
 
     /**
@@ -5960,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
@@ -8405,6 +8513,23 @@
             mPrivateFlags &= ~AWAKEN_SCROLL_BARS_ON_ATTACH;
         }
         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()) {
+            case HORIZONTAL_DIRECTION_INHERIT:
+                // If this is root view, no need to look at parent's layout dir.
+                if (mParent != null && mParent instanceof ViewGroup &&
+                        ((ViewGroup) mParent).isLayoutRtl()) {
+                    mPrivateFlags2 |= RESOLVED_LAYOUT_RTL;
+                }
+                break;
+            case HORIZONTAL_DIRECTION_RTL:
+                mPrivateFlags2 |= RESOLVED_LAYOUT_RTL;
+                break;
+        }
     }
 
     /**
@@ -8793,6 +8918,12 @@
 
         // Destroy any previous software drawing cache if needed
         switch (mLayerType) {
+            case LAYER_TYPE_HARDWARE:
+                if (mHardwareLayer != null) {
+                    mHardwareLayer.destroy();
+                    mHardwareLayer = null;
+                }
+                // fall through - unaccelerated views may use software layer mechanism instead
             case LAYER_TYPE_SOFTWARE:
                 if (mDrawingCache != null) {
                     mDrawingCache.recycle();
@@ -8804,12 +8935,6 @@
                     mUnscaledDrawingCache = null;
                 }
                 break;
-            case LAYER_TYPE_HARDWARE:
-                if (mHardwareLayer != null) {
-                    mHardwareLayer.destroy();
-                    mHardwareLayer = null;
-                }
-                break;
             default:
                 break;
         }
@@ -9892,6 +10017,16 @@
     }
 
     /**
+     * <p>Indicates whether or not this view's layout is right-to-left. This is resolved from
+     * layout attribute and/or the inherited value from the parent.</p>
+     *
+     * @return true if the layout is right-to-left.
+     */
+    public boolean isLayoutRtl() {
+        return (mPrivateFlags2 & RESOLVED_LAYOUT_RTL) == RESOLVED_LAYOUT_RTL;
+    }
+
+    /**
      * Assign a size and position to a view and all of its
      * descendants
      *
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 f84b33b..f504b90 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -587,6 +587,7 @@
             return false;
         }
         final boolean propagate = onRequestSendAccessibilityEvent(child, event);
+        //noinspection SimplifiableIfStatement
         if (!propagate) {
             return false;
         }
@@ -1243,6 +1244,7 @@
                 mHoveredChild = null;
             } else {
                 // Pointer is still within the child.
+                //noinspection ConstantConditions
                 handled |= dispatchTransformedGenericPointerEvent(event, mHoveredChild);
             }
         }
@@ -1306,6 +1308,7 @@
         // Handle the event only if leaf. This guarantees that
         // the leafs (or any custom class that returns true from
         // this method) will get a change to process the hover.
+        //noinspection SimplifiableIfStatement
         if (getChildCount() == 0) {
             return super.onHoverEvent(event);
         }
@@ -1879,7 +1882,7 @@
      * @see #FOCUS_BEFORE_DESCENDANTS
      * @see #FOCUS_AFTER_DESCENDANTS
      * @see #FOCUS_BLOCK_DESCENDANTS
-     * @see #onRequestFocusInDescendants
+     * @see #onRequestFocusInDescendants(int, android.graphics.Rect) 
      */
     @Override
     public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
@@ -2093,10 +2096,10 @@
     }
 
     /**
-     * Perform dispatching of a {@link #restoreHierarchyState thaw()} to only this view,
-     * not to its children.  For use when overriding
-     * {@link #dispatchRestoreInstanceState dispatchThaw()} to allow subclasses to thaw
-     * their own state but not the state of their children.
+     * Perform dispatching of a {@link #restoreHierarchyState(android.util.SparseArray)}
+     * to only this view, not to its children.  For use when overriding
+     * {@link #dispatchRestoreInstanceState(android.util.SparseArray)} to allow
+     * subclasses to thaw their own state but not the state of their children.
      *
      * @param container the container
      */
@@ -4835,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 5a418f3..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
@@ -866,7 +884,13 @@
     public boolean performHapticFeedbackLw(WindowState win, int effectId, boolean always);
     
     /**
-     * Called when we have stopped keeping the screen on because a window
+     * Called when we have started keeping the screen on because a window
+     * requesting this has become visible.
+     */
+    public void screenOnStartedLw();
+
+    /**
+     * Called when we have stopped keeping the screen on because the last window
      * requesting this is no longer visible.
      */
     public void screenOnStoppedLw();
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 de32c2b..563fc26 100644
--- a/core/java/android/widget/PopupWindow.java
+++ b/core/java/android/widget/PopupWindow.java
@@ -392,11 +392,11 @@
 
         mContentView = contentView;
 
-        if (mContext == null) {
+        if (mContext == null && mContentView != null) {
             mContext = mContentView.getContext();
         }
 
-        if (mWindowManager == null) {
+        if (mWindowManager == null && mContentView != null) {
             mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
         }
     }
@@ -939,7 +939,9 @@
      * @param p the layout parameters of the popup's content view
      */
     private void invokePopup(WindowManager.LayoutParams p) {
-        p.packageName = mContext.getPackageName();
+        if (mContext != null) {
+            p.packageName = mContext.getPackageName();
+        }
         mWindowManager.addView(mPopupView, p);
     }
 
@@ -1169,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/SimpleCursorAdapter.java b/core/java/android/widget/SimpleCursorAdapter.java
index 3d2a252..c5c6c69 100644
--- a/core/java/android/widget/SimpleCursorAdapter.java
+++ b/core/java/android/widget/SimpleCursorAdapter.java
@@ -338,6 +338,12 @@
 
     @Override
     public Cursor swapCursor(Cursor c) {
+        // super.swapCursor() will notify observers before we have
+        // a valid mapping, make sure we have a mapping before this
+        // happens
+        if (mFrom == null) {
+            findColumns(mOriginalFrom);
+        }
         Cursor res = super.swapCursor(c);
         // rescan columns in case cursor layout is different
         findColumns(mOriginalFrom);
@@ -358,7 +364,13 @@
     public void changeCursorAndColumns(Cursor c, String[] from, int[] to) {
         mOriginalFrom = from;
         mTo = to;
-        super.changeCursor(c);        
+        // super.changeCursor() will notify observers before we have
+        // a valid mapping, make sure we have a mapping before this
+        // happens
+        if (mFrom == null) {
+            findColumns(mOriginalFrom);
+        }
+        super.changeCursor(c);
         findColumns(mOriginalFrom);
     }
 
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/AbsActionBarView.java b/core/java/com/android/internal/widget/AbsActionBarView.java
index 7830dca..788883b 100644
--- a/core/java/com/android/internal/widget/AbsActionBarView.java
+++ b/core/java/com/android/internal/widget/AbsActionBarView.java
@@ -154,7 +154,7 @@
         availableWidth -= child.getMeasuredWidth();
         availableWidth -= spacing;
 
-        return availableWidth;
+        return Math.max(0, availableWidth);
     }
 
     protected int positionChild(View child, int x, int y, int contentHeight) {
diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java
index 13ccbba..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;
     }
@@ -713,48 +662,48 @@
             mHomeLayout.measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST),
                     MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
             final int homeWidth = mHomeLayout.getMeasuredWidth();
-            availableWidth -= homeWidth;
-            leftOfCenter -= homeWidth;
+            availableWidth = Math.max(0, availableWidth - homeWidth);
+            leftOfCenter = Math.max(0, availableWidth - homeWidth);
         }
         
         if (mMenuView != null && mMenuView.getParent() == this) {
             availableWidth = measureChildView(mMenuView, availableWidth,
                     childSpecHeight, 0);
-            rightOfCenter -= mMenuView.getMeasuredWidth();
+            rightOfCenter = Math.max(0, rightOfCenter - mMenuView.getMeasuredWidth());
         }
 
         boolean showTitle = mTitleLayout != null && mTitleLayout.getVisibility() != GONE &&
                 (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0;
         if (showTitle) {
             availableWidth = measureChildView(mTitleLayout, availableWidth, childSpecHeight, 0);
-            leftOfCenter -= mTitleLayout.getMeasuredWidth();
+            leftOfCenter = Math.max(0, leftOfCenter - mTitleLayout.getMeasuredWidth());
         }
 
         switch (mNavigationMode) {
         case ActionBar.NAVIGATION_MODE_LIST:
             if (mListNavLayout != null) {
                 final int itemPaddingSize = showTitle ? mItemPadding * 2 : mItemPadding;
-                availableWidth -= itemPaddingSize;
-                leftOfCenter -= itemPaddingSize;
+                availableWidth = Math.max(0, availableWidth - itemPaddingSize);
+                leftOfCenter = Math.max(0, leftOfCenter - itemPaddingSize);
                 mListNavLayout.measure(
                         MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST),
                         MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
                 final int listNavWidth = mListNavLayout.getMeasuredWidth();
-                availableWidth -= listNavWidth;
-                leftOfCenter -= listNavWidth;
+                availableWidth = Math.max(0, availableWidth - listNavWidth);
+                leftOfCenter = Math.max(0, leftOfCenter - listNavWidth);
             }
             break;
         case ActionBar.NAVIGATION_MODE_TABS:
             if (mTabScrollView != null) {
                 final int itemPaddingSize = showTitle ? mItemPadding * 2 : mItemPadding;
-                availableWidth -= itemPaddingSize;
-                leftOfCenter -= itemPaddingSize;
+                availableWidth = Math.max(0, availableWidth - itemPaddingSize);
+                leftOfCenter = Math.max(0, leftOfCenter - itemPaddingSize);
                 mTabScrollView.measure(
                         MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST),
                         MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
                 final int tabWidth = mTabScrollView.getMeasuredWidth();
-                availableWidth -= tabWidth;
-                leftOfCenter -= tabWidth;
+                availableWidth = Math.max(0, availableWidth - tabWidth);
+                leftOfCenter = Math.max(0, leftOfCenter - tabWidth);
             }
             break;
         }
@@ -763,7 +712,8 @@
                 mIndeterminateProgressView.getVisibility() != GONE) {
             availableWidth = measureChildView(mIndeterminateProgressView, availableWidth,
                     childSpecHeight, 0);
-            rightOfCenter -= mIndeterminateProgressView.getMeasuredWidth();
+            rightOfCenter = Math.max(0,
+                    rightOfCenter - mIndeterminateProgressView.getMeasuredWidth());
         }
 
         if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && mCustomNavView != null) {
@@ -947,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/Canvas.cpp b/core/jni/android/graphics/Canvas.cpp
index 9d9196e..4a09232 100644
--- a/core/jni/android/graphics/Canvas.cpp
+++ b/core/jni/android/graphics/Canvas.cpp
@@ -73,20 +73,6 @@
     static jboolean isOpaque(JNIEnv* env, jobject jcanvas) {
         NPE_CHECK_RETURN_ZERO(env, jcanvas);
         SkCanvas* canvas = GraphicsJNI::getNativeCanvas(env, jcanvas);
-
-        /*
-            Currently we cannot support transparency in GL-based canvas' at
-            the view level. Therefore we cannot base our answer on the device's
-            bitmap, but need to hard-code the answer. If we relax this
-            limitation in views, we can simplify the following code as well.
-         
-            Use the getViewport() call to find out if we're gl-based...
-        */
-        if (canvas->getViewport(NULL)) {
-            return true;
-        }
-        
-        // normal technique, rely on the device's bitmap for the answer
         return canvas->getDevice()->accessBitmap(false).isOpaque();
     }
     
@@ -770,7 +756,7 @@
 
         jint count = end - start;
         sp<TextLayoutCacheValue> value = gTextLayoutCache.getValue(
-                paint, textArray, start, count, count, flags);
+                paint, textArray, start, count, end, flags);
         if (value == NULL) {
             LOGE("Cannot get TextLayoutCache value");
             return ;
diff --git a/core/jni/android/graphics/NinePatchImpl.cpp b/core/jni/android/graphics/NinePatchImpl.cpp
index ff24a87..a3e36ee 100644
--- a/core/jni/android/graphics/NinePatchImpl.cpp
+++ b/core/jni/android/graphics/NinePatchImpl.cpp
@@ -116,9 +116,9 @@
         paint = &defaultPaint;
     }
     
-    // if our canvas is GL, draw this as a mesh, which will be faster than
-    // in parts (which is faster for raster)
-    if (canvas && canvas->getViewport(NULL)) {
+    // if our SkCanvas were back by GL we should enable this and draw this as
+    // a mesh, which will be faster in most cases.
+    if (false) {
         SkNinePatch::DrawMesh(canvas, bounds, bitmap,
                               chunk.xDivs, chunk.numXDivs,
                               chunk.yDivs, chunk.numYDivs,
diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp
index 768b836..64749e9 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -335,8 +335,8 @@
         const jchar* textArray = env->GetCharArrayElements(text, NULL);
         jfloat result = 0;
 #if RTL_USE_HARFBUZZ
-        TextLayout::getTextRunAdvances(paint, textArray, index, count, count, paint->getFlags(),
-                NULL /* dont need all advances */, result);
+        TextLayout::getTextRunAdvances(paint, textArray, index, count, textLength,
+                paint->getFlags(), NULL /* dont need all advances */, result);
 #else
         // we double count, since measureText wants a byteLength
         SkScalar width = paint->measureText(textArray + index, count << 1);
@@ -362,8 +362,8 @@
         jfloat width = 0;
 
 #if RTL_USE_HARFBUZZ
-        TextLayout::getTextRunAdvances(paint, textArray, 0, count, count, paint->getFlags(),
-                NULL /* dont need all advances */, width);
+        TextLayout::getTextRunAdvances(paint, textArray, start, count, end,
+                paint->getFlags(), NULL /* dont need all advances */, width);
 #else
 
         width = SkScalarToFloat(paint->measureText(textArray + start, count << 1));
@@ -381,8 +381,8 @@
         size_t textLength = env->GetStringLength(text);
         jfloat width = 0;
 #if RTL_USE_HARFBUZZ
-        TextLayout::getTextRunAdvances(paint, textArray, 0, textLength, textLength, paint->getFlags(),
-                NULL /* dont need all advances */, width);
+        TextLayout::getTextRunAdvances(paint, textArray, 0, textLength, textLength,
+                paint->getFlags(), NULL /* dont need all advances */, width);
 #else
         width = SkScalarToFloat(paint->measureText(textArray, textLength << 1));
 #endif
@@ -396,8 +396,8 @@
 #if RTL_USE_HARFBUZZ
         jfloat totalAdvance;
 
-        TextLayout::getTextRunAdvances(paint, text, 0, count, count, paint->getFlags(),
-                widthsArray, totalAdvance);
+        TextLayout::getTextRunAdvances(paint, text, 0, count, count,
+                paint->getFlags(), widthsArray, totalAdvance);
 #else
         SkScalar* scalarArray = (SkScalar*)widthsArray;
 
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/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 2d85ccc..419578c 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -358,6 +358,14 @@
         android:description="@string/permdesc_nfc"
         android:label="@string/permlab_nfc" />
 
+    <!-- Allows applications to provide VPN functionality.
+         @hide Pending API council approval -->
+    <permission android:name="android.permission.VPN"
+        android:permissionGroup="android.permission-group.NETWORK"
+        android:protectionLevel="dangerous"
+        android:description="@string/permdesc_vpn"
+        android:label="@string/permlab_vpn" />
+
     <!-- Allows an application to use SIP service -->
     <permission android:name="android.permission.USE_SIP"
         android:permissionGroup="android.permission-group.NETWORK"
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-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 73506df..6f70942 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"للسماح بتعديل إحصاءات البطارية المجمّعة. ليس للاستخدام بواسطة التطبيقات العادية."</string>
     <string name="permlab_backup" msgid="470013022865453920">"التحكم في النسخة الاحتياطية للنظام واستعادتها"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"للسماح للتطبيق بالتحكم في النسخة الاحتياطية للنظام وآلية الاستعادة. ليس للاستخدام بواسطة التطبيقات العادية."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"عرض النوافذ غير المصرح بها"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"للسماح بإنشاء نوافذ بقصد استخدامها بواسطة واجهة مستخدم النظام الداخلي. ليس للاستخدام بواسطة التطبيقات العادية."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"عرض تنبيهات مستوى النظام"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"للسماح لتطبيق ما بعرض تهيئة هاتف البلوتوث المحلي، وإجراء اتصالات وقبولها باستخدام الأجهزة المقترنة."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"التحكم في اتصال الحقل القريب"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"للسماح لتطبيق ما بالاتصال بعلامات اتصال حقل قريب (NFC)، والبطاقات وبرامج القراءة."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"تعطيل تأمين المفاتيح"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"للسماح لتطبيق ما بتعطيل تأمين المفاتيح وأي أمان كلمة مرور مرتبطة. ومثال صحيح لذلك هو تعطيل الهاتف لتأمين المفاتيح عند استلام مكالمة هاتفية واردة، ثم إعادة تمكين تأمين المفاتيح عند انتهاء المكالمة."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"قراءة إعدادات المزامنة"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"حدد حسابًا."</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"زيادة"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"تناقص"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"التنقل إلى الشاشة الرئيسية"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"التنقل إلى أعلى"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"المزيد من الخيارات"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index cd37ab1..b01b6bc 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Разрешава промяна на събраните статистически данни за батерията. Не е предназначено за нормални приложения."</string>
     <string name="permlab_backup" msgid="470013022865453920">"контролиране на създаването и възстановяването на резервни копия на системата"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Разрешава на приложението да контролира системния механизъм за създаване и възстановяване на резервни копия. Не е предназначено за нормални приложения."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"показване на неупълномощени прозорци"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Разрешава създаването на прозорци, предназначени за употреба от вътрешния системен потребителски интерфейс. Не е предназначено за нормални приложения."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"показване на сигнали на ниво система"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Разрешава на приложението да вижда конфигурацията на локалния Bluetooth телефон и да изгражда и приема връзки със сдвоени устройства."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"контролиране на комуникацията в близкото поле"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Разрешава на приложението да комуникира с маркери, карти и четци, ползващи комуникация в близкото поле (NFC)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"деактивиране на заключването на клавиатурата"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Разрешава на приложението да деактивира заключването на клавиатурата и свързаната защита с парола. Това е допустимо, когато например телефонът деактивира заключването при получаване на входящо обаждане и после го активира отново, когато обаждането завърши."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"четене на настройките за синхронизиране"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Избор на профил"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Увеличаване"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Намаляване"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Придвижване към „Начало“"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Придвижване нагоре"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Още опции"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 0e83243..eb48b67 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Permet la modificació de les estadístiques de la bateria que es recopilen. No indicat per a les aplicacions normals."</string>
     <string name="permlab_backup" msgid="470013022865453920">"controlar la còpia de seguretat i restauració del sistema"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Permet a l\'aplicació controlar el mecanisme de còpia de seguretat i restauració del sistema. No indicat per a les aplicacions normals."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"visualitzar finestres no autoritzades"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Permet la creació de finestres que utilitzarà la interfície d\'usuari del sistema interna. No indicat per a les aplicacions normals."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"visualitzar les alertes del sistema"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Permet a una aplicació visualitzar la configuració del telèfon Bluetooth local i establir i acceptar connexions amb els dispositius emparellats."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"controla Near Field Communication (NFC)"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Permet que una aplicació es comuniqui amb les etiquetes, les targetes i els lectors de Near Field Communication (NFC)"</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"desactivar el bloqueig del teclat"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Permet a una aplicació desactivar el bloqueig del teclat i qualsevol element de seguretat de contrasenyes associat. Un exemple d\'això és la desactivació per part del telèfon del bloqueig del teclat en rebre una trucada telefònica entrant i després la reactivació del bloqueig del teclat quan finalitza la trucada."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"llegir la configuració de sincronització"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Selecciona un compte"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Incrementa"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Disminueix"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Torna a la pàgina d\'inici"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Mou cap a dalt"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Més opcions"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index e2deb0f..8fb793f 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Umožňuje změnu shromážděných statistických údajů o baterii. Není určeno pro běžné aplikace."</string>
     <string name="permlab_backup" msgid="470013022865453920">"ovládání zálohování a obnovy systému"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Umožňuje aplikaci ovládat systémový mechanizmus pro zálohování a obnovu dat. Není určeno pro běžné aplikace."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"zobrazení nepovolených oken"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Umožňuje vytvoření oken, která mají být použita interním systémem uživatelského rozhraní. Běžné aplikace toto nastavení nepoužívají."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"zobrazení upozornění systémové úrovně"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Umožňuje aplikaci zobrazit konfiguraci místního telefonu s rozhraním Bluetooth, vytvářet připojení ke spárovaným zařízením a přijímat tato připojení."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"ovládat technologii NFC"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Umožňuje aplikaci komunikovat se štítky, kartami a čtečkami s podporou technologie NFC."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"vypnutí zámku kláves"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Umožňuje aplikaci vypnout zámek kláves a související zabezpečení heslem. Příkladem oprávněného použití této funkce je vypnutí zámku klávesnice při příchozím hovoru a jeho opětovné zapnutí po skončení hovoru."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"čtení nastavení synchronizace"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Vybrat účet"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Zvýšení"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Snížení"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Přejít na plochu"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Přejít nahoru"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Další možnosti"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 6bc1e29..b399621 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Tillader ændring af indsamlede batteristatistikker. Ikke til brug for normale programmer."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kontroller sikkerhedskopiering af system, og gendan"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Tillader, at et program kontrollerer systemets sikkerhedskopierings- og gendannelsesfunktion. Ikke til brug til normale programmer."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"vis uautoriserede vinduer"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Tillader oprettelse af vinduer, der er beregnet til at blive brugt af den interne systembrugergrænseflade. Ikke til brug for normale programmer."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"vis underretninger på systemniveau"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Tillader, at et program viser konfigurationen af den lokale Bluetooth-telefon samt opretter og accepterer forbindelse med parrede enheder."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"kontrollere Near Field Communication"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Tillader, at et program kommunikerer med tags, kort og læsere i Near Field Communication (NFC)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"deaktiver tastaturlås"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Tillader, at et program deaktiverer tastaturlåsen og al associeret adgangskodesikkerhed. Et legitimt eksempel på dette er, at telefonen deaktiverer tastaturlåsen, når der modtages et indgående telefonopkald, og genaktiverer tastaturlåsen, når opkaldet er afsluttet."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"læs indstillinger for synkronisering"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Vælg en konto"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Optælling"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Nedtælling"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Naviger hjem"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Naviger op"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Flere valgmuligheder"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index a97c017..0837ee91 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Ermöglicht die Änderung von gesammelten Akku-Daten. Nicht für normale Anwendungen vorgesehen."</string>
     <string name="permlab_backup" msgid="470013022865453920">"Systemsicherung und -wiederherstellung kontrollieren"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Der Anwendung wird die Steuerung des Sicherungs- und Wiederherstellungsmechanismus des Systems ermöglicht. Nicht für normale Anwendungen vorgesehen."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"nicht autorisierte Fenster anzeigen"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Ermöglicht die Erstellung von Fenstern, die von der Benutzeroberfläche des internen Systems verwendet werden. Nicht für normale Anwendungen geeignet."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"Warnungen auf Systemebene anzeigen"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Ermöglicht einer Anwendung, die Konfiguration des lokalen Bluetooth-Telefons einzusehen und Verbindungen mit Partnergeräten herzustellen und zu akzeptieren"</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"Nahfeldkommunikation steuern"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Ermöglicht einer Anwendung die Kommunikation mit Tags für Nahfeldkommunikation, Karten und Lesegeräte"</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"Tastensperre deaktivieren"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Ermöglicht einer Anwendung, die Tastensperre sowie den damit verbundenen Passwortschutz zu deaktivieren. So wird die Tastensperre vom Telefon deaktiviert, wenn ein Anruf eingeht, und nach Beendigung des Anrufs wieder aktiviert."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"Synchronisierungseinstellungen lesen"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Konto auswählen"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Erhöhen"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Verringern"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Zur Startseite navigieren"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Nach oben navigieren"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Weitere Optionen"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 490dbde..df83d34 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Επιτρέπει την τροποποίηση στατιστικών μπαταρίας που έχουν συλλεχθεί. Δεν πρέπει να χρησιμοποιείται από συνήθεις εφαρμογές."</string>
     <string name="permlab_backup" msgid="470013022865453920">"αντίγραφο ασφαλείας και επαναφορά συστήματος"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Επιτρέπει στην εφαρμογή τον έλεγχο του μηχανισμού δημιουργίας αντιγράφων ασφαλείας και επαναφοράς του συστήματος. Δεν προορίζεται για χρήση από κανονικές εφαρμογές."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"προβολή μη εξουσιοδοτημένων παραθύρων"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Επιτρέπει τη δημιουργία παραθύρων που πρόκειται να χρησιμοποιηθούν από την εσωτερική διεπαφή χρήστη του συστήματος. Δεν πρέπει να χρησιμοποιείται από κανονικές εφαρμογές."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"εμφάνιση ειδοποιήσεων επιπέδου συστήματος"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Επιτρέπει σε μια εφαρμογή να προβάλει τη διαμόρφωση του τοπικού τηλεφώνου Bluetooth και επίσης να πραγματοποιεί και να αποδέχεται συνδέσεις με συζευγμένες συσκευές."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"έλεγχος Επικοινωνίας κοντινού πεδίου (Near Field Communication)"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Επιτρέπει σε μια εφαρμογή την επικοινωνία με ετικέτες, τις κάρτες και τους αναγνώστες της Επικοινωνίας κοντινού πεδίου (NFC)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"απενεργοποίηση κλειδώματος πληκτρολογίου"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Επιτρέπει σε μια εφαρμογή την απενεργοποίηση του κλειδώματος πληκτρολογίου και άλλης σχετικής ασφάλειας με κωδικό πρόσβασης. Για παράδειγμα, η απενεργοποίηση του κλειδώματος πληκτρολογίου όταν λαμβάνεται εισερχόμενη τηλεφωνική κλήση και η επανενεργοποίηση του κλειδώματος πληκτρολογίου όταν η κλήση τερματιστεί."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ανάγνωση ρυθμίσεων συγχρονισμού"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Επιλογή λογαριασμού"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Αύξηση"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Μείωση"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Πλοήγηση στην αρχική σελίδα"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Πλοήγηση προς τα επάνω"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Περισσότερες επιλογές"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 5fa87ad..fa81526 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -240,6 +240,8 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Allows the modification of collected battery statistics. Not for use by normal applications."</string>
     <string name="permlab_backup" msgid="470013022865453920">"control system back up and restore"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Allows the application to control the system\'s back-up and restore mechanism. Not for use by normal applications."</string>
+    <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"confirm a full backup or restore operation"</string>
+    <string name="permdesc_confirm_full_backup" msgid="9005017754175897954">"Allows the application to launch the full backup confirmation UI. Not to be used by any application."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"display unauthorised windows"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Allows the creation of windows that are intended to be used by the internal system user interface. Not for use by normal applications."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"display system-level alerts"</string>
@@ -446,6 +448,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Allows an application to view configuration of the local Bluetooth phone and to make and accept connections with paired devices."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"control Near-Field Communication"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Allows an application to communicate with Near-Field Communication (NFC) tags, cards and readers."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"disable key lock"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Allows an application to disable the key lock and any associated password security. A legitimate example of this is the phone disabling the key lock when receiving an incoming phone call, then re-enabling the key lock when the call is finished."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"read sync settings"</string>
@@ -1019,4 +1025,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Select an account"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Increment"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Decrement"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Navigate home"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Navigate up"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"More options"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 251869a..a0c228c 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Admite la modificación de estadísticas recopiladas sobre la batería. Las aplicaciones normales no deben utilizarlo."</string>
     <string name="permlab_backup" msgid="470013022865453920">"copia de seguridad y restauración del sistema de control"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Permite a la aplicación controlar el mecanismo de restauración y copia de seguridad de los sistemas. No es para uso de las aplicaciones normales."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"mostrar ventanas no autorizadas"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Permite la creación de ventanas que la interfaz interna del usuario del sistema pretenda utilizar. Las aplicaciones normales no deben utilizarlo."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"mostrar alertas a nivel del sistema"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Admite una aplicación que ve la configuración del teléfono Bluetooth local, y realiza y acepta conexiones con dispositivos vinculados."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"controlar la Transmisión de datos en proximidad"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Permite que una aplicación se comunique con etiquetas, tarjetas y lectores de Transmisión de datos en proximidad (NFC)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"desactivar el bloqueo"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Admite una aplicación que desactiva el bloqueo y cualquier seguridad con contraseña relacionada. Un ejemplo legítimo de esto es el bloqueo desactivado por el teléfono cuando recibe una llamada telefónica entrante, y luego la reactivación del bloqueo cuando finaliza la llamada."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"leer la configuración de sincronización"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Seleccionar una cuenta"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Incremento"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Decremento"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Desplazarse hasta la página principal"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Desplazarse hacia arriba"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Más opciones"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 7e9c55f..9973f0b 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Permite la modificación de estadísticas recopiladas sobre la batería. No está destinado al uso por parte de aplicaciones normales."</string>
     <string name="permlab_backup" msgid="470013022865453920">"controlar las copias de seguridad y las restauraciones del sistema"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Permite que la aplicación controle el mecanismo de copia de seguridad y restauración del sistema. Este permiso no está destinado a aplicaciones normales."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"mostrar ventanas no autorizadas"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Permite la creación de ventanas destinadas al uso por parte de la interfaz de usuario interna del sistema. No está destinado al uso por parte de aplicaciones normales."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"mostrar alertas de nivel del sistema"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Permite que una aplicación vea la configuración del teléfono Bluetooth local, y cree y acepte conexiones con los dispositivos sincronizados."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"controlar Comunicación de campo cercano (NFC)"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Permite que la aplicación se comunique con lectores, tarjetas y etiquetas de Comunicación de campo cercano (NFC)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"inhabilitar bloqueo del teclado"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Permite que una aplicación inhabilite el bloqueo del teclado y cualquier protección con contraseña asociada. Un ejemplo legítimo de este permiso es la inhabilitación por parte del teléfono del bloqueo del teclado cuando recibe una llamada telefónica entrante y su posterior habilitación cuando finaliza la llamada."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"leer la configuración de sincronización"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Seleccionar una cuenta"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Aumentar"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Disminuir"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Ir al escritorio"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Desplazarse hacia arriba"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Más opciones"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 07c3785..7842216 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"امکان تغییر اطلاعات جمع آوری شده مربوط به باتری را فراهم می آورد. برای استفاده با برنامه های معمولی در نظر گرفته نشده است."</string>
     <string name="permlab_backup" msgid="470013022865453920">"کنترل نسخه پشتیبان سیستم و بازیابی"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"به برنامه کاربردی اجازه می دهد نسخه پشتیبان سیستم را کنترل کرده و مکانیسم آن را بازیابی کند. برای استفاده با برنامه های معمولی در نظر گرفته نشده است."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"نمایش پنجره های غیرمجاز"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"اجازه می دهد پنجره هایی ایجاد شوند که برای استفاده توسط رابط کاربر سیستم داخلی در نظر گرفته شده است. برای استفاده با برنامه های معمولی در نظر گرفته نشده است."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"هشدارهای سطح سیستم نمایش"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"به یک برنامه کاربردی اجازه می دهد تا پیکربندی تلفن بلوتوث محلی را مشاهده کند، اتصال ها را با دستگاه های جفت شده برقرار کرده، آنها را بپذیرد."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"کنترل ارتباط راه نزدیک"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"به یک برنامه کاربردی برای ارتباط با برچسب های ارتباط راه نزدیک (NFC)، کارت ها و خواننده ها اجازه می دهد."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"غیرفعال کردن قفل کلید"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"به یک برنامه کاربردی اجازه می دهد قفل کلید و حفاظت رمز ورود همراه با کلیه کلیدها را غیرفعال کند. یک نمونه قانونی از این مورد، غیرفعال شدن قفل کلید در هنگام دریافت تماس تلفنی و سپس فعال کردن قفل کلید پس از پایان تماس است."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"خواندن تنظیمات همگام سازی"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"انتخاب یک حساب"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"افزایش"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"کاهش"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"رفتن به صفحه اصلی"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"حرکت به بالا"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"سایر گزینه ها"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index cb47f70..631da31 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Antaa sovelluksen muuttaa kerättyjä akkutietoja. Ei tavallisten sovelluksien käyttöön."</string>
     <string name="permlab_backup" msgid="470013022865453920">"hallitse järjestelmän varmuuskopiointia ja palauttamista"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Antaa sovelluksen hallita järjestelmän varmuuskopio- ja palautusmekanismeja. Ei tavallisten sovelluksien käyttöön."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"näytä luvattomia ikkunoita"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Antaa sovelluksen luoda ikkunoita, jotka on tarkoitettu sisäisen järjestelmän käyttöliittymän käyttöön. Ei tavallisten sovelluksien käyttöön."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"näytä järjestelmätason ilmoituksia"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Antaa sovelluksen tarkastella paikallisen Bluetooth-puhelimen asetuksia sekä muodostaa ja hyväksyä laitepariyhteyksiä muihin laitteisiin."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"hallitse Near Field Communication -tunnistusta"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Antaa sovelluksen viestiä Near Field Communication (NFC) -tunnisteiden, -korttien ja -lukijoiden kanssa."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"poista näppäinlukitus käytöstä"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Antaa sovelluksen poistaa näppäinlukituksen ja siihen liittyvän salasanasuojauksen käytöstä. Esimerkki: puhelin poistaa näppäinlukituksen käytöstä saapuvan puhelun yhteydessä ja ottaa näppäinlukituksen takaisin käyttöön puhelun päätyttyä."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lue synkronointiasetuksia"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Valitse tili"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Lisää"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Vähennä"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Siirry etusivulle"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Siirry ylös"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Lisää asetuksia"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index f44421c..1160ab4 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Autoriser la modification des statistiques de la batterie. Les applications normales n\'utilisent pas cette fonctionnalité."</string>
     <string name="permlab_backup" msgid="470013022865453920">"contrôler la sauvegarde et la restauration du système"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Autorise l\'application à contrôler le mécanisme de sauvegarde et de restauration du système. Ne pas utiliser pour les applications standard."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"Affichage de fenêtres non autorisées"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Permet de créer des fenêtres conçues pour l\'interface utilisateur du système interne. Les applications normales n\'utilisent pas cette fonctionnalité."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"Affichage d\'alertes système"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Permet à une application d\'obtenir la configuration du téléphone Bluetooth local, de se connecter à des appareils associés et d\'accepter leur connexion."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"contrôler la communication en champ proche"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Permet à une application de communiquer avec des tags, cartes et lecteurs prenant en charge la communication en champ proche (NFC)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"Désactivation du verrouillage des touches"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Permet à une application de désactiver le verrouillage des touches et toute sécurité par mot de passe. Exemple : Votre téléphone désactive le verrouillage du clavier lorsque vous recevez un appel, puis le réactive lorsque vous raccrochez."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"Lecture des paramètres de synchronisation"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Sélectionner un compte"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Augmenter"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Diminuer"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Retour à l\'accueil"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Revenir en haut de la page"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Plus d\'options"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
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-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 33af403a..cf3f502 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Omogućuje izmjenu prikupljene statistike o bateriji. Nije za upotrebu na uobičajenim aplikacijama."</string>
     <string name="permlab_backup" msgid="470013022865453920">"sigurnosna kopija i oporavak nadzornog sustava"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Aplikaciji omogućuje nadzor nad mehanizmom stvaranja sigurnosnih kopija i oporavka sustava. Nije za upotrebu na uobičajenim aplikacijama."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"prikaz neovlaštenih prozora"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Omogućuje stvaranje prozora kojima je namjena da se koriste u korisničkom sučelju internog sustava. Nije za upotrebu na uobičajenim aplikacijama."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"prikaz upozorenja na razini sustava"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Aplikaciji omogućuje pregled konfiguracije lokalnog Bluetooth telefona i uspostavljanje i prihvaćanje veza sa sparenim uređajima."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"upravljaj beskontaktnom (NFC) komunikacijom"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Aplikaciji omogućuje komunikaciju s Near Field Communication (NFC) oznakama, karticama i čitačima."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"onemogući zaključavanje tipkovnice"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Aplikaciji omogućuje isključivanje zaključavanja tipkovnice i svih povezanih sigurnosnih zaporki. Jasan primjer toga daje isključivanje zaključavanja telefona kod primanja poziva, koje se ponovno aktivira nakon završetka poziva."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"čitanje postavki sinkronizacije"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Odaberite račun"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Povećaj"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Smanji"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Kreni na početnu"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Kreni gore"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Više opcija"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index e260c85..340c2f9 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Lehetővé teszi a begyűjtött akkumulátoradatok módosítását. A normál alkalmazások nem használják ezt."</string>
     <string name="permlab_backup" msgid="470013022865453920">"rendszer biztonsági mentésének és helyreállításának vezérlése"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Lehetővé teszi az alkalmazás számára a rendszer biztonsági mentési és helyreállítási mechanizmusának vezérlését. A normál alkalmazások nem használják ezt."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"azonosítatlan ablakok megjelenítése"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Lehetővé teszi olyan ablakok létrehozását, amelyeket a belső rendszer felhasználói felülete általi használatra szántak. A normál alkalmazások nem használják ezt."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"rendszerszintű riasztások megjelenítése"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Lehetővé teszi egy alkalmazás számára a helyi Bluetooth telefon konfigurációjának megtekintését, valamint kapcsolatok kezdeményezését és fogadását a párosított eszközökkel."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"NFC technológia vezérlése"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Lehetővé teszi az alkalmazások számára, hogy NFC (Near Field Communication - kis hatósugarú vezeték nélküli kommunikáció) technológiát használó címkékkel, kártyákkal és leolvasókkal kommunikáljanak."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"billentyűzár kikapcsolása"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Lehetővé teszi egy alkalmazás számára a billentyűzár és a kapcsolódó jelszavas biztonság kikapcsolását. Ennek egy szabályos példája, amikor a telefon kikapcsolja a billentyűzárat egy beérkező hívás fogadásakor, majd a hívás befejezése után újra bekapcsolja azt."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"szinkronizálási beállítások olvasása"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Fiók kiválasztása"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Növelés"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Csökkentés"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Ugrás a főoldalra"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Felfele mozgás"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"További lehetőségek"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index d57cc32..d224384 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Mengizinkan modifikasi statistik baterai yang terkumpul. Tidak untuk digunakan untuk aplikasi normal."</string>
     <string name="permlab_backup" msgid="470013022865453920">"mengontrol cadangan dan pemulihan sistem"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Mengizinkan aplikasi mengontrol cadangan sistem dan mengembalikan mekanisme. Tidak untuk digunakan oleh aplikasi normal."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"tampilkan jendela yang tidak diizinkan"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Mengizinkan pembuatan jendela yang dimaksudkan untuk digunakan oleh antarmuka pengguna sistem internal. Bukan untuk digunakan oleh aplikasi normal."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"tampilkan lansiran tingkat sistem"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Mengizinkan aplikasi melihat konfigurasi ponsel Bluetooth lokal, dan membuat dan menerima panggilan dengan perangkat yang disandingkan."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"kontrol NFC"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Mengizinkan aplikasi berkomunikasi dengan tag, kartu, dan pembaca Near Field Communication (NFC)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"nonaktifkan kunci tombol"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Mengizinkan aplikasi menonaktifkan keylock dan keamanan sandi terkait mana pun. Contoh yang sah adalah ponsel menonaktifkan keylock ketika menerima panggilan telepon masuk, kemudian mengaktifkan keylock sekali lagi setelah panggilan selesai."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"baca setelan sinkron"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Pilih akun"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Penambahan"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Pengurangan"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Navigasi ke beranda"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Navigasi naik"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Opsi lainnya"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 0c77120..eb450bb 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -240,6 +240,8 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Consente la modifica delle statistiche sulla batteria raccolte. Da non usare per normali applicazioni."</string>
     <string name="permlab_backup" msgid="470013022865453920">"controllo del backup di sistema e ripristino"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Consente all\'applicazione di controllare il meccanismo di backup e ripristino del sistema. Da non usare per normali applicazioni."</string>
+    <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"conferma di un\'operazione completa di backup o di ripristino"</string>
+    <string name="permdesc_confirm_full_backup" msgid="9005017754175897954">"Consente all\'applicazione di lanciare l\'interfaccia utente di conferma del backup completo. Non utilizzabile da qualsiasi applicazione."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"visualizzazione finestre non autorizzate"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Consente la creazione di finestre destinate all\'uso nell\'interfaccia utente di sistema interna. Da non usare per normali applicazioni."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"visualizzazione avvisi di sistema"</string>
@@ -446,6 +448,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Consente a un\'applicazione di visualizzare la configurazione del telefono Bluetooth locale e di stabilire e accettare connessioni con dispositivi associati."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"controllo Near Field Communication"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Consente a un\'applicazione di comunicare con tag, schede e lettori NFC (Near Field Communication)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"disattivazione blocco tastiera"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Consente la disattivazione da parte di un\'applicazione del blocco tastiera e di eventuali protezioni tramite password associate. Un valido esempio è la disattivazione da parte del telefono del blocco tastiera quando riceve una telefonata in entrata, e la successiva riattivazione del blocco al termine della chiamata."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lettura impostazioni di sincronizz."</string>
@@ -1019,4 +1025,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Seleziona un account"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Aumenta"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Diminuisci"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Vai alla home page"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Vai in alto"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Altre opzioni"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 323d409..3f3ae23 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"מאפשר שינוי של נתונים סטטיסטיים הנאספים על הסוללה. לא לשימוש של יישומים רגילים."</string>
     <string name="permlab_backup" msgid="470013022865453920">"שלוט בגיבוי ובשחזור של המערכת"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"מאפשר ליישום לשלוט במנגנון הגיבוי והשחזור של המערכת. לא לשימוש של יישומים רגילים."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"הצג חלונות לא מורשים"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"מאפשר יצירת חלונות המיועדים לשימוש של ממשק המשתמש במערכת הפנימית. לא לשימוש של יישומים רגילים."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"הצג התראות ברמת המערכת"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"מאפשר ליישום להציג תצורה של מכשיר Bluetooth המקומי, וליצור ולקבל חיבורים עם מכשירים מותאמים."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"שלוט ב-Near Field Communication"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"מאפשר ליישום לקיים תקשורת עם תגיות, כרטיסים וקוראים מסוג Near Field Communication ‏(NFC)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"השבת נעילת מקשים"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"מאפשר ליישום להשבית את נעילת המקשים ואבטחת סיסמה משויכת. דוגמה תקפה לכך היא טלפון המשבית את נעילת המקשים בעת קבלת שיחת טלפון נכנסת, ולאחר מכן מפעיל מחדש את נעילת המקשים עם סיום השיחה."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"קרא הגדרות סנכרון"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"בחר חשבון"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"הוספה"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"הפחתה"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"נווט לדף הבית"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"נווט למעלה"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"אפשרויות נוספות"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 7f88103..4563091 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"収集した電池統計情報の変更を許可します。通常のアプリケーションでは使用しません。"</string>
     <string name="permlab_backup" msgid="470013022865453920">"システムのバックアップと復元を制御する"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"システムのバックアップと復元メカニズムの制御をアプリケーションに許可します。通常のアプリケーションでは使用しません。"</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"未許可のウィンドウの表示"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"内部システムのユーザーインターフェースで使用するためのウィンドウ作成を許可します。通常のアプリケーションでは使用しません。"</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"システムレベルの警告の表示"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"このBluetooth端末の設定表示、および別の端末をペアとして設定し接続を承認することをアプリケーションに許可します。"</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"NFCの管理"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"NFCタグ、カード、リーダーとの通信をアプリケーションに許可します。"</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"キーロックを無効にする"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"キーロックや関連するパスワードセキュリティを無効にすることをアプリケーションに許可します。正当な利用の例では、かかってきた電話を受信する際にキーロックを無効にし、通話の終了時にキーロックを有効にし直します。"</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"同期設定の読み取り"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"アカウントを選択"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"増やす"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"減らす"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"ホームへ移動"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"上へ移動"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"その他のオプション"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index dc83e3b..3d692ea 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"수집된 배터리 통계를 수정할 수 있도록 합니다. 일반 애플리케이션에서는 사용하지 않습니다."</string>
     <string name="permlab_backup" msgid="470013022865453920">"시스템 백업 및 복원 관리"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"애플리케이션이 시스템의 백업 및 복원 매커니즘을 제어할 수 있도록 합니다. 일반 애플리케이션에서는 사용하지 않습니다."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"인증되지 않은 창 표시"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"내부 시스템 사용자 인터페이스에서 사용하는 창을 만들 수 있도록 합니다. 일반 애플리케이션에서는 사용하지 않습니다."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"시스템 수준 경고 표시"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"애플리케이션이 로컬 Bluetooth 전화의 구성을 보고 페어링된 장치에 연결하며 연결을 수락할 수 있도록 합니다."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"NFC(Near Field Communication) 제어"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"애플리케이션에서 NFC(Near Field Communication) 태그, 카드 및 리더와 통신할 수 있습니다."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"키 잠금 사용 중지"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"애플리케이션이 키 잠금 및 관련 비밀번호 보안을 사용 중지할 수 있도록 합니다. 예를 들어, 휴대전화가 수신전화를 받을 때 키 잠금을 사용 중지했다가 통화가 끝나면 키 잠금을 다시 사용할 수 있습니다."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"동기화 설정 읽기"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"계정 선택"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"올리기"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"줄이기"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"홈 탐색"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"위로 탐색"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"옵션 더보기"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </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-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 883b6f3..69457ef 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Leidžia keisti surinktą akumuliatoriaus statistiką. Neskirta įprastų programų naudojimui."</string>
     <string name="permlab_backup" msgid="470013022865453920">"valdyti sistemos atsarginę kopiją ir atkūrimą"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Leidžia programai valdyti atsarginę sistemos kopiją ir atkurti mechanizmą. Neskirta naudoti įprastose programose."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"pateikti neteisėtus langus"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Leidžia sukurti langus, kurie bus naudojami vidinės sistemos naudotojo sąsajos. Neskirta naudoti įprastose programose."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"pateikti sistemos lygio įspėjimus"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Leidžia programai žiūrėti vietinio „Bluetooth“ telefono konfigūraciją ir užmegzti bei priimti susietų įrenginių ryšius."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"valdyti artimo lauko perdavimą (angl. „Near Field Communication“)"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Leidžiama programai perduoti artimo lauko perdavimo (angl. „Near Field Communication“, NFC) žymas, korteles ir skaitymo programas."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"išjungti užraktą"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Leidžia programai išjungti užraktą ir visą susijusią slaptažodžio apsaugą. Patikimas pavyzdys būtų užrakto išjungimas telefone gaunant įeinantį skambutį ir įgalinant jį vėl, kai skambutis baigtas."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"skaityti sinchronizavimo nustatymus"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Pasirinkti paskyrą"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Padidinti"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Sumažinti"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Naršyti pagrindinį puslapį"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Naršyti į viršų"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Daugiau parinkčių"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index f4ecff7..e931728 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Ļauj pārveidot apkopoto akumulatora jaudas statistiku. Nav paredzēts izmantošanai parastajās lietojumprogrammās."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kontrolēt sistēmas dublējumu un atjaunošanu"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Ļauj lietojumprogrammai kontrolēt sistēmas dublēšanas un atjaunošanas mehānismu. Nav paredzēts izmantošanai parastajās lietojumprogrammās."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"attēlot neautorizētus logus"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Ļauj izveidot logus, kas ir paredzēti izmantošanai iekšējās sistēmas lietotāja saskarnē. Nav paredzēts izmantošanai parastajās lietojumprogrammās."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"rādīt sistēmas līmeņa brīdinājumus"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Ļauj lietojumprogrammai skatīt vietējā Bluetooth tālruņa konfigurāciju, kā arī veidot un pieņemt savienojumus ar pārī savienotām ierīcēm."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"kontrolē tuvlauka saziņu"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Ļauj lietojumprogrammai sazināties ar tuvlauka saziņas (Near Field Communication — NFC) atzīmēm, kartēm un lasītājiem."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"atspējot atslēgas slēgu"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Ļauj lietojumprogrammai atspējot atslēgas slēgu un jebkādu saistīto paroles drošību. Atbilstošs tā piemērs: tālrunis atspējo atslēgas slēgu, saņemot ienākošu tālruņa zvanu, pēc tam atkārtoti iespējo atslēgas slēgu, kad saruna ir pabeigta."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lasīt sinhronizācijas iestatījumus"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Atlasīt kontu"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Palielināt"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Samazināt"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Pārvietoties uz sākuma ekrānu"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Pārvietoties augšup"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Vairāk opciju"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index b5c0c71..6fe5dd7 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Lar applikasjonen endre på innsamlet batteristatistikk. Ikke ment for vanlige applikasjoner."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kontrollere backup og gjenoppretting"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Lar applikasjonen kontrollere systemets backup- og gjenopprettingsmekanisme. Ikke ment for vanlige applikasjoner."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"vis uautoriserte vinduer"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Tillater at det opprettes vinduer ment for bruk av systemets interne brukergrensesnitt. Ikke ment for vanlige applikasjoner."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"vise advarsler på systemnivå"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Lar applikasjonen se konfigurasjonen til den lokale Bluetooth-telefonen, og å opprette og godta tilkoblinger med parede enheter."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"kontroller overføring av data med NFC-teknologi"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Tillater programmet å kommunisere data via koder, kort og lesere for NFC-teknologi."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"slå av tastaturlås"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Lar applikasjonen slå av tastaturlåsen og enhver tilknyttet passordsikkerhet. Et legitimt eksempel på dette er at telefonen slår av tastaturlåsen når den mottar et innkommende anrop, og så slår den på igjen når samtalen er over."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"lese synkroniseringsinnstillinger"</string>
@@ -951,7 +959,7 @@
     <string name="create_contact_using" msgid="4947405226788104538">"Lag kontakt"\n"med nummeret <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Ett eller flere av de følgende programmene ber om tillatelse til å få tilgang til kontoen din fra nå av."</string>
     <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Vil du tillate dette?"</string>
-    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Få tilgang til forespørsler"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Forespørsel om tilgang"</string>
     <string name="allow" msgid="7225948811296386551">"Tillat"</string>
     <string name="deny" msgid="2081879885755434506">"Avslå"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"Tillatelse forespurt"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Velg en konto"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Øke"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Senke"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Gå til startsiden"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Gå opp"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Flere alternativer"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index f7eef3e..81fa796 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Hiermee kunnen verzamelde accustatistieken worden gewijzigd. Niet voor gebruik door normale toepassingen."</string>
     <string name="permlab_backup" msgid="470013022865453920">"systeemback-up en -herstel beheren"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Hiermee kan de app het mechanisme voor systeemback-up en -herstel beheren. Niet voor gebruik door normale apps."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"niet-geautoriseerde vensters weergeven"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Hiermee kunnen vensters worden gemaakt die door de interne systeemgebruikersinterface worden gebruikt. Niet voor gebruik door normale toepassingen."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"waarschuwingen op systeemniveau weergeven"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Hiermee kan een app de configuratie van een lokale Bluetooth-telefoon bekijken en verbindingen met gekoppelde apparaten maken en accepteren."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"Near Field Communication regelen"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Hiermee kan een app communiceren met NFC-tags (Near Field Communication), kaarten en lezers."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"toetsvergrendeling uitschakelen"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Hiermee kan een app de toetsvergrendeling en bijbehorende wachtwoordbeveiliging uitschakelen. Een voorbeeld: de telefoon schakelt de toetsvergrendeling uit wanneer een oproep binnenkomt en schakelt de toetsvergrendeling weer in zodra de oproep wordt beëindigd."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"synchronisatie-instellingen lezen"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Selecteer een account"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Hoger"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Lager"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Navigeren naar startpositie"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Omhoog navigeren"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Meer opties"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 552ed0b..28a28a5 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Pozwala na zmianę zebranych statystyk dotyczących baterii. Nie do wykorzystania przez normalne aplikacje."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kontrolowanie tworzenia i przywracania kopii zapasowych systemu"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Zezwala aplikacji na kontrolowanie mechanizmu tworzenia i przywracania kopii zapasowych systemu. Opcja nie jest przeznaczona dla zwykłych aplikacji."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"wyświetlanie nieuwierzytelnionych okien"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Pozwala na tworzenie okien, które przeznaczone są do wykorzystania przez wewnętrzny interfejs użytkownika systemu. Nie do wykorzystania przez normalne aplikacje."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"wyświetlanie ostrzeżeń systemowych"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Pozwala aplikacji na wyświetlanie konfiguracji lokalnego telefonu Bluetooth oraz na tworzenie i akceptowanie połączeń ze sparowanymi urządzeniami."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"kontrolowanie łączności Near Field Communication"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Zezwala aplikacji na komunikowanie się z użyciem tagów, kart i czytników Near Field Communication (NFC)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"wyłączanie blokady klawiatury"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Pozwala aplikacji na wyłączenie blokady klawiatury i wszystkich związanych z tym haseł zabezpieczających. Typowym przykładem takiego działania jest wyłączanie blokady klawiatury, gdy pojawia się połączenie przychodzące, a następnie ponowne jej włączanie po zakończeniu połączenia."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"czytanie ustawień synchronizowania"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Wybierz konto"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Zwiększ"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Zmniejsz"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Przejdź do strony głównej"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Przejdź wyżej"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Więcej opcji"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index c7282b5..e812d68 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Permite a modificação das estatísticas recolhidas sobre a bateria. Não se destina a utilização por aplicações normais."</string>
     <string name="permlab_backup" msgid="470013022865453920">"controlar a cópia de segurança e restauro do sistema"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Permite que a aplicação controle o mecanismo de cópia de segurança e restauro do sistema. Não deve ser utilizado por aplicações normais."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"apresentar janelas não autorizadas"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Permite a criação de janelas destinadas a utilização pela interface de utilizador interna do sistema. Não se destina a utilização por aplicações normais."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"apresentar alertas ao nível do sistema"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Permite a uma aplicação ver a configuração do telefone Bluetooth local, bem como efectuar e aceitar ligações com dispositivos emparelhados."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"controlo Near Field Communication"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Permite que uma aplicação comunique com etiquetas, cartões e leitores Near Field Communication (NFC)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"desactivar bloqueio de teclas"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Permite a uma aplicação desactivar o bloqueio de teclas e qualquer segurança por palavra-passe associada. Um exemplo legítimo é a desactivação do bloqueio de teclas pelo telefone ao receber uma chamada, reactivando, em seguida, o bloqueio de teclas ao terminar a chamada."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler definições de sincronização"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Seleccionar conta"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Aumentar"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Diminuir"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Navegar para página inicial"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Navegar para cima"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Mais opções"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index d459bb11..be6dcbe 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Permite a modificação das estatísticas de bateria coletadas. Não deve ser usado por aplicativos normais."</string>
     <string name="permlab_backup" msgid="470013022865453920">"controlar backup e restauração do sistema"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Permite que o aplicativo controle o mecanismo de backup e restauração do sistema. Não deve ser usado por aplicativos normais."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"exibir janelas não autorizadas"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Permite a criação de janelas destinadas ao uso pela interface de usuário do sistema interno. Não deve ser usado por aplicativos normais."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"exibir alertas de nível do sistema"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Permite que um aplicativo veja a configuração do telefone Bluetooth local e que possa fazer e aceitar conexões com dispositivos pareados."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"controlar a comunicação a curta distância"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Permite que um aplicativo se comunique com tags, cartões e leitores de comunicação a curta distância (NFC)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"desativar o bloqueio de teclas"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Permite que um aplicativo desative o bloqueio de teclas e qualquer segurança por senha associada. Um exemplo legítimo disso é a desativação do bloqueio de teclas pelo telefone ao receber uma chamada e a reativação do bloqueio quando a chamada é finalizada."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler as configurações de sincronização"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Selecione uma conta"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Incremento"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Redução"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Navegar na página inicial"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Navegar para cima"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Mais opções"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml
index 1f9a503..9865b47 100644
--- a/core/res/res/values-rm/strings.xml
+++ b/core/res/res/values-rm/strings.xml
@@ -246,6 +246,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Permetta da modifitgar las datas statisticas da l\'accu. Betg previs per applicaziuns normalas."</string>
     <string name="permlab_backup" msgid="470013022865453920">"controllar las copias da segirezza e la restauraziun dal sistem"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Permetta a l\'applicaziun da controllar il mecanissem da copias da segirezza e da restauraziun dal sistem. Betg previs per applicaziuns normalas."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"mussar fanestras betg autorisadas"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Permetta da crear fanestras destinadas per l\'utilisaziun da l\'interfatscha d\'utilisader interna dal sistem. Questa funcziun n\'è betg previsa per applicaziuns normalas."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"mussar avertiments dal sistem"</string>
@@ -460,6 +464,10 @@
     <skip />
     <!-- no translation found for permdesc_nfc (9171401851954407226) -->
     <skip />
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"deactivar la bloccaziun da la tastatura"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Permetta ad ina applicaziun da deactivar la bloccaziun da la tastatura e la protecziun cun il pled-clav associada. In exempel dad ina utilisaziun legitima: La bloccaziun da la tastatura vegn deactivada sche Vus retschavais in clom ed ella vegn reactivada sche Vus finis il telefon."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"leger ils parameters da sincronisaziun"</string>
@@ -1115,4 +1123,16 @@
     <skip />
     <!-- no translation found for number_picker_decrement_button (2576606679160067262) -->
     <skip />
+    <!-- no translation found for action_bar_home_description (5293600496601490216) -->
+    <skip />
+    <!-- no translation found for action_bar_up_description (2237496562952152589) -->
+    <skip />
+    <!-- no translation found for action_menu_overflow_description (2295659037509008453) -->
+    <skip />
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index bf2eac9..0daabb8 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Permite modificarea statisticilor colectate despre baterie. Nu se utilizează de aplicaţiile obişnuite."</string>
     <string name="permlab_backup" msgid="470013022865453920">"controlare copiere de rezervă şi restabilire a sistemului"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Permite aplicaţiei să controleze mecanismul de copiere de rezervă şi restabilire. Nu se utilizează de aplicaţiile obişnuite."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"afişare ferestre neautorizate"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Permite crearea de ferestre menite să fie utilizate de interfaţa utilizatorului a sistemului intern. Nu se utilizează de aplicaţiile obişnuite."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"afişare alerte la nivel de sistem"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Permite unei aplicaţii să vizualizeze configuraţia telefonului Bluetooth local, să efectueze şi să accepte conexiuni cu dispozitive pereche."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"controlare schimb de date prin Near Field Communication"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Permite unei aplicaţii să comunice cu etichetele, cardurile şi cititoarele NFC (Near Field Communication)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"dezactivare blocare taste"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Permite unei aplicaţii să dezactiveze blocarea tastelor şi orice modalitate asociată de securitate a parolelor. Un bun exemplu este deblocarea tastelor de către telefon atunci când se primeşte un apel şi reactivarea blocării tastelor la terminarea apelului."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"citire setări sincronizare"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Selectaţi un cont"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Incrementaţi"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Decrementaţi"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Navigaţi la ecranul de pornire"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Navigaţi în sus"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Mai multe opţiuni"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index e51f1bd..083a044 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Позволяет изменять собранную статистику батареи. Не предназначено для использования обычными приложениями."</string>
     <string name="permlab_backup" msgid="470013022865453920">"управление резервным копированием и восстановлением системы"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Разрешает приложению контролировать механизмы резервного копирования и восстановления системы. Не используется обычными приложениями."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"показывать неавторизованные окна"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Разрешает создание окон, предназначенных для использования внутренним пользовательским интерфейсом системы. Не предназначено для использования обычными приложениями."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"показывать оповещения системного уровня"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Позволяет приложению просматривать конфигурацию локального телефона Bluetooth, создавать подключения с сопряженными устройствами."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"управлять радиосвязью ближнего действия"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Позволяет приложению обмениваться данными с метками, картами и считывателями через радиосвязь ближнего действия (NFC)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"отключать блокировку клавиатуры"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Позволяет приложению отключить блокировку клавиатуры и другие функции защиты паролем. Примером допустимого использования этой функции является отключение блокировки клавиатуры при получении входящего вызова и включение блокировки после завершения разговора."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"считывать настройки синхронизации"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Выберите аккаунт"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Увеличить"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Уменьшить"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Перейти на главную"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Перейти вверх"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Ещё"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index deacc08..f55b0eb 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Umožňuje zmenu zhromaždených štatistických údajov o batérii. Nie je určené pre bežné aplikácie."</string>
     <string name="permlab_backup" msgid="470013022865453920">"Ovládať zálohovanie a obnovu systému"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Umožňuje aplikácii ovládať systémový mechanizmus na zálohovanie a obnovu údajov. Nie je určené pre bežné aplikácie."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"zobrazenie neoprávnených okien"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Umožňuje vytvorenie okien, ktoré majú byť použité interným systémom používateľského rozhrania. Bežné aplikácie toto nastavenie nepoužívajú."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"zobrazenie upozornení systémovej úrovne"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Umožňuje aplikácii zobraziť konfiguráciu miestneho telefónu s rozhraním Bluetooth, vytvárať pripojenie na spárované zariadenia a prijímať tieto pripojenia."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"ovládať technológiu Near Field Communication"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Umožňuje aplikácii komunikovať so štítkami, kartami a čítačkami s podporou technológie Near Field Communication (NFC)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"zakázanie uzamknutia klávesnice"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Umožňuje aplikácii vypnúť uzamknutie klávesnice a súvisiace zabezpečenie heslom. Príkladom oprávneného použitia tejto funkcie je vypnutie uzamknutia klávesnice pri prichádzajúcom hovore a jej opätovné zapnutie po skončení hovoru."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"čítanie nastavení synchronizácie"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Vybrať účet"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Zvýšenie"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Zníženie"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Prejsť na plochu"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Prejsť na"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Viac možností"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 8b6c568..16c2c41 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Dovoljuje spreminjanje zbranih statističnih podatkov baterije. Ni za uporabo z navadnimi programi."</string>
     <string name="permlab_backup" msgid="470013022865453920">"nadzor varnostnega kopiranja sistema in obnovitev"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Programu dovoljuje nadzor mehanizma za varnostno kopiranje in obnovitev sistema. Ni za uporabo z navadnimi programi."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"prikazovanje nepooblaščenih oken"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Dovoljuje ustvarjanje oken, ki jih bo uporabljal uporabniški vmesnik notranjega sistema. Ni za uporabo z navadnimi programi."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"prikaz opozoril na ravni sistema"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Programom dovoljuje ogled konfiguracije lokalnega telefona Bluetooth ter ustvarjanje in sprejemanje povezave s povezanimi napravami."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"nadzor nad komunikacijo s tehnologijo bližnjega polja"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Podpira komunikacijo med računalnikom in oznakami, karticami in bralniki komunikacije s tehnologijo bližnjega polja."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"onemogočanje zaklepa tipkovnice"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Dovoljuje, da program onemogoči zaklep tipk in morebitno povezano varnostno geslo. Legitimen primer je onemogočenje zaklepa tipkovnice pri dohodnem klicu ter vnovičnem omogočanju zaklepa, ko je klic dokončan."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"branje nastavitev sinhronizacije"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Izberite račun"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Povečaj"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Zmanjšaj"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Krmarjenje domov"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Krmarjenje navzgor"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Več možnosti"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 2d7b968..cf56261 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Омогућава измену прикупљене статистике о батерији. Не користе је обичне апликације."</string>
     <string name="permlab_backup" msgid="470013022865453920">"контрола резервне копије система и враћање почетних вредности"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Омогућава да апликација контролише резервну копију система и механизам за враћање првобитних поставки. Не користе је обичне апликације."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"приказ неовлашћених прозора"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Омогућава прављење прозора који су осмишљени за коришћење у корисничком интерфејсу интерног система. Не користе је обичне апликације."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"приказ упозорења на нивоу система"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Омогућава да апликација види конфигурацију локалног Bluetooth телефона, као и да успоставља и прихвата везе са упареним уређајима."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"контрола комуникације у ужем пољу (Near Field Communication)"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Омогућава апликацији да комуницира са ознакама, картицама и читачима комуникације у ужем пољу (Near Field Communication – NFC)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"онемогућавање закључавања тастатуре"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Омогућава да апликација онемогући закључавање тастатуре и свих безбедносних мера успостављених на основу лозинке. У оправдане примере додељивања такве дозволе спада онемогућавање закључавања тастатуре при пријему долазећег телефонског позива и поновно омогућавање тастатуре по његовом завршетку."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"читање подешавања синхронизације"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Избор налога"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Повећање"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Смањење"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Кретање до Почетне"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Кретање нагоре"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Још опција"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 114fc71..4d96aff 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Tillåter att samlad batteristatistik ändras. Används inte av vanliga program."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kontrollera säkerhetskopiering och återställning av systemet"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Tillåter att programmet styr över systemets mekanism för säkerhetskopiering och återställning. Används inte av vanliga program."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"visa otillåtna fönster"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Tillåter att fönster skapas och används av det interna systemgränssnittet. Används inte av vanliga program."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"visa varningar på systemnivå"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Tillåter att ett program ser den lokala Bluetooth-telefonens konfiguration, och skapar och accepterar anslutningar med parkopplade enheter."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"kontrollera närfältskommunikationen"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Tillåter att en app kommunicerar med taggar, kort och läsare för närfältskommunikation (NFC)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"inaktivera tangentlås"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Tillåter att ett program inaktiverar tangentlåset och tillhörande lösenordsskydd. Ett exempel på detta är att telefonen inaktiverar tangentlåset vid inkommande samtal och sedan aktiverar det igen när samtalet är avslutat."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"läsa synkroniseringsinställningar"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Välj ett konto"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Öka"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Minska"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Visa startsidan"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Navigera uppåt"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Fler alternativ"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </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-th/strings.xml b/core/res/res/values-th/strings.xml
index 236c510c..75a886c 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"อนุญาตให้แก้ไขสถิติแบตเตอรี่ที่เก็บไว้ ห้ามใช้โดยแอปพลิเคชันทั่วไป"</string>
     <string name="permlab_backup" msgid="470013022865453920">"ควบคุมการสำรองและคืนค่า"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"อนุญาตให้แอปพลิเคชันควบคุมวิธีการสำรองและคืนค่าระบบ ห้ามใช้โดยแอปพลิเคชันทั่วไป"</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"แสดงหน้าต่างที่ไม่ได้รับอนุญาต"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"อนุญาตให้สร้างหน้าต่างสำหรับใช้โดยส่วนติดต่อผู้ใช้ของระบบภายใน ห้ามใช้โดยแอปพลิเคชันทั่วไป"</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"แสดงการแจ้งเตือนในระดับระบบ"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"อนุญาตให้แอปพลิเคชันดูการกำหนดค่าของโทรศัพท์บลูทูธในพื้นที่ ตลอดจนเชื่อมต่อและยอมรับการเชื่อมต่อด้วยอุปกรณ์ที่จับคู่ไว้"</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"ควบคุม Near Field Communication"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"อนุญาตให้แอปพลิเคชันสื่อสารกับแท็ก Near Field Communication (NFC) การ์ด และโปรแกรมอ่าน"</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"ปิดการใช้งานการล็อกปุ่มกด"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"อนุญาตให้แอปพลิเคชันปิดการใช้งานการล็อกปุ่มและการรักษาความปลอดภัยรหัสผ่านที่เกี่ยวข้องใดๆ ตัวอย่างการใช้งานของกรณีนี้คือ โทรศัพท์ปิดการใช้งานการล็อกปุ่มกดเมื่อมีสายเรียกเข้า จากนั้นจึงเปิดการใช้งานการล็อกปุ่มกดใหม่เมื่อวางสายแล้ว"</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"อ่านการตั้งค่าการซิงค์แล้ว"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"เลือกบัญชี"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"การเพิ่ม"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"การลด"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"นำทางไปหน้าแรก"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"นำทางขึ้น"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"ตัวเลือกเพิ่มเติม"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index cdb2808..cec9fae 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Pinapayagan ang pagbabago ng mga nakolektang istatistika ng baterya. Hindi para sa paggamit ng mga normal na application."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kontrolin ang system backup at pagbawi"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Pinapayagan ang application na kontrolin ang mekanismo sa pag-backup at pagbalik ng system. Hindi para sa paggamit ng mga normal na application."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"ipakita ang mga hindi pinahintulutang window"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Pinapayagan ang paglikha ng mga window na nilayon para sa paggamit ng user interface ng pangloob na system. Hindi para sa paggamit ng mga normal na application."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"ipakita ang mga alerto sa antas ng system"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Pinapayagan ang isang application na tingnan ang configuration ng lokal na Bluetooth na telepono, at upang gumawa at tumanggap ng mga koneksyon sa mga nakapares na device."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"kontrolin ang Near Field Communication"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Pinapayagan ang application na makipagkomunika sa mga Near Field Communication (NFC) na tag, card, at reader."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"huwag paganahin ang keylock"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Pinapayagan ang isang application na huwag paganahin ang keylock at ang anumang nauugnay na seguridad sa password. Ang isang lehitimong halimbawa nito ay ang hindi pagpapagana ng telepono sa keylock kapag nakakatanggap ng papasok na tawag sa telepono, pagkatapos ay muling pagaganahin ang keylock kapag tapos na ang tawag."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"basahin ang mga setting ng sync"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Pumili ng account"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Taasan"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Babaan"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Magnabiga sa home"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Magnabiga pataas"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Higit pang mga pagpipilian"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 529632a..081fa10 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Toplanan pil istatistiklerinin değiştirilmesine izin verir. Normal uygulamalarda kullanılmamalıdır."</string>
     <string name="permlab_backup" msgid="470013022865453920">"sistem yedeğini kontrol et ve geri yükle"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Uygulamaya sistem yedekleme ve geri yükleme mekanizmasını denetleme izni verir. Normal uygulamalar tarafından kullanım için değildir."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"yetkisiz pencereleri görüntüle"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Dahili sistem kullanıcı arayüzü tarafından kullanılmak üzere tasarlanmış pencerelerin oluşturulmasına izin verir. Normal uygulamalarda kullanılmaz."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"sistem düzeyi uyarıları görüntüle"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Uygulamaların yerel Bluetooth telefonunun yapılandırmasını görüntülemesine ve eşleşilmiş cihazlar ile bağlantı kurup kabul etmesine izin verir."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"Yakın Alan İletişimini denetle"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Bir uyg\'nın Yakın Alan İletişimi etiketleri, kartları ve okuyclr ile iletşm kurmasına izin verir."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"tuş kilidini devre dışı bırak"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Uygulamaların tuş kilidini ve ilgili şifreli güvenlik önlemini devre dışı bırakmasına izin verir. Bunun geçerli bir örneği gelen bir çağrı alındığında tuş kilidinin devre dışı bırakılması, sonra çağrı bittiğinde kilidin yeniden devreye sokulmasıdır."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"senk. ayarlarını oku"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Bir hesap seçin"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Artır"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Azalt"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Ana sayfaya git"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Yukarı git"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Diğer seçenekler"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 4950ace..88ddc41 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Дозволяє змінювати зібрану статистику батареї. Не для використання звичайними програмами."</string>
     <string name="permlab_backup" msgid="470013022865453920">"контр. резерв. копіюв. і відн. сист."</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Дозволяє програмі контролювати механізми резерв. копіюв. і відновл. системи. Не для викор. звичайними програмами."</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"відображати несанкціон. вікна"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Дозволяє створювати вікна, які мають використ-ся інтерфейсом користувача внутрішньої системи. Не для використання звичайними програмами."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"відобр. сповіщ. на рівні сист."</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Дозволяє програмі переглядати конфігурацію локального Bluetooth телефону, створювати та приймати з\'єднання зі спареними пристроями."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"контрол. Near Field Communication"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Дозволяє прогр. обмін. даними з тегами, картками та читачами екрана Near Field Communication (NFC)."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"вимик. блок. клав."</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Дозволяє програмі вимикати блокування клавіатури та будь-який пов\'язаний захист паролем. Допустимий приклад, коли телефон вимикає блокування клавіат. при отриманні вхідного дзвінка, після завершення якого блокування клавіатури відновлюється."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"чит. налашт-ня синхр."</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Вибрати обліковий запис"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Додати"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Відняти"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Перейти на головну"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Перейти вгору"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Інші варіанти"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index ab097ad..01a320a 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -240,6 +240,8 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Cho phép sửa đổi các thống kê pin được thu thập. Không dành cho các ứng dụng thông thường."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kiểm soát sao lưu và khôi phục hệ thống"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Cho phép ứng dụng kiểm soát cơ chế sao lưu và khôi phục hệ thống. Không dành cho các ứng dụng thông thường."</string>
+    <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"xác nhận bản sao lưu đầy đủ hoặc khôi phục hoạt động"</string>
+    <string name="permdesc_confirm_full_backup" msgid="9005017754175897954">"Cho phép ứng dụng khởi chạy toàn bộ Giao diện người dùng xác nhận sao lưu. Không được bất kỳ ứng dụng nào sử dụng."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"hiển thị các cửa sổ trái phép"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Cho phép tạo các cửa sổ được giao diện người dùng hệ thống nội bộ sử dụng. Không dành cho các ứng dụng thông thường."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"hiển thị thông báo cấp hệ thống"</string>
@@ -446,6 +448,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Cho phép ứng dụng xem cấu hình của điện thoại Bluetooth nội hạt cũng như tạo và chấp nhận các kết nối với các thiết bị được ghép nối."</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"kiểm soát Liên lạc trường gần"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"Cho phép ứng dụng liên lạc với thẻ Liên lạc trường gần (NFC), thẻ và trình đọc."</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"vô hiệu hoá khoá phím"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Cho phép ứng dụng vô hiệu hoá khoá phím và bất kỳ bảo mật mật khẩu được liên kết nào. Ví dụ thích hợp của việc này là điện thoại vô hiệu hoá khoá phím khi nhận được cuộc gọi đến sau đó bật lại khoá phím khi cuộc gọi kết thúc."</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"đọc cài đặt đồng bộ hoá"</string>
@@ -1019,4 +1025,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"Chọn tài khoản"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"Tăng dần"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"Giảm dần"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"Điều hướng về trang chủ"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"Điều hướng lên trên"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"Tùy chọn khác"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
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-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 42a7995..3386f97 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"允许修改收集的电池使用情况统计信息。普通应用程序不能使用此权限。"</string>
     <string name="permlab_backup" msgid="470013022865453920">"控制系统备份和还原"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"允许应用程序控制系统的备份和还原机制。普通应用程序不能使用此权限。"</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"显示未授权的窗口"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"允许创建专用于内部系统用户界面的窗口。普通应用程序不能使用此权限。"</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"显示系统级警报"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"允许应用程序查看本地蓝牙手机的配置,以及建立或接受与配对设备的连接。"</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"控制近距离通信"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"允许应用程序与近距离通信 (NFC) 标签、卡和读卡器进行通信。"</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"停用键锁"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"允许应用程序停用键锁和任何关联的密码安全设置。例如,在手机上接听电话时停用键锁,在通话结束后重新启用键锁。"</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"读取同步设置"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"选择帐户"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"增加"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"减少"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"导航首页"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"向上导航"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"更多选项"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 6d8e1f4..d4a0243 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -240,6 +240,10 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"允修改收集到的電池用量統計資料。一般應用程式不應使用這項功能。"</string>
     <string name="permlab_backup" msgid="470013022865453920">"控制系統備份與還原"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"允許應用程式控制系統的備份與還原機制。一般應用程式不應使用這項功能。"</string>
+    <!-- no translation found for permlab_confirm_full_backup (5557071325804469102) -->
+    <skip />
+    <!-- no translation found for permdesc_confirm_full_backup (9005017754175897954) -->
+    <skip />
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"顯示未授權視窗"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"允許內部系統使用介面建立視窗。一般應用程式不會使用此功能。"</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"顯示系統警示"</string>
@@ -446,6 +450,10 @@
     <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"允許應用程式檢視本機藍牙電話設定,並與其他配對裝置連線。"</string>
     <string name="permlab_nfc" msgid="4423351274757876953">"控制近距離無線通訊"</string>
     <string name="permdesc_nfc" msgid="9171401851954407226">"允許應用程式使用近距離無線通訊 (NFC) 標記、卡片及讀取程式進行通訊。"</string>
+    <!-- no translation found for permlab_vpn (8345800584532175312) -->
+    <skip />
+    <!-- no translation found for permdesc_vpn (5617893078989944219) -->
+    <skip />
     <string name="permlab_disableKeyguard" msgid="4977406164311535092">"停用按鍵鎖定"</string>
     <string name="permdesc_disableKeyguard" msgid="3189763479326302017">"允許應用程式停用按鍵鎖定以及其他相關的密碼安全性。例如:收到來電時解除按鍵鎖定,通話結束後重新啟動按鍵鎖定。"</string>
     <string name="permlab_readSyncSettings" msgid="6201810008230503052">"讀取同步處理設定"</string>
@@ -1019,4 +1027,13 @@
     <string name="choose_account_label" msgid="4191313562041125787">"選取帳戶"</string>
     <string name="number_picker_increment_button" msgid="4830170763103463443">"增加"</string>
     <string name="number_picker_decrement_button" msgid="2576606679160067262">"減少"</string>
+    <string name="action_bar_home_description" msgid="5293600496601490216">"瀏覽首頁"</string>
+    <string name="action_bar_up_description" msgid="2237496562952152589">"向上瀏覽"</string>
+    <string name="action_menu_overflow_description" msgid="2295659037509008453">"更多選項"</string>
+    <!-- no translation found for storage_internal (7556050805474115618) -->
+    <skip />
+    <!-- no translation found for storage_sd_card (8921771478629812343) -->
+    <skip />
+    <!-- no translation found for storage_usb (3017954059538517278) -->
+    <skip />
 </resources>
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 dac3bd2..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" />
@@ -1913,6 +1920,22 @@
                  more information. -->
             <enum name="hardware" value="2" />
         </attr>
+
+        <!-- Defines the direction of layout drawing. This typically is associated with writing
+             direction of the language script used. The possible values are Left-to-Right,
+             Right-to-Left, Locale and Inherit from parent view. If there is nothing to inherit,
+             Locale is used. Locale fallsback to 'en-US'. Left-to-Right is the direction used in
+             'en-US'. The default for this attribute is 'inherit'. -->
+        <attr name="horizontalDirection">
+            <!-- Left-to-Right -->
+            <enum name="ltr" value="0" />
+            <!-- Right-to-Left -->
+            <enum name="rtl" value="1" />
+            <!-- Inherit from parent -->
+            <enum name="inherit" value="2" />
+            <!-- Locale -->
+            <enum name="locale" value="3" />
+        </attr>
     </declare-styleable>
 
     <!-- Attributes that can be used with a {@link android.view.ViewGroup} or any
@@ -2858,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
@@ -4888,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">
@@ -4956,4 +4978,21 @@
         <!-- Y coordinate of the icon hot spot. -->
         <attr name="hotSpotY" format="float" />
     </declare-styleable>
+
+    <declare-styleable name="Storage">
+        <!-- path to mount point for the storage --> 
+        <attr name="mountPoint" format="string" />
+        <!-- user visible description of the storage -->
+        <attr name="storageDescription" format="string" />
+        <!-- true if the storage is the primary external storage -->
+        <attr name="primary" format="boolean" />
+        <!-- true if the storage is removable -->
+        <attr name="removable" format="boolean" />
+        <!-- true if the storage is emulated via the FUSE sdcard daemon -->
+        <attr name="emulated" format="boolean" />
+        <!-- number of megabytes of storage MTP should reserve for free storage
+             (used for emulated storage that is shared with system's data partition) -->
+        <attr name="mtpReserve" format="integer" />
+    </declare-styleable>
+
 </resources>
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 1463bc7..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 physical screen size has changed.  If applications don't
-             target at least {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}
+        <!-- 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). -->
+             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).  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 652d791..1957b2a 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -1667,7 +1667,9 @@
   <public type="attr" name="textEditSuggestionsBottomWindowLayout" />
   <public type="attr" name="textEditSuggestionsTopWindowLayout" />
   <public type="attr" name="textEditSuggestionItemLayout" />
+  <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 0e826aa..816546b 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1313,6 +1313,14 @@
       with Near Field Communication (NFC) tags, cards, and readers.</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_vpn">intercept and modify all network traffic</string>
+    <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permdesc_vpn">Allows an application to intercept and
+      inspect all network traffic, for example to establish a VPN connection.
+      Malicious applications may monitor, redirect, or modify network packets
+      without your knowledge.</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_disableKeyguard">disable keylock</string>
     <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
     <string name="permdesc_disableKeyguard">Allows an application to disable
@@ -1844,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>
 
@@ -1990,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>
@@ -2441,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] -->
@@ -2820,4 +2845,13 @@
     <string name="action_bar_up_description">Navigate up</string>
     <!-- Content description for the action menu overflow button. [CHAR LIMIT=NONE] -->
     <string name="action_menu_overflow_description">More options</string>
+
+    <!-- Storage description for internal storage. [CHAR LIMIT=NONE] -->
+    <string name="storage_internal">Internal Storage</string>
+
+    <!-- Storage description for the SD card. [CHAR LIMIT=NONE] -->
+    <string name="storage_sd_card">SD Card</string>
+
+    <!-- Storage description for USB storage. [CHAR LIMIT=NONE] -->
+    <string name="storage_usb">USB storage</string>
 </resources>
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index 2d44f62..e95094f0 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -574,12 +574,12 @@
 
     <style name="Widget.ScrollView">
         <item name="android:scrollbars">vertical</item>
-        <item name="android:fadingEdge">none</item>
+        <item name="android:fadingEdge">vertical</item>
     </style>
 
     <style name="Widget.HorizontalScrollView">
         <item name="android:scrollbars">horizontal</item>
-        <item name="android:fadingEdge">none</item>
+        <item name="android:fadingEdge">horizontal</item>
     </style>
 
     <style name="Widget.ListView" parent="Widget.AbsListView">
@@ -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/res/res/xml/storage_list.xml b/core/res/res/xml/storage_list.xml
new file mode 100644
index 0000000..944bb3a
--- /dev/null
+++ b/core/res/res/xml/storage_list.xml
@@ -0,0 +1,40 @@
+<?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.
+*/
+-->
+
+<!-- The <device> element should contain one or more <storage> elements.
+     Exactly one of these should have the attribute primary="true".
+     This storage will be the primary external storage and should have mountPoint="/mnt/sdcard".
+     Each storage should have both a mountPoint and storageDescription attribute.
+     The following attributes are optional:
+
+        primary:    (boolean) this storage is the primary external storage
+        removable:  (boolean) this is removable storage (for example, a real SD card)
+        emulated:   (boolean) the storage is emulated via the FUSE sdcard daemon
+        mtpReserve: (integer) number of megabytes of storage MTP should reserve for free storage
+                     (used for emulated storage that is shared with system's data partition)
+
+      A storage should not have both emulated and removable set to true
+-->
+
+<StorageList xmlns:android="http://schemas.android.com/apk/res/android">
+    <!-- removable is not set in nosdcard product -->
+    <storage android:mountPoint="/mnt/sdcard"
+    		 android:storageDescription="@string/storage_usb"
+    		 android:primary="true" />
+</StorageList>
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/community/index.html b/docs/html/community/index.html
new file mode 100644
index 0000000..fb2a0d35
--- /dev/null
+++ b/docs/html/community/index.html
@@ -0,0 +1,10 @@
+<html>
+<head>
+<meta http-equiv="refresh" content="0;url=http://developer.android.com/resources/community-groups.html">
+<title>Redirecting...</title>
+</head>
+<body>
+<p>You should have been redirected. Please <a
+href="http://developer.android.com/resources/community-groups.html">click here</a>.</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/community/index.jd b/docs/html/community/index.jd
deleted file mode 100644
index 23203c1..0000000
--- a/docs/html/community/index.jd
+++ /dev/null
@@ -1,127 +0,0 @@
-community=true
-page.title=Community
-@jd:body
-
-	<div id="mainBodyFluid">
-<h1>Community</h1>
-<p>Welcome to the Android developers community! We're glad you're here and invite you to participate in these discussions. Before posting, please read the <a href="http://source.android.com/community/groups-charter.html">Groups Charter</a> that covers the community guidelines.</p>
-
-<p class="note"><strong>Note:</strong> If you are seeking discussion about Android source code (not application development),
-then please refer to the <a href="http://source.android.com/community">Open Source Project Mailing lists</a>.</p>
-
-<p style="margin-bottom:.5em"><strong>Contents</strong></p>
-<ol class="toc">
-  <li><a href="#BeforeYouPost">Before you post</a></li>
-  <li><a href="#ApplicationDeveloperLists">Application developer mailing lists</a></li>
-  <li><a href="#UsingEmail">Using email with the mailing lists</a></li>
-  <li><a href="#UsingIRC">Using IRC</a></li>
-</ol>
-
-<h2 id="BeforeYouPost">Before you post</h2>
-<p>Before writing a post, please try the following:</p>
-
-<ol>
-<li><a href="{@docRoot}guide/appendix/faq/index.html">Read the FAQs</a> The most common questions about developing Android applications are addressed in this frequently updated list.</li>
-<li><strong>Type in keywords of your questions in the main Android site's search bar</strong> (such as the one above). This search encompasses all previous discussions, across all groups, as well as the full contents of the site, documentation, and blogs. Chances are good that somebody has run into the same issue before.</li>
-<li><b>Search the mailing list archives</b> to see whether your questions have already been discussed.
-  </li>
-</ol>
-
-<p>If you can't find your answer, then we encourage you to address the community.
-As you write your post, please do the following:
-<ol>
-<li><b>Read
-the <a href="http://source.android.com/community/groups-charter.html">mailing list charter</a></b> that covers the community guidelines. 
-</li>
-<li><b>Select the most appropriate mailing list for your question</b>. There are several different lists for 
-developers, described below.</li>
-<li>
-    <b>Be very clear</b> about your question
-in the subject -- it helps everyone, both those trying to answer your
-question as well as those who may be looking for information in the
-future.</li>
-<li><b>Give plenty of details</b> in your post to
-help others understand your problem. Code or log snippets, as well as
-pointers to screenshots, may also be helpful. For a great guide to
-phrasing your questions, read <a href="http://www.catb.org/%7Eesr/faqs/smart-questions.html">How To Ask Questions The Smart Way</a>.
-  </li>
-</ol>
-
-
-<h3 id="ApplicationDeveloperLists">Application developer mailing lists</h3>
-<ul>
-<li><b>Android beginners</b> - You're new to Android application development. You want to figure out how to get started with the Android SDK and the basic Android APIs? Start here. This list is open to any discussion around beginner-type questions for developers using the SDK; this is a great way to get up and running with your new application on the Android platform. Ask about getting your development environment set up, get help with the first steps of Android development (your first User Interface, your first permission, your first file on the Android filesystem, your first app on the Android Market...). Be sure to check the archives first before asking new questions. Please avoid advanced subjects, which belong on android-developers, and user questions, which will get a better reception on android-discuss.
-<ul>
-<li>Subscribe using Google Groups:&nbsp;<a href="http://groups.google.com/group/android-beginners">android-beginners</a></li>
-<li>Subscribe via email:&nbsp;<a href="mailto:android-beginners-subscribe@googlegroups.com">android-beginners-subscribe@googlegroups.com</a></li>
-</ul>
-</li>
-
-<li><b>Android developers</b> - You're now an experienced Android application developer. You've grasped the basics of Android app development, you're comfortable using the SDK, now you want to move to advanced topics. Get help here with troubleshooting applications, advice on implementation, and strategies for improving your application's performance and user experience. This is the not the right place to discuss user issues (use android-discuss for that) or beginner questions with the Android SDK (use android-beginners for that).
-<ul>
-<li>Subscribe using Google Groups:&nbsp;<a href="http://groups.google.com/group/android-developers">android-developers</a></li>
-<li>Subscribe via email:&nbsp;<a href="mailto:android-developers-subscribe@googlegroups.com">android-developers-subscribe@googlegroups.com</a></li>
-</ul>
-</li>
-
-<li><b>Android discuss</b> - The "water cooler" of Android discussion. You can discuss just about anything Android-related here, ideas for the Android platform, announcements about your applications, discussions about Android devices, community resources... As long as your discussion is related to Android, it's on-topic here. However, if you have a discussion here that could belong on another list, you are probably not reaching all of your target audience here and may want to consider shifting to a more targeted list.
-<ul>
-<li>Subscribe using Google Groups:&nbsp;<a href="http://groups.google.com/group/android-discuss">android-discuss</a></li>
-<li>Subscribe via email:&nbsp;<a href="mailto:android-discuss-subscribe@googlegroups.com">android-discuss-subscribe@googlegroups.com</a></li>
-</ul>
-</li>
-
-<li><b>Android ndk</b> - A place for discussing the Android NDK and topics related to using native code in Android applications. 
-<ul>
-<li>Subscribe using Google Groups:&nbsp;<a href="http://groups.google.com/group/android-ndk">android-ndk</a></li>
-<li>Subscribe via email:&nbsp;<a href="mailto:android-ndk-subscribe@googlegroups.com">android-ndk-subscribe@googlegroups.com</a></li>
-</ul>
-</li>
-
-<li><b>Android security discuss</b> - A place for open discussion on secure development, emerging security concerns, and best practices for and by android developers. Please don't disclose vulnerabilities directly on this list, you'd be putting all Android users at risk.
-<ul>
-<li>Subscribe using Google Groups:&nbsp;<a href="http://groups.google.com/group/android-security-discuss">android-security-discuss</a></li>
-<li>Subscribe via email:&nbsp;<a href="mailto:android-security-discuss@googlegroups.com">android-security-discuss@googlegroups.com</a></li>
-</ul>
-</li>
-
-<li><b>Android security announce</b> - A low-volume group for security-related announcements by the Android Security Team.
-<ul>
-<li>Subscribe using Google Groups:&nbsp;<a href="http://groups.google.com/group/android-security-announce">android-security-announce</a></li>
-<li>Subscribe via email:&nbsp;<a href="mailto:android-security-announce-subscribe@googlegroups.com">android-security-announce-subscribe@googlegroups.com</a></li>
-</ul>
-</li>
-
-<li><b>Android Market Help Forum</b> - A web-based discussion forum where you can ask questions or report issues relating to Android Market.
-<ul>
-<li>URL:&nbsp;<a href="http://www.google.com/support/forum/p/Android+Market?hl=en">http://www.google.com/support/forum/p/Android+Market?hl=en</a></li>
-</ul>
-</li>
-
-</ul>
-
-
-
-<h2 id="UsingEmail">Using email with the mailing lists</h2>
-<p>Instead of using the <a href="http://groups.google.com/">Google Groups</a> site, you can use your email client of choice to participate in the mailing lists.</p>
-<p>To subscribe to a group without using the Google Groups site, use the link under "subscribe via email" in the lists above.</p>
-<p>To set up how you receive mailing list postings by email:</p>
-
-<ol><li>Sign into the group via the Google Groups site. For example, for the android-framework group you would visit <a href="http://groups.google.com/group/android-framework">http://groups.google.com/group/android-framework</a>.</li>
-<li>Click "Edit
-my membership" on the right side.</li>
-<li>Under "How do
-you want to read this group?" select one of the email options. </li>
-</ol>
-
-<h2 id="UsingIRC">Using IRC</h2>
-<p>The Android community is using the #android channel on the irc.freenode.net server.
-</p>
-
-
-
-
-
-
-
-</div>
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/samples/index.html b/docs/html/guide/samples/index.html
new file mode 100644
index 0000000..f4acdbf
--- /dev/null
+++ b/docs/html/guide/samples/index.html
@@ -0,0 +1,10 @@
+<html>
+<head>
+<meta http-equiv="refresh" content="0;url=http://developer.android.com/resources/browser.html?tag=sample">
+<title>Redirecting...</title>
+</head>
+<body>
+<p>You should have been redirected. Please <a
+href="http://developer.android.com/resources/browser.html?tag=sample">click here</a>.</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/guide/samples/index.jd b/docs/html/guide/samples/index.jd
deleted file mode 100644
index 4b9334f..0000000
--- a/docs/html/guide/samples/index.jd
+++ /dev/null
@@ -1,15 +0,0 @@
-guide=true
-page.title=Sample Code
-@jd:body
-
-
-<script type="text/javascript">
-  window.location = toRoot + "resources/browser.html?tag=sample";
-</script>
-
-<p><strong>This document has moved. Please go to <a
-href="http://developer.android.com/resources/browser.html?tag=sample">List of Sample
-Apps</a>.</strong></p>
-
-
-
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/graphics/opengl.jd b/docs/html/guide/topics/graphics/opengl.jd
index 1f51c2d..9f88954 100644
--- a/docs/html/guide/topics/graphics/opengl.jd
+++ b/docs/html/guide/topics/graphics/opengl.jd
@@ -5,13 +5,15 @@
 
 
 <p>Android includes support for high performance 3D graphics 
-via the OpenGL API &mdash; specifically, the OpenGL ES API.</p>
+via the OpenGL API&mdash;specifically, the OpenGL ES API.</p>
 
-<p>OpenGL ES is a flavor of the OpenGL specification intended for embedded
-devices. Versions of <a href="http://www.khronos.org/opengles/">OpenGL ES</a> are loosely peered to versions of the primary
-OpenGL standard. Android currently supports OpenGL ES 1.0, which corresponds
-to OpenGL 1.3. So, if the application you have in mind is possible with OpenGL
-1.3 on a desktop system, it should be possible on Android.</p>
+<p>OpenGL ES is a flavor of the OpenGL specification intended for embedded devices. Versions of <a
+href="http://www.khronos.org/opengles/">OpenGL ES</a> are loosely peered to versions of the primary
+OpenGL standard. Beginning with Android 2.2, the platform supports OpenGL ES 2.0 (with
+backward compatibility support for OpenGL ES 1.1). For information about the relative number of
+Android-powered devices that support a given version of OpenGL ES, see the <a
+href="http://developer.android.com/resources/dashboard/opengl.html">OpenGL ES Versions</a>
+dashboard.</p>
 
 <p>The specific API provided by Android is similar to the J2ME JSR239 OpenGL
 ES API. However, it may not be identical, so watch out for deviations.</p>
@@ -21,17 +23,18 @@
 <p>Here's how to use the API at an extremely high level:</p>
 
 <ol>
-<li>Write a custom View subclass.</li>
+<li>Write a custom {@link android.view.View} subclass.</li>
 <li>Obtain a handle to an OpenGLContext, which provides access to the OpenGL functionality.</li>
-<li>In your View's onDraw() method, get a handle to a GL object, and use its methods to perform GL operations.</li>
+<li>In your View's {@link android.view.View#onDraw onDraw()} method, get a handle to a GL object,
+and use its methods to perform GL operations.</li>
 </ol>
 
-<p>For an example of this usage model (based on the classic GL ColorCube), showing how to use
-it with threads can be found in 
-<a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/GLSurfaceViewActivity.html">com.android.samples.graphics.GLSurfaceViewActivity.java</a>.
+<p>Several samples using OpenGL ES are available in the <a
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/index.html">API
+Demos</a> sample application.
 </p>
 
-<p>Writing a summary of how to actually write 3D applications using OpenGL is
+<p>A summary of how to actually write 3D applications using OpenGL is
 beyond the scope of this text and is left as an exercise for the reader.</p>
 
 <h2>Links to Additional Information</h2>
@@ -45,9 +48,6 @@
 at <a title="http://www.khronos.org/opengles/1_X/"
 href="http://www.khronos.org/opengles/1_X/">http://www.khronos.org/opengles/1_X/</a>.</p>
 
-<p>The documentation for the Android {@link javax.microedition.khronos.opengles
-OpenGL ES implementations} are also available.</p>
+<p>The documentation for the Android OpenGL ES implementations are available in {@link
+android.opengl} and {@link javax.microedition.khronos.opengles}.</p>
 
-<p>Finally, note that though Android does include some basic support for
-OpenGL ES 1.1, the support is <strong>not complete</strong>, and should not be relied
-upon at this time.</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/guide/topics/usb/adk.jd b/docs/html/guide/topics/usb/adk.jd
index 44d7fc2..8aaa65c 100644
--- a/docs/html/guide/topics/usb/adk.jd
+++ b/docs/html/guide/topics/usb/adk.jd
@@ -6,7 +6,9 @@
       <h2>In this document</h2>
 
       <ol>
+        <li><a href="#components">ADK Components</a></li>
         <li>
+
           <a href="#getting-started">Getting Started with the ADK</a>
 
           <ol>
@@ -54,16 +56,28 @@
         </li>
       </ol>
 
-      <h2>Where to Buy</h2>
+      
+
+      <h2>See also</h2>
+
+      <ol>
+        <li><a href="http://www.youtube.com/watch?v=s7szcpXf2rE">Google I/O Session Video</a></li>
+        <li><a href="{@docRoot}guide/topics/usb/accessory.html">USB Accessory Dev Guide</a></li>
+      </ol>
+      
+      <h2>Where to buy</h2>
 
       <ol>
         <li><a href=
-        "http://www.rt-shop.sakura.ne.jp/rt-shop/index.php?main_page=product_info&amp;products_id=2731&language=en">
+        "http://www.rt-net.jp/shop/index.php?main_page=product_info&cPath=3_4&products_id=1">
         RT Corp</a></li>
 
         <li><a href=
         "http://www.microchip.com/android">
         Microchip</a></li>
+
+        <li><a href="https://store.diydrones.com/ProductDetails.asp?ProductCode=BR-PhoneDrone">
+        DIY Drones</a></li>
       </ol>
     </div>
   </div>
@@ -79,7 +93,7 @@
   released Android-powered devices are only capable of acting as a USB device and cannot initiate
   connections with external USB devices. Android Open Accessory support overcomes this limitation
   and allows you to build accessories that can interact with an assortment of Android-powered
-  devices by allowing the accessory initiate the connection.</p>
+  devices by allowing the accessory to initiate the connection.</p>
 
   <p class="note"><strong>Note:</strong> Accessory mode is ultimately dependent on the device's
   hardware and not all devices will support accessory mode. Devices that support accessory mode can
@@ -87,20 +101,29 @@
   Android manifest. For more information, see the <a href=
   "{@docRoot}guide/topics/usb/accessory.html#manifest">USB Accessory</a> Developer Guide.</p>
 
+  <p>The following list of distributers are currently producing Android Open Accessory compatible
+  development boards:</p>
+
+  <ul>
+    <li><a href="http://www.rt-net.jp/shop/index.php?main_page=product_info&cPath=3_4&products_id=1">
+    RT Corp</a> provides an Arduino-compatible board based on the Android ADK board design.</li>
+    <li><a href="http://www.microchip.com/android">Microchip</a> provides a A PIC based USB
+    microcontroller board.</li>
+    <li><a href="https://store.diydrones.com/ProductDetails.asp?ProductCode=BR-PhoneDrone">DIY
+    Drones</a> provides an Arduino-compatible board geared towards RC (radio controlled) and UAV
+    (unmanned aerial vehicle) enthusiasts.</li>
+  </ul>
+
+  <p>We expect more hardware distributers to create a variety of kits, so please stay tuned for
+  further developments.</p>
+
+  <h2 id="components">ADK Components</h2>
   <p>The Android Open Accessory Development Kit (ADK) provides an implementation of an Android USB
   accessory that is based on the <a href="http://www.arduino.cc/">Arduino open source electronics
   prototyping platform</a>, the accessory's hardware design files, code that implements the
   accessory's firmware, and the Android application that interacts with the accessory. The hardware
-  design files and code are contained in the <a href=
-  "https://dl-ssl.google.com/android/adk/adk_release_0506.zip">ADK package download</a>. You can
-  <a href=
-  "http://www.rt-shop.sakura.ne.jp/rt-shop/index.php?main_page=product_info&amp;products_id=2731&language=en">buy
-  the hardware components</a> of the ADK if you do not already have them. There is also a <a href=
-  "http://www.microchip.com/android">
-  PIC based USB microcontroller</a> that is not based on the ADK design, but that you can still use
-  to create your own Android open accessories. We expect more hardware distributers to create a
-  variety of kits, so please stay tuned for further developments.</p>
-
+  design files and firmware code are contained in the <a href=
+  "https://dl-ssl.google.com/android/adk/adk_release_0512.zip">ADK package download</a>.</p>
   <p>The main hardware and software components of the ADK include:</p>
 
   <ul>
@@ -138,7 +161,6 @@
     how to setup communication with the device.</li>
 
     <li>Other third party libraries to support the ADK board's functionality:
-
       <ul>
         <li><a href="http://www.arduino.cc/playground/Main/CapSense">CapSense library</a></li>
 
@@ -150,11 +172,12 @@
         <li><a href="http://www.arduino.cc/playground/Code/Spi">Spi library</a></li>
 
         <li><a href="http://www.arduino.cc/en/Reference/Wire">Wire library</a></li>
+
+        <li>An Android application, DemoKit, that communicates with the ADK board and shield. The
+        source for this project is in the <code>app/</code> directory.</li>
       </ul>
     </li>
 
-    <li>An Android application, DemoKit, that communicates with the ADK board and shield. The
-    source for this project is in the <code>app/</code> directory.</li>
   </ul>
 
   <h2 id="getting-started">Getting Started with the ADK</h2>
@@ -172,7 +195,7 @@
     libraries to sense human capacitance. This is needed for the capacative button that is located
     on the ADK shield.</li>
 
-    <li><a href="">The ADK package</a>: contains the firmware for the ADK board and hardware design
+    <li><a href="https://dl-ssl.google.com/android/adk/adk_release_0512.zip">The ADK package</a>: contains the firmware for the ADK board and hardware design
     files for the ADK board and shield.</li>
   </ul>
 
@@ -190,7 +213,7 @@
       otherwise.</p>
     </li>
 
-    <li><a href="https://dl-ssl.google.com/android/adk/adk_release_0506.zip">Download</a> and
+    <li><a href="https://dl-ssl.google.com/android/adk/adk_release_0512.zip">Download</a> and
     extract the ADK package to a directory of your choice. You should have an <code>app</code>,
     <code>firmware</code>, and <code>hardware</code> directories.</li>
 
@@ -419,7 +442,7 @@
   mode, the accessory cannot discern whether the device supports accessory mode and is not in that
   state, or if the device does not support accessory mode at all. This is because devices that
   support accessory mode but aren't in it initially report the device's manufacturer vendor ID and
-  product ID, and not the special Google ones. In either case, the accessory should try to start
+  product ID, and not the special Android Open Accessory ones. In either case, the accessory should try to start
   the device into accessory mode to figure out if the device supports it. The following steps
   explain how to do this:</p>
 
diff --git a/docs/html/guide/tutorials/hello-world.html b/docs/html/guide/tutorials/hello-world.html
new file mode 100644
index 0000000..55187bd
--- /dev/null
+++ b/docs/html/guide/tutorials/hello-world.html
@@ -0,0 +1,10 @@
+<html>
+<head>
+<meta http-equiv="refresh" content="0;url=http://developer.android.com/resources/tutorials/hello-world.html">
+<title>Redirecting...</title>
+</head>
+<body>
+<p>You should have been redirected. Please <a
+href="http://developer.android.com/resources/tutorials/hello-world.html">click here</a>.</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/guide/tutorials/hello-world.jd b/docs/html/guide/tutorials/hello-world.jd
deleted file mode 100644
index 11e6497..0000000
--- a/docs/html/guide/tutorials/hello-world.jd
+++ /dev/null
@@ -1,569 +0,0 @@
-page.title=Hello, World
-@jd:body
-
-<div id="qv-wrapper">
-  <div id="qv">
-    <h2>In this document</h2>
-    <ol>
-      <li><a href="#avd">Create an AVD</a></li>
-      <li><a href="#create">Create the Project</a></li>
-      <li><a href="#ui">Construct the UI</a></li>
-      <li><a href="#run">Run the Code</a></li>
-      <li><a href="#upgrading">Upgrade the UI to an XML Layout</a></li>
-      <li><a href="#debugging">Debug Your Project</a></li>
-      <li><a href="#noeclipse">Creating the Project Without Eclipse</a></li>
-    </ol>
-  </div>
-</div>
-
-<p>As a developer, you know that the first impression
-of a development framework is how easy it is to write "Hello,
-World." Well, on Android, it's pretty easy. 
-It's particularly easy if you're using Eclipse as your IDE, because we've provided a
-great plugin that handles your project creation and management to greatly speed-up your
-development cycles.</p>
-
-<p>If you are not using Eclipse, the tools provided by the Android SDK are accessible
-on the command line, so you can choose your IDE or text editor.
-For more information about developing with the Android SDK tools, see
-the <a href="{@docRoot}guide/developing/index.html">Overview</a>
-section for developing on Android.</p>
-
-<p>Before you start, you should already have the very latest SDK installed, and if you're using
-Eclipse, you should have installed the ADT plugin as well. If you have not installed these, see 
-<a href="{@docRoot}sdk/installing.html">Installing the Android SDK</a> and return
-here when you've completed the installation.</p>
-
-<h2 id="avd">Create an AVD</h2>
-
-<div class="sidebox-wrapper">
-  <div class="sidebox">
-    <p>To learn more about how to use AVDs and the options 
-       available to you, refer to the 
-       <a href="{@docRoot}guide/developing/tools/avd.html">Android 
-       Virtual Devices</a> document.</p>
-  </div>
-</div>
-
-<p>In this tutorial, you will run your application in the Android Emulator.
-Before you can launch the emulator, you must create an 
-Android Virtual Device (AVD). An AVD defines the system image and
-device settings used by the emulator.</p>
-
-<p>To create an AVD, use the "android" tool provided in the Android SDK.
-Open a command prompt or terminal, navigate to the 
-<code>tools/</code> directory in the SDK package and execute:
-<pre>
-android create avd --target 2 --name my_avd
-</pre>
-
-<p>The tool now asks if you would like to create a custom hardware profile.
-For the time being, press Return to skip it ("no" is the default response). 
-That's it. This configures an AVD named "my_avd" that uses the Android 1.5
-platform. The AVD is now ready for use in the emulator.</p>
-
-<p>In the above command, the <code>--target</code> option is required 
-and specifies the deployment target to run on the emulator.
-The <code>--name</code> option is also required and defines the 
-name for the new AVD.</p>
-
-
-<h2 id="create">Create a New Android Project</h2>
-
-<p>After you've created an AVD, the next step is to start a new
-Android project in Eclipse.</p>
-
-<ol>
-    <li>From Eclipse, select <strong>File &gt; New &gt; Project</strong>. 
-      <p>If the ADT
-      Plugin for Eclipse has been successfully installed, the resulting dialog
-      should have a folder labeled "Android" which should contain
-      "Android Project". (After you create one or more Android projects, an entry for 
-      "Android XML File" will also be available.)</p>
-    </li>
-
-    <li>Select "Android Project" and click <strong>Next</strong>.<br/>
-      <a href="images/hello_world_0.png"><img src="images/hello_world_0.png" style="height:230px" alt="" /></a>
-    </li>
-
-    <li>Fill in the project details with the following values:
-        <ul>
-          <li><em>Project name:</em> HelloAndroid</li>
-          <li><em>Application name:</em> Hello, Android</li>
-          <li><em>Package name:</em> com.example.helloandroid (or your own private namespace)</li>
-          <li><em>Create Activity:</em> HelloAndroid</li>
-          <li><em>Min SDK Version:</em> 2</li>
-        </ul>
-        <p>Click <strong>Finish</strong>.</p>
-
-        <a href="images/hello_world_1.png"><img src="images/hello_world_1.png" style="height:230px" alt="" /></a>
-
-        <p>Here is a description of each field:</p>
-      
-        <dl>
-            <dt><em>Project Name</em></dt>
-                <dd>This is the Eclipse Project name &mdash; the name of the directory
-                that will contain the project files.</dd>
-            <dt><em>Application Name</em></dt>
-                <dd>This is the human-readable title for your application &mdash; the name that
-                will appear on the Android device.</dd>
-            <dt><em>Package Name</em></dt>
-                <dd>This is the package namespace (following the same rules as for
-                  packages in the Java programming language) that you want all your source code to
-                  reside under. This also sets the package name under which the stub
-                  Activity will be generated.
-                  <p>Your package name must be unique across
-                  all packages installed on the Android system; for this reason, it's very
-                  important to use a standard domain-style package for your
-                  applications.  The example above uses the "com.example" namespace, which is
-                  a namespace reserved for example documentation &mdash;
-                  when you develop your own applications, you should use a namespace that's
-                  appropriate to your organization or entity.</p></dd>
-            <dt><em>Create Activity</em></dt>
-                <dd>This is the name for the class stub that will be generated by the plugin.
-                This will be a subclass of Android's {@link android.app.Activity} class.  An 
-                Activity is simply a class that can run and do work. It can create a UI if it 
-                chooses, but it doesn't need to. As the checkbox suggests, this is optional, but an
-                Activity is almost always used as the basis for an application.</dd>
-            <dt><em>Min SDK Version</em></dt>
-                <dd>This value specifies the minimum API Level required by your application. If the API Level
-                entered here matches the API Level provided by one of the available targets, 
-                then that Build Target will be automatically selected (in this case, entering 
-                "2" as the API Level will select the Android 1.1 target). With each new
-                version of the Android system image and Android SDK, there have likely been 
-                additions or changes made to the APIs. When this occurs, a new API Level is assigned
-                to the system image to regulate which applications are allowed to be run. If an
-                application requires an API Level that is <em>higher</em> than the level supported 
-                by the device, then the application will not be installed.</dd>
-        </dl>
-      
-        <p><em>Other fields</em>: The checkbox for "Use default location" allows you to change 
-        the location on disk where the project's files will be generated and stored. "Build Target"
-        is the platform target that your application will be compiled against 
-        (this should be selected automatically, based on your Min SDK Version).</p>
-
-        <p class="note">Notice that the "Build Target" you've selected uses the Android 1.1
-        platform. This means that your application will be compiled against the Android 1.1 
-        platform library. If you recall, the AVD created above runs on the Android 1.5 platform.
-        These don't have to match; Android applications are forward-compatible, so an application
-        built against the 1.1 platform library will run normally on the 1.5 platform. The reverse
-        is not true.</p>
-    </li>
-</ol>
-
-<p>Your Android project is now ready. It should be visible in the Package
-Explorer on the left.
-Open the <code>HelloAndroid.java</code> file, located inside <em>HelloAndroid > src > 
-com.example.helloandroid</em>). It should look like this:</p>
-
-<pre>
-package com.example.helloandroid;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class HelloAndroid extends Activity {
-    /** Called when the activity is first created. */
-    &#64;Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}</pre>
-
-<p>Notice that the class is based on the {@link android.app.Activity} class. An Activity is a 
-single application entity that is used to perform actions. An application may have many separate 
-activities, but the user interacts with them one at a time. The 
-{@link android.app.Activity#onCreate(Bundle) onCreate()} method 
-will be called by the Android system when your Activity starts &mdash;
-it is where you should perform all initialization and UI setup. An activity is not required to
-have a user interface, but usually will.</p>
-
-<p>Now let's modify some code! </p>
-
-
-<h2 id="ui">Construct the UI</h2>
-
-<p>Take a look at the revised code below and then make the same changes to your HelloAndroid class.
-The bold items are lines that have been added.</p>
-
-<pre>
-package com.android.helloandroid;
-
-import android.app.Activity;
-import android.os.Bundle;
-<strong>import android.widget.TextView;</strong>
-
-public class HelloAndroid extends Activity {
-   /** Called when the activity is first created. */
-   &#64;Override
-   public void onCreate(Bundle savedInstanceState) {
-       super.onCreate(savedInstanceState);
-       <strong>TextView tv = new TextView(this);
-       tv.setText(&quot;Hello, Android&quot;);
-       setContentView(tv);</strong>
-   }
-}</pre>
-
-<p class="note"><strong>Tip:</strong> An easy way to add import packages to your project is
-to press <strong>Ctrl-Shift-O</strong> (<strong>Cmd-Shift-O</strong>, on Mac). This is an Eclipse 
-shortcut that identifies missing packages based on your code and adds them for you.</p>
-
-<p>An Android user interface is composed of hierarchies of objects called
-Views. A {@link android.view.View} is a drawable object used as an element in your UI layout, 
-such as a button, image, or (in this case) a text label. Each of these objects is a subclass
-of the View class and the subclass that handles text is {@link android.widget.TextView}.</p>
-
-<p>In this change, you create a TextView with the class constructor, which accepts
-an Android {@link android.content.Context} instance as its parameter. A
-Context is a handle to the system; it provides services like
-resolving resources, obtaining access to databases and preferences, and so
-on. The Activity class inherits from Context, and because your
-HelloAndroid class is a subclass of Activity, it is also a Context. So, you can
-pass <code>this</code> as your Context reference to the TextView.</p>
-
-<p>Next, you define the text content with 
-{@link android.widget.TextView setText(CharSequence) setText()}.</p>
-
-<p>Finally, you pass the TextView to
-{@link android.app.Activity#setContentView(View) setContentView()} in order to
-display it as the content for the Activity UI. If your Activity doesn't
-call this method, then no UI is present and the system will display a blank
-screen.</p>
-
-<p>There it is &mdash; "Hello, World" in Android! The next step, of course, is
-to see it running.</p>
-
-
-<h2 id="run">Run the Application</h2>
-
-<p>The Eclipse plugin makes it very easy to run your applications:</p>
-
-<ol>
-  <li>Select <strong>Run > Run</strong>.</li>
-  <li>Select "Android Application".</li>
-</ol>
-
-<div class="sidebox-wrapper">
-  <div class="sidebox">
-    <p>To learn more about creating and editing run configurations in Eclipse, refer to
-    <a href="{@docRoot}guide/developing/eclipse-adt.html#RunConfig">Developing In Eclipse, 
-    with ADT</a>.</p>
-  </div>
-</div>
-
-<p>The Eclipse ADT will automatically create a new run configuration for your project
-and the Android Emulator will automatically launch. Once the emulator is booted up,
-your application will appear after a moment. You should now see something like this:</p>
-
-  <a href="images/hello_world_5.png"><img src="images/hello_world_5.png" style="height:230px" alt="" /></a>
-
-<p>The "Hello, Android" you see in the grey bar is actually the application title. The Eclipse plugin
-creates this automatically (the string is defined in the <code>res/values/strings.xml</code> file and referenced
-by your <code>AndroidManifest.xml</code> file). The text below the title is the actual text that you have 
-created in the TextView object.</p>
-
-<p>That concludes the basic "Hello World" tutorial, but you should continue reading for some more
-valuable information about developing Android applications.</p>
-
-
-<h2 id="upgrading">Upgrade the UI to an XML Layout</h2>
-
-<p>The "Hello, World" example you just completed uses what is called a "programmatic"
-UI layout. This means that you constructed and built your application's UI
-directly in source code. If you've done much UI programming, you're
-probably familiar with how brittle that approach can sometimes be: small
-changes in layout can result in big source-code headaches. It's also very
-easy to forget to properly connect Views together, which can result in errors in
-your layout and wasted time debugging your code.</p>
-
-<p>That's why Android provides an alternate UI construction model: XML-based
-layout files. The easiest way to explain this concept is to show an
-example. Here's an XML layout file that is identical in behavior to the
-programmatically-constructed example:</p>
-
-<pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
-&lt;TextView xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
-  android:layout_width=&quot;fill_parent&quot;
-  android:layout_height=&quot;fill_parent&quot;
-  android:text=&quot;@string/hello&quot;/&gt;</pre>
-
-<p>The general structure of an Android XML layout file is simple: it's a tree
-of XML elements, wherein each node is the name of a View class 
-(this example, however, is just one View element). You can use the
-name of any class that extends {@link android.view.View} as an element in your XML layouts,
-including custom View classes you define in your own code. This
-structure makes it very easy to quickly build up UIs, using a more simple
-structure and syntax than you would use in a programmatic layout. This model is inspired
-by the web development model, wherein you can separate the presentation of your
-application (its UI) from the application logic used to fetch and fill in data.</p>
-
-<p>In the above XML example, there's just one View element: the <code>TextView</code>, 
-which has four XML attributes.  Here's a summary of what they mean:</p>
-
-<table>
-    <tbody>
-        <tr>
-            <th>
-                Attribute
-            </th>
-            <th>
-                Meaning
-            </th>
-        </tr>
-        <tr>
-            <td>
-                <code>xmlns:android</code>
-            </td>
-            <td>
-                This is an XML namespace declaration that tells the Android tools that you are going to refer to common attributes defined in the Android namespace. The outermost tag in every Android layout file must have this attribute.<br>
-            </td>
-        </tr>
-        <tr>
-            <td>
-                <code>android:layout_width</code>
-            </td>
-            <td>
-                This attribute defines how much of the available width on the screen this View should consume. 
-In this case, it's the only View so you want it to take up the entire screen, which is what a value of "fill_parent" means.<br>
-            </td>
-        </tr>
-        <tr>
-            <td>
-                <code>android:layout_height</code>
-            </td>
-            <td>
-                This is just like android:layout_width, except that it refers to available screen height.
-            </td>
-        </tr>
-        <tr>
-            <td>
-                <code>android:text</code>
-            </td>
-            <td>
-                This sets the text that the TextView should display. In this example, you use a string 
-                resource instead of a hard-coded string value.
-                The <em>hello</em> string is defined in the <em>res/values/strings.xml</em> file. This is the
-                recommended practice for inserting strings to your application, because it makes the localization
-                of your application to other languages graceful, without need to hard-code changes to the layout file.
-                For more information, see <a href="{@docRoot}guide/topics/resources/resources-i18n.html">Resources
-                and Internationalization</a>.
-            </td>
-        </tr>
-    </tbody>
-</table>
-
-
-<p>These XML layout files belong in the <code>res/layout/</code> directory of your project. The "res" is
-short for "resources" and the directory contains all the non-code assets that
-your application requires. In addition to layout files, resources also include assets
-such as images, sounds, and localized strings.</p>
-
-<div class="sidebox-wrapper">
-<div class="sidebox">
-  <h2>Landscape layout</h2>
-  <p>When you want a different design for landscape, put your layout XML file
-  inside /res/layout-land. Android will automatically look here when the layout changes.
-  Without this special landscape layout defined, Android will stretch the default layout.</p>
-</div>
-</div>
-
-<p>The Eclipse plugin automatically creates one of these layout files for you: main.xml. 
-In the "Hello World" application you just completed, this file was ignored and you created a 
-layout programmatically. This was meant to teach you more
-about the Android framework, but you should almost always define your layout 
-in an XML file instead of in your code.
-The following procedures will instruct you how to change your 
-existing application to use an XML layout.</p>
-
-<ol>
-  <li>In the Eclipse Package Explorer, expand the
-<code>/res/layout/</code> folder and open <code>main.xml</code> (once opened, you might need to click 
-the "main.xml" tab at the bottom of the window to see the XML source). Replace the contents with
-the following XML:
-
-<pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
-&lt;TextView xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
-  android:layout_width=&quot;fill_parent&quot;
-  android:layout_height=&quot;fill_parent&quot;
-  android:text=&quot;@string/hello&quot;/&gt;</pre>
-<p>Save the file.</p>
-</li>
-
-<li>Inside the <code>res/values/</code> folder, open <code>strings.xml</code>.
-This is where you should save all default text strings for your user interface. If you're using Eclipse, then
-ADT will have started you with two strings, <em>hello</em> and <em>app_name</em>. 
-Revise <em>hello</em> to something else. Perhaps "Hello, Android! I am a string resource!"
-The entire file should now look like this:
-<pre>
-&lt;?xml version="1.0" encoding="utf-8"?>
-&lt;resources>
-    &lt;string name="hello">Hello, Android! I am a string resource!&lt;/string>
-    &lt;string name="app_name">Hello, Android&lt;/string>
-&lt;/resources>
-</pre>
-</li>
-
-<li>Now open and modify your <code>HelloAndroid</code> class use the
-XML layout. Edit the file to look like this:
-<pre>
-package com.example.helloandroid;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class HelloAndroid extends Activity {
-    /** Called when the activity is first created. */
-    &#64;Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}</pre>
-
-<p>When you make this change, type it by hand to try the 
-code-completion feature. As you begin typing "R.layout.main" the plugin will offer you
-suggestions. You'll find that it helps in a lot of situations.</p>
-
-<p>Instead of passing <code>setContentView()</code> a View object, you give it a reference 
-to the layout resource.
-The resource is identified as <code>R.layout.main</code>, which is actually a compiled object representation of
-the layout defined in <code>/res/layout/main.xml</code>. The Eclipse plugin automatically creates this reference for
-you inside the project's R.java class. If you're not using Eclipse, then the R.java class will be generated for you
-when you run Ant to build the application. (More about the R class in a moment.)</p>
-</li>
-</ol>
-
-<p>Now re-run your application &mdash; because you've created a launch configuration, all
-you need to do is click the green arrow icon to run, or select 
-<strong>Run &gt; Run History &gt; Android Activity</strong>. Other than the change to the TextView
-string, the application looks the same. After all, the point was to show that the two different
-layout approaches produce identical results.</p>
-
-<p class="note"><strong>Tip:</strong> Use the shortcut <strong>Ctrl-F11</strong> 
-(<strong>Cmd-Shift-F11</strong>, on Mac) to run your currently visible application.</p>
-
-<p>Continue reading for an introduction
-to debugging and a little more information on using other IDEs. When you're ready to learn more,
-read <a href="{@docRoot}guide/topics/fundamentals.html">Application
-Fundamentals</a> for an introduction to all the elements that make Android applications work. 
-Also refer to the <a href="{@docRoot}guide/index.html">Developer's Guide</a>
-introduction page for an overview of the <em>Dev Guide</em> documentation.</p>
-
-
-<div class="special">
-<h3>R class</h3>
-<p>In Eclipse, open the file named <code>R.java</code> (in the <code>gen/</code> [Generated Java Files] folder). 
-It should look something like this:</p>
-
-<pre>
-package com.example.helloandroid;
-
-public final class R {
-    public static final class attr {
-    }
-    public static final class drawable {
-        public static final int icon=0x7f020000;
-    }
-    public static final class layout {
-        public static final int main=0x7f030000;
-    }
-    public static final class string {
-        public static final int app_name=0x7f040001;
-        public static final int hello=0x7f040000;
-    }
-}
-</pre>
-
-<p>A project's <code>R.java</code> file is an index into all the resources defined in the
-file. You use this class in your source code as a sort of short-hand
-way to refer to resources you've included in your project. This is
-particularly powerful with the code-completion features of IDEs like Eclipse 
-because it lets you quickly and interactively locate the specific reference
-you're looking for.</p>
-
-<p>It's possible yours looks slighly different than this (perhaps the hexadecimal values are different). 
-For now, notice the inner class named "layout", and its
-member field "main". The Eclipse plugin noticed the XML
-layout file named main.xml and generated a class for it here.  As you add other
-resources to your project (such as strings in the <code>res/values/string.xml</code> file or drawables inside
-the <code>res/drawable/</code> direcory) you'll see <code>R.java</code> change to keep up.</p>
-<p>When not using Eclipse, this class file will be generated for you at build time (with the Ant tool).</p>
-<p><em>You should never edit this file by hand.</em></p>
-</div>
-
-<h2 id="debugging">Debug Your Project</h2>
-
-<p>The Android Plugin for Eclipse also has excellent integration with the Eclipse
-debugger. To demonstrate this, introduce a bug into
-your code. Change your HelloAndroid source code to look like this:</p>
-
-<pre>
-package com.android.helloandroid;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class HelloAndroid extends Activity {
-    /** Called when the activity is first created. */
-    &#64;Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        Object o = null;
-        o.toString();
-        setContentView(R.layout.main);
-    }
-}</pre>
-
-<p>This change simply introduces a NullPointerException into your code. If
-you run your application again, you'll eventually see this:</p>
-
-  <a href="images/hello_world_8.png"><img src="images/hello_world_8.png" style="height:230px" alt="" /></a>
-
-<p>Press "Force Quit" to terminate the application and close the emulator window.</p>
-
-<p>To find out more about the error, set a breakpoint in your source code 
-on the line <code>Object o = null;</code> (double-click on the marker bar next to the source code line). Then select <strong>Run &gt; Debug History &gt; Hello, 
-Android</strong> from the menu to enter debug mode. Your app will restart in the 
-emulator, but this time it will suspend when it reaches the breakpoint you
-set. You can then step through the code in Eclipse's Debug Perspective,
-just as you would for any other application.</p>
-
-  <a href="images/hello_world_9.png"><img src="images/hello_world_9.png" style="height:230px" alt="" /></a>
-
-
-<h2 id="noeclipse">Creating the Project without Eclipse</h2>
-  
-  <p>If you don't use Eclipse (such as if you prefer another IDE, or simply use text
-  editors and command line tools) then the Eclipse plugin can't help you.
-  Don't worry though &mdash; you don't lose any functionality just because you don't
-  use Eclipse.</p>
-  
-  <p>The Android Plugin for Eclipse is really just a wrapper around a set of tools
-  included with the Android SDK. (These tools, like the emulator, aapt, adb,
-  ddms, and others are <a href="{@docRoot}guide/developing/tools/index.html">documented elsewhere.</a>) 
-  Thus, it's possible to
-  wrap those tools with another tool, such as an 'ant' build file.</p>
-  
-  <p>The Android SDK includes a tool named "android" that can be
-  used to create all the source code and directory stubs for your project, as well
-  as an ant-compatible <code>build.xml</code> file. This allows you to build your project
-  from the command line, or integrate it with the IDE of your choice.</p>
-  
-  <p>For example, to create a HelloAndroid project similar to the one created
-  in Eclipse, use this command:</p>
-  
-  <pre>
-android create project \
-    --package com.android.helloandroid \
-    --activity HelloAndroid \ 
-    --target 2 \
-    --path <em>&lt;path-to-your-project></em>/HelloAndroid 
-</pre>
-
-  <p>This creates the required folders and files for the project at the location 
-  defined by the <em>path</em>.</p>
-  
-  <p>For more information on how to use the SDK tools to create and build projects on the command line, read
-<a href="{@docRoot}guide/developing/projects/index.html">Creating and Managing Projects on the Command Line</a> and
-<a href="{@docRoot}guide/developing/building/building-cmdline.html">Building and Running Apps on the Command Line</a>.</p>
diff --git a/docs/html/guide/tutorials/index.html b/docs/html/guide/tutorials/index.html
index 4881acf..e412dec 100644
--- a/docs/html/guide/tutorials/index.html
+++ b/docs/html/guide/tutorials/index.html
@@ -1,8 +1,10 @@
 <html>
 <head>
-<meta http-equiv="refresh" content="0;url=../index.html">
+<meta http-equiv="refresh" content="0;url=http://developer.android.com/resources/browser.html?tag=tutorial">
+<title>Redirecting...</title>
 </head>
 <body>
-<a href="../index.html">click here</a> if you are not redirected.
+<p>You should have been redirected. Please <a
+href="http://developer.android.com/resources/browser.html?tag=tutorial">click here</a>.</p>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/html/guide/tutorials/localization/index.html b/docs/html/guide/tutorials/localization/index.html
new file mode 100644
index 0000000..2ea6661
--- /dev/null
+++ b/docs/html/guide/tutorials/localization/index.html
@@ -0,0 +1,10 @@
+<html>

+<head>

+<meta http-equiv="refresh" content="0;url=http://developer.android.com/resources/tutorials/localization/index.html">

+<title>Redirecting...</title>

+</head>

+<body>

+<p>You should have been redirected. Please <a

+href="http://developer.android.com/resources/tutorials/localization/index.html">click here</a>.</p>

+</body>

+</html>
\ No newline at end of file
diff --git a/docs/html/guide/tutorials/localization/index.jd b/docs/html/guide/tutorials/localization/index.jd
deleted file mode 100755
index 8a60814..0000000
--- a/docs/html/guide/tutorials/localization/index.jd
+++ /dev/null
@@ -1,593 +0,0 @@
-page.title=Hello, L10N

-@jd:body

-

-<div id="qv-wrapper">

-  <div id="qv">

-    <h2>In this document</h2>

-    <ol>

-      <li><a href="#unlocalized">Create an Unlocalized App</a>

-        <ol>

-          <li><a href="#create">Create the Project and Layout</a></li>

-          <li><a href="#default">Create Default Resources</a></li>

-        </ol>

-      </li>

-      <li><a href="#run">Run the Unlocalized App</a></li>

-      <li><a href="#plan">Plan the Localization</a></li>

-      <li><a href="#localize">Localize the App</a>

-        <ol>

-          <li><a href="#localize_strings">Localize the Strings</a></li>

-          <li><a href="#localize_images">Localize the Images</a></li>

-        </ol>

-      </li>

-      <li><a href="#test_localized">Run and Test the Localized App</a></li>

-    </ol>

-    <h2>See also</h2>

-    <ol>

-<li>{@link android.widget.Button}</li>

-<li>{@link android.widget.TextView}</li>

-<li>{@link android.app.AlertDialog}</li>

-</ol>

-  </div>

-</div>

-

-<p>In this tutorial, we will create a Hello, L10N application that uses the

-Android framework to selectively load resources. Then we will localize the

-application by adding resources to the <code>res/</code> directory. </p>

-

-<p>This tutorial uses the practices described in the <a

-href="{@docRoot}guide/topics/resources/localization.html">Localization</a>

-document. </p>

-

-

-<h2 id="unlocalized">Create an Unlocalized Application</h2>

-

-<p>The first version of the Hello, L10N application will use only the default

-resource directories (<code>res/drawable</code>, <code>res/layout</code>, and

-<code>res/values</code>). These resources are not localized &#8212; they are the

-graphics, layout, and strings  that we expect the application to use most often.

-When a user runs the application in the default locale, or in a locale that the

-application does not specifically support, the application will load resources

-from these default directories.</p>

-

-<p>The application consists of a simple user interface that displays two

-{@link android.widget.TextView} objects and a {@link android.widget.Button} image with a

-  background image of a national flag. When clicked, the button displays an

-{@link android.app.AlertDialog} object that shows additional text. </p>

-

-<h3 id="create">Create the Project and Layout</h3>

-

-<p>For this application, the default language will be British English and the

-default location the United Kingdom. </p>

-

-<ol>

-  <li>Start a new project and Activity called &quot;HelloL10N.&quot; If you are

-using Eclipse, fill out these values in the New Android Project wizard:

-    <ul>

-      <li><em>Project name:</em> HelloL10N</li>

-      <li><em>Application name:</em> Hello, L10N</li>

-      <li><em>Package name:</em> com.example.hellol10n (or your own private

-namespace)</li>

-      <li><em>Create Activity:</em> HelloL10N</li>

-      <li><em>Min SDK Version:</em> 3</li>

-    </ul>

-    <p>The basic  project contains a <code>res/</code> directory with

-subdirectories for the three most common types of resources: graphics

-(<code>res/drawable/</code>), layouts (<code>res/layout/</code>) and strings

-(<code>res/values/</code>). Most of the localization work you do later in this

-tutorial will involve adding more subdirectories to the <code>res/</code>

-directory.</p>

-    <img src="{@docRoot}images/hello_l10n/plain_project.png" alt="plain project" width="194"

-height="229">

-  </li>

-  <li>Open the <code>res/layout/main.xml</code> file and replace it with the

-following code:

-    <pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;

-&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;

-    android:orientation=&quot;vertical&quot;

-    android:layout_width=&quot;fill_parent&quot;

-    android:layout_height=&quot;fill_parent&quot;

-    &gt;

-&lt;TextView

-    android:layout_width=&quot;fill_parent&quot; 

-    android:layout_height=&quot;wrap_content&quot;

-    android:gravity=&quot;center_horizontal&quot;

-    android:text=&quot;@string/text_a&quot;

-    /&gt;

-&lt;TextView

-    android:layout_width=&quot;fill_parent&quot;

-    android:layout_height=&quot;wrap_content&quot;

-    android:gravity=&quot;center_horizontal&quot;

-    android:text=&quot;@string/text_b&quot;

-    /&gt;

-&lt;Button

-    android:id=&quot;@+id/flag_button&quot;

-    android:layout_width=&quot;wrap_content&quot;

-    android:layout_height=&quot;wrap_content&quot;

-    android:layout_gravity=&quot;center&quot;

-    /&gt;

-&lt;/LinearLayout&gt;

-    </pre>

-

-  <p>The LinearLayout has two {@link android.widget.TextView} objects that will

-display localized text and one  {@link android.widget.Button} that shows a flag.

-</p>

-  </li>

-</ol>

-

-<h3 id="default">Create Default Resources</h3>

-

-<p>The layout refers to resources that need to be defined. </p>

-

-<ol>

-  <li>Create default text strings. To do this, open the <code>res/values/strings.xml</code> file and replace it with the following code:<br>

-    <pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;

-&lt;resources&gt;

-    &lt;string name=&quot;app_name&quot;&gt;Hello, L10N&lt;/string&gt;

-    &lt;string name=&quot;text_a&quot;&gt;Shall I compare thee to a summer&quot;'&quot;s day?&lt;/string&gt;

-    &lt;string name=&quot;text_b&quot;&gt;Thou art more lovely and more temperate.&lt;/string&gt;

-    &lt;string name=&quot;dialog_title&quot;&gt;No Localisation&lt;/string&gt;

-    &lt;string name=&quot;dialog_text&quot;&gt;This dialog box&quot;'&quot;s strings are not localised. For every locale, the text here will come from values/strings.xml.&lt;/string&gt;

-&lt;/resources&gt;</pre>

-

-  <p>This code provides British English text for each string that the application

-will use. When we localize this application, we will provide alternate text in

-German, French, and Japanese for some of the strings.</p>

-  </li>

-  <li>Add a default flag graphic to the <code>res/drawable</code> folder by

-saving <a href="../../../images/hello_l10n/flag.png">flag.png</a> as

-<code>res/drawable/flag.png</code>.  When the application is not localized, it

-will show a British flag.<br>

-    

-  </li>

-  <li>Open HelloL10N.java (in the <code>src/</code> directory) and add the

-following code inside the <code>onCreate()</code> method (after

-<code>setContentView</code>).

-

-    <pre>// assign flag.png to the button, loading correct flag image for current locale

-Button b;

-(b = (Button)findViewById(R.id.flag_button)).setBackgroundDrawable(this.getResources().getDrawable(R.drawable.flag));

-

-// build dialog box to display when user clicks the flag

-AlertDialog.Builder builder = new AlertDialog.Builder(this);

-builder.setMessage(R.string.dialog_text)

-    .setCancelable(false)

-    .setTitle(R.string.dialog_title)

-    .setPositiveButton("Done", new DialogInterface.OnClickListener() {

-        public void onClick(DialogInterface dialog, int id) {

-        dialog.dismiss();

-        }

-    });

-final AlertDialog alert = builder.create();

-

-// set click listener on the flag to show the dialog box 

-b.setOnClickListener(new View.OnClickListener() {

-    public void onClick(View v) {

-	alert.show();

-    }

-    });</pre>

-

-    <p class="note"><strong>Tip:</strong> In Eclipse, use

-<strong>Ctrl-Shift-O</strong> (<strong>Cmd-Shift-O</strong>, on Mac) to find and

-add missing import packages to your project, then save the HelloL10N.java

-file.</p>

-

-    <p>The code that you added does the following:</p>

-

-    <ul>

-      <li>It assigns the correct flag icon to the button. 

-        For now, no resources are defined other than the default, so this code

-will always assign the contents of <code>res/drawable/flag.png</code> (the

-British flag) as the flag icon, no matter what the locale. Once we add more

-flags for different locales, this code will sometimes assign a different flag.

-</li>

-      <li>It creates an {@link android.app.AlertDialog} object and sets a click listener so that when the

-user clicks the button, the AlertDialog will display. 

-        We will not localize the dialog text; 

-the AlertDialog will always display the <code>dialog_text</code> that is located

-within <code>res/values/strings.xml</code>. </li>

-    </ul>

-

-  </li>

-</ol>

-

-<p>The project structure now looks like this:</p>

-

-  <img src="{@docRoot}images/hello_l10n/nonlocalized_project.png" alt="nonlocalized" width="394"

-height="320">

-

-<p class="note"><strong>Tip:</strong> If you will want to run the application on

-a device and not just on an emulator, open <code>AndroidManifest.xml</code> and

-add <code>android:debuggable="true"</code> inside the

-<code>&lt;application&gt;</code> element. For information about setting up the

-device itself so it can run applications from your system, see <a

-href="{@docRoot}guide/developing/device.html">Developing on a Device</a>.</p>

-

-

-<h2 id="run">Run the Unlocalized Application</h2>

-

-<p>Save the project and run the application to see how it works. No matter what

-locale your device or emulator is set to, the application runs the same way. It

-should look something like this:</p>

-

-<table border="0" cellspacing="0" cellpadding="30">

-  <tr>

-    <th scope="col">The unlocalized application, running in any locale:</th>

-    <th scope="col">After clicking the flag, in any locale:</th>

-  </tr>

-  <tr>

-    <td valign="top"><img src="{@docRoot}images/hello_l10n/nonlocalized_screenshot1.png"

-alt="nonlocalized" width="321" height="366"></td>

-    <td><img src="{@docRoot}images/hello_l10n/nonlocalized_screenshot2.png" alt="nonlocalized2"

-width="321" height="366"></td>

-  </tr>

-</table>

-<h2 id="plan">Plan the Localization</h2>

-<p>The first step in localizing an application is to plan how the application

-will render differently in different locales. In this application, the default 

-locale will be the United Kingdom. We will add some locale-specific information

-for Germany, France, Canada, Japan, and the United States. Table 1 shows the

-plan for how the application will appear in different locales.</p>

-

-<p class="caption">Table 1</p>

-

-<table border="0" cellspacing="0" cellpadding="10">

-  <tr>

-    <th scope="col" valign="bottom">Region /<br />

-    Language</th>

-    <th scope="col">United Kingdom</th>

-    <th scope="col">Germany</th>

-    <th scope="col">France</th>

-    <th scope="col">Canada</th>

-    <th scope="col">Japan</th>

-    <th scope="col">United States</th>

-    <th scope="col">Other Location</th>

-  </tr>

-  <tr>

-    <th scope="row"><br>

-    English</th>

-    <td> British English text; British flag <em>(default)</em></td>

-    <td><em>-</em></td>

-    <td><em>-</em></td>

-    <td> British English text; Canadian flag</td>

-    <td>-</td>

-    <td> British English text; U.S. flag</td>

-    <td> British English text; British flag <em>(default)</em></td>

-  </tr>

-  <tr>

-    <th scope="row">German</th>

-    <td>-</td>

-    <td>German text for <code>app_name</code>, <code>text_a</code> and

-<code>text_b</code>; German flag</td>

-    <td>-</td>

-    <td>-</td>

-    <td>-</td>

-    <td>-</td>

-    <td>German text for <code>app_name</code>, <code>text_a</code> and

-<code>text_b</code>; British flag</td>

-  </tr>

-  <tr>

-    <th scope="row">French</th>

-    <td>-</td>

-    <td>-</td>

-    <td>French text for <code>app_name</code>, <code>text_a</code> and

-<code>text_b</code>; French flag</td>

-    <td>French text for <code>app_name</code>, <code>text_a</code> and

-<code>text_b</code>; Canadian flag</td>

-    <td>-</td>

-    <td>-</td>

-    <td>French text for <code>app_name</code>, <code>text_a</code> and

-<code>text_b</code>; British flag</td>

-  </tr>

-  <tr>

-    <th scope="row">Japanese</th>

-    <td>-</td>

-    <td>-</td>

-    <td>-</td>

-    <td>-</td>

-    <td>Japanese text for <code>text_a</code> and <code>text_b</code>; Japanese

-flag</td>

-    <td>-</td>

-    <td>Japanese text for <code>text_a</code> and <code>text_b</code>; British

-flag</td>

-  </tr>

-  <tr>

-    <th scope="row">Other Language</th>

-    <td>-</td>

-    <td>-</td>

-    <td>-</td>

-    <td>-</td>

-    <td>-</td>

-    <td>-</td>

-    <td> British English text; British flag <em>(default)</em></td>

-  </tr>

-</table>

-

-<p class="note"> Note that other behaviors are possible; for example, the

-application could support Canadian English or U.S. English text. But given the

-small amount of text involved, adding more versions of English  would not  make

-this application  more useful.</p>

-

-<p>As shown in the table above, the plan calls for five flag icons in addition

-to the British flag that is already in the <code>res/drawable/</code> folder. It

-also calls for three  sets of text strings other than the text  that is in

-<code>res/values/strings.xml</code>.</p>

-

-<p>Table 2 shows where the needed text strings and  flag icons will go, and

-specifies which ones will be loaded for which locales. (For more about the

-locale codes, <em></em>see <a

-href="{@docRoot}guide/topics/resources/resources-i18n.html#AlternateResources">

-Alternate Resources</a>.)</p>

-<p class="caption" id="table2">Table 2</p>

-

-<table border="1" cellspacing="0" cellpadding="5">

-  <tr>

-    <th scope="col">Locale Code</th>

-    <th scope="col">Language / Country</th>

-    <th scope="col">Location of strings.xml</th>

-    <th scope="col">Location of flag.png</th>

-  </tr>

-  <tr>

-    <td><em>Default</em></td>

-    <td>English / United Kingdom</td>

-    <td>res/values/</td>

-    <td>res/drawable/</td>

-  </tr>

-  <tr>

-    <td>de-rDE</td>

-    <td>German / Germany</td>

-    <td>res/values-de/</td>

-    <td>res/drawable-de-rDE/</td>

-  </tr>

-  <tr>

-    <td>fr-rFR</td>

-    <td>French / France</td>

-    <td>res/values-fr/</td>

-    <td>res/drawable-fr-rFR/</td>

-  </tr>

-  <tr>

-    <td>fr-rCA</td>

-    <td>French / Canada</td>

-    <td>res/values-fr/</td>

-    <td>res/drawable-fr-rCA/</td>

-  </tr>

-  <tr>

-    <td>en-rCA</td>

-    <td>English / Canada</td>

-    <td><em>(res/values/)</em></td>

-    <td>res/drawable-en-rCA/</td>

-  </tr>

-  <tr>

-    <td>ja-rJP</td>

-    <td>Japanese / Japan</td>

-    <td>res/values-ja/</td>

-    <td>res/drawable-ja-rJP/</td>

-  </tr>

-  <tr>

-    <td>en-rUS</td>

-    <td>English / United States</td>

-    <td><em>(res/values/)</em></td>

-    <td>res/drawable-en-rUS/</td>

-  </tr>

-</table>

-

-<p class="note"><strong>Tip: </strong>A folder qualifer cannot specify a region

-without a language. Having a folder named <code>res/drawable-rCA/</code>, 

-for example, will prevent the application from compiling. </p>

-

-<p>At run time, the application will select a set of resources to load based on the locale

-that is set in the user's device. In cases where no locale-specific resources

-are available, the application will fall back on the defaults. </p>

-

-<p>For example,   assume that the device's language is set to German and its

-location  to Switzerland. Because this application does not have a

-<code>res/drawable-de-rCH/</code> directory with a <code>flag.png</code> file in it, the system

-will fall back on the default, which is the UK flag located in

-<code>res/drawable/flag.png</code>. The language used will be German. Showing a

-British flag to German speakers in Switzerland is not ideal, but for now we will

-just leave the behavior as it is. There are several  ways you could improve this

-application's behavior if you wanted to:</p>

-

-<ul>

-  <li>Use a  generic default icon. In this application, it might be something

-that represents Shakespeare. </li>

-  <li>Create a <code>res/drawable-de/</code> folder that includes an icon that

-the application will use whenever the language is set to German but the location

-is not Germany. </li>

-</ul>

-

-

-<h2 id="localize">Localize the Application</h2>

-

-<h3 id="localize_strings">Localize the Strings</h3>

-

-<p>The application requires three more <code>strings.xml</code> files, one 

-each for German, French, and Japanese. To create these resource files within 

-Eclipse:</p>

-

-<ol>

-<li>Select <strong>File</strong> &gt; <strong>New</strong> &gt; <strong>Android 

-XML File</strong> to open the New Android XML File wizard. You can also open 

-the wizard by clicking its icon in the toolbar:<br />

-<img src="{@docRoot}images/hello_l10n/xml_file_wizard_shortcut.png" 

-alt="file_wizard_shortcut" width="297"

-height="90" style="margin:15px"></li>

-  <li>Select L10N for the Project field, and type <code>strings.xml</code> into 

-the File field. In the left-hand list, select Language, then click the right arrow.<br>

-<img src="{@docRoot}images/hello_l10n/xml_wizard1.png" alt="res_file_copy" width="335"

-height="406" style="margin:15px"></li>

-  <li>Type <code>de</code> in the Language box and click Finish.<br>

-    <img src="{@docRoot}images/hello_l10n/xml_wizard2.png" alt="res_file_copy" width="306"

-height="179">

-<p>A new file, <code>res/values-de/strings.xml</code>, now appears among the project 

-files.</p></li>

-<li>Repeat the steps twice more, for the language codes <code>fr</code> and	

-	<code>ja</code>.

-Now the project includes these new skeleton files: <br />

-    <code>res/<strong>values-de</strong>/strings.xml</code><br />

-    <code>res/<strong>values-fr</strong>/strings.xml</code><br />

-    <code>res/<strong>values-ja</strong>/strings.xml</code><br />

-  </li>

-  <li>Add localized text to the new files. To do

-this, open the <code>res/values-<em>&lt;qualifier&gt;</em>/strings.xml</code> files and

-replace the code as follows:</li>

-</ol>

-

-<table border="0" cellspacing="0" cellpadding="0">

-  <tr>

-    <th scope="col">File</th>

-    <th scope="col">Replace the contents with the following code:</th>

-  </tr>

-  <tr>

-    <td><code>res/values-de/strings.xml</code></td>

-    <td><pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;

-&lt;resources&gt;

-    &lt;string name=&quot;app_name&quot;&gt;Hallo, Lokalisierung&lt;/string&gt;

-    &lt;string name=&quot;text_a&quot;&gt;Soll ich dich einem Sommertag vergleichen,&lt;/string&gt;

-    &lt;string name=&quot;text_b&quot;&gt;Der du viel lieblicher und sanfter bist?&lt;/string&gt;

-&lt;/resources&gt;</pre></td>

-  </tr>

-  <tr>

-    <td><code>res/values-fr/strings.xml</code></td>

-    <td><pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;

-&lt;resources&gt;

-    &lt;string name=&quot;app_name&quot;&gt;Bonjour, Localisation&lt;/string&gt;

-    &lt;string name=&quot;text_a&quot;&gt;Irai-je te comparer au jour d'été?&lt;/string&gt;

-    &lt;string name=&quot;text_b&quot;&gt;Tu es plus tendre et bien plus tempéré.&lt;/string&gt;

-&lt;/resources&gt; </pre></td>

-  </tr>

-  <tr>

-    <td><code>res/values-ja/strings.xml</code></td>

-    <td>

-<pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;

-&lt;resources&gt;

-    &lt;string name=&quot;text_a&quot;&gt;あなたをなにかにたとえるとしたら夏の一日でしょうか?&lt;/string&gt;

-    &lt;string name=&quot;text_b&quot;&gt;だがあなたはもっと美しく、もっとおだやかです。&lt;/string&gt;

-&lt;/resources&gt;</pre></td>

-  </tr>

-</table>

-

-<p class="note"><b>Tip:</b> In the

-<code>values-<em>&lt;qualifier&gt;</em>/strings.xml</code> files, you only need to

-include text for strings that are different from the default strings. For

-example, when the application runs on a device that is configured for Japanese,

-the plan is for <code>text_a</code> and <code>text_b</code> to be in Japanese

-while all the other text is in English, so

-<code>res/values-ja/strings.xml</code> only needs to include <code>text_a</code>

-and <code>text_b</code>.</p>

-

-<h3 id="localize_images">Localize the Images</h3>

-

-<p>As shown in <a href="#table2">Table 2</a>, the application needs six more

-drawable folders, each containing a <code>flag.png</code> icon. Add the needed

-icons and folders to your project:</p>

-

-<ol>

-  <li>Save this <a href="../../../images/hello_l10n/drawable-de-rDE/flag.png">German flag icon</a>

-as <code>res/drawable-de-rDE/flag.png</code> in the application's project

-workspace. 

-    <p>For example:</p>

-    <ol>

-      <li>Click the link to open the flag image.</li>

-      <li>Save the image in

-<code><em>your-workspace</em>/HelloL10N/res/drawable-de-rDE/</code> .</li>

-    </ol>

-  </li>

-  <li>Save this <a href="../../../images/hello_l10n/drawable-fr-rFR/flag.png">French flag icon</a>

-as <code>res/drawable-fr-rFR/flag.png</code> in the application's project

-workspace. </li>

-  <li>Save this <a href="../../../images/hello_l10n/drawable-fr-rCA/flag.png">Canadian flag icon</a>

-as <code>res/drawable-fr-rCA/flag.png</code> in the project workspace. </li>

-  <li>Save the <a href="../../../images/hello_l10n/drawable-en-rCA/flag.png">Canadian flag icon</a>

-again, this time as <code>res/drawable-en-rCA/flag.png</code> in the project

-workspace.  (Why not have just <em>one</em> folder that contains the Canadian

-flag? Because a folder qualifer cannot specify a region without a language. 

-You cannot have a folder named <code>drawable-rCA/</code>; instead you must 

-create two separate folders, one for each of the Canadian languages represented 

-in the application.)</li>

-  <li>Save this <a href="../../../images/hello_l10n/drawable-ja-rJP/flag.png">Japanese flag icon</a>

-as <code>res/drawable-ja-rJP/flag.png</code> in the project workspace. </li>

-  <li>Save this <a href="../../../images/hello_l10n/drawable-en-rUS/flag.png">United States flag

-icon</a> as <code>res/drawable-en-rUS/flag.png</code> in the project workspace.

-  </li>

-</ol>

-

-<p>If you are using Eclipse, refresh the project (F5). The new

-<code>res/drawable-<em>&lt;qualifier&gt;</em>/</code> folders should appear in the

-project view. </p>

-

-

-<h2 id="test_localized">Run and Test the Localized Application</h2>

-

-<p>Once you've added the localized string and image resources, you are ready to 

-	run the application and test its handling of them. To change the locale 

-	on a device or in the emulator, use  the Settings

-application  (Home &gt; Menu &gt; Settings &gt; Locale &amp; text &gt; Select

-locale). Depending on how a device was configured, it might not offer any

-alternate locales via the Settings application, or might offer only a few. The

-emulator, on the other hand, will offer a selection of all the locales that are

-available in the Android system image. </p>

-

-<p>To set the emulator to a locale that is not available in the system image,

-use the  Custom Locale application, which is available in the Application

-tab:</p>

-

-<p><img src="{@docRoot}images/hello_l10n/custom_locale_app.png" alt="custom locale app" width="163"

-height="158" style="margin-left:15px"></p>

-

-<p>To switch to a new locale, long-press a  locale name:</p>

-

-<p><img src="{@docRoot}images/hello_l10n/using_custom_locale.png" alt="using custom locale"

-width="512" height="299" style="margin-left:15px"></p>

-

-<p>For a list of locales available on different versions of the Android platform,

-refer to the platform notes documents, listed under "Downloadable SDK Components"

-in the "SDK" tab. For example, <a 

-href="{@docRoot}sdk/android-2.0.html#locs">Android 2.0 locales</a>.</p>

-

-<p>Run the application for each of the expected locales, plus one unexpected

-locale. Here are some of the results you should see:</p>

-

-<table border="0" cellspacing="0" cellpadding="05">

-  <tr>

-    <th scope="col">Locale</th>

-    <th scope="col">Opening screen of application</th>

-  </tr>

-  <tr>

-    <td>German / Germany

-    	<br />Specifically supported by the Hello, L10N application.</td>

-    <td><img src="{@docRoot}images/hello_l10n/german_screenshot.png" alt="custom locale app"

-width="321" height="175" align="right"

-style="margin-left:10px;margin-right:20px"></td>

-  </tr>

-  <tr>

-    <td>French / Canada

-    	<br />Specifically supported by the Hello, L10N application.</td>

-    <td><img src="{@docRoot}images/hello_l10n/frenchCA_screenshot.png" alt="custom locale app"

-width="321" height="175" align="right"

-style="margin-left:10px;margin-right:20px"></td>

-  </tr>

-  <tr>

-    <td>German / Switzerland

-    	<br />Only the language is specifically supported by 

-the Hello, L10N  application.</td>

-    <td><img src="{@docRoot}images/hello_l10n/germanCH_screenshot.png" alt="custom locale app"

-width="321" height="175" align="right"

-style="margin-left:10px;margin-right:20px">`</td>

-  </tr>

-  <tr>

-    <td>Japanese

-    	<br />Specifically supported by  the Hello, L10N  application. 

-	</td>

-    <td><img src="{@docRoot}images/hello_l10n/japanese_screenshot.png" alt="custom locale app"

-width="321" height="220" align="right"

-style="margin-left:10px;margin-right:20px">`</td>

-  </tr>

-  <tr>

-    <td>Romansh / Switzerland (custom locale <code>rm_CH</code>)

-    	<br />Not specifically supported  by  the Hello, L10N 

-application, so the application uses the default resources.</td>

-    <td><img src="{@docRoot}images/hello_l10n/romanshCH_screenshot.png" alt="custom locale app"

-width="321" height="175" align="right"

-style="margin-left:10px;margin-right:20px"></td>

-  </tr>

-</table>

diff --git a/docs/html/guide/tutorials/notepad/index.html b/docs/html/guide/tutorials/notepad/index.html
new file mode 100644
index 0000000..01e4d09
--- /dev/null
+++ b/docs/html/guide/tutorials/notepad/index.html
@@ -0,0 +1,10 @@
+<html>
+<head>
+<meta http-equiv="refresh" content="0;url=http://developer.android.com/resources/tutorials/notepad/index.html">
+<title>Redirecting...</title>
+</head>
+<body>
+<p>You should have been redirected. Please <a
+href="http://developer.android.com/resources/tutorials/notepad/index.html">click here</a>.</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/guide/tutorials/notepad/index.jd b/docs/html/guide/tutorials/notepad/index.jd
deleted file mode 100644
index f569314..0000000
--- a/docs/html/guide/tutorials/notepad/index.jd
+++ /dev/null
@@ -1,142 +0,0 @@
-page.title=Notepad Tutorial
-@jd:body
-
-
-<p>This tutorial on writing a notepad application gives you a &quot;hands-on&quot; introduction
-to the Android framework and the  tools you use to build  applications on it.
-Starting from a preconfigured project file, it guides you through the process of
-developing a simple notepad application and provides concrete examples of how to
-set up the project,  develop the application logic and user interface, and then
-compile and run the application. </p>
-
-<p>The tutorial presents the application development as a set of 
-exercises (see below), each consisting of several steps. You should follow 
-the steps in each exercise to gradually build and refine your  
-application. The exercises explain each step in detail and provide all the 
-sample code you need to complete the application. </p>
-
-<p>When you are finished with the tutorial, you will have created a functioning
-Android application and will have learned many of the most important
-concepts in Android development. If you want to add more complex features to
-your application, you can examine the code in an alternative implementation
-of a Note Pad application, in the 
-<a href="{@docRoot}resources/samples/index.html">Sample Code</a> section. </p>
-
-
-<a name="who"></a>
-<h2>Who Should Use this Tutorial</h2>
-
-<p>This tutorial is designed for  experienced developers, especially those with 
-knowledge of the Java programming language. If you haven't written Java
-applications before, you can still use the tutorial, but you might need to work
-at a slower pace. </p>
-
-<p>Also note that this tutorial uses
-the Eclipse development environment, with the Android plugin installed. If you
-are not using Eclipse, you can  follow  the exercises and build the application,
-but you will need to determine how to accomplish the Eclipse-specific
-steps in your environment. </p>
-
-<a name="preparing"></a>
-<h2>Preparing for the Exercises</h2>
-
-<p>The tutorial  assumes that you have some familiarity with basic Android
-application concepts and terminology. If you are not, you
-should read <a href="{@docRoot}guide/topics/fundamentals.html">Application 
-Fundamentals</a> before continuing. </p>
-
-<p>This tutorial also builds on the introductory information provided in the 
-<a href="{@docRoot}resources/tutorials/hello-world.html">Hello World</a>
-tutorial, which explains how to set up your Eclipse environment
-for building Android applications. We recommend you complete the Hello World
-tutorial before starting this one.</p>
-
-<p>To prepare for this lesson:</p>
-
-<ol>
-  <li>Download the <a href="codelab/NotepadCodeLab.zip">project
-      exercises archive (.zip)</a>.</li>
-  <li>Unpack the archive file to a suitable location on your machine.</li>
-  <li>Open the <code>NotepadCodeLab</code> folder.</li>
-</ol>
-
-<p>Inside the <code>NotepadCodeLab</code> folder, you should see six project
-files: <code>Notepadv1</code>,
-    <code>Notepadv2</code>, <code>Notepadv3</code>,
-    <code>Notepadv1Solution</code>, <code>Notepadv2Solution</code>
-    and <code>Notepadv3Solution</code>. The <code>Notepadv#</code> projects are
-the starting points for each of the exercises, while the
-<code>Notepadv#Solution</code> projects are the exercise
-    solutions. If you are having trouble with a particular exercise, you
-    can compare your current work against the exercise solution.</p>
-
-<a name="exercises"></a>
-<h2> Exercises</h2>
-
-  <p>The table below lists the tutorial exercises and describes the development
-areas that each covers. Each exercise assumes that you have completed any
-previous exercises.</p>
-
-  <table border="0" style="padding:4px;spacing:2px;" summary="This
-table lists the
-tutorial examples and describes what each covers. ">
-    <tr>
-      <th width="120"><a href="{@docRoot}resources/tutorials/notepad/notepad-ex1.html">Exercise
-1</a></th>
-      <td>Start here. Construct a simple notes list that lets the user add new notes but not
-edit them. Demonstrates the basics of <code>ListActivity</code> and creating
-and handling
-      menu options. Uses a SQLite database to store the notes.</td>
-    </tr>
-    <tr>
-      <th><a href="{@docRoot}resources/tutorials/notepad/notepad-ex2.html">Exercise 2</a></th>
-      <td>Add a second Activity to the
-application. Demonstrates constructing a
-new Activity, adding it to the Android manifest, passing data between the
-activities, and using more advanced screen layout. Also shows how to
-invoke another Activity to return a result, using
-<code>startActivityForResult()</code>.</td>
-    </tr>
-    <tr>
-      <th><a href="{@docRoot}resources/tutorials/notepad/notepad-ex3.html">Exercise 3</a></th>
-      <td>Add handling of life-cycle events to
-the application, to let it
-maintain application state across the life cycle. </td>
-    </tr>
-    <tr>
-    <th><a href="{@docRoot}resources/tutorials/notepad/notepad-extra-credit.html">Extra
-Credit</a></th>
-    <td>Demonstrates how to use the Eclipse
-debugger and how you can use it to
-view life-cycle events as they are generated. This section is optional but
-highly recommended.</td>
-    </tr>
-</table>
-
-
-<a name="other"></a>
-<h2>Other Resources and Further Learning</h2>
-<ul>
-<li>For a lighter but broader introduction to concepts not covered in the
-tutorial,
-take a look at <a href="{@docRoot}resources/faq/commontasks.html">Common Android Tasks</a>.</li>
-<li>The Android SDK includes a variety of fully functioning sample applications
-that make excellent opportunities for further learning. You can find the sample
-applications in the <code>samples/</code> directory of your downloaded SDK, or browser them
-here, in the <a href="{@docRoot}resources/samples/index.html">Sample Code</a> section.</li>
-<li>This tutorial draws from the full Notepad application included in the
-<code>samples/</code> directory of the SDK, though it does not match it exactly. 
-When you are done with the tutorial,
-it is highly recommended that you take a closer look at this version of the Notepad
-application, 
-as it demonstrates a variety of interesting additions for your application, 
-such as:</li>
-  <ul>
-    <li>Setting up a custom striped list for the list of notes.</li>
-    <li>Creating a custom text edit view that overrides the <code>draw()</code>
-    method to make it look like a lined notepad.</li>
-    <li>Implementing a full <code>ContentProvider</code> for notes.</li>
-    <li>Reverting and discarding edits instead of just automatically saving
-    them.</li>
-  </ul>
-</ul>
diff --git a/docs/html/guide/tutorials/views/index.html b/docs/html/guide/tutorials/views/index.html
new file mode 100644
index 0000000..41d6796
--- /dev/null
+++ b/docs/html/guide/tutorials/views/index.html
@@ -0,0 +1,10 @@
+<html>
+<head>
+<meta http-equiv="refresh" content="0;url=http://developer.android.com/resources/tutorials/views/index.html">
+<title>Redirecting...</title>
+</head>
+<body>
+<p>You should have been redirected. Please <a
+href="http://developer.android.com/resources/tutorials/views/index.html">click here</a>.</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/html/guide/tutorials/views/index.jd b/docs/html/guide/tutorials/views/index.jd
deleted file mode 100644
index 4e76ab9..0000000
--- a/docs/html/guide/tutorials/views/index.jd
+++ /dev/null
@@ -1,118 +0,0 @@
-page.title=Hello, Views
-@jd:body
-
-<style>
-.view {float:left; margin:10px; font-size:120%; font-weight:bold;}
-.view img {border:1px solid black; margin:5px 0 0; padding:5px;}
-</style>
-
-<p>This collection of "Hello World"-style tutorials is designed
-to get you quickly started with common Android Views and widgets. The aim is to let you copy and paste
-these kinds of boring bits so you can focus on developing the code that makes your Android application rock.
-Of course, we'll discuss some of the given code so that it all makes sense.</p>
-
-<p>Note that a certain amount of knowledge is assumed for these tutorials. If you haven't
-completed the <a href="{@docRoot}resources/tutorials/hello-world.html">Hello, World</a> tutorial, 
-please do so&mdash;it will teach you many things you should know about basic 
-Android development and Eclipse features. More specifically, you should know:</p>
-<ul>
-  <li>How to create a new Android project.</li>
-  <li>The basic structure of an Android project (resource files, layout files, etc.).</li>
-  <li>The essential components of an {@link android.app.Activity}.</li>
-  <li>How to build and run a project.</li>
-</ul>
-<p>Please, also notice that, in order to make these tutorials simple, some may
-not convey the better Android coding practices. In particular, many of them
-use hard-coded strings in the layout files&mdash;the better practice is to reference strings from
-your strings.xml file.</p>
-<p>With this knowledge, you're ready to begin, so take your pick.</p>
-
-<div>
-
-<div class="view">
-<a href="hello-linearlayout.html">LinearLayout</a><br/>
-<a href="hello-linearlayout.html"><img src="images/hello-linearlayout.png" height="285" width="200" /></a>
-</div>
-<div class="view">
-<a href="hello-relativelayout.html">RelativeLayout</a><br/>
-<a href="hello-relativelayout.html"><img src="images/hello-relativelayout.png" height="285" width="200" /></a>
-</div>
-<div class="view">
-<a href="hello-tablelayout.html">TableLayout</a><br/>
-<a href="hello-tablelayout.html"><img src="images/hello-tablelayout.png" height="285" width="200" /></a>
-</div>
-
-<div class="view">
-<a href="hello-datepicker.html">DatePicker</a><br/>
-<a href="hello-datepicker.html"><img src="images/hello-datepicker.png" height="285" width="200" /></a>
-</div>
-
-<div class="view">
-<a href="hello-timepicker.html">TimePicker</a><br/>
-<a href="hello-timepicker.html"><img src="images/hello-timepicker.png" height="285" width="200" /></a>
-</div>
-<div class="view">
-<a href="hello-formstuff.html">Form Stuff</a><br/>
-<a href="hello-formstuff.html"><img src="images/hello-formstuff.png" height="285" width="200" /></a>
-</div>
-<div class="view">
-<a href="hello-spinner.html">Spinner</a><br/>
-<a href="hello-spinner.html"><img src="images/hello-spinner.png" height="285" width="200" /></a>
-</div>
-
-<div class="view">
-<a href="hello-autocomplete.html">AutoComplete</a><br/>
-<a href="hello-autocomplete.html"><img src="images/hello-autocomplete.png" height="285" width="200" /></a>
-</div>
-<div class="view">
-<a href="hello-listview.html">ListView</a><br/>
-<a href="hello-listview.html"><img src="images/hello-listview.png" height="285" width="200" /></a>
-</div>
-<div class="view">
-<a href="hello-gridview.html">GridView</a><br/>
-<a href="hello-gridview.html"><img src="images/hello-gridview.png" height="285" width="200" /></a>
-</div>
-
-<div class="view">
-<a href="hello-gallery.html">Gallery</a><br/>
-<a href="hello-gallery.html"><img src="images/hello-gallery.png" height="285" width="200" /></a>
-</div>
-
-<div class="view">
-<a href="hello-tabwidget.html">TabWidget</a><br/>
-<a href="hello-tabwidget.html"><img src="images/hello-tabwidget.png" height="285" width="200" /></a>
-</div>
-
-<div class="view">
-<a href="hello-mapview.html">MapView</a><br/>
-<a href="hello-mapview.html"><img src="images/hello-mapview.png" height="285" width="200" /></a>
-</div>
-
-<div class="view">
-<a href="hello-webview.html">WebView</a><br/>
-<a href="hello-webview.html"><img src="images/hello-webview.png" height="285" width="200" /></a>
-</div>
-
-<!--
-TODO
-
-<div class="view">
-<a href="hello-popupwindow.html">PopupWindow<br/>
-<img src="images/hello-popupwindow.png" height="285" width="200" /></a>
-</div>
-<div class="view">
-<a href="hello-tabhost.html">TabHost / TabWidget<br/>
-<img src="images/hello-tabhost.png" height="285" width="200" /></a>
-</div>
-ProgressBar; RatingBar; FrameLayout
-
--->
-
-<p class="note" style="clear:left">
-There are plenty more Views and widgets available. See the {@link android.view.View} class
-for more on View layouts, and the {@link android.widget widget package}
-for more useful widgets. And for more raw code samples, visit the 
-<a href="{@docRoot}guide/samples/ApiDemos/src/com/example/android/apis/view/index.html">Api Demos</a>.
-These can also be found offline, in <code>/&lt;sdk&gt;/samples/ApiDemos</code>.</p>
-</div>
-
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/docs/html/resources/articles/speech-input.jd b/docs/html/resources/articles/speech-input.jd
index d42bd59..736087ec 100644
--- a/docs/html/resources/articles/speech-input.jd
+++ b/docs/html/resources/articles/speech-input.jd
@@ -8,8 +8,9 @@
 on. </p>
 
 <p>Speech input adds another dimension to staying in touch.
-Google's Voice Search application, which is pre-installed on many Android devices,
-provides powerful features like "search by voice" and voice shortcuts like "Navigate to." Further
+Google's Voice Search application, which is pre-installed on many Android devices
+and available in Android Market, provides powerful features like "search by voice"
+and Voice Actions like "Navigate to." Further
 enhancing the voice experience, Android 2.1 introduces a <a
 href="http://www.youtube.com/watch?v=laOlkD8LmZw">
 voice-enabled keyboard</a>, which makes it even easier
@@ -66,9 +67,7 @@
 "Speak
 now" dialog and streaming audio to Google's servers -- the same servers used
 when a user taps the microphone button on the search widget or the voice-enabled
-keyboard. Voice Search is installed on all the major
-US devices, and it's also available on Market. You can check whether Voice
-Search is installed in 
+keyboard. You can check whether Voice Search is installed in 
 <strong>Settings > Applications > Manage applications</strong>. </p>
 
 <p> One important tip: for speech input to be as accurate as possible, it's
@@ -84,9 +83,12 @@
 model to improve dictation accuracy for the voice keyboard,
 while the "web search" model is used when users want to search by voice. </p> 
 
-<p> Google's servers currently support English, Mandarin Chinese, and Japanese. 
+<p> Google's servers support many languages for voice input, with more arriving
+regularly. You can use the
+{@link android.speech.RecognizerIntent#ACTION_GET_LANGUAGE_DETAILS}
+broadcast intent to query for the list of supported languages.
 The web search model is available in all three languages, while free-form has
 primarily been optimized for English. As we work hard to support more models in
 more languages, and to improve the accuracy of the speech recognition technology
 we use in our products, Android developers who integrate speech capabilities
-directly into their applications can reap the benefits as well. </p>
\ No newline at end of file
+directly into their applications can reap the benefits as well. </p>
diff --git a/docs/html/resources/resources-data.js b/docs/html/resources/resources-data.js
index 06a0d51..8d9b7b1 100644
--- a/docs/html/resources/resources-data.js
+++ b/docs/html/resources/resources-data.js
@@ -231,6 +231,16 @@
     }
   },
   {
+    tags: ['article', 'input', 'search', 'ui'],
+    path: 'articles/speech-input.html',
+    title: {
+      en: 'Speech Input'
+    },
+    description: {
+      en: 'This articles describes the basics of integrating speech recognition into Android applications.'
+    }
+  },
+  {
     tags: ['article', 'ui'],
     path: 'articles/touch-mode.html',
     title: {
diff --git a/docs/html/sdk/android-3.1.jd b/docs/html/sdk/android-3.1.jd
index 57fe1eb..992b7d1 100644
--- a/docs/html/sdk/android-3.1.jd
+++ b/docs/html/sdk/android-3.1.jd
@@ -107,8 +107,8 @@
 USB. </p>
 
 <p>The stack and APIs distinguish two basic types of USB hardware, based on
-whether the platform iself is acting as host or the external hardware is acting
-as host: </p>
+whether the Android-powered device is acting as host or the external hardware
+is acting as host: </p>
 
 <ul>
 <li>A <em>USB device</em> is a piece of connected hardware that depends on the
diff --git a/docs/html/sdk/oem-usb.jd b/docs/html/sdk/oem-usb.jd
index c94668f5..27e742a 100644
--- a/docs/html/sdk/oem-usb.jd
+++ b/docs/html/sdk/oem-usb.jd
@@ -36,6 +36,11 @@
 href="http://www.acer.com/worldwide/support/mobile.html">http://www.acer.com/worldwide/support/mobile.html</a>
     </td></tr>
   <tr>
+    <td style="font-variant:small-caps">alcatel one touch</td>
+    <td><a
+href="http://www.alcatel-mobilephones.com/global/Android-Downloads">http://www.alcatel-mobilephones.com/global/Android-Downloads</a></td>
+  </tr>
+  <tr>
     <td>Asus</td>
     <td><a href="http://support.asus.com/download/">http://support.asus.com/download/</a></td>
   </tr>
diff --git a/docs/html/videos/index.jd b/docs/html/videos/index.jd
index 50bdb46..7f5df78 100644
--- a/docs/html/videos/index.jd
+++ b/docs/html/videos/index.jd
@@ -37,12 +37,12 @@
  * Each playlist ID is paired with a custom video description.
  */
 var featured = {
-// Android UI design patterns
-  'M1ZBjlCRfz0' : "The Android user experience team provides suggestions for how to make your applications more useable and engaging.",
-// The world of ListView
-  'wDBM6wVEO70' : "ListView is a common widget that's customizable, but can be tricky to polish, so this talk shows how you can provide the best performance.",
-// Debugging Arts of the Ninja Masters
-  'Dgnx0E7m1GQ' : "The Android SDK includes tools to debug your apps like a ninja. Enter the dojo and become a master at debugging your apps."
+// Android Development Tools
+  'Oq05KqjXTvs' : "The team behind the Android Development Tools demonstrate several powerful features for app development, including new capabilities in the Eclipse layout editor.",
+// Android UIs for phones and tablets
+  'WGIU2JX1U5Y' : "This talk from the Android UI team explains several design patterns that the team recommends you use when designing your application for screens of all sizes.",
+// Android Protips
+  'twmuBbC_oB8' : "In this talk, you'll learn how to create a well polished app that abides by several key virtues, using advanced development techniques and some lesser known APIs."
 };
 
 /* When an event on the browser history occurs (back, forward, load),
@@ -177,7 +177,7 @@
     for (var i in ids) {
       var script = "<script type='text/javascript' src='http://gdata.youtube.com/feeds/api/playlists/"
       				  + ids[i] +
-      				  "?v=2&alt=json-in-script&callback=renderPlaylist'><\/script>";
+      				  "?v=2&alt=json-in-script&max-results=50&callback=renderPlaylist'><\/script>";
     	$("body").append(script);
     }
   }
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 41a29e6..d51c202 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -68,9 +68,9 @@
     native int  nDeviceCreate();
     native void nDeviceDestroy(int dev);
     native void nDeviceSetConfig(int dev, int param, int value);
-    native void nContextGetUserMessage(int con, int[] data);
+    native int nContextGetUserMessage(int con, int[] data);
     native String nContextGetErrorMessage(int con);
-    native int  nContextPeekMessage(int con, int[] subID, boolean wait);
+    native int  nContextPeekMessage(int con, int[] subID);
     native void nContextInitToClient(int con);
     native void nContextDeinitToClient(int con);
 
@@ -736,7 +736,7 @@
             mRS.nContextInitToClient(mRS.mContext);
             while(mRun) {
                 rbuf[0] = 0;
-                int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData, true);
+                int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData);
                 int size = mAuxData[1];
                 int subID = mAuxData[0];
 
@@ -744,7 +744,10 @@
                     if ((size>>2) >= rbuf.length) {
                         rbuf = new int[(size + 3) >> 2];
                     }
-                    mRS.nContextGetUserMessage(mRS.mContext, rbuf);
+                    if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
+                        RS_MESSAGE_TO_CLIENT_USER) {
+                        throw new RSDriverException("Error processing message from Renderscript.");
+                    }
 
                     if(mRS.mMessageCallback != null) {
                         mRS.mMessageCallback.mData = rbuf;
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index 26a6287..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
@@ -240,15 +240,14 @@
     int id = rsContextGetMessage(con,
                                  buf, sizeof(buf),
                                  &receiveLen, sizeof(receiveLen),
-                                 &subID, sizeof(subID),
-                                 true);
+                                 &subID, sizeof(subID));
     if (!id && receiveLen) {
         LOGV("message receive buffer too small.  %i", receiveLen);
     }
     return _env->NewStringUTF(buf);
 }
 
-static void
+static jint
 nContextGetUserMessage(JNIEnv *_env, jobject _this, RsContext con, jintArray data)
 {
     jint len = _env->GetArrayLength(data);
@@ -259,23 +258,23 @@
     int id = rsContextGetMessage(con,
                                  ptr, len * 4,
                                  &receiveLen, sizeof(receiveLen),
-                                 &subID, sizeof(subID),
-                                 true);
+                                 &subID, sizeof(subID));
     if (!id && receiveLen) {
         LOGV("message receive buffer too small.  %i", receiveLen);
     }
     _env->ReleaseIntArrayElements(data, ptr, 0);
+    return id;
 }
 
 static jint
-nContextPeekMessage(JNIEnv *_env, jobject _this, RsContext con, jintArray auxData, jboolean wait)
+nContextPeekMessage(JNIEnv *_env, jobject _this, RsContext con, jintArray auxData)
 {
     LOG_API("nContextPeekMessage, con(%p)", con);
     jint *auxDataPtr = _env->GetIntArrayElements(auxData, NULL);
     size_t receiveLen;
     uint32_t subID;
     int id = rsContextPeekMessage(con, &receiveLen, sizeof(receiveLen),
-                                  &subID, sizeof(subID), wait);
+                                  &subID, sizeof(subID));
     auxDataPtr[0] = (jint)subID;
     auxDataPtr[1] = (jint)receiveLen;
     _env->ReleaseIntArrayElements(auxData, auxDataPtr, 0);
@@ -1160,9 +1159,9 @@
 {"nDeviceCreate",                  "()I",                                     (void*)nDeviceCreate },
 {"nDeviceDestroy",                 "(I)V",                                    (void*)nDeviceDestroy },
 {"nDeviceSetConfig",               "(III)V",                                  (void*)nDeviceSetConfig },
-{"nContextGetUserMessage",         "(I[I)V",                                  (void*)nContextGetUserMessage },
+{"nContextGetUserMessage",         "(I[I)I",                                  (void*)nContextGetUserMessage },
 {"nContextGetErrorMessage",        "(I)Ljava/lang/String;",                   (void*)nContextGetErrorMessage },
-{"nContextPeekMessage",            "(I[IZ)I",                                 (void*)nContextPeekMessage },
+{"nContextPeekMessage",            "(I[I)I",                                  (void*)nContextPeekMessage },
 
 {"nContextInitToClient",           "(I)V",                                    (void*)nContextInitToClient },
 {"nContextDeinitToClient",         "(I)V",                                    (void*)nContextDeinitToClient },
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/mediarecorder.h b/include/media/mediarecorder.h
index 59093c9..36bf34e 100644
--- a/include/media/mediarecorder.h
+++ b/include/media/mediarecorder.h
@@ -179,6 +179,9 @@
     // The time used to compensate for initial A/V sync.
     MEDIA_RECORDER_TRACK_INFO_START_OFFSET_MS      = 1008,
 
+    // Total number of bytes of the media data.
+    MEDIA_RECORDER_TRACK_INFO_DATA_KBYTES          = 1009,
+
     MEDIA_RECORDER_TRACK_INFO_LIST_END             = 2000,
 };
 
diff --git a/include/media/stagefright/MPEG4Writer.h b/include/media/stagefright/MPEG4Writer.h
index 2d75728..904ce2a 100644
--- a/include/media/stagefright/MPEG4Writer.h
+++ b/include/media/stagefright/MPEG4Writer.h
@@ -56,6 +56,8 @@
     int32_t getTimeScale() const { return mTimeScale; }
 
     status_t setGeoData(int latitudex10000, int longitudex10000);
+    void setStartTimeOffsetMs(int ms) { mStartTimeOffsetMs = ms; }
+    int32_t getStartTimeOffsetMs() const { return mStartTimeOffsetMs; }
 
 protected:
     virtual ~MPEG4Writer();
@@ -84,6 +86,7 @@
     int mLatitudex10000;
     int mLongitudex10000;
     bool mAreGeoTagsAvailable;
+    int32_t mStartTimeOffsetMs;
 
     Mutex mLock;
 
@@ -173,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 64f5a48..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.
@@ -24,8 +22,13 @@
  * @hide
  */
 interface IKeyChainService {
-    byte[] getPrivate(String alias, String authToken);
+    // APIs used by KeyChain
+    byte[] getPrivateKey(String alias, String authToken);
     byte[] getCertificate(String alias, String authToken);
-    byte[] getCaCertificate(String alias, String authToken);
-    String findIssuer(in Bundle cert);
+
+    // APIs used by CertInstaller
+    void installCaCertificate(in byte[] caCertificate);
+
+    // APIs used by Settings
+    boolean reset();
 }
diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java
index 69847bf..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;
@@ -28,24 +30,20 @@
 import android.os.IBinder;
 import android.os.Looper;
 import android.os.RemoteException;
-import android.util.Log;
-import dalvik.system.CloseGuard;
 import java.io.ByteArrayInputStream;
+import java.io.Closeable;
 import java.io.IOException;
 import java.security.KeyFactory;
 import java.security.NoSuchAlgorithmException;
 import java.security.PrivateKey;
-import java.security.cert.CertPathValidatorException;
 import java.security.cert.Certificate;
-import java.security.cert.CertificateEncodingException;
 import java.security.cert.CertificateException;
 import java.security.cert.CertificateFactory;
-import java.security.cert.TrustAnchor;
 import java.security.cert.X509Certificate;
 import java.security.spec.InvalidKeySpecException;
 import java.security.spec.PKCS8EncodedKeySpec;
-import org.apache.harmony.xnet.provider.jsse.IndexedPKIXParameters;
-import org.apache.harmony.xnet.provider.jsse.SSLParametersImpl;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
 
 /**
  * @hide
@@ -60,197 +58,131 @@
     public static final String ACCOUNT_TYPE = "com.android.keychain";
 
     /**
-     * @hide Also used by KeyChainService implementation
+     * @hide Also used by KeyChainActivity implementation
      */
-    // TODO This non-localized CA string to be removed when CAs moved out of keystore
-    public static final String CA_SUFFIX = " CA";
-
-    public static final String KEY_INTENT = "intent";
+    public static final String EXTRA_RESPONSE = "response";
 
     /**
-     * Intentionally not public to leave open the future possibility
-     * of hardware based keys. Callers should use {@link #toPrivateKey
-     * toPrivateKey} in order to convert a bundle to a {@code
-     * PrivateKey}
+     * 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.
      */
-    private static final String KEY_PKCS8 = "pkcs8";
-
-    /**
-     * Intentionally not public to leave open the future possibility
-     * of hardware based certs. Callers should use {@link
-     * #toCertificate toCertificate} in order to convert a bundle to a
-     * {@code PrivateKey}
-     */
-    private static final String KEY_X509 = "x509";
-
-    /**
-     * 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}.
-     */
-    public static Intent chooseAlias() {
-        return new Intent("com.android.keychain.CHOOSER");
+    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);
     }
 
-    /**
-     * Returns a new {@code KeyChain} instance. When the caller is
-     * done using the {@code KeyChain}, it must be closed with {@link
-     * #close()} or resource leaks will occur.
-     */
-    public static KeyChain getInstance(Context context) throws InterruptedException {
-        return new KeyChain(context);
+    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 final AccountManager mAccountManager;
-
-    private final Object mServiceLock = new Object();
-    private IKeyChainService mService;
-    private boolean mIsBound;
-
-    private Account mAccount;
-
-    private ServiceConnection mServiceConnection = new ServiceConnection() {
-        @Override public void onServiceConnected(ComponentName name, IBinder service) {
-            synchronized (mServiceLock) {
-                mService = IKeyChainService.Stub.asInterface(service);
-                mServiceLock.notifyAll();
-
-                // Account is created if necessary during binding of the IKeyChainService
-                mAccount = mAccountManager.getAccountsByType(ACCOUNT_TYPE)[0];
+    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);
             }
         }
-
-        @Override public void onServiceDisconnected(ComponentName name) {
-            synchronized (mServiceLock) {
-                mService = null;
-            }
-        }
-    };
-
-    private final Context mContext;
-
-    private final CloseGuard mGuard = CloseGuard.get();
-
-    private KeyChain(Context context) throws InterruptedException {
-        if (context == null) {
-            throw new NullPointerException("context == null");
-        }
-        mContext = context;
-        ensureNotOnMainThread();
-        mAccountManager = AccountManager.get(mContext);
-        mIsBound = mContext.bindService(new Intent(IKeyChainService.class.getName()),
-                                        mServiceConnection,
-                                        Context.BIND_AUTO_CREATE);
-        if (!mIsBound) {
-            throw new AssertionError();
-        }
-        synchronized (mServiceLock) {
-            // there is a race between binding on this thread and the
-            // callback on the main thread. wait until binding is done
-            // to be sure we have the mAccount initialized.
-            if (mService == null) {
-                mServiceLock.wait();
-            }
-        }
-        mGuard.open("close");
     }
 
     /**
-     * {@code Bundle} will contain {@link #KEY_INTENT} if user needs
-     * to confirm application access to requested key. In the alias
-     * does not exist or there is an error, null is
-     * returned. Otherwise the {@code Bundle} contains information
-     * representing the private key which can be interpreted with
-     * {@link #toPrivateKey toPrivateKey}.
-     *
-     * non-null alias
+     * Returns the {@code PrivateKey} for the requested alias, or null
+     * if no there is no result.
      */
-    public Bundle getPrivate(String alias) {
-        return get(alias, Credentials.USER_PRIVATE_KEY);
-    }
-
-    public Bundle getCertificate(String alias) {
-        return get(alias, Credentials.USER_CERTIFICATE);
-    }
-
-    public Bundle getCaCertificate(String alias) {
-        return get(alias, Credentials.CA_CERTIFICATE);
-    }
-
-    private Bundle get(String alias, String type) {
+    public static PrivateKey getPrivateKey(Context context, String alias)
+            throws InterruptedException, RemoteException {
         if (alias == null) {
             throw new NullPointerException("alias == null");
         }
-        ensureNotOnMainThread();
-
-        String authAlias = (type.equals(Credentials.CA_CERTIFICATE)) ? (alias + CA_SUFFIX) : alias;
-        AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken(mAccount,
-                                                                           authAlias,
-                                                                           false,
-                                                                           null,
-                                                                           null);
-        Bundle bundle;
+        KeyChainConnection keyChainConnection = bind(context);
         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);
-            result.putParcelable(KEY_INTENT, intent);
-            return result;
-        }
-        String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);
-        if (authToken == null) {
-            throw new AssertionError("Invalid authtoken");
-        }
-
-        byte[] bytes;
-        try {
-            if (type.equals(Credentials.USER_PRIVATE_KEY)) {
-                bytes = mService.getPrivate(alias, authToken);
-            } else if (type.equals(Credentials.USER_CERTIFICATE)) {
-                bytes = mService.getCertificate(alias, authToken);
-            } else if (type.equals(Credentials.CA_CERTIFICATE)) {
-                bytes = mService.getCaCertificate(alias, authToken);
-            } else {
-                throw new AssertionError();
+            String authToken = authToken(context, alias);
+            if (authToken == null) {
+                return null;
             }
-        } catch (RemoteException e) {
-            throw new AssertionError(e);
+            IKeyChainService keyChainService = keyChainConnection.getService();
+            byte[] privateKeyBytes = keyChainService.getPrivateKey(alias, authToken);
+            return toPrivateKey(privateKeyBytes);
+        } finally {
+            keyChainConnection.close();
         }
-        if (bytes == null) {
-            throw new AssertionError();
-        }
-        Bundle result = new Bundle();
-        if (type.equals(Credentials.USER_PRIVATE_KEY)) {
-            result.putByteArray(KEY_PKCS8, bytes);
-        } else if (type.equals(Credentials.USER_CERTIFICATE)) {
-            result.putByteArray(KEY_X509, bytes);
-        } else if (type.equals(Credentials.CA_CERTIFICATE)) {
-            result.putByteArray(KEY_X509, bytes);
-        } else {
-            throw new AssertionError();
-        }
-        return result;
     }
 
-    public static PrivateKey toPrivateKey(Bundle bundle) {
-        byte[] bytes = bundle.getByteArray(KEY_PKCS8);
+    /**
+     * 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 X509Certificate[] { toCertificate(certificateBytes) };
+        } finally {
+            keyChainConnection.close();
+        }
+    }
+
+    private static PrivateKey toPrivateKey(byte[] bytes) {
         if (bytes == null) {
-            throw new IllegalArgumentException("not a private key bundle");
+            throw new IllegalArgumentException("bytes == null");
         }
         try {
             KeyFactory keyFactory = KeyFactory.getInstance("RSA");
@@ -262,20 +194,9 @@
         }
     }
 
-    public static Bundle fromPrivateKey(PrivateKey privateKey) {
-        Bundle bundle = new Bundle();
-        String format = privateKey.getFormat();
-        if (!format.equals("PKCS#8")) {
-            throw new IllegalArgumentException("Unsupported private key format " + format);
-        }
-        bundle.putByteArray(KEY_PKCS8, privateKey.getEncoded());
-        return bundle;
-    }
-
-    public static X509Certificate toCertificate(Bundle bundle) {
-        byte[] bytes = bundle.getByteArray(KEY_X509);
+    private static X509Certificate toCertificate(byte[] bytes) {
         if (bytes == null) {
-            throw new IllegalArgumentException("not a certificate bundle");
+            throw new IllegalArgumentException("bytes == null");
         }
         try {
             CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
@@ -286,87 +207,108 @@
         }
     }
 
-    public static Bundle fromCertificate(Certificate cert) {
-        Bundle bundle = new Bundle();
-        String type = cert.getType();
-        if (!type.equals("X.509")) {
-            throw new IllegalArgumentException("Unsupported certificate type " + type);
-        }
+    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.putByteArray(KEY_X509, cert.getEncoded());
-        } catch (CertificateEncodingException e) {
+            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);
         }
-        return bundle;
-    }
-
-    private void ensureNotOnMainThread() {
-        Looper looper = Looper.myLooper();
-        if (looper != null && looper == mContext.getMainLooper()) {
-            throw new IllegalStateException(
-                    "calling this from your main thread can lead to deadlock");
-        }
-    }
-
-    public Bundle findIssuer(X509Certificate cert) {
-        if (cert == null) {
-            throw new NullPointerException("cert == null");
-        }
-        ensureNotOnMainThread();
-
-        // check and see if the issuer is already known to the default IndexedPKIXParameters
-        IndexedPKIXParameters index = SSLParametersImpl.getDefaultIndexedPKIXParameters();
-        try {
-            TrustAnchor anchor = index.findTrustAnchor(cert);
-            if (anchor != null && anchor.getTrustedCert() != null) {
-                X509Certificate ca = anchor.getTrustedCert();
-                return fromCertificate(ca);
-            }
-        } catch (CertPathValidatorException ignored) {
-        }
-
-        // otherwise, it might be a user installed CA in the keystore
-        String alias;
-        try {
-            alias = mService.findIssuer(fromCertificate(cert));
-        } catch (RemoteException e) {
-            throw new AssertionError(e);
-        }
-        if (alias == null) {
-            Log.w(TAG, "Lookup failed for issuer");
+        Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT);
+        if (intent != null) {
             return null;
         }
-
-        Bundle bundle = get(alias, Credentials.CA_CERTIFICATE);
-        Intent intent = bundle.getParcelable(KEY_INTENT);
-        if (intent != null) {
-            // permission still required
-            return bundle;
+        String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);
+        if (authToken == null) {
+            throw new AssertionError("Invalid authtoken");
         }
-        // add the found CA to the index for next time
-        X509Certificate ca = toCertificate(bundle);
-        index.index(new TrustAnchor(ca, null));
-        return bundle;
+        return authToken;
     }
 
-    public void close() {
-        if (mIsBound) {
-            mContext.unbindService(mServiceConnection);
-            mIsBound = false;
-            mGuard.close();
-        }
-    }
-
-    protected void finalize() throws Throwable {
-        // note we don't close, we just warn.
-        // shouldn't be doing I/O in a finalizer,
-        // which the unbind would cause.
-        try {
-            if (mGuard != null) {
-                mGuard.warnIfOpen();
+    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);
             }
-        } finally {
-            super.finalize();
+            accounts = accountManager.getAccountsByType(ACCOUNT_TYPE);
+        }
+        return accounts[0];
+    }
+
+    /**
+     * @hide for reuse by CertInstaller and Settings.
+     * @see KeyChain#bind
+     */
+    public final static class KeyChainConnection implements Closeable {
+        private final Context context;
+        private final ServiceConnection serviceConnection;
+        private final IKeyChainService service;
+        private KeyChainConnection(Context context,
+                                   ServiceConnection serviceConnection,
+                                   IKeyChainService service) {
+            this.context = context;
+            this.serviceConnection = serviceConnection;
+            this.service = service;
+        }
+        @Override public void close() {
+            context.unbindService(serviceConnection);
+        }
+        public IKeyChainService getService() {
+            return service;
+        }
+    }
+
+    /**
+     * @hide for reuse by CertInstaller and Settings.
+     *
+     * Caller should call unbindService on the result when finished.
+     */
+    public static KeyChainConnection bind(Context context) throws InterruptedException {
+        if (context == null) {
+            throw new NullPointerException("context == null");
+        }
+        ensureNotOnMainThread(context);
+        final BlockingQueue<IKeyChainService> q = new LinkedBlockingQueue<IKeyChainService>(1);
+        ServiceConnection keyChainServiceConnection = new ServiceConnection() {
+            @Override public void onServiceConnected(ComponentName name, IBinder service) {
+                try {
+                    q.put(IKeyChainService.Stub.asInterface(service));
+                } catch (InterruptedException e) {
+                    throw new AssertionError(e);
+                }
+            }
+            @Override public void onServiceDisconnected(ComponentName name) {}
+        };
+        boolean isBound = context.bindService(new Intent(IKeyChainService.class.getName()),
+                                              keyChainServiceConnection,
+                                              Context.BIND_AUTO_CREATE);
+        if (!isBound) {
+            throw new AssertionError("could not bind to KeyChainService");
+        }
+        return new KeyChainConnection(context, keyChainServiceConnection, q.take());
+    }
+
+    private static void ensureNotOnMainThread(Context context) {
+        Looper looper = Looper.myLooper();
+        if (looper != null && looper == context.getMainLooper()) {
+            throw new IllegalStateException(
+                    "calling this from your main thread can lead to deadlock");
         }
     }
 }
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/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/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 3232f6f..560c1f9 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -2434,12 +2434,11 @@
 }
 
 SkXfermode::Mode OpenGLRenderer::getXfermode(SkXfermode* mode) {
-    // In the future we should look at unifying the Porter-Duff modes and
-    // SkXferModes so that we can use SkXfermode::IsMode(xfer, &mode).
-    if (mode == NULL) {
-        return SkXfermode::kSrcOver_Mode;
+    SkXfermode::Mode resultMode;
+    if (!SkXfermode::AsMode(mode, &resultMode)) {
+        resultMode = SkXfermode::kSrcOver_Mode;
     }
-    return mode->fMode;
+    return resultMode;
 }
 
 void OpenGLRenderer::setTextureWrapModes(Texture* texture, GLenum wrapS, GLenum wrapT) {
diff --git a/libs/rs/Android.mk b/libs/rs/Android.mk
index ef00b30..29c1447 100644
--- a/libs/rs/Android.mk
+++ b/libs/rs/Android.mk
@@ -117,6 +117,7 @@
 	rsType.cpp \
 	driver/rsdBcc.cpp \
 	driver/rsdCore.cpp \
+	driver/rsdFrameBuffer.cpp \
 	driver/rsdGL.cpp \
 	driver/rsdMesh.cpp \
 	driver/rsdMeshObj.cpp \
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/rsdCore.cpp b/libs/rs/driver/rsdCore.cpp
index 0a5f2ec..7ef9c30 100644
--- a/libs/rs/driver/rsdCore.cpp
+++ b/libs/rs/driver/rsdCore.cpp
@@ -23,6 +23,7 @@
 #include "rsdProgramFragment.h"
 #include "rsdMesh.h"
 #include "rsdSampler.h"
+#include "rsdFrameBuffer.h"
 
 #include <malloc.h>
 #include "rsContext.h"
@@ -98,6 +99,12 @@
         rsdSamplerDestroy
     },
 
+    {
+        rsdFrameBufferInit,
+        rsdFrameBufferSetActive,
+        rsdFrameBufferDestroy
+    },
+
 };
 
 pthread_key_t rsdgThreadTLSKey = 0;
diff --git a/libs/rs/driver/rsdFrameBuffer.cpp b/libs/rs/driver/rsdFrameBuffer.cpp
new file mode 100644
index 0000000..6a7dac4
--- /dev/null
+++ b/libs/rs/driver/rsdFrameBuffer.cpp
@@ -0,0 +1,162 @@
+/*
+ * 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 "rsdCore.h"
+#include "rsdFrameBuffer.h"
+
+#include "rsContext.h"
+#include "rsFBOCache.h"
+
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+using namespace android;
+using namespace android::renderscript;
+
+struct DrvFrameBuffer {
+    GLuint mFBOId;
+};
+
+void checkError(const Context *rsc) {
+    GLenum status;
+    status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
+    switch (status) {
+    case GL_FRAMEBUFFER_COMPLETE:
+        break;
+    case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
+        rsc->setError(RS_ERROR_BAD_VALUE,
+                      "Unable to set up render Target: RFRAMEBUFFER_INCOMPLETE_ATTACHMENT");
+        break;
+    case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
+        rsc->setError(RS_ERROR_BAD_VALUE,
+                      "Unable to set up render Target: GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT");
+        break;
+    case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
+        rsc->setError(RS_ERROR_BAD_VALUE,
+                      "Unable to set up render Target: GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS");
+        break;
+    case GL_FRAMEBUFFER_UNSUPPORTED:
+        rsc->setError(RS_ERROR_BAD_VALUE,
+                      "Unable to set up render Target: GL_FRAMEBUFFER_UNSUPPORTED");
+        break;
+    }
+}
+
+
+void setDepthAttachment(const Context *rsc, const FBOCache *fb) {
+    if (fb->mHal.state.depthTarget.get() != NULL) {
+        if (fb->mHal.state.depthTarget->getIsTexture()) {
+            uint32_t texID = fb->mHal.state.depthTarget->getTextureID();
+            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+                                   GL_TEXTURE_2D, texID, 0);
+        } else {
+            uint32_t texID = fb->mHal.state.depthTarget->getRenderTargetID();
+            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+                                      GL_RENDERBUFFER, texID);
+        }
+    } else {
+        // Reset last attachment
+        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+                                  GL_RENDERBUFFER, 0);
+        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+                               GL_TEXTURE_2D, 0, 0);
+    }
+}
+
+void setColorAttachment(const Context *rsc, const FBOCache *fb) {
+    // Now attach color targets
+    for (uint32_t i = 0; i < fb->mHal.state.colorTargetsCount; i ++) {
+        uint32_t texID = 0;
+        if (fb->mHal.state.colorTargets[i].get() != NULL) {
+            if (fb->mHal.state.colorTargets[i]->getIsTexture()) {
+                uint32_t texID = fb->mHal.state.colorTargets[i]->getTextureID();
+                glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
+                                       GL_TEXTURE_2D, texID, 0);
+            } else {
+                uint32_t texID = fb->mHal.state.depthTarget->getRenderTargetID();
+                glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
+                                          GL_RENDERBUFFER, texID);
+            }
+        } else {
+            // Reset last attachment
+            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
+                                      GL_RENDERBUFFER, 0);
+            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
+                                   GL_TEXTURE_2D, 0, 0);
+        }
+    }
+}
+
+bool renderToFramebuffer(const FBOCache *fb) {
+    if (fb->mHal.state.depthTarget.get() != NULL) {
+        return false;
+    }
+
+    for (uint32_t i = 0; i < fb->mHal.state.colorTargetsCount; i ++) {
+        if (fb->mHal.state.colorTargets[i].get() != NULL) {
+            return false;
+        }
+    }
+    return true;
+}
+
+
+bool rsdFrameBufferInit(const Context *rsc, const FBOCache *fb) {
+    DrvFrameBuffer *drv = (DrvFrameBuffer *)calloc(1, sizeof(DrvFrameBuffer));
+    if (drv == NULL) {
+        return false;
+    }
+    fb->mHal.drv = drv;
+    drv->mFBOId = 0;
+
+    return true;
+}
+
+void rsdFrameBufferSetActive(const Context *rsc, const FBOCache *fb) {
+    DrvFrameBuffer *drv = (DrvFrameBuffer *)fb->mHal.drv;
+
+    bool framebuffer = renderToFramebuffer(fb);
+    if (!framebuffer) {
+        if(drv->mFBOId == 0) {
+            glGenFramebuffers(1, &drv->mFBOId);
+        }
+        glBindFramebuffer(GL_FRAMEBUFFER, drv->mFBOId);
+
+        setDepthAttachment(rsc, fb);
+        setColorAttachment(rsc, fb);
+
+        glViewport(0, 0, fb->mHal.state.colorTargets[0]->getType()->getDimX(),
+                         fb->mHal.state.colorTargets[0]->getType()->getDimY());
+
+        checkError(rsc);
+    } else {
+        glBindFramebuffer(GL_FRAMEBUFFER, 0);
+        glViewport(0, 0, rsc->getWidth(), rsc->getHeight());
+    }
+}
+
+void rsdFrameBufferDestroy(const Context *rsc, const FBOCache *fb) {
+    DrvFrameBuffer *drv = (DrvFrameBuffer *)fb->mHal.drv;
+    if(drv->mFBOId != 0) {
+        glDeleteFramebuffers(1, &drv->mFBOId);
+    }
+
+    free(fb->mHal.drv);
+    fb->mHal.drv = NULL;
+}
+
+
diff --git a/libs/rs/driver/rsdFrameBuffer.h b/libs/rs/driver/rsdFrameBuffer.h
new file mode 100644
index 0000000..dec59fc
--- /dev/null
+++ b/libs/rs/driver/rsdFrameBuffer.h
@@ -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.
+ */
+
+#ifndef RSD_FRAME_BUFFER_H
+#define RSD_FRAME_BUFFER_H
+
+#include <rs_hal.h>
+
+bool rsdFrameBufferInit(const android::renderscript::Context *rsc,
+                         const android::renderscript::FBOCache *fb);
+void rsdFrameBufferSetActive(const android::renderscript::Context *rsc,
+                              const android::renderscript::FBOCache *fb);
+void rsdFrameBufferDestroy(const android::renderscript::Context *rsc,
+                            const android::renderscript::FBOCache *fb);
+
+
+#endif // RSD_FRAME_BUFFER_H
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 1da00a5..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
 }
@@ -45,16 +7,14 @@
     direct
     param void *data
     param size_t *receiveLen
-    param uint32_t *subID
-    param bool wait
+    param uint32_t *usrID
     ret RsMessageToClientType
 }
 
 ContextPeekMessage {
     direct
     param size_t *receiveLen
-    param uint32_t *subID
-    param bool wait
+    param uint32_t *usrID
     ret RsMessageToClientType
 }
 
@@ -106,7 +66,7 @@
 
 
 ContextFinish {
-	handcodeApi
+	sync
 	}
 
 ContextBindRootScript {
@@ -142,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 98adabc..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>
@@ -238,6 +236,7 @@
         rsc->setProgramStore(NULL);
         rsc->mStateFont.init(rsc);
         rsc->setFont(NULL);
+        rsc->mFBOCache.init(rsc);
     }
 
     rsc->mRunning = true;
@@ -245,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) {
@@ -298,6 +297,7 @@
          mStateFragment.deinit(this);
          mStateFragmentStore.deinit(this);
          mStateFont.deinit(this);
+         mFBOCache.deinit(this);
     }
     //LOGV("destroyWorkerThreadResources 2");
     mExit = true;
@@ -344,6 +344,8 @@
 bool Context::initContext(Device *dev, const RsSurfaceConfig *sc) {
     pthread_mutex_lock(&gInitMutex);
 
+    mIO.init();
+
     dev->addContext(this);
     mDev = dev;
     if (sc) {
@@ -367,7 +369,7 @@
         return false;
     }
 
-    mWndSurface = NULL;
+    mHasSurface = false;
 
     timerInit();
     timerSet(RS_TIMER_INTERNAL);
@@ -393,7 +395,7 @@
 Context::~Context() {
     LOGV("Context::~Context");
 
-    mIO.mToCore.flush();
+    mIO.coreFlush();
     rsAssert(mExit);
     mExit = true;
     mPaused = false;
@@ -402,7 +404,6 @@
     mIO.shutdown();
     int status = pthread_join(mThreadId, &res);
 
-
     if (mHal.funcs.shutdownDriver) {
         mHal.funcs.shutdownDriver(this);
     }
@@ -417,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;
 
@@ -505,69 +506,18 @@
     }
 }
 
-RsMessageToClientType Context::peekMessageToClient(size_t *receiveLen, uint32_t *subID, bool wait) {
-    *receiveLen = 0;
-    if (!wait && mIO.mToClient.isEmpty()) {
-        return RS_MESSAGE_TO_CLIENT_NONE;
-    }
-
-    uint32_t bytesData = 0;
-    uint32_t commandID = 0;
-    const uint32_t *d = (const uint32_t *)mIO.mToClient.get(&commandID, &bytesData);
-    *receiveLen = bytesData - sizeof(uint32_t);
-    if (bytesData) {
-        *subID = d[0];
-    }
-    return (RsMessageToClientType)commandID;
+RsMessageToClientType Context::peekMessageToClient(size_t *receiveLen, uint32_t *subID) {
+    return (RsMessageToClientType)mIO.getClientHeader(receiveLen, subID);
 }
 
-RsMessageToClientType Context::getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen, bool wait) {
-    //LOGE("getMessageToClient %i %i", bufferLen, wait);
-    *receiveLen = 0;
-    if (!wait && mIO.mToClient.isEmpty()) {
-        return RS_MESSAGE_TO_CLIENT_NONE;
-    }
-
-    //LOGE("getMessageToClient 2 con=%p", this);
-    uint32_t bytesData = 0;
-    uint32_t commandID = 0;
-    const uint32_t *d = (const uint32_t *)mIO.mToClient.get(&commandID, &bytesData);
-    //LOGE("getMessageToClient 3    %i  %i", commandID, bytesData);
-
-    *receiveLen = bytesData - sizeof(uint32_t);
-    *subID = d[0];
-
-    //LOGE("getMessageToClient  %i %i", commandID, *subID);
-    if (bufferLen >= (*receiveLen)) {
-        memcpy(data, d+1, *receiveLen);
-        mIO.mToClient.next();
-        return (RsMessageToClientType)commandID;
-    }
-    return RS_MESSAGE_TO_CLIENT_RESIZE;
+RsMessageToClientType Context::getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen) {
+    return (RsMessageToClientType)mIO.getClientPayload(data, receiveLen, subID, bufferLen);
 }
 
 bool Context::sendMessageToClient(const void *data, RsMessageToClientType cmdID,
                                   uint32_t subID, size_t len, bool waitForSpace) const {
-    //LOGE("sendMessageToClient %i %i %i %i", cmdID, subID, len, waitForSpace);
-    if (cmdID == 0) {
-        LOGE("Attempting to send invalid command 0 to client.");
-        return false;
-    }
-    if (!waitForSpace) {
-        if (!mIO.mToClient.makeSpaceNonBlocking(len + 12)) {
-            // Not enough room, and not waiting.
-            return false;
-        }
-    }
-    //LOGE("sendMessageToClient 2");
-    uint32_t *p = (uint32_t *)mIO.mToClient.reserve(len + sizeof(subID));
-    p[0] = subID;
-    if (len > 0) {
-        memcpy(p+1, data, len);
-    }
-    mIO.mToClient.commit(cmdID, len + sizeof(subID));
-    //LOGE("sendMessageToClient 3");
-    return true;
+
+    return mIO.sendToClient(cmdID, subID, data, len, waitForSpace);
 }
 
 void Context::initToClient() {
@@ -577,7 +527,7 @@
 }
 
 void Context::deinitToClient() {
-    mIO.mToClient.shutdown();
+    mIO.clientShutdown();
 }
 
 void Context::setError(RsError e, const char *msg) const {
@@ -664,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);
 }
 
@@ -687,35 +637,19 @@
     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,
-                                           uint32_t * subID, size_t subID_length, bool wait) {
-    return rsc->peekMessageToClient(receiveLen, subID, wait);
+                                           uint32_t * subID, size_t subID_length) {
+    return rsc->peekMessageToClient(receiveLen, subID);
 }
 
 RsMessageToClientType rsi_ContextGetMessage(Context *rsc, void * data, size_t data_length,
                                           size_t * receiveLen, size_t receiveLen_length,
-                                          uint32_t * subID, size_t subID_length, bool wait) {
+                                          uint32_t * subID, size_t subID_length) {
     rsAssert(subID_length == sizeof(uint32_t));
     rsAssert(receiveLen_length == sizeof(size_t));
-    return rsc->getMessageToClient(data, receiveLen, subID, data_length, wait);
+    return rsc->getMessageToClient(data, receiveLen, subID, data_length);
 }
 
 void rsi_ContextInitToClient(Context *rsc) {
@@ -729,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 1407b7e..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,15 +134,15 @@
 
     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();
 
     void assignName(ObjectBase *obj, const char *name, uint32_t len);
     void removeName(ObjectBase *obj);
 
-    RsMessageToClientType peekMessageToClient(size_t *receiveLen, uint32_t *subID, bool wait);
-    RsMessageToClientType getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen, bool wait);
+    RsMessageToClientType peekMessageToClient(size_t *receiveLen, uint32_t *subID);
+    RsMessageToClientType getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen);
     bool sendMessageToClient(const void *data, RsMessageToClientType cmdID, uint32_t subID, size_t len, bool waitForSpace) const;
     uint32_t runScript(Script *s);
 
@@ -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/rsFBOCache.cpp b/libs/rs/rsFBOCache.cpp
index 0f33f67..31a51b7 100644
--- a/libs/rs/rsFBOCache.cpp
+++ b/libs/rs/rsFBOCache.cpp
@@ -19,33 +19,30 @@
 #include "rsContext.h"
 #include "rsAllocation.h"
 
-#ifndef ANDROID_RS_SERIALIZE
-#include <GLES/gl.h>
-#include <GLES2/gl2.h>
-#endif //ANDROID_RS_SERIALIZE
-
 using namespace android;
 using namespace android::renderscript;
 
 
 FBOCache::FBOCache() {
-    mFBOId = 0;
     mDirty = true;
-    mMaxTargets = 1;
-    mColorTargets = new ObjectBaseRef<Allocation>[mMaxTargets];
+    mHal.state.colorTargetsCount = 1;
+    mHal.state.colorTargets = new ObjectBaseRef<Allocation>[mHal.state.colorTargetsCount];
 }
 
 FBOCache::~FBOCache() {
-    delete[] mColorTargets;
-#ifndef ANDROID_RS_SERIALIZE
-    if(mFBOId != 0) {
-        glDeleteFramebuffers(1, &mFBOId);
-    }
-#endif //ANDROID_RS_SERIALIZE
+    delete[] mHal.state.colorTargets;
+}
+
+void FBOCache::init(Context *rsc) {
+    rsc->mHal.funcs.framebuffer.init(rsc, this);
+}
+
+void FBOCache::deinit(Context *rsc) {
+    rsc->mHal.funcs.framebuffer.destroy(rsc, this);
 }
 
 void FBOCache::bindColorTarget(Context *rsc, Allocation *a, uint32_t slot) {
-    if (slot >= mMaxTargets) {
+    if (slot >= mHal.state.colorTargetsCount) {
         LOGE("Invalid render target index");
         return;
     }
@@ -62,7 +59,7 @@
             a->deferredAllocateRenderTarget(rsc);
         }
     }
-    mColorTargets[slot].set(a);
+    mHal.state.colorTargets[slot].set(a);
     mDirty = true;
 }
 
@@ -80,131 +77,34 @@
             a->deferredAllocateRenderTarget(rsc);
         }
     }
-    mDepthTarget.set(a);
+    mHal.state.depthTarget.set(a);
     mDirty = true;
 }
 
 void FBOCache::resetAll(Context *) {
-    for (uint32_t i = 0; i < mMaxTargets; i ++) {
-        mColorTargets[i].set(NULL);
+    for (uint32_t i = 0; i < mHal.state.colorTargetsCount; i ++) {
+        mHal.state.colorTargets[i].set(NULL);
     }
-    mDepthTarget.set(NULL);
+    mHal.state.depthTarget.set(NULL);
     mDirty = true;
 }
 
-bool FBOCache::renderToFramebuffer() {
-    if (mDepthTarget.get() != NULL) {
-        return false;
-    }
-
-    for (uint32_t i = 0; i < mMaxTargets; i ++) {
-        if (mColorTargets[i].get() != NULL) {
-            return false;
-        }
-    }
-    return true;
-}
-
-void FBOCache::checkError(Context *rsc) {
-    GLenum status;
-    status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
-    switch (status) {
-    case GL_FRAMEBUFFER_COMPLETE:
-        break;
-    case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
-        rsc->setError(RS_ERROR_BAD_VALUE,
-                      "Unable to set up render Target: RFRAMEBUFFER_INCOMPLETE_ATTACHMENT");
-        break;
-    case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
-        rsc->setError(RS_ERROR_BAD_VALUE,
-                      "Unable to set up render Target: GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT");
-        break;
-    case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
-        rsc->setError(RS_ERROR_BAD_VALUE,
-                      "Unable to set up render Target: GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS");
-        break;
-    case GL_FRAMEBUFFER_UNSUPPORTED:
-        rsc->setError(RS_ERROR_BAD_VALUE,
-                      "Unable to set up render Target: GL_FRAMEBUFFER_UNSUPPORTED");
-        break;
-    }
-}
-
-void FBOCache::setDepthAttachment(Context *rsc) {
-#ifndef ANDROID_RS_SERIALIZE
-    if (mDepthTarget.get() != NULL) {
-        mDepthTarget->uploadCheck(rsc);
-        if (mDepthTarget->getIsTexture()) {
-            uint32_t texID = mDepthTarget->getTextureID();
-            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
-                                   GL_TEXTURE_2D, texID, 0);
-        } else {
-            uint32_t texID = mDepthTarget->getRenderTargetID();
-            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
-                                      GL_RENDERBUFFER, texID);
-        }
-    } else {
-        // Reset last attachment
-        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
-                                  GL_RENDERBUFFER, 0);
-        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
-                               GL_TEXTURE_2D, 0, 0);
-    }
-#endif //ANDROID_RS_SERIALIZE
-}
-
-void FBOCache::setColorAttachment(Context *rsc) {
-#ifndef ANDROID_RS_SERIALIZE
-    // Now attach color targets
-    for (uint32_t i = 0; i < mMaxTargets; i ++) {
-        uint32_t texID = 0;
-        if (mColorTargets[i].get() != NULL) {
-            mColorTargets[i]->uploadCheck(rsc);
-            if (mColorTargets[i]->getIsTexture()) {
-                uint32_t texID = mColorTargets[i]->getTextureID();
-                glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
-                                       GL_TEXTURE_2D, texID, 0);
-            } else {
-                uint32_t texID = mDepthTarget->getRenderTargetID();
-                glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
-                                          GL_RENDERBUFFER, texID);
-            }
-        } else {
-            // Reset last attachment
-            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
-                                      GL_RENDERBUFFER, 0);
-            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
-                                   GL_TEXTURE_2D, 0, 0);
-        }
-    }
-#endif //ANDROID_RS_SERIALIZE
-}
-
 void FBOCache::setup(Context *rsc) {
-#ifndef ANDROID_RS_SERIALIZE
     if (!mDirty) {
         return;
     }
 
-    bool framebuffer = renderToFramebuffer();
-
-    if (!framebuffer) {
-        if(mFBOId == 0) {
-            glGenFramebuffers(1, &mFBOId);
-        }
-        glBindFramebuffer(GL_FRAMEBUFFER, mFBOId);
-
-        setDepthAttachment(rsc);
-        setColorAttachment(rsc);
-
-        glViewport(0, 0, mColorTargets[0]->getType()->getDimX(),
-                         mColorTargets[0]->getType()->getDimY());
-
-        checkError(rsc);
-    } else {
-        glBindFramebuffer(GL_FRAMEBUFFER, 0);
-        glViewport(0, 0, rsc->getWidth(), rsc->getHeight());
+    if (mHal.state.depthTarget.get() != NULL) {
+        mHal.state.depthTarget->uploadCheck(rsc);
     }
+
+    for (uint32_t i = 0; i < mHal.state.colorTargetsCount; i ++) {
+        if (mHal.state.colorTargets[i].get() != NULL) {
+            mHal.state.colorTargets[i]->uploadCheck(rsc);
+        }
+    }
+
+    rsc->mHal.funcs.framebuffer.setActive(rsc, this);
+
     mDirty = false;
-#endif //ANDROID_RS_SERIALIZE
 }
diff --git a/libs/rs/rsFBOCache.h b/libs/rs/rsFBOCache.h
index c9ae1dc..f42e1f3 100644
--- a/libs/rs/rsFBOCache.h
+++ b/libs/rs/rsFBOCache.h
@@ -30,24 +30,33 @@
     FBOCache();
     ~FBOCache();
 
+    void init(Context *rsc);
+    void deinit(Context *rsc);
+
     void bindColorTarget(Context *rsc, Allocation *a, uint32_t slot);
     void bindDepthTarget(Context *, Allocation *a);
     void resetAll(Context *);
 
     void setup(Context *);
 
-protected:
+    struct Hal {
+        mutable void *drv;
 
+        struct State {
+            ObjectBaseRef<Allocation> *colorTargets;
+            uint32_t colorTargetsCount;
+            ObjectBaseRef<Allocation> depthTarget;
+        };
+        State state;
+    };
+    Hal mHal;
+
+protected:
     bool mDirty;
-    uint32_t mMaxTargets;
     void checkError(Context *);
     void setColorAttachment(Context *rsc);
     void setDepthAttachment(Context *rsc);
     bool renderToFramebuffer();
-    ObjectBaseRef<Allocation> *mColorTargets;
-    ObjectBaseRef<Allocation> mDepthTarget;
-
-    uint32_t mFBOId;
 
 };
 
diff --git a/libs/rs/rsFifoSocket.cpp b/libs/rs/rsFifoSocket.cpp
index 1ce57b9..848bba5 100644
--- a/libs/rs/rsFifoSocket.cpp
+++ b/libs/rs/rsFifoSocket.cpp
@@ -45,23 +45,34 @@
 }
 
 void FifoSocket::writeAsync(const void *data, size_t bytes) {
-    size_t ret = ::write(sv[0], data, bytes);
+    if (bytes == 0) {
+        return;
+    }
+    //LOGE("writeAsync %p %i", data, bytes);
+    size_t ret = ::send(sv[0], data, bytes, 0);
+    //LOGE("writeAsync ret %i", ret);
     rsAssert(ret == bytes);
 }
 
 void FifoSocket::writeWaitReturn(void *retData, size_t retBytes) {
-    size_t ret = ::read(sv[1], retData, retBytes);
+    //LOGE("writeWaitReturn %p %i", retData, retBytes);
+    size_t ret = ::recv(sv[0], retData, retBytes, 0);
+    //LOGE("writeWaitReturn %i", ret);
     rsAssert(ret == retBytes);
 }
 
 size_t FifoSocket::read(void *data, size_t bytes) {
-    size_t ret = ::read(sv[0], data, bytes);
+    //LOGE("read %p %i", data, bytes);
+    size_t ret = ::recv(sv[1], data, bytes, 0);
     rsAssert(ret == bytes);
+    //LOGE("read ret %i", ret);
     return ret;
 }
 
 void FifoSocket::readReturn(const void *data, size_t bytes) {
-    size_t ret = ::write(sv[1], data, bytes);
+    LOGE("readReturn %p %i", data, bytes);
+    size_t ret = ::send(sv[1], data, bytes, 0);
+    LOGE("readReturn %i", ret);
     rsAssert(ret == bytes);
 }
 
diff --git a/libs/rs/rsHandcode.h b/libs/rs/rsHandcode.h
deleted file mode 100644
index e6b722c..0000000
--- a/libs/rs/rsHandcode.h
+++ /dev/null
@@ -1,9 +0,0 @@
-
-#define DATA_SYNC_SIZE 1024
-
-static inline void rsHCAPI_ContextFinish (RsContext rsc) {
-    ThreadIO *io = &((Context *)rsc)->mIO;
-    uint32_t size = sizeof(RS_CMD_ContextFinish);
-    io->mToCore.commitSync(RS_CMD_ID_ContextFinish, size);
-}
-
diff --git a/libs/rs/rsThreadIO.cpp b/libs/rs/rsThreadIO.cpp
index 6e959a7..4429556 100644
--- a/libs/rs/rsThreadIO.cpp
+++ b/libs/rs/rsThreadIO.cpp
@@ -23,16 +23,96 @@
 
 ThreadIO::ThreadIO() {
     mToCore.init(16 * 1024);
-    mToClient.init(1024);
 }
 
 ThreadIO::~ThreadIO() {
 }
 
-void ThreadIO::shutdown() {
-    mToCore.shutdown();
+void ThreadIO::init(bool useSocket) {
+    mUsingSocket = useSocket;
+
+    if (mUsingSocket) {
+        mToClientSocket.init();
+        mToCoreSocket.init();
+    } else {
+        mToClient.init(1024);
+    }
 }
 
+void ThreadIO::shutdown() {
+    //LOGE("shutdown 1");
+    mToCore.shutdown();
+    //LOGE("shutdown 2");
+}
+
+void ThreadIO::coreFlush() {
+    //LOGE("coreFlush 1");
+    if (mUsingSocket) {
+    } else {
+        mToCore.flush();
+    }
+    //LOGE("coreFlush 2");
+}
+
+void * ThreadIO::coreHeader(uint32_t cmdID, size_t dataLen) {
+    //LOGE("coreHeader %i %i", cmdID, dataLen);
+    if (mUsingSocket) {
+        CoreCmdHeader hdr;
+        hdr.bytes = dataLen;
+        hdr.cmdID = cmdID;
+        mToCoreSocket.writeAsync(&hdr, sizeof(hdr));
+    } else {
+        mCoreCommandSize = dataLen;
+        mCoreCommandID = cmdID;
+        mCoreDataPtr = (uint8_t *)mToCore.reserve(dataLen);
+        mCoreDataBasePtr = mCoreDataPtr;
+    }
+    //LOGE("coreHeader ret %p", mCoreDataPtr);
+    return mCoreDataPtr;
+}
+
+void ThreadIO::coreData(const void *data, size_t dataLen) {
+    //LOGE("coreData %p %i", data, dataLen);
+    mToCoreSocket.writeAsync(data, dataLen);
+    //LOGE("coreData ret %p", mCoreDataPtr);
+}
+
+void ThreadIO::coreCommit() {
+    //LOGE("coreCommit %p %p %i", mCoreDataPtr, mCoreDataBasePtr, mCoreCommandSize);
+    if (mUsingSocket) {
+    } else {
+        rsAssert((size_t)(mCoreDataPtr - mCoreDataBasePtr) <= mCoreCommandSize);
+        mToCore.commit(mCoreCommandID, mCoreCommandSize);
+    }
+    //LOGE("coreCommit ret");
+}
+
+void ThreadIO::coreCommitSync() {
+    //LOGE("coreCommitSync %p %p %i", mCoreDataPtr, mCoreDataBasePtr, mCoreCommandSize);
+    if (mUsingSocket) {
+    } else {
+        rsAssert((size_t)(mCoreDataPtr - mCoreDataBasePtr) <= mCoreCommandSize);
+        mToCore.commitSync(mCoreCommandID, mCoreCommandSize);
+    }
+    //LOGE("coreCommitSync ret");
+}
+
+void ThreadIO::clientShutdown() {
+    //LOGE("coreShutdown 1");
+    mToClient.shutdown();
+    //LOGE("coreShutdown 2");
+}
+
+void ThreadIO::coreSetReturn(const void *data, size_t dataLen) {
+    rsAssert(dataLen <= sizeof(mToCoreRet));
+    memcpy(&mToCoreRet, data, dataLen);
+}
+
+void ThreadIO::coreGetReturn(void *data, size_t dataLen) {
+    memcpy(data, &mToCoreRet, dataLen);
+}
+
+
 bool ThreadIO::playCoreCommands(Context *con, bool waitForCommand) {
     bool ret = false;
     while (!mToCore.isEmpty() || waitForCommand) {
@@ -64,4 +144,82 @@
     return ret;
 }
 
+RsMessageToClientType ThreadIO::getClientHeader(size_t *receiveLen, uint32_t *usrID) {
+    if (mUsingSocket) {
+        mToClientSocket.read(&mLastClientHeader, sizeof(mLastClientHeader));
+    } else {
+        size_t bytesData = 0;
+        const uint32_t *d = (const uint32_t *)mToClient.get(&mLastClientHeader.cmdID, &bytesData);
+        if (bytesData >= sizeof(uint32_t)) {
+            mLastClientHeader.userID = d[0];
+            mLastClientHeader.bytes = bytesData - sizeof(uint32_t);
+        } else {
+            mLastClientHeader.userID = 0;
+            mLastClientHeader.bytes = 0;
+        }
+    }
+    receiveLen[0] = mLastClientHeader.bytes;
+    usrID[0] = mLastClientHeader.userID;
+    return (RsMessageToClientType)mLastClientHeader.cmdID;
+}
+
+RsMessageToClientType ThreadIO::getClientPayload(void *data, size_t *receiveLen,
+                                uint32_t *usrID, size_t bufferLen) {
+    receiveLen[0] = mLastClientHeader.bytes;
+    usrID[0] = mLastClientHeader.userID;
+    if (bufferLen < mLastClientHeader.bytes) {
+        return RS_MESSAGE_TO_CLIENT_RESIZE;
+    }
+    if (mUsingSocket) {
+        if (receiveLen[0]) {
+            mToClientSocket.read(data, receiveLen[0]);
+        }
+        return (RsMessageToClientType)mLastClientHeader.cmdID;
+    } else {
+        uint32_t bytesData = 0;
+        uint32_t commandID = 0;
+        const uint32_t *d = (const uint32_t *)mToClient.get(&commandID, &bytesData);
+        //LOGE("getMessageToClient 3    %i  %i", commandID, bytesData);
+        //LOGE("getMessageToClient  %i %i", commandID, *subID);
+        if (bufferLen >= receiveLen[0]) {
+            memcpy(data, d+1, receiveLen[0]);
+            mToClient.next();
+            return (RsMessageToClientType)commandID;
+        }
+    }
+    return RS_MESSAGE_TO_CLIENT_RESIZE;
+}
+
+bool ThreadIO::sendToClient(RsMessageToClientType cmdID, uint32_t usrID, const void *data,
+                            size_t dataLen, bool waitForSpace) {
+    ClientCmdHeader hdr;
+    hdr.bytes = dataLen;
+    hdr.cmdID = cmdID;
+    hdr.userID = usrID;
+    if (mUsingSocket) {
+        mToClientSocket.writeAsync(&hdr, sizeof(hdr));
+        if (dataLen) {
+            mToClientSocket.writeAsync(data, dataLen);
+        }
+        return true;
+    } else {
+        if (!waitForSpace) {
+            if (!mToClient.makeSpaceNonBlocking(dataLen + sizeof(hdr))) {
+                // Not enough room, and not waiting.
+                return false;
+            }
+        }
+
+        //LOGE("sendMessageToClient 2");
+        uint32_t *p = (uint32_t *)mToClient.reserve(dataLen + sizeof(usrID));
+        p[0] = usrID;
+        if (dataLen > 0) {
+            memcpy(p+1, data, dataLen);
+        }
+        mToClient.commit(cmdID, dataLen + sizeof(usrID));
+        //LOGE("sendMessageToClient 3");
+        return true;
+    }
+    return false;
+}
 
diff --git a/libs/rs/rsThreadIO.h b/libs/rs/rsThreadIO.h
index f9d0de7..cad7318 100644
--- a/libs/rs/rsThreadIO.h
+++ b/libs/rs/rsThreadIO.h
@@ -19,6 +19,7 @@
 
 #include "rsUtils.h"
 #include "rsLocklessFifo.h"
+#include "rsFifoSocket.h"
 
 // ---------------------------------------------------------------------------
 namespace android {
@@ -31,17 +32,58 @@
     ThreadIO();
     ~ThreadIO();
 
+    void init(bool useSocket = false);
     void shutdown();
 
     // Plays back commands from the client.
     // Returns true if any commands were processed.
     bool playCoreCommands(Context *con, bool waitForCommand);
 
+    //LocklessCommandFifo mToCore;
 
-    LocklessCommandFifo mToCore;
+
+
+    void coreFlush();
+    void * coreHeader(uint32_t, size_t dataLen);
+    void coreData(const void *data, size_t dataLen);
+    void coreCommit();
+    void coreCommitSync();
+    void coreSetReturn(const void *data, size_t dataLen);
+    void coreGetReturn(void *data, size_t dataLen);
+
+
+    RsMessageToClientType getClientHeader(size_t *receiveLen, uint32_t *usrID);
+    RsMessageToClientType getClientPayload(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen);
+    bool sendToClient(RsMessageToClientType cmdID, uint32_t usrID, const void *data, size_t dataLen, bool waitForSpace);
+    void clientShutdown();
+
+
+protected:
+    typedef struct CoreCmdHeaderRec {
+        uint32_t cmdID;
+        uint32_t bytes;
+    } CoreCmdHeader;
+    typedef struct ClientCmdHeaderRec {
+        uint32_t cmdID;
+        uint32_t bytes;
+        uint32_t userID;
+    } ClientCmdHeader;
+    ClientCmdHeader mLastClientHeader;
+
+    size_t mCoreCommandSize;
+    uint32_t mCoreCommandID;
+    uint8_t * mCoreDataPtr;
+    uint8_t * mCoreDataBasePtr;
+
+    bool mUsingSocket;
     LocklessCommandFifo mToClient;
+    LocklessCommandFifo mToCore;
+
+    FifoSocket mToClientSocket;
+    FifoSocket mToCoreSocket;
 
     intptr_t mToCoreRet;
+
 };
 
 
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 4cc2abf..9d8c906 100644
--- a/libs/rs/rs_hal.h
+++ b/libs/rs/rs_hal.h
@@ -37,6 +37,7 @@
 class ProgramFragment;
 class Mesh;
 class Sampler;
+class FBOCache;
 
 typedef void *(*RsHalSymbolLookupFunc)(void *usrptr, char const *symbolName);
 
@@ -46,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 *);
@@ -128,6 +129,12 @@
         void (*destroy)(const Context *rsc, const Sampler *m);
     } sampler;
 
+    struct {
+        bool (*init)(const Context *rsc, const FBOCache *fb);
+        void (*setActive)(const Context *rsc, const FBOCache *fb);
+        void (*destroy)(const Context *rsc, const FBOCache *fb);
+    } framebuffer;
+
 } RsdHalFunctions;
 
 
diff --git a/libs/rs/rsg_generator.c b/libs/rs/rsg_generator.c
index d550712..b3f6c55 100644
--- a/libs/rs/rsg_generator.c
+++ b/libs/rs/rsg_generator.c
@@ -193,7 +193,6 @@
     fprintf(f, "\n");
     fprintf(f, "using namespace android;\n");
     fprintf(f, "using namespace android::renderscript;\n");
-    fprintf(f, "#include \"rsHandcode.h\"\n");
     fprintf(f, "\n");
 
     printFuncPointers(f, 0);
@@ -206,18 +205,14 @@
         fprintf(f, "static ");
         printFuncDecl(f, api, "LF_", 0, 0);
         fprintf(f, "\n{\n");
-        if (api->handcodeApi || api->direct) {
-            if (api->handcodeApi) {
-                fprintf(f, "    rsHCAPI_%s(rsc", api->name);
-            } else {
-                fprintf(f, "    ");
-                if (api->ret.typeName[0]) {
-                    fprintf(f, "return ");
-                }
-                fprintf(f, "rsi_%s(", api->name);
-                if (!api->nocontext) {
-                    fprintf(f, "(Context *)rsc");
-                }
+        if (api->direct) {
+            fprintf(f, "    ");
+            if (api->ret.typeName[0]) {
+                fprintf(f, "return ");
+            }
+            fprintf(f, "rsi_%s(", api->name);
+            if (!api->nocontext) {
+                fprintf(f, "(Context *)rsc");
             }
             for (ct2=0; ct2 < api->paramCount; ct2++) {
                 const VarType *vt = &api->params[ct2];
@@ -244,13 +239,13 @@
             if (hasInlineDataPointers(api)) {
                 fprintf(f, "    RS_CMD_%s *cmd = NULL;\n", api->name);
                 fprintf(f, "    if (dataSize < 1024) {;\n");
-                fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->mToCore.reserve(dataSize + size));\n", api->name);
+                fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, dataSize + size));\n", api->name, api->name);
                 fprintf(f, "    } else {\n");
-                fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->mToCore.reserve(size));\n", api->name);
+                fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name);
                 fprintf(f, "    }\n");
                 fprintf(f, "    uint8_t *payload = (uint8_t *)&cmd[1];\n");
             } else {
-                fprintf(f, "    RS_CMD_%s *cmd = static_cast<RS_CMD_%s *>(io->mToCore.reserve(size));\n", api->name, api->name);
+                fprintf(f, "    RS_CMD_%s *cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name, api->name);
             }
 
             for (ct2=0; ct2 < api->paramCount; ct2++) {
@@ -271,28 +266,30 @@
                     fprintf(f, "    cmd->%s = %s;\n", vt->name, vt->name);
                 }
             }
-            if (api->ret.typeName[0]) {
+            if (api->ret.typeName[0] || api->sync) {
                 needFlush = 1;
             }
 
             if (hasInlineDataPointers(api)) {
                 fprintf(f, "    if (dataSize < 1024) {\n");
-                fprintf(f, "        io->mToCore.commit(RS_CMD_ID_%s, size + dataSize);\n", api->name);
+                fprintf(f, "        io->coreCommit();\n");
                 fprintf(f, "    } else {\n");
-                fprintf(f, "        io->mToCore.commitSync(RS_CMD_ID_%s, size);\n", api->name);
+                fprintf(f, "        io->coreCommitSync();\n");
                 fprintf(f, "    }\n");
             } else {
-                fprintf(f, "    io->mToCore.commit");
+                fprintf(f, "    io->coreCommit");
                 if (needFlush) {
                     fprintf(f, "Sync");
                 }
-                fprintf(f, "(RS_CMD_ID_%s, size);\n", api->name);
+                fprintf(f, "();\n");
             }
 
             if (api->ret.typeName[0]) {
-                fprintf(f, "    return reinterpret_cast<");
+                fprintf(f, "\n    ");
                 printVarType(f, &api->ret);
-                fprintf(f, ">(io->mToCoreRet);\n");
+                fprintf(f, " ret;\n");
+                fprintf(f, "    io->coreGetReturn(&ret, sizeof(ret));\n");
+                fprintf(f, "    return ret;\n");
             }
         }
         fprintf(f, "};\n\n");
@@ -306,86 +303,73 @@
         fprintf(f, "    const uint32_t cmdSize = sizeof(cmd);\n");
         fprintf(f, "    const uint32_t cmdID = RS_CMD_ID_%s;\n", api->name);
         fprintf(f, "    f->writeAsync(&cmdID, sizeof(cmdID));\n");
-
-        if (api->handcodeApi) {
-            fprintf(f, "    rsHCAPI_%s(rsc", api->name);
-            for (ct2=0; ct2 < api->paramCount; ct2++) {
-                const VarType *vt = &api->params[ct2];
-                if (ct2 > 0 || !api->nocontext) {
-                    fprintf(f, ", ");
-                }
-                fprintf(f, "%s", vt->name);
-            }
-            fprintf(f, ");\n");
-        } else {
-            fprintf(f, "    intptr_t offset = cmdSize;\n");
-            fprintf(f, "    uint32_t dataSize = 0;\n");
-            for (ct2=0; ct2 < api->paramCount; ct2++) {
-                const VarType *vt = &api->params[ct2];
-                if (vt->isConst && vt->ptrLevel) {
-                    switch(vt->ptrLevel) {
-                    case 1:
-                        fprintf(f, "    dataSize += %s_length;\n", vt->name);
-                        break;
-                    case 2:
-                        fprintf(f, "    for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name);
-                        fprintf(f, "        dataSize += %s_length[ct];\n", vt->name);
-                        fprintf(f, "    }\n");
-                        break;
-                    default:
-                        printf("pointer level not handled!!");
-                    }
-                }
-            }
-            fprintf(f, "\n");
-
-            for (ct2=0; ct2 < api->paramCount; ct2++) {
-                const VarType *vt = &api->params[ct2];
+        fprintf(f, "    intptr_t offset = cmdSize;\n");
+        fprintf(f, "    uint32_t dataSize = 0;\n");
+        for (ct2=0; ct2 < api->paramCount; ct2++) {
+            const VarType *vt = &api->params[ct2];
+            if (vt->isConst && vt->ptrLevel) {
                 switch(vt->ptrLevel) {
-                case 0:
-                    fprintf(f, "    cmd.%s = %s;\n", vt->name, vt->name);
-                    break;
                 case 1:
-                    fprintf(f, "    cmd.%s = (", vt->name);
-                    printVarType(f, vt);
-                    fprintf(f, ")offset;\n");
-                    fprintf(f, "    offset += %s_length;\n", vt->name);
+                    fprintf(f, "    dataSize += %s_length;\n", vt->name);
                     break;
                 case 2:
-                    fprintf(f, "    cmd.%s = (", vt->name);
-                    printVarType(f, vt);
-                    fprintf(f, ")offset;\n");
                     fprintf(f, "    for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name);
-                    fprintf(f, "        offset += %s_length[ct];\n", vt->name);
+                    fprintf(f, "        dataSize += %s_length[ct];\n", vt->name);
                     fprintf(f, "    }\n");
                     break;
                 default:
                     printf("pointer level not handled!!");
                 }
             }
-            fprintf(f, "\n");
+        }
+        fprintf(f, "\n");
 
-            fprintf(f, "    f->writeAsync(&cmd, cmdSize);\n");
-            for (ct2=0; ct2 < api->paramCount; ct2++) {
-                const VarType *vt = &api->params[ct2];
-                if (vt->ptrLevel == 1) {
-                    fprintf(f, "    f->writeAsync(%s, %s_length);\n", vt->name, vt->name);
-                }
-                if (vt->ptrLevel == 2) {
-                    fprintf(f, "    for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name);
-                    fprintf(f, "        f->writeAsync(%s, %s_length[ct]);\n", vt->name, vt->name);
-                    fprintf(f, "        offset += %s_length[ct];\n", vt->name);
-                    fprintf(f, "    }\n");
-                }
+        for (ct2=0; ct2 < api->paramCount; ct2++) {
+            const VarType *vt = &api->params[ct2];
+            switch(vt->ptrLevel) {
+            case 0:
+                fprintf(f, "    cmd.%s = %s;\n", vt->name, vt->name);
+                break;
+            case 1:
+                fprintf(f, "    cmd.%s = (", vt->name);
+                printVarType(f, vt);
+                fprintf(f, ")offset;\n");
+                fprintf(f, "    offset += %s_length;\n", vt->name);
+                break;
+            case 2:
+                fprintf(f, "    cmd.%s = (", vt->name);
+                printVarType(f, vt);
+                fprintf(f, ")offset;\n");
+                fprintf(f, "    for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name);
+                fprintf(f, "        offset += %s_length[ct];\n", vt->name);
+                fprintf(f, "    }\n");
+                break;
+            default:
+                fprintf(stderr, "pointer level not handled!!");
             }
+        }
+        fprintf(f, "\n");
 
-            if (api->ret.typeName[0]) {
-                fprintf(f, "    ");
-                printVarType(f, &api->ret);
-                fprintf(f, " retValue;\n");
-                fprintf(f, "    f->writeWaitReturn(&retValue, sizeof(retValue));\n");
-                fprintf(f, "    return retValue;\n");
+        fprintf(f, "    f->writeAsync(&cmd, cmdSize);\n");
+        for (ct2=0; ct2 < api->paramCount; ct2++) {
+            const VarType *vt = &api->params[ct2];
+            if (vt->ptrLevel == 1) {
+                fprintf(f, "    f->writeAsync(%s, %s_length);\n", vt->name, vt->name);
             }
+            if (vt->ptrLevel == 2) {
+                fprintf(f, "    for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name);
+                fprintf(f, "        f->writeAsync(%s, %s_length[ct]);\n", vt->name, vt->name);
+                fprintf(f, "        offset += %s_length[ct];\n", vt->name);
+                fprintf(f, "    }\n");
+            }
+        }
+
+        if (api->ret.typeName[0]) {
+            fprintf(f, "    ");
+            printVarType(f, &api->ret);
+            fprintf(f, " retValue;\n");
+            fprintf(f, "    f->writeWaitReturn(&retValue, sizeof(retValue));\n");
+            fprintf(f, "    return retValue;\n");
         }
         fprintf(f, "}\n\n");
     }
@@ -446,7 +430,6 @@
     fprintf(f, "\n");
     fprintf(f, "namespace android {\n");
     fprintf(f, "namespace renderscript {\n");
-    fprintf(f, "#include \"rsHandcode.h\"\n");
     fprintf(f, "\n");
 
     for (ct=0; ct < apiCount; ct++) {
@@ -463,7 +446,9 @@
 
         fprintf(f, "    ");
         if (api->ret.typeName[0]) {
-            fprintf(f, "con->mIO.mToCoreRet = (intptr_t)");
+            fprintf(f, "\n    ");
+            printVarType(f, &api->ret);
+            fprintf(f, " ret = ");
         }
         fprintf(f, "rsi_%s(con", api->name);
         for (ct2=0; ct2 < api->paramCount; ct2++) {
@@ -472,6 +457,10 @@
         }
         fprintf(f, ");\n");
 
+        if (api->ret.typeName[0]) {
+            fprintf(f, "    con->mIO.coreSetReturn(&ret, sizeof(ret));\n");
+        }
+
         fprintf(f, "};\n\n");
     }
 
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 961ee1e..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);
         }
 
@@ -860,6 +859,10 @@
      * {@hide}
      */
     public static final int MEDIA_RECORDER_TRACK_INFO_START_OFFSET_MS   = 1008;
+    /** Provide the total number of data (in kilo-bytes) encoded.
+     * {@hide}
+     */
+    public static final int MEDIA_RECORDER_TRACK_INFO_DATA_KBYTES       = 1009;
     /**
      * {@hide}
      */
diff --git a/media/java/android/mtp/MtpStorage.java b/media/java/android/mtp/MtpStorage.java
index 33146e7..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.
@@ -29,12 +31,14 @@
     private final String mPath;
     private final String mDescription;
     private final long mReserveSpace;
+    private final boolean mRemovable;
 
-    public MtpStorage(int id, String path, String description, long reserveSpace) {
-        mStorageId = id;
-        mPath = path;
-        mDescription = description;
-        mReserveSpace = reserveSpace;
+    public MtpStorage(StorageVolume volume) {
+        mStorageId = volume.getStorageId();
+        mPath = volume.getPath();
+        mDescription = volume.getDescription();
+        mReserveSpace = volume.getMtpReserveSpace();
+        mRemovable = volume.isRemovable();
     }
 
     /**
@@ -86,4 +90,12 @@
         return mReserveSpace;
     }
 
+   /**
+     * Returns true if the storage is removable.
+     *
+     * @return is removable
+     */
+    public final boolean isRemovable() {
+        return mRemovable;
+    }
 }
diff --git a/media/jni/android_mtp_MtpServer.cpp b/media/jni/android_mtp_MtpServer.cpp
index 84c2c7e..4d84cb7 100644
--- a/media/jni/android_mtp_MtpServer.cpp
+++ b/media/jni/android_mtp_MtpServer.cpp
@@ -47,6 +47,7 @@
 static jfieldID field_MtpStorage_path;
 static jfieldID field_MtpStorage_description;
 static jfieldID field_MtpStorage_reserveSpace;
+static jfieldID field_MtpStorage_removable;
 
 static Mutex sMutex;
 
@@ -245,12 +246,13 @@
         jstring path = (jstring)env->GetObjectField(jstorage, field_MtpStorage_path);
         jstring description = (jstring)env->GetObjectField(jstorage, field_MtpStorage_description);
         jlong reserveSpace = env->GetLongField(jstorage, field_MtpStorage_reserveSpace);
+        jboolean removable = env->GetBooleanField(jstorage, field_MtpStorage_removable);
 
         const char *pathStr = env->GetStringUTFChars(path, NULL);
         if (pathStr != NULL) {
             const char *descriptionStr = env->GetStringUTFChars(description, NULL);
             if (descriptionStr != NULL) {
-                MtpStorage* storage = new MtpStorage(storageID, pathStr, descriptionStr, reserveSpace);
+                MtpStorage* storage = new MtpStorage(storageID, pathStr, descriptionStr, reserveSpace, removable);
                 thread->addStorage(storage);
                 env->ReleaseStringUTFChars(path, pathStr);
                 env->ReleaseStringUTFChars(description, descriptionStr);
@@ -322,7 +324,12 @@
     }
     field_MtpStorage_reserveSpace = env->GetFieldID(clazz, "mReserveSpace", "J");
     if (field_MtpStorage_reserveSpace == NULL) {
-        LOGE("Can't find MtpStorage.mStorageId");
+        LOGE("Can't find MtpStorage.mReserveSpace");
+        return -1;
+    }
+    field_MtpStorage_removable = env->GetFieldID(clazz, "mRemovable", "Z");
+    if (field_MtpStorage_removable == NULL) {
+        LOGE("Can't find MtpStorage.mRemovable");
         return -1;
     }
     clazz_MtpStorage = (jclass)env->NewGlobalRef(clazz);
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index 9eb84d2..978571c 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -1453,6 +1453,12 @@
         writer->setMaxFileSize(mMaxFileSizeBytes);
     }
 
+    mStartTimeOffsetMs = mEncoderProfiles->getStartTimeOffsetMs(mCameraId);
+    if (mStartTimeOffsetMs > 0) {
+        reinterpret_cast<MPEG4Writer *>(writer.get())->
+            setStartTimeOffsetMs(mStartTimeOffsetMs);
+    }
+
     writer->setListener(mListener);
     *mediaWriter = writer;
     return OK;
@@ -1659,6 +1665,7 @@
     mAudioTimeScale  = -1;
     mVideoTimeScale  = -1;
     mCameraId        = 0;
+    mStartTimeOffsetMs = -1;
     mVideoEncoderProfile = -1;
     mVideoEncoderLevel   = -1;
     mMaxFileDurationUs = 0;
@@ -1747,6 +1754,8 @@
     result.append(buffer);
     snprintf(buffer, SIZE, "     Camera Id: %d\n", mCameraId);
     result.append(buffer);
+    snprintf(buffer, SIZE, "     Start time offset (ms): %d\n", mStartTimeOffsetMs);
+    result.append(buffer);
     snprintf(buffer, SIZE, "     Encoder: %d\n", mVideoEncoder);
     result.append(buffer);
     snprintf(buffer, SIZE, "     Encoder profile: %d\n", mVideoEncoderProfile);
diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h
index 7795554..aa67aa7 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.h
+++ b/media/libmediaplayerservice/StagefrightRecorder.h
@@ -99,6 +99,7 @@
     int32_t mRotationDegrees;  // Clockwise
     int32_t mLatitudex10000;
     int32_t mLongitudex10000;
+    int32_t mStartTimeOffsetMs;
 
     bool mCaptureTimeLapse;
     int64_t mTimeBetweenTimeLapseFrameCaptureUs;
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 c79d02e..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>
 
@@ -2171,6 +2171,9 @@
         // Just give these file types a chance.
         FOURCC('q', 't', ' ', ' '),  // Apple's QuickTime
         FOURCC('M', 'S', 'N', 'V'),  // Sony's PSP
+
+        FOURCC('3', 'g', '2', 'a'),  // 3GPP2
+        FOURCC('3', 'g', '2', 'b'),
     };
 
     for (size_t i = 0;
diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp
index 63878b7..f6a8b17 100644
--- a/media/libstagefright/MPEG4Writer.cpp
+++ b/media/libstagefright/MPEG4Writer.cpp
@@ -33,6 +33,7 @@
 #include <media/stagefright/MediaSource.h>
 #include <media/stagefright/Utils.h>
 #include <media/mediarecorder.h>
+#include <cutils/properties.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -260,7 +261,8 @@
       mInterleaveDurationUs(1000000),
       mLatitudex10000(0),
       mLongitudex10000(0),
-      mAreGeoTagsAvailable(false) {
+      mAreGeoTagsAvailable(false),
+      mStartTimeOffsetMs(-1) {
 
     mFd = open(filename, O_CREAT | O_LARGEFILE | O_TRUNC | O_RDWR);
     if (mFd >= 0) {
@@ -282,7 +284,8 @@
       mInterleaveDurationUs(1000000),
       mLatitudex10000(0),
       mLongitudex10000(0),
-      mAreGeoTagsAvailable(false) {
+      mAreGeoTagsAvailable(false),
+      mStartTimeOffsetMs(-1) {
 }
 
 MPEG4Writer::~MPEG4Writer() {
@@ -741,7 +744,7 @@
     endBox();  // moov
 }
 
-void MPEG4Writer::writeFtypBox(const MetaData *param) {
+void MPEG4Writer::writeFtypBox(MetaData *param) {
     beginBox("ftyp");
 
     int32_t fileType;
@@ -758,7 +761,27 @@
     endBox();
 }
 
+static bool isTestModeEnabled() {
+#if (PROPERTY_VALUE_MAX < 5)
+#error "PROPERTY_VALUE_MAX must be at least 5"
+#endif
+
+    // Test mode is enabled only if rw.media.record.test system
+    // property is enabled.
+    char value[PROPERTY_VALUE_MAX];
+    if (property_get("rw.media.record.test", value, NULL) &&
+        (!strcasecmp(value, "true") || !strcasecmp(value, "1"))) {
+        return true;
+    }
+    return false;
+}
+
 void MPEG4Writer::sendSessionSummary() {
+    // Send session summary only if test mode is enabled
+    if (!isTestModeEnabled()) {
+        return;
+    }
+
     for (List<ChunkInfo>::iterator it = mChunkInfos.begin();
          it != mChunkInfos.end(); ++it) {
         int trackNum = it->mTrack->getTrackId() << 28;
@@ -1425,10 +1448,15 @@
          * session, and it also helps eliminate the "recording" sound for
          * camcorder applications.
          *
-         * Ideally, this platform-specific value should be defined
-         * in media_profiles.xml file
+         * If client does not set the start time offset, we fall back to
+         * use the default initial delay value.
          */
-        startTimeUs += kInitialDelayTimeUs;
+        int64_t startTimeOffsetUs = mOwner->getStartTimeOffsetMs() * 1000LL;
+        if (startTimeOffsetUs < 0) {  // Start time offset was not set
+            startTimeOffsetUs = kInitialDelayTimeUs;
+        }
+        startTimeUs += startTimeOffsetUs;
+        LOGI("Start time offset: %lld us", startTimeOffsetUs);
     }
 
     meta->setInt64(kKeyTime, startTimeUs);
@@ -2220,6 +2248,12 @@
 }
 
 void MPEG4Writer::Track::sendTrackSummary(bool hasMultipleTracks) {
+
+    // Send track summary only if test mode is enabled.
+    if (!isTestModeEnabled()) {
+        return;
+    }
+
     int trackNum = (mTrackId << 28);
 
     mOwner->notify(MEDIA_RECORDER_TRACK_EVENT_INFO,
@@ -2234,13 +2268,24 @@
                     trackNum | MEDIA_RECORDER_TRACK_INFO_ENCODED_FRAMES,
                     mNumSamples);
 
-    // The system delay time excluding the requested initial delay that
-    // is used to eliminate the recording sound.
-    int64_t initialDelayUs =
-        mFirstSampleTimeRealUs - mStartTimeRealUs - kInitialDelayTimeUs;
-    mOwner->notify(MEDIA_RECORDER_TRACK_EVENT_INFO,
+    {
+        // The system delay time excluding the requested initial delay that
+        // is used to eliminate the recording sound.
+        int64_t startTimeOffsetUs = mOwner->getStartTimeOffsetMs() * 1000LL;
+        if (startTimeOffsetUs < 0) {  // Start time offset was not set
+            startTimeOffsetUs = kInitialDelayTimeUs;
+        }
+        int64_t initialDelayUs =
+            mFirstSampleTimeRealUs - mStartTimeRealUs - startTimeOffsetUs;
+
+        mOwner->notify(MEDIA_RECORDER_TRACK_EVENT_INFO,
                     trackNum | MEDIA_RECORDER_TRACK_INFO_INITIAL_DELAY_MS,
                     (initialDelayUs) / 1000);
+    }
+
+    mOwner->notify(MEDIA_RECORDER_TRACK_EVENT_INFO,
+                    trackNum | MEDIA_RECORDER_TRACK_INFO_DATA_KBYTES,
+                    mMdatSizeBytes / 1024);
 
     if (hasMultipleTracks) {
         mOwner->notify(MEDIA_RECORDER_TRACK_EVENT_INFO,
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/aacdec/Android.mk b/media/libstagefright/codecs/aacdec/Android.mk
index 5ef54fd..359a2ec 100644
--- a/media/libstagefright/codecs/aacdec/Android.mk
+++ b/media/libstagefright/codecs/aacdec/Android.mk
@@ -176,6 +176,6 @@
         libstagefright_omx libstagefright_foundation libutils
 
 LOCAL_MODULE := libstagefright_soft_aacdec
-LOCAL_MODULE_TAGS := eng
+LOCAL_MODULE_TAGS := optional
 
 include $(BUILD_SHARED_LIBRARY)
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..a4d3e8fd 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/amrnb/dec/Android.mk b/media/libstagefright/codecs/amrnb/dec/Android.mk
index 296cae4..5862abc 100644
--- a/media/libstagefright/codecs/amrnb/dec/Android.mk
+++ b/media/libstagefright/codecs/amrnb/dec/Android.mk
@@ -79,6 +79,6 @@
         libstagefright_amrnb_common
 
 LOCAL_MODULE := libstagefright_soft_amrdec
-LOCAL_MODULE_TAGS := eng
+LOCAL_MODULE_TAGS := optional
 
 include $(BUILD_SHARED_LIBRARY)
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 c115b11b..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/avc/dec/Android.mk b/media/libstagefright/codecs/avc/dec/Android.mk
index afecdc4..4d4533b 100644
--- a/media/libstagefright/codecs/avc/dec/Android.mk
+++ b/media/libstagefright/codecs/avc/dec/Android.mk
@@ -50,7 +50,7 @@
         libstagefright libstagefright_omx libstagefright_foundation libutils
 
 LOCAL_MODULE := libstagefright_soft_avcdec
-LOCAL_MODULE_TAGS := eng
+LOCAL_MODULE_TAGS := optional
 
 include $(BUILD_SHARED_LIBRARY)
 
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/g711/dec/Android.mk b/media/libstagefright/codecs/g711/dec/Android.mk
index b6953bc..6e98559 100644
--- a/media/libstagefright/codecs/g711/dec/Android.mk
+++ b/media/libstagefright/codecs/g711/dec/Android.mk
@@ -26,6 +26,6 @@
         libstagefright libstagefright_omx libstagefright_foundation libutils
 
 LOCAL_MODULE := libstagefright_soft_g711dec
-LOCAL_MODULE_TAGS := eng
+LOCAL_MODULE_TAGS := optional
 
 include $(BUILD_SHARED_LIBRARY)
diff --git a/media/libstagefright/codecs/m4v_h263/dec/Android.mk b/media/libstagefright/codecs/m4v_h263/dec/Android.mk
index 65b642c..f1bec08 100644
--- a/media/libstagefright/codecs/m4v_h263/dec/Android.mk
+++ b/media/libstagefright/codecs/m4v_h263/dec/Android.mk
@@ -71,6 +71,6 @@
         libstagefright libstagefright_omx libstagefright_foundation libutils
 
 LOCAL_MODULE := libstagefright_soft_mpeg4dec
-LOCAL_MODULE_TAGS := eng
+LOCAL_MODULE_TAGS := optional
 
 include $(BUILD_SHARED_LIBRARY)
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/codecs/mp3dec/Android.mk b/media/libstagefright/codecs/mp3dec/Android.mk
index 2d35183..229988e 100644
--- a/media/libstagefright/codecs/mp3dec/Android.mk
+++ b/media/libstagefright/codecs/mp3dec/Android.mk
@@ -77,6 +77,6 @@
         libstagefright_mp3dec
 
 LOCAL_MODULE := libstagefright_soft_mp3dec
-LOCAL_MODULE_TAGS := eng
+LOCAL_MODULE_TAGS := optional
 
 include $(BUILD_SHARED_LIBRARY)
diff --git a/media/libstagefright/codecs/on2/dec/Android.mk b/media/libstagefright/codecs/on2/dec/Android.mk
index 1b3088f..832b885 100644
--- a/media/libstagefright/codecs/on2/dec/Android.mk
+++ b/media/libstagefright/codecs/on2/dec/Android.mk
@@ -37,7 +37,7 @@
         libstagefright libstagefright_omx libstagefright_foundation libutils
 
 LOCAL_MODULE := libstagefright_soft_vpxdec
-LOCAL_MODULE_TAGS := eng
+LOCAL_MODULE_TAGS := optional
 
 include $(BUILD_SHARED_LIBRARY)
 
diff --git a/media/libstagefright/codecs/vorbis/dec/Android.mk b/media/libstagefright/codecs/vorbis/dec/Android.mk
index 06f0079..9251229 100644
--- a/media/libstagefright/codecs/vorbis/dec/Android.mk
+++ b/media/libstagefright/codecs/vorbis/dec/Android.mk
@@ -32,7 +32,7 @@
         libstagefright_foundation libutils
 
 LOCAL_MODULE := libstagefright_soft_vorbisdec
-LOCAL_MODULE_TAGS := eng
+LOCAL_MODULE_TAGS := optional
 
 include $(BUILD_SHARED_LIBRARY)
 
diff --git a/media/libstagefright/colorconversion/Android.mk b/media/libstagefright/colorconversion/Android.mk
index 62ba40f..702a7b4 100644
--- a/media/libstagefright/colorconversion/Android.mk
+++ b/media/libstagefright/colorconversion/Android.mk
@@ -9,6 +9,10 @@
         $(TOP)/frameworks/base/include/media/stagefright/openmax \
         $(TOP)/hardware/msm7k
 
+ifneq ($(filter crespo crespo4g,$(TARGET_DEVICE)),)
+LOCAL_CFLAGS += -DTHIS_IS_CRESPO=1
+endif
+
 LOCAL_MODULE:= libstagefright_color_conversion
 
 include $(BUILD_STATIC_LIBRARY)
diff --git a/media/libstagefright/colorconversion/SoftwareRenderer.cpp b/media/libstagefright/colorconversion/SoftwareRenderer.cpp
index ee86148..1828ac8 100644
--- a/media/libstagefright/colorconversion/SoftwareRenderer.cpp
+++ b/media/libstagefright/colorconversion/SoftwareRenderer.cpp
@@ -56,9 +56,23 @@
     }
 
     int halFormat;
+    size_t bufWidth, bufHeight;
+
     switch (mColorFormat) {
+#ifndef THIS_IS_CRESPO
+        case OMX_COLOR_FormatYUV420Planar:
+        {
+            halFormat = HAL_PIXEL_FORMAT_YV12;
+            bufWidth = (mWidth + 1) & ~1;
+            bufHeight = (mHeight + 1) & ~1;
+            break;
+        }
+#endif
+
         default:
             halFormat = HAL_PIXEL_FORMAT_RGB_565;
+            bufWidth = mWidth;
+            bufHeight = mHeight;
 
             mConverter = new ColorConverter(
                     mColorFormat, OMX_COLOR_Format16bitRGB565);
@@ -75,13 +89,17 @@
             native_window_set_usage(
             mNativeWindow.get(),
             GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_OFTEN
-            | GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP));
+            | GRALLOC_USAGE_HW_TEXTURE
+#ifndef THIS_IS_CRESPO
+            | GRALLOC_USAGE_EXTERNAL_DISP
+#endif
+            ));
 
     // Width must be multiple of 32???
     CHECK_EQ(0, native_window_set_buffers_geometry(
                 mNativeWindow.get(),
-                mCropRight - mCropLeft + 1,
-                mCropBottom - mCropTop + 1,
+                bufWidth,
+                bufHeight,
                 halFormat));
 
     uint32_t transform;
@@ -97,6 +115,14 @@
         CHECK_EQ(0, native_window_set_buffers_transform(
                     mNativeWindow.get(), transform));
     }
+
+    android_native_rect_t crop;
+    crop.left = mCropLeft;
+    crop.top = mCropTop;
+    crop.right = mCropRight + 1;
+    crop.bottom = mCropBottom + 1;
+
+    CHECK_EQ(0, native_window_set_crop(mNativeWindow.get(), &crop));
 }
 
 SoftwareRenderer::~SoftwareRenderer() {
@@ -104,6 +130,11 @@
     mConverter = NULL;
 }
 
+static int ALIGN(int x, int y) {
+    // y must be a power of 2.
+    return (x + y - 1) & ~(y - 1);
+}
+
 void SoftwareRenderer::render(
         const void *data, size_t size, void *platformPrivate) {
     ANativeWindowBuffer *buf;
@@ -127,14 +158,40 @@
         mConverter->convert(
                 data,
                 mWidth, mHeight,
-                mCropLeft, mCropTop, mCropRight, mCropBottom,
+                0, 0, mWidth - 1, mHeight - 1,
                 dst,
                 buf->stride, buf->height,
-                0, 0,
-                mCropRight - mCropLeft,
-                mCropBottom - mCropTop);
+                0, 0, mWidth - 1, mHeight - 1);
     } else {
-        TRESPASS();
+        CHECK_EQ(mColorFormat, OMX_COLOR_FormatYUV420Planar);
+
+        const uint8_t *src_y = (const uint8_t *)data;
+        const uint8_t *src_u = (const uint8_t *)data + mWidth * mHeight;
+        const uint8_t *src_v = src_u + (mWidth / 2 * mHeight / 2);
+
+        uint8_t *dst_y = (uint8_t *)dst;
+        size_t dst_y_size = buf->stride * buf->height;
+        size_t dst_c_stride = ALIGN(buf->stride / 2, 16);
+        size_t dst_c_size = dst_c_stride * buf->height / 2;
+        uint8_t *dst_v = dst_y + dst_y_size;
+        uint8_t *dst_u = dst_v + dst_c_size;
+
+        for (int y = 0; y < mHeight; ++y) {
+            memcpy(dst_y, src_y, mWidth);
+
+            src_y += mWidth;
+            dst_y += buf->stride;
+        }
+
+        for (int y = 0; y < (mHeight + 1) / 2; ++y) {
+            memcpy(dst_u, src_u, (mWidth + 1) / 2);
+            memcpy(dst_v, src_v, (mWidth + 1) / 2);
+
+            src_u += mWidth / 2;
+            src_v += mWidth / 2;
+            dst_u += dst_c_stride;
+            dst_v += dst_c_stride;
+        }
     }
 
     CHECK_EQ(0, mapper.unlock(buf->handle));
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/media/mtp/MtpStorage.cpp b/media/mtp/MtpStorage.cpp
index fff0b5f..fef8066 100644
--- a/media/mtp/MtpStorage.cpp
+++ b/media/mtp/MtpStorage.cpp
@@ -33,12 +33,13 @@
 namespace android {
 
 MtpStorage::MtpStorage(MtpStorageID id, const char* filePath,
-        const char* description, uint64_t reserveSpace)
+        const char* description, uint64_t reserveSpace, bool removable)
     :   mStorageID(id),
         mFilePath(filePath),
         mDescription(description),
         mMaxCapacity(0),
-        mReserveSpace(reserveSpace)
+        mReserveSpace(reserveSpace),
+        mRemovable(removable)
 {
     LOGV("MtpStorage id: %d path: %s\n", id, filePath);
 }
@@ -47,7 +48,7 @@
 }
 
 int MtpStorage::getType() const {
-    return MTP_STORAGE_FIXED_RAM;
+    return (mRemovable ? MTP_STORAGE_REMOVABLE_RAM :  MTP_STORAGE_FIXED_RAM);
 }
 
 int MtpStorage::getFileSystemType() const {
diff --git a/media/mtp/MtpStorage.h b/media/mtp/MtpStorage.h
index d6ad25f..3e4f40d 100644
--- a/media/mtp/MtpStorage.h
+++ b/media/mtp/MtpStorage.h
@@ -33,10 +33,12 @@
     uint64_t                mMaxCapacity;
     // amount of free space to leave unallocated
     uint64_t                mReserveSpace;
+    bool                    mRemovable;
 
 public:
                             MtpStorage(MtpStorageID id, const char* filePath,
-                                    const char* description, uint64_t reserveSpace);
+                                    const char* description, uint64_t reserveSpace,
+                                    bool removable);
     virtual                 ~MtpStorage();
 
     inline MtpStorageID     getStorageID() const { return mStorageID; }
@@ -47,6 +49,7 @@
     uint64_t                getFreeSpace();
     const char*             getDescription() const;
     inline const char*      getPath() const { return (const char *)mFilePath; }
+    inline bool             isRemovable() const { return mRemovable; }
 };
 
 }; // namespace android
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/panel_notification.png b/packages/SystemUI/res/drawable-mdpi/panel_notification.png
deleted file mode 100644
index 3789f3c..0000000
--- a/packages/SystemUI/res/drawable-mdpi/panel_notification.png
+++ /dev/null
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/drawable-nodpi/panel_notification.png b/packages/SystemUI/res/drawable-nodpi/panel_notification.png
deleted file mode 100644
index 437deff..0000000
--- a/packages/SystemUI/res/drawable-nodpi/panel_notification.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable/panel_notification_tiled.xml b/packages/SystemUI/res/drawable/panel_notification_tiled.xml
deleted file mode 100644
index 9d41e28..0000000
--- a/packages/SystemUI/res/drawable/panel_notification_tiled.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?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.
--->
-
-<bitmap
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:src="@drawable/panel_notification"
-    android:tileMode="repeat"
-    />
-
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-en-rGB-large/strings.xml b/packages/SystemUI/res/values-en-rGB-large/strings.xml
new file mode 100644
index 0000000..aec6899
--- /dev/null
+++ b/packages/SystemUI/res/values-en-rGB-large/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * 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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Clear all"</string>
+    <string name="status_bar_settings_signal_meter_disconnected" msgid="383145178755329067">"No Internet connection"</string>
+    <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="2535465294437586528">"Wi-Fi connected"</string>
+    <string name="gps_notification_searching_text" msgid="4467935186864208249">"Searching for GPS"</string>
+    <string name="gps_notification_found_text" msgid="6270628388918822956">"Location set by GPS"</string>
+    <string name="notifications_off_title" msgid="1860117696034775851">"Notifications off"</string>
+    <string name="notifications_off_text" msgid="1439152806320786912">"Tap here to turn notifications back on."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-it-large/strings.xml b/packages/SystemUI/res/values-it-large/strings.xml
new file mode 100644
index 0000000..3cde529
--- /dev/null
+++ b/packages/SystemUI/res/values-it-large/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * 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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Cancella tutto"</string>
+    <string name="status_bar_settings_signal_meter_disconnected" msgid="383145178755329067">"Nessuna conness. Internet"</string>
+    <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="2535465294437586528">"Wi-Fi connesso"</string>
+    <string name="gps_notification_searching_text" msgid="4467935186864208249">"Ricerca del GPS"</string>
+    <string name="gps_notification_found_text" msgid="6270628388918822956">"Posizione stabilita dal GPS"</string>
+    <string name="notifications_off_title" msgid="1860117696034775851">"Notifiche disattivate"</string>
+    <string name="notifications_off_text" msgid="1439152806320786912">"Tocca qui per riattivare le notifiche."</string>
+</resources>
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-vi-large/strings.xml b/packages/SystemUI/res/values-vi-large/strings.xml
new file mode 100644
index 0000000..569d70f
--- /dev/null
+++ b/packages/SystemUI/res/values-vi-large/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/**
+ * 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.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="status_bar_clear_all_button" msgid="4661583896803349732">"Xóa tất cả"</string>
+    <string name="status_bar_settings_signal_meter_disconnected" msgid="383145178755329067">"Không có k.nối Internet"</string>
+    <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="2535465294437586528">"Đã kết nối Wi-Fi"</string>
+    <string name="gps_notification_searching_text" msgid="4467935186864208249">"Đang tìm kiếm GPS"</string>
+    <string name="gps_notification_found_text" msgid="6270628388918822956">"Vị trí đặt bởi GPS"</string>
+    <string name="notifications_off_title" msgid="1860117696034775851">"Tắt thông báo"</string>
+    <string name="notifications_off_text" msgid="1439152806320786912">"Chạm vào đây để bật lại thông báo."</string>
+</resources>
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 03afc82..e48dbe9 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -23,6 +23,7 @@
 import android.app.UiModeManager;
 import android.content.ActivityNotFoundException;
 import android.content.BroadcastReceiver;
+import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
@@ -230,7 +231,7 @@
     boolean mSafeMode;
     WindowState mStatusBar = null;
     boolean mStatusBarCanHide;
-    int mScreenMarginBottom;
+    int mStatusBarHeight;
     final ArrayList<WindowState> mStatusBarPanels = new ArrayList<WindowState>();
     WindowState mNavigationBar = null;
 
@@ -344,6 +345,10 @@
     int mLockScreenTimeout;
     boolean mLockScreenTimerActive;
 
+    // visual screen saver support
+    int mScreenSaverTimeout;
+    boolean mScreenSaverEnabled = false;
+
     // Behavior of ENDCALL Button.  (See Settings.System.END_BUTTON_BEHAVIOR.)
     int mEndcallBehavior;
 
@@ -399,6 +404,8 @@
                     Settings.Secure.DEFAULT_INPUT_METHOD), false, this);
             resolver.registerContentObserver(Settings.System.getUriFor(
                     "fancy_rotation_anim"), false, this);
+            resolver.registerContentObserver(Settings.System.getUriFor(
+                    Settings.Secure.DREAM_TIMEOUT), false, this);
             updateSettings();
         }
 
@@ -832,6 +839,11 @@
                 mHasSoftInput = hasSoftInput;
                 updateRotation = true;
             }
+
+            mScreenSaverTimeout = Settings.System.getInt(resolver,
+                    Settings.Secure.DREAM_TIMEOUT, 0);
+            mScreenSaverEnabled = true;
+            updateScreenSaverTimeoutLocked();
         }
         if (updateRotation) {
             updateRotation(0);
@@ -1071,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) {
@@ -1228,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:
@@ -2595,6 +2615,7 @@
             mScreenOn = false;
             updateOrientationListenerLp();
             updateLockScreenTimeout();
+            updateScreenSaverTimeoutLocked();
         }
     }
 
@@ -2606,6 +2627,7 @@
             mScreenOn = true;
             updateOrientationListenerLp();
             updateLockScreenTimeout();
+            updateScreenSaverTimeoutLocked();
         }
     }
 
@@ -2886,6 +2908,63 @@
                 mStatusBarService.userActivity();
             } catch (RemoteException ex) {}
         }
+
+        synchronized (mLock) {
+            updateScreenSaverTimeoutLocked();
+        }
+    }
+
+    Runnable mScreenSaverActivator = new Runnable() {
+        public void run() {
+            synchronized (this) {
+                if (!(mScreenSaverEnabled && mScreenOn)) {
+                    Log.w(TAG, "mScreenSaverActivator ran, but the screensaver should not be showing. Who's driving this thing?");
+                    return;
+                }
+
+                if (localLOGV) Log.v(TAG, "mScreenSaverActivator entering dreamland");
+                try {
+                    String component = Settings.System.getString(
+                            mContext.getContentResolver(), Settings.Secure.DREAM_COMPONENT);
+                    if (component != null) {
+                        ComponentName cn = ComponentName.unflattenFromString(component);
+                        Intent intent = new Intent(Intent.ACTION_MAIN)
+                            .setComponent(cn)
+                            .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+                                | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
+                                | Intent.FLAG_ACTIVITY_NO_USER_ACTION
+                                | Intent.FLAG_ACTIVITY_SINGLE_TOP);
+                        mContext.startActivity(intent);
+                    } else {
+                        Log.e(TAG, "Couldn't start screen saver: none selected");
+                    }
+                } catch (android.content.ActivityNotFoundException exc) {
+                    // no screensaver? give up
+                    Log.e(TAG, "Couldn't start screen saver: none installed");
+                }
+            }
+        }
+    };
+
+    // Must call while holding mLock
+    private void updateScreenSaverTimeoutLocked() {
+        synchronized (mScreenSaverActivator) {
+            mHandler.removeCallbacks(mScreenSaverActivator);
+            if (mScreenSaverEnabled && mScreenOn && mScreenSaverTimeout > 0) {
+                if (localLOGV)
+                    Log.v(TAG, "scheduling screensaver for " + mScreenSaverTimeout + "ms from now");
+                mHandler.postDelayed(mScreenSaverActivator, mScreenSaverTimeout);
+            } else {
+                if (localLOGV) {
+                    if (mScreenSaverTimeout == 0)
+                        Log.v(TAG, "screen saver disabled by user");
+                    else if (!mScreenOn)
+                        Log.v(TAG, "screen saver disabled while screen off");
+                    else
+                        Log.v(TAG, "screen saver disabled by wakelock");
+                }
+            }
+        }
     }
 
     Runnable mScreenLockTimeout = new Runnable() {
@@ -3081,10 +3160,27 @@
         return true;
     }
     
+    public void screenOnStartedLw() {
+        // The window manager has just grabbed a wake lock. This is our cue to disable the screen
+        // saver.
+        synchronized (mLock) {
+            mScreenSaverEnabled = false;
+        }
+    }
+
     public void screenOnStoppedLw() {
-        if (!mKeyguardMediator.isShowingAndNotHidden() && mPowerManager.isScreenOn()) {
-            long curTime = SystemClock.uptimeMillis();
-            mPowerManager.userActivity(curTime, false, LocalPowerManager.OTHER_EVENT);
+        if (mPowerManager.isScreenOn()) {
+            if (!mKeyguardMediator.isShowingAndNotHidden()) {
+                long curTime = SystemClock.uptimeMillis();
+                mPowerManager.userActivity(curTime, false, LocalPowerManager.OTHER_EVENT);
+            }
+
+            synchronized (mLock) {
+                // even if the keyguard is up, now that all the wakelocks have been released, we
+                // should re-enable the screen saver
+                mScreenSaverEnabled = true;
+                updateScreenSaverTimeoutLocked();
+            }
         }
     }
 
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 c18ccc8..f78dca9 100644
--- a/services/java/com/android/server/MountService.java
+++ b/services/java/com/android/server/MountService.java
@@ -17,6 +17,7 @@
 package com.android.server;
 
 import com.android.internal.app.IMediaContainerService;
+import com.android.internal.util.XmlUtils;
 import com.android.server.am.ActivityManagerService;
 import com.android.server.pm.PackageManagerService;
 
@@ -29,6 +30,9 @@
 import android.content.ServiceConnection;
 import android.content.pm.PackageManager;
 import android.content.res.ObbInfo;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
 import android.net.Uri;
 import android.os.Binder;
 import android.os.Environment;
@@ -37,6 +41,7 @@
 import android.os.IBinder;
 import android.os.Looper;
 import android.os.Message;
+import android.os.Parcelable;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.SystemClock;
@@ -47,8 +52,14 @@
 import android.os.storage.IObbActionListener;
 import android.os.storage.OnObbStateChangeListener;
 import android.os.storage.StorageResultCode;
+import android.os.storage.StorageVolume;
 import android.text.TextUtils;
+import android.util.AttributeSet;
 import android.util.Slog;
+import android.util.Xml;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.FileDescriptor;
 import java.io.IOException;
@@ -149,7 +160,10 @@
 
     private Context                               mContext;
     private NativeDaemonConnector                 mConnector;
+    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;
@@ -659,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::");
@@ -695,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;
@@ -733,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;
     }
 
@@ -766,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) {
@@ -788,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!");
@@ -821,8 +830,8 @@
             Slog.e(TAG, "Unhandled VolumeState {" + newState + "}");
         }
 
-        if (in != null) {
-            mContext.sendBroadcast(in);
+        if (action != null) {
+            sendStorageIntent(action, path);
         }
     }
 
@@ -872,7 +881,7 @@
             /*
              * Mount failed for some reason
              */
-            Intent in = null;
+            String action = null;
             int code = e.getCode();
             if (code == VoldResponseCode.OpFailedNoMedia) {
                 /*
@@ -885,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");
@@ -893,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;
@@ -902,8 +911,8 @@
             /*
              * Send broadcast intent (if required for the failure)
              */
-            if (in != null) {
-                mContext.sendBroadcast(in);
+            if (action != null) {
+                sendStorageIntent(action, path);
             }
         }
 
@@ -1060,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)));
@@ -1071,6 +1088,81 @@
         }
     }
 
+    // Storage list XML tags
+    private static final String TAG_STORAGE_LIST = "StorageList";
+    private static final String TAG_STORAGE = "storage";
+
+    private void readStorageList(Resources resources) {
+        int id = com.android.internal.R.xml.storage_list;
+        XmlResourceParser parser = resources.getXml(id);
+        AttributeSet attrs = Xml.asAttributeSet(parser);
+
+        try {
+            XmlUtils.beginDocument(parser, TAG_STORAGE_LIST);
+            while (true) {
+                XmlUtils.nextElement(parser);
+
+                String element = parser.getName();
+                if (element == null) break;
+
+                if (TAG_STORAGE.equals(element)) {
+                    TypedArray a = resources.obtainAttributes(attrs,
+                            com.android.internal.R.styleable.Storage);
+
+                    CharSequence path = a.getText(
+                            com.android.internal.R.styleable.Storage_mountPoint);
+                    CharSequence description = a.getText(
+                            com.android.internal.R.styleable.Storage_storageDescription);
+                    boolean primary = a.getBoolean(
+                            com.android.internal.R.styleable.Storage_primary, false);
+                    boolean removable = a.getBoolean(
+                            com.android.internal.R.styleable.Storage_removable, false);
+                    boolean emulated = a.getBoolean(
+                            com.android.internal.R.styleable.Storage_emulated, false);
+                    int mtpReserve = a.getInt(
+                            com.android.internal.R.styleable.Storage_mtpReserve, 0);
+
+                    Slog.d(TAG, "got storage path: " + path + " description: " + description +
+                            " primary: " + primary + " removable: " + removable +
+                            " emulated: " + emulated +  " mtpReserve: " + mtpReserve);
+                    if (path == null || description == null) {
+                        Slog.e(TAG, "path or description is null in readStorageList");
+                    } else {
+                        String pathString = path.toString();
+                        StorageVolume volume = new StorageVolume(pathString,
+                                description.toString(), removable, emulated, mtpReserve);
+                        if (primary) {
+                            if (mPrimaryVolume == null) {
+                                mPrimaryVolume = volume;
+                            } else {
+                                Slog.e(TAG, "multiple primary volumes in storage list");
+                            }
+                        }
+                        if (mPrimaryVolume == volume) {
+                            // primay volume must be first
+                            mVolumes.add(0, volume);
+                        } else {
+                            mVolumes.add(volume);
+                        }
+                        mVolumeMap.put(pathString, volume);
+                    }
+                    a.recycle();
+                }
+            }
+        } catch (XmlPullParserException e) {
+            throw new RuntimeException(e);
+        } 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();
+        }
+    }
+
     /**
      * Constructs a new MountService instance
      *
@@ -1078,13 +1170,16 @@
      */
     public MountService(Context context) {
         mContext = context;
+        Resources resources = context.getResources();
+        readStorageList(resources);
 
-        mExternalStoragePath = Environment.getExternalStorageDirectory().getPath();
-        mEmulateExternalStorage = context.getResources().getBoolean(
-                com.android.internal.R.bool.config_emulateExternalStorage);
-        if (mEmulateExternalStorage) {
-            Slog.d(TAG, "using emulated external storage");
-            mVolumeStates.put(mExternalStoragePath, Environment.MEDIA_MOUNTED);
+        if (mPrimaryVolume != null) {
+            mExternalStoragePath = mPrimaryVolume.getPath();
+            mEmulateExternalStorage = mPrimaryVolume.isEmulated();
+            if (mEmulateExternalStorage) {
+                Slog.d(TAG, "using emulated external storage");
+                mVolumeStates.put(mExternalStoragePath, Environment.MEDIA_MOUNTED);
+            }
         }
 
         // XXX: This will go away soon in favor of IMountServiceObserver
@@ -1756,13 +1851,12 @@
         }
     }
 
-    public String[] getVolumeList() {
-        synchronized(mVolumeStates) {
-            Set<String> volumes = mVolumeStates.keySet();
-            String[] result = new String[volumes.size()];
-            int i = 0;
-            for (String volume : volumes) {
-                result[i++] = volume;
+    public Parcelable[] getVolumeList() {
+        synchronized(mVolumes) {
+            int size = mVolumes.size();
+            Parcelable[] result = new Parcelable[size];
+            for (int i = 0; i < size; i++) {
+                result[i] = mVolumes.get(i);
             }
             return result;
         }
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 f6ae523..cf5592c 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -25,6 +25,7 @@
 import com.android.server.SystemServer;
 import com.android.server.Watchdog;
 import com.android.server.am.ActivityStack.ActivityState;
+import com.android.server.net.NetworkPolicyManagerService;
 import com.android.server.wm.WindowManagerService;
 
 import dalvik.system.Zygote;
@@ -42,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;
@@ -851,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
@@ -882,7 +876,10 @@
 
     final RemoteCallbackList<IActivityWatcher> mWatchers
             = new RemoteCallbackList<IActivityWatcher>();
-    
+
+    final RemoteCallbackList<IProcessObserver> mProcessObservers
+            = new RemoteCallbackList<IProcessObserver>();
+
     /**
      * Callback of last caller to {@link #requestPss}.
      */
@@ -971,6 +968,8 @@
     static final int CHECK_EXCESSIVE_WAKE_LOCKS_MSG = 27;
     static final int CLEAR_DNS_CACHE = 28;
     static final int UPDATE_HTTP_PROXY = 29;
+    static final int DISPATCH_FOREGROUND_ACTIVITIES_CHANGED = 30;
+    static final int DISPATCH_PROCESS_DIED = 31;
 
     AlertDialog mUidAlert;
 
@@ -1271,6 +1270,18 @@
                     sendMessageDelayed(nmsg, POWER_CHECK_DELAY);
                 }
             } break;
+            case DISPATCH_FOREGROUND_ACTIVITIES_CHANGED: {
+                final ProcessRecord app = (ProcessRecord) msg.obj;
+                final boolean foregroundActivities = msg.arg1 != 0;
+                dispatchForegroundActivitiesChanged(
+                        app.pid, app.info.uid, foregroundActivities);
+                break;
+            }
+            case DISPATCH_PROCESS_DIED: {
+                final ProcessRecord app = (ProcessRecord) msg.obj;
+                dispatchProcessDied(app.pid, app.info.uid);
+                break;
+            }
             }
         }
     };
@@ -1436,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();
@@ -1743,7 +1745,7 @@
         mLruSeq++;
         updateLruProcessInternalLocked(app, oomAdj, updateActivityTime, 0);
     }
-    
+
     final ProcessRecord getProcessRecordLocked(
             String processName, int uid) {
         if (uid == Process.SYSTEM_UID) {
@@ -1916,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()) {
@@ -2131,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) {
@@ -3339,7 +3370,8 @@
 
     private final boolean forceStopPackageLocked(String name, int uid,
             boolean callerWillRestart, boolean purgeCache, boolean doit) {
-        int i, N;
+        int i;
+        int N;
 
         if (uid < 0) {
             try {
@@ -6218,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;
@@ -8691,9 +8731,17 @@
                     schedGroup = Integer.toString(r.setSchedGroup);
                     break;
             }
-            pw.println(String.format("%s%s #%2d: adj=%s/%s %s (%s)",
+            String foreground;
+            if (r.foregroundActivities) {
+                foreground = "A";
+            } else if (r.foregroundServices) {
+                foreground = "S";
+            } else {
+                foreground = " ";
+            }
+            pw.println(String.format("%s%s #%2d: adj=%s/%s%s %s (%s)",
                     prefix, (r.persistent ? persistentLabel : normalLabel),
-                    N-i, oomAdj, schedGroup, r.toShortString(), r.adjType));
+                    N-i, oomAdj, schedGroup, foreground, r.toShortString(), r.adjType));
             if (r.adjSource != null || r.adjTarget != null) {
                 pw.print(prefix);
                 pw.print("    ");
@@ -9069,6 +9117,7 @@
         app.thread = null;
         app.forcingToForeground = null;
         app.foregroundServices = false;
+        app.foregroundActivities = false;
 
         killServicesLocked(app, true);
 
@@ -9162,6 +9211,8 @@
             }
         }
 
+        mHandler.obtainMessage(DISPATCH_PROCESS_DIED, app).sendToTarget();
+
         // If the caller is restarting this app, then leave it in its
         // current lists and let the caller take care of it.
         if (restarting) {
@@ -12400,25 +12451,30 @@
             app.keeping = true;
             app.curSchedGroup = Process.THREAD_GROUP_DEFAULT;
             return (app.curAdj=app.maxAdj);
-       }
-        
+        }
+
+        final boolean hadForegroundActivities = app.foregroundActivities;
+
         app.adjTypeCode = ActivityManager.RunningAppProcessInfo.REASON_UNKNOWN;
         app.adjSource = null;
         app.adjTarget = null;
         app.keeping = false;
         app.empty = false;
         app.hidden = false;
+        app.foregroundActivities = false;
+
+        final int activitiesSize = app.activities.size();
 
         // Determine the importance of the process, starting with most
         // important to least, and assign an appropriate OOM adjustment.
         int adj;
         int schedGroup;
-        int N;
         if (app == TOP_APP) {
             // The last app on the list is the foreground app.
             adj = FOREGROUND_APP_ADJ;
             schedGroup = Process.THREAD_GROUP_DEFAULT;
             app.adjType = "top-activity";
+            app.foregroundActivities = true;
         } else if (app.instrumentationClass != null) {
             // Don't want to kill running instrumentation.
             adj = FOREGROUND_APP_ADJ;
@@ -12437,54 +12493,64 @@
             adj = FOREGROUND_APP_ADJ;
             schedGroup = Process.THREAD_GROUP_DEFAULT;
             app.adjType = "exec-service";
-        } else if ((N=app.activities.size()) != 0) {
+        } else if (activitiesSize > 0) {
             // This app is in the background with paused activities.
-            app.hidden = true;
+            // We inspect activities to potentially upgrade adjustment further below.
             adj = hiddenAdj;
             schedGroup = Process.THREAD_GROUP_BG_NONINTERACTIVE;
+            app.hidden = true;
             app.adjType = "bg-activities";
-            N = app.activities.size();
-            for (int j=0; j<N; j++) {
-                ActivityRecord r = app.activities.get(j);
-                if (r.visible) {
-                    // This app has a visible activity!
-                    app.hidden = false;
-                    adj = VISIBLE_APP_ADJ;
-                    schedGroup = Process.THREAD_GROUP_DEFAULT;
-                    app.adjType = "visible";
-                    break;
-                } else if (r.state == ActivityState.PAUSING
-                        || r.state == ActivityState.PAUSED
-                        || r.state == ActivityState.STOPPING) {
-                    adj = PERCEPTIBLE_APP_ADJ;
-                    app.adjType = "stopping";
-                }
-            }
         } else {
             // A very not-needed process.  If this is lower in the lru list,
             // we will push it in to the empty bucket.
+            adj = hiddenAdj;
+            schedGroup = Process.THREAD_GROUP_BG_NONINTERACTIVE;
             app.hidden = true;
             app.empty = true;
-            schedGroup = Process.THREAD_GROUP_BG_NONINTERACTIVE;
-            adj = hiddenAdj;
             app.adjType = "bg-empty";
         }
-        
+
+        // Examine all activities if not already foreground.
+        if (!app.foregroundActivities && activitiesSize > 0) {
+            for (int j = 0; j < activitiesSize; j++) {
+                final ActivityRecord r = app.activities.get(j);
+                if (r.visible) {
+                    // App has a visible activity; only upgrade adjustment.
+                    if (adj > VISIBLE_APP_ADJ) {
+                        adj = VISIBLE_APP_ADJ;
+                        app.adjType = "visible";
+                    }
+                    schedGroup = Process.THREAD_GROUP_DEFAULT;
+                    app.hidden = false;
+                    app.foregroundActivities = true;
+                    break;
+                } else if (r.state == ActivityState.PAUSING || r.state == ActivityState.PAUSED
+                        || r.state == ActivityState.STOPPING) {
+                    // Only upgrade adjustment.
+                    if (adj > PERCEPTIBLE_APP_ADJ) {
+                        adj = PERCEPTIBLE_APP_ADJ;
+                        app.adjType = "stopping";
+                    }
+                    app.foregroundActivities = true;
+                }
+            }
+        }
+
         if (adj > PERCEPTIBLE_APP_ADJ) {
             if (app.foregroundServices) {
                 // The user is aware of this app, so make it visible.
                 adj = PERCEPTIBLE_APP_ADJ;
-                schedGroup = Process.THREAD_GROUP_DEFAULT;
                 app.adjType = "foreground-service";
+                schedGroup = Process.THREAD_GROUP_DEFAULT;
             } else if (app.forcingToForeground != null) {
                 // The user is aware of this app, so make it visible.
                 adj = PERCEPTIBLE_APP_ADJ;
-                schedGroup = Process.THREAD_GROUP_DEFAULT;
                 app.adjType = "force-foreground";
                 app.adjSource = app.forcingToForeground;
+                schedGroup = Process.THREAD_GROUP_DEFAULT;
             }
         }
-        
+
         if (adj > HEAVY_WEIGHT_APP_ADJ && app == mHeavyWeightProcess) {
             // We don't want to kill the current heavy-weight process.
             adj = HEAVY_WEIGHT_APP_ADJ;
@@ -12704,7 +12770,12 @@
 
         app.curAdj = adj;
         app.curSchedGroup = schedGroup;
-        
+
+        if (hadForegroundActivities != app.foregroundActivities) {
+            mHandler.obtainMessage(DISPATCH_FOREGROUND_ACTIVITIES_CHANGED,
+                    app.foregroundActivities ? 1 : 0, 0, app).sendToTarget();
+        }
+
         return adj;
     }
 
@@ -12937,13 +13008,15 @@
     }
 
     private final boolean updateOomAdjLocked(
-        ProcessRecord app, int hiddenAdj, ProcessRecord TOP_APP) {
+            ProcessRecord app, int hiddenAdj, ProcessRecord TOP_APP) {
         app.hiddenAdj = hiddenAdj;
 
         if (app.thread == null) {
             return true;
         }
 
+        boolean success = true;
+
         final boolean wasKeeping = app.keeping;
 
         int adj = computeOomAdjLocked(app, hiddenAdj, TOP_APP, false);
@@ -12983,7 +13056,7 @@
                         " oom adj to " + adj);
                     app.setAdj = adj;
                 } else {
-                    return false;
+                    success = false;
                 }
             }
             if (app.setSchedGroup != app.curSchedGroup) {
@@ -13022,7 +13095,7 @@
             }
         }
 
-        return true;
+        return success;
     }
 
     private final ActivityRecord resumedAppLocked() {
diff --git a/services/java/com/android/server/am/ProcessRecord.java b/services/java/com/android/server/am/ProcessRecord.java
index 5be35ee..beef136 100644
--- a/services/java/com/android/server/am/ProcessRecord.java
+++ b/services/java/com/android/server/am/ProcessRecord.java
@@ -64,6 +64,7 @@
     boolean keeping;            // Actively running code so don't kill due to that?
     boolean setIsForeground;    // Running foreground UI when last set?
     boolean foregroundServices; // Running any services that are foreground?
+    boolean foregroundActivities; // Running any activities that are foreground?
     boolean bad;                // True if disabled in the bad process list
     boolean killedBackground;   // True when proc has been killed due to too many bg
     String waitingToKill;       // Process is waiting to be killed when in the bg; reason
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
new file mode 100644
index 0000000..d083d01
--- /dev/null
+++ b/services/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -0,0 +1,250 @@
+/*
+ * 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.net;
+
+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_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.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;
+
+/**
+ * Service that maintains low-level network policy rules and collects usage
+ * statistics to drive those rules.
+ */
+public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
+    private static final String TAG = "NetworkPolicy";
+    private static final boolean LOGD = true;
+
+    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 = new SparseIntArray();
+
+    /** Foreground at both UID and PID granularity. */
+    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
+
+    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 systemReady() {
+        // TODO: read current policy+stats from disk and generate NMS rules
+
+        updateScreenOn();
+
+        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);
+        }
+
+        // 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);
+
+    }
+
+    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");
+
+            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");
+
+        synchronized (mRulesLock) {
+            mUidPolicy.put(uid, policy);
+        }
+    }
+
+    @Override
+    public int getUidPolicy(int uid) {
+        synchronized (mRulesLock) {
+            return mUidPolicy.get(uid, POLICY_NONE);
+        }
+    }
+
+    /**
+     * Foreground for PID changed; recompute foreground at UID level. If
+     * changed, will trigger {@link #updateRulesForUidL(int)}.
+     */
+    private void computeUidForegroundL(int uid) {
+        final SparseBooleanArray pidForeground = mUidPidForeground.get(uid);
+
+        // current pid is dropping foreground; examine other pids
+        boolean uidForeground = false;
+        final int size = pidForeground.size();
+        for (int i = 0; i < size; i++) {
+            if (pidForeground.valueAt(i)) {
+                uidForeground = true;
+                break;
+            }
+        }
+
+        final boolean oldUidForeground = mUidForeground.get(uid, false);
+        if (oldUidForeground != uidForeground) {
+            // foreground changed, push updated rules
+            mUidForeground.put(uid, uidForeground);
+            updateRulesForUidL(uid);
+        }
+    }
+
+    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) {
+            Log.d(TAG, "updateRulesForUid(uid=" + uid + ") found foreground=" + uidForeground
+                    + " and policy=" + uidPolicy);
+        }
+
+        if (!uidForeground && (uidPolicy & POLICY_REJECT_BACKGROUND) != 0) {
+            // TODO: build updated rules and push to NMS
+        } else if ((uidPolicy & POLICY_REJECT_PAID) != 0) {
+            // TODO: build updated rules and push to NMS
+        } else {
+            // TODO: build updated rules and push to NMS
+        }
+    }
+
+    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/BlackFrame.java b/services/java/com/android/server/wm/BlackFrame.java
new file mode 100644
index 0000000..f9f5758
--- /dev/null
+++ b/services/java/com/android/server/wm/BlackFrame.java
@@ -0,0 +1,139 @@
+/*
+ * 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.graphics.Matrix;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.util.Slog;
+import android.view.Surface;
+import android.view.SurfaceSession;
+
+/**
+ * Four black surfaces put together to make a black frame.
+ */
+public class BlackFrame {
+    class BlackSurface {
+        final int left;
+        final int top;
+        final Surface surface;
+
+        BlackSurface(SurfaceSession session, int layer, int l, int t, int w, int h)
+                throws Surface.OutOfResourcesException {
+            left = l;
+            top = t;
+            surface = new Surface(session, 0, "BlackSurface",
+                    -1, w, h, PixelFormat.OPAQUE, Surface.FX_SURFACE_DIM);
+            surface.setAlpha(1.0f);
+            surface.setLayer(layer);
+        }
+
+        void setMatrix(Matrix matrix) {
+            mTmpMatrix.setTranslate(left, top);
+            mTmpMatrix.postConcat(matrix);
+            mTmpMatrix.getValues(mTmpFloats);
+            surface.setPosition((int)mTmpFloats[Matrix.MTRANS_X],
+                    (int)mTmpFloats[Matrix.MTRANS_Y]);
+            surface.setMatrix(
+                    mTmpFloats[Matrix.MSCALE_X], mTmpFloats[Matrix.MSKEW_Y],
+                    mTmpFloats[Matrix.MSKEW_X], mTmpFloats[Matrix.MSCALE_Y]);
+            if (false) {
+                Slog.i(WindowManagerService.TAG, "Black Surface @ (" + left + "," + top + "): ("
+                        + mTmpFloats[Matrix.MTRANS_X] + ","
+                        + mTmpFloats[Matrix.MTRANS_Y] + ") matrix=["
+                        + mTmpFloats[Matrix.MSCALE_X] + ","
+                        + mTmpFloats[Matrix.MSCALE_Y] + "]["
+                        + mTmpFloats[Matrix.MSKEW_X] + ","
+                        + mTmpFloats[Matrix.MSKEW_Y] + "]");
+            }
+        }
+
+        void clearMatrix() {
+            surface.setMatrix(1, 0, 0, 1);
+        }
+    }
+
+    final Matrix mTmpMatrix = new Matrix();
+    final float[] mTmpFloats = new float[9];
+    final BlackSurface[] mBlackSurfaces = new BlackSurface[4];
+
+    public BlackFrame(SurfaceSession session, Rect outer, Rect inner,
+            int layer) throws Surface.OutOfResourcesException {
+        boolean success = false;
+
+        try {
+            if (outer.top < inner.top) {
+                mBlackSurfaces[0] = new BlackSurface(session, layer,
+                        outer.left, outer.top, inner.right, inner.top);
+            }
+            if (outer.left < inner.left) {
+                mBlackSurfaces[1] = new BlackSurface(session, layer,
+                        outer.left, inner.top, inner.left, outer.bottom);
+            }
+            if (outer.bottom > inner.bottom) {
+                mBlackSurfaces[2] = new BlackSurface(session, layer,
+                        inner.left, inner.bottom, outer.right, outer.bottom);
+            }
+            if (outer.right > inner.right) {
+                mBlackSurfaces[3] = new BlackSurface(session, layer,
+                        inner.right, outer.top, outer.right, inner.bottom);
+            }
+            success = true;
+        } finally {
+            if (!success) {
+                kill();
+            }
+        }
+    }
+
+    public void kill() {
+        if (mBlackSurfaces != null) {
+            for (int i=0; i<mBlackSurfaces.length; i++) {
+                if (mBlackSurfaces[i] != null) {
+                    mBlackSurfaces[i].surface.destroy();
+                    mBlackSurfaces[i] = null;
+                }
+            }
+        }
+    }
+
+    public void hide() {
+        if (mBlackSurfaces != null) {
+            for (int i=0; i<mBlackSurfaces.length; i++) {
+                if (mBlackSurfaces[i] != null) {
+                    mBlackSurfaces[i].surface.hide();
+                }
+            }
+        }
+    }
+
+    public void setMatrix(Matrix matrix) {
+        for (int i=0; i<mBlackSurfaces.length; i++) {
+            if (mBlackSurfaces[i] != null) {
+                mBlackSurfaces[i].setMatrix(matrix);
+            }
+        }
+    }
+
+    public void clearMatrix() {
+        for (int i=0; i<mBlackSurfaces.length; i++) {
+            if (mBlackSurfaces[i] != null) {
+                mBlackSurfaces[i].clearMatrix();
+            }
+        }
+    }
+}
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/ScreenRotationAnimation.java b/services/java/com/android/server/wm/ScreenRotationAnimation.java
index fbf1ec3..bb01633 100644
--- a/services/java/com/android/server/wm/ScreenRotationAnimation.java
+++ b/services/java/com/android/server/wm/ScreenRotationAnimation.java
@@ -19,7 +19,6 @@
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
-import android.graphics.Color;
 import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.PixelFormat;
@@ -41,46 +40,10 @@
 
     static final int FREEZE_LAYER = WindowManagerService.TYPE_LAYER_MULTIPLIER * 200;
 
-    class BlackSurface {
-        final int left;
-        final int top;
-        final Surface surface;
-
-        BlackSurface(SurfaceSession session, int layer, int l, int t, int w, int h)
-                throws Surface.OutOfResourcesException {
-            left = l;
-            top = t;
-            surface = new Surface(session, 0, "BlackSurface",
-                    -1, w, h, PixelFormat.OPAQUE, Surface.FX_SURFACE_DIM);
-            surface.setAlpha(1.0f);
-            surface.setLayer(FREEZE_LAYER);
-        }
-
-        void setMatrix(Matrix matrix) {
-            mTmpMatrix.setTranslate(left, top);
-            mTmpMatrix.postConcat(matrix);
-            mTmpMatrix.getValues(mTmpFloats);
-            surface.setPosition((int)mTmpFloats[Matrix.MTRANS_X],
-                    (int)mTmpFloats[Matrix.MTRANS_Y]);
-            surface.setMatrix(
-                    mTmpFloats[Matrix.MSCALE_X], mTmpFloats[Matrix.MSKEW_Y],
-                    mTmpFloats[Matrix.MSKEW_X], mTmpFloats[Matrix.MSCALE_Y]);
-            if (false) {
-                Slog.i(TAG, "Black Surface @ (" + left + "," + top + "): ("
-                        + mTmpFloats[Matrix.MTRANS_X] + ","
-                        + mTmpFloats[Matrix.MTRANS_Y] + ") matrix=["
-                        + mTmpFloats[Matrix.MSCALE_X] + ","
-                        + mTmpFloats[Matrix.MSCALE_Y] + "]["
-                        + mTmpFloats[Matrix.MSKEW_X] + ","
-                        + mTmpFloats[Matrix.MSKEW_Y] + "]");
-            }
-        }
-    }
-
     final Context mContext;
     final Display mDisplay;
     Surface mSurface;
-    BlackSurface[] mBlackSurfaces;
+    BlackFrame mBlackFrame;
     int mWidth, mHeight;
 
     int mSnapshotRotation;
@@ -302,14 +265,12 @@
                 ">>> OPEN TRANSACTION ScreenRotationAnimation.dismiss");
         Surface.openTransaction();
 
-        mBlackSurfaces = new BlackSurface[4];
         try {
             final int w = mDisplayMetrics.widthPixels;
             final int h = mDisplayMetrics.heightPixels;
-            mBlackSurfaces[0] = new BlackSurface(session, FREEZE_LAYER, -w, -h, w, h*2);
-            mBlackSurfaces[1] = new BlackSurface(session, FREEZE_LAYER, 0, -h, w*2, h);
-            mBlackSurfaces[2] = new BlackSurface(session, FREEZE_LAYER, w, 0, w, h*2);
-            mBlackSurfaces[3] = new BlackSurface(session, FREEZE_LAYER, -w, h, w*2, h);
+            Rect outer = new Rect(-w, -h, w*2, h*2);
+            Rect inner = new Rect(0, 0, w, h);
+            mBlackFrame = new BlackFrame(session, outer, inner, FREEZE_LAYER);
         } catch (Surface.OutOfResourcesException e) {
             Slog.w(TAG, "Unable to allocate black surface", e);
         } finally {
@@ -326,13 +287,8 @@
             mSurface.destroy();
             mSurface = null;
         }
-        if (mBlackSurfaces != null) {
-            for (int i=0; i<mBlackSurfaces.length; i++) {
-                if (mBlackSurfaces[i] != null) {
-                    mBlackSurfaces[i].surface.destroy();
-                }
-            }
-            mBlackSurfaces = null;
+        if (mBlackFrame != null) {
+            mBlackFrame.kill();
         }
         if (mExitAnimation != null) {
             mExitAnimation.cancel();
@@ -383,20 +339,12 @@
                 mEnterAnimation.cancel();
                 mEnterAnimation = null;
                 mEnterTransformation.clear();
-                if (mBlackSurfaces != null) {
-                    for (int i=0; i<mBlackSurfaces.length; i++) {
-                        if (mBlackSurfaces[i] != null) {
-                            mBlackSurfaces[i].surface.hide();
-                        }
-                    }
+                if (mBlackFrame != null) {
+                    mBlackFrame.hide();
                 }
             } else {
-                if (mBlackSurfaces != null) {
-                    for (int i=0; i<mBlackSurfaces.length; i++) {
-                        if (mBlackSurfaces[i] != null) {
-                            mBlackSurfaces[i].setMatrix(mEnterTransformation.getMatrix());
-                        }
-                    }
+                if (mBlackFrame != null) {
+                    mBlackFrame.setMatrix(mEnterTransformation.getMatrix());
                 }
             }
         }
diff --git a/services/java/com/android/server/wm/ViewServer.java b/services/java/com/android/server/wm/ViewServer.java
index 9fb35b96..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 12a5000..08fea1b 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -190,6 +190,16 @@
      */
     static final int LAYER_OFFSET_BLUR = 2;
 
+    /**
+     * Layer at which to put the rotation freeze snapshot.
+     */
+    static final int FREEZE_LAYER = (TYPE_LAYER_MULTIPLIER * 200) + 1;
+
+    /**
+     * Layer at which to put the mask for emulated screen sizes.
+     */
+    static final int MASK_LAYER = TYPE_LAYER_MULTIPLIER * 200;
+
     /** The maximum length we will accept for a loaded animation duration:
      * this is 10 seconds.
      */
@@ -383,6 +393,8 @@
     StrictModeFlash mStrictModeFlash;
     ScreenRotationAnimation mScreenRotationAnimation;
 
+    BlackFrame mBlackFrame;
+
     int mTransactionSequence = 0;
 
     final float[] mTmpFloats = new float[9];
@@ -392,6 +404,8 @@
     boolean mSystemBooted = false;
     int mInitialDisplayWidth = 0;
     int mInitialDisplayHeight = 0;
+    int mBaseDisplayWidth = 0;
+    int mBaseDisplayHeight = 0;
     int mCurDisplayWidth = 0;
     int mCurDisplayHeight = 0;
     int mRotation = 0;
@@ -589,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) {
@@ -1760,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) {
@@ -2355,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();
                 }
@@ -2690,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(
@@ -2889,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 {
@@ -3264,36 +3276,46 @@
         long ident = Binder.clearCallingIdentity();
         
         synchronized(mWindowMap) {
-            if (updateOrientationFromAppTokensLocked(false)) {
-                if (freezeThisOneIfNeeded != null) {
-                    AppWindowToken wtoken = findAppWindowToken(
-                            freezeThisOneIfNeeded);
-                    if (wtoken != null) {
-                        startAppFreezingScreenLocked(wtoken,
-                                ActivityInfo.CONFIG_ORIENTATION);
-                    }
+            config = updateOrientationFromAppTokensLocked(currentConfig,
+                    freezeThisOneIfNeeded);
+        }
+
+        Binder.restoreCallingIdentity(ident);
+        return config;
+    }
+
+    private Configuration updateOrientationFromAppTokensLocked(
+            Configuration currentConfig, IBinder freezeThisOneIfNeeded) {
+        Configuration config = null;
+
+        if (updateOrientationFromAppTokensLocked(false)) {
+            if (freezeThisOneIfNeeded != null) {
+                AppWindowToken wtoken = findAppWindowToken(
+                        freezeThisOneIfNeeded);
+                if (wtoken != null) {
+                    startAppFreezingScreenLocked(wtoken,
+                            ActivityInfo.CONFIG_ORIENTATION);
                 }
-                config = computeNewConfigurationLocked();
-                
-            } else if (currentConfig != null) {
-                // No obvious action we need to take, but if our current
-                // state mismatches the activity manager's, update it,
-                // disregarding font scale, which should remain set to
-                // the value of the previous configuration.
-                mTempConfiguration.setToDefaults();
-                mTempConfiguration.fontScale = currentConfig.fontScale;
-                if (computeNewConfigurationLocked(mTempConfiguration)) {
-                    if (currentConfig.diff(mTempConfiguration) != 0) {
-                        mWaitingForConfig = true;
-                        mLayoutNeeded = true;
-                        startFreezingDisplayLocked(false);
-                        config = new Configuration(mTempConfiguration);
-                    }
+            }
+            config = computeNewConfigurationLocked();
+
+        } else if (currentConfig != null) {
+            // No obvious action we need to take, but if our current
+            // state mismatches the activity manager's, update it,
+            // disregarding font scale, which should remain set to
+            // the value of the previous configuration.
+            mTempConfiguration.setToDefaults();
+            mTempConfiguration.fontScale = currentConfig.fontScale;
+            if (computeNewConfigurationLocked(mTempConfiguration)) {
+                if (currentConfig.diff(mTempConfiguration) != 0) {
+                    mWaitingForConfig = true;
+                    mLayoutNeeded = true;
+                    startFreezingDisplayLocked(false);
+                    config = new Configuration(mTempConfiguration);
                 }
             }
         }
         
-        Binder.restoreCallingIdentity(ident);
         return config;
     }
 
@@ -3682,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) {
@@ -3704,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;
@@ -3858,7 +3880,7 @@
 
             final long origId = Binder.clearCallingIdentity();
             setTokenVisibilityLocked(wtoken, null, visible, WindowManagerPolicy.TRANSIT_UNSET,
-                    true, false);
+                    true);
             wtoken.updateReportedVisibilityLocked();
             Binder.restoreCallingIdentity(origId);
         }
@@ -3985,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;
@@ -4761,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
@@ -4810,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;
@@ -5046,6 +5068,7 @@
                 } else {
                     Surface.setOrientation(0, rotation, animFlags);
                 }
+                rebuildBlackFrame(inTransaction);
             }
 
             for (int i=mWindows.size()-1; i>=0; i--) {
@@ -5478,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;
@@ -5488,8 +5519,8 @@
         // Use the effective "visual" dimensions based on current rotation
         final boolean rotated = (mRotation == Surface.ROTATION_90
                 || mRotation == Surface.ROTATION_270);
-        final int realdw = rotated ? mInitialDisplayHeight : mInitialDisplayWidth;
-        final int realdh = rotated ? mInitialDisplayWidth : mInitialDisplayHeight;
+        final int realdw = rotated ? mBaseDisplayHeight : mBaseDisplayWidth;
+        final int realdh = rotated ? mBaseDisplayWidth : mBaseDisplayHeight;
 
         if (mAltOrientation) {
             mCurDisplayWidth = realdw;
@@ -5528,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;
@@ -5926,8 +5980,18 @@
             }
             WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
             mDisplay = wm.getDefaultDisplay();
-            mInitialDisplayWidth = mCurDisplayWidth = mDisplay.getRealWidth();
-            mInitialDisplayHeight = mCurDisplayHeight = mDisplay.getRealHeight();
+            mInitialDisplayWidth = mDisplay.getRealWidth();
+            mInitialDisplayHeight = mDisplay.getRealHeight();
+            int rot = mDisplay.getRotation();
+            if (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270) {
+                // If the screen is currently rotated, we need to swap the
+                // initial width and height to get the true natural values.
+                int tmp = mInitialDisplayWidth;
+                mInitialDisplayWidth = mInitialDisplayHeight;
+                mInitialDisplayHeight = tmp;
+            }
+            mBaseDisplayWidth = mCurDisplayWidth = mInitialDisplayWidth;
+            mBaseDisplayHeight = mCurDisplayHeight = mInitialDisplayHeight;
             mInputManager.setDisplaySize(0, mDisplay.getRawWidth(), mDisplay.getRawHeight());
             mPolicy.setInitialDisplaySize(mInitialDisplayWidth, mInitialDisplayHeight);
         }
@@ -5936,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
@@ -6433,8 +6501,128 @@
     public int getMaximumSizeDimension() {
         synchronized(mWindowMap) {
             // Do this based on the raw screen size, until we are smarter.
-            return mInitialDisplayWidth > mInitialDisplayHeight
-                    ? mInitialDisplayWidth : mInitialDisplayHeight;
+            return mBaseDisplayWidth > mBaseDisplayHeight
+                    ? mBaseDisplayWidth : mBaseDisplayHeight;
+        }
+    }
+
+    public void setForcedDisplaySize(int longDimen, int shortDimen) {
+        synchronized(mWindowMap) {
+            int width, height;
+            if (mInitialDisplayWidth < mInitialDisplayHeight) {
+                width = shortDimen < mInitialDisplayWidth
+                        ? shortDimen : mInitialDisplayWidth;
+                height = longDimen < mInitialDisplayHeight
+                        ? longDimen : mInitialDisplayHeight;
+            } else {
+                width = longDimen < mInitialDisplayWidth
+                        ? longDimen : mInitialDisplayWidth;
+                height = shortDimen < mInitialDisplayHeight
+                        ? shortDimen : mInitialDisplayHeight;
+            }
+            setForcedDisplaySizeLocked(width, height);
+            Settings.Secure.putString(mContext.getContentResolver(),
+                    Settings.Secure.DISPLAY_SIZE_FORCED, width + "," + height);
+        }
+    }
+
+    private void rebuildBlackFrame(boolean inTransaction) {
+        if (!inTransaction) {
+            if (SHOW_TRANSACTIONS) Slog.i(TAG,
+                    ">>> OPEN TRANSACTION rebuildBlackFrame");
+            Surface.openTransaction();
+        }
+        try {
+            if (mBlackFrame != null) {
+                mBlackFrame.kill();
+                mBlackFrame = null;
+            }
+            if (mBaseDisplayWidth < mInitialDisplayWidth
+                    || mBaseDisplayHeight < mInitialDisplayHeight) {
+                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) {
+                }
+            }
+        } finally {
+            if (!inTransaction) {
+                Surface.closeTransaction();
+                if (SHOW_TRANSACTIONS) Slog.i(TAG,
+                        "<<< CLOSE TRANSACTION rebuildBlackFrame");
+            }
+        }
+    }
+
+    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);
+
+        mLayoutNeeded = true;
+
+        boolean configChanged = updateOrientationFromAppTokensLocked(false);
+        mTempConfiguration.setToDefaults();
+        mTempConfiguration.fontScale = mCurConfiguration.fontScale;
+        if (computeNewConfigurationLocked(mTempConfiguration)) {
+            if (mCurConfiguration.diff(mTempConfiguration) != 0) {
+                configChanged = true;
+            }
+        }
+
+        if (configChanged) {
+            mWaitingForConfig = true;
+            startFreezingDisplayLocked(false);
+            mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
+        }
+
+        rebuildBlackFrame(false);
+
+        performLayoutAndPlaceSurfacesLocked();
+    }
+
+    public void clearForcedDisplaySize() {
+        synchronized(mWindowMap) {
+            setForcedDisplaySizeLocked(mInitialDisplayWidth, mInitialDisplayHeight);
+            Settings.Secure.putString(mContext.getContentResolver(),
+                    Settings.Secure.DISPLAY_SIZE_FORCED, "");
         }
     }
 
@@ -6683,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;
 
@@ -6740,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="
@@ -6777,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="
@@ -6808,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;
 
@@ -7229,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
@@ -7267,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) {
@@ -7338,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();
@@ -7351,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
@@ -7518,8 +7692,6 @@
             boolean dimming = false;
             boolean covered = false;
             boolean syswin = false;
-            boolean backgroundFillerWasShown = mBackgroundFillerTarget != null;
-            mBackgroundFillerTarget = null;
 
             final int N = mWindows.size();
 
@@ -7548,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) {
@@ -7557,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) {
@@ -7630,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
@@ -7647,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
@@ -7682,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) {
@@ -7821,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) {
@@ -7859,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
@@ -7931,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());
@@ -7987,6 +8098,15 @@
                 }
                 mBlurShown = false;
             }
+
+            if (mBlackFrame != null) {
+                if (mScreenRotationAnimation != null) {
+                    mBlackFrame.setMatrix(
+                            mScreenRotationAnimation.getEnterTransformation().getMatrix());
+                } else {
+                    mBlackFrame.clearMatrix();
+                }
+            }
         } catch (RuntimeException e) {
             Slog.e(TAG, "Unhandled exception in Window Manager", e);
         }
@@ -8017,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
@@ -8026,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;
@@ -8177,6 +8297,7 @@
         boolean state = mHoldingScreenWakeLock.isHeld();
         if (holding != state) {
             if (holding) {
+                mPolicy.screenOnStartedLw();
                 mHoldingScreenWakeLock.acquire();
             } else {
                 mPolicy.screenOnStoppedLw();
@@ -8840,7 +8961,9 @@
             }
             if (mDisplay != null) {
                 pw.print("  Display: init="); pw.print(mInitialDisplayWidth); pw.print("x");
-                        pw.print(mInitialDisplayHeight); pw.print(" cur=");
+                        pw.print(mInitialDisplayHeight); pw.print(" base=");
+                        pw.print(mBaseDisplayWidth); pw.print("x"); pw.print(mBaseDisplayHeight);
+                        pw.print(" cur=");
                         pw.print(mCurDisplayWidth); pw.print("x"); pw.print(mCurDisplayHeight);
                         pw.print(" real="); pw.print(mDisplay.getRealWidth());
                         pw.print("x"); pw.print(mDisplay.getRealHeight());
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 b2f95cd..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)
 {
@@ -663,8 +655,9 @@
 
         // update the layer size and release freeze-lock
         const Layer::State& front(drawingState());
-        if (newFrontBuffer->getWidth()  == front.requested_w &&
-            newFrontBuffer->getHeight() == front.requested_h)
+        if ((newFrontBuffer->getWidth()  == front.requested_w &&
+            newFrontBuffer->getHeight() == front.requested_h) ||
+            isFixedSize())
         {
             if ((front.w != front.requested_w) ||
                 (front.h != front.requested_h))
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 43f3b95..5ddfcd1 100644
--- a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
@@ -31,6 +31,7 @@
 import android.os.Handler;
 import android.os.Message;
 import android.os.Messenger;
+import android.os.SystemProperties;
 import android.preference.PreferenceManager;
 import android.provider.Settings;
 import android.provider.Settings.SettingNotFoundException;
@@ -219,6 +220,8 @@
     protected static final String FAIL_DATA_SETUP_FAIL_CAUSE = "fail_data_setup_fail_cause";
     protected FailCause mFailDataSetupFailCause = FailCause.ERROR_UNSPECIFIED;
 
+    protected static final String DEFALUT_DATA_ON_BOOT_PROP = "net.def_data_on_boot";
+
     // member variables
     protected PhoneBase mPhone;
     protected Activity mActivity = Activity.NONE;
@@ -384,13 +387,15 @@
 
         // This preference tells us 1) initial condition for "dataEnabled",
         // and 2) whether the RIL will setup the baseband to auto-PS attach.
-        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mPhone.getContext());
-        dataEnabled[APN_DEFAULT_ID] =
-                !sp.getBoolean(PhoneBase.DATA_DISABLED_ON_BOOT_KEY, false);
+
+        dataEnabled[APN_DEFAULT_ID] = SystemProperties.getBoolean(DEFALUT_DATA_ON_BOOT_PROP,
+                                                                  true);
         if (dataEnabled[APN_DEFAULT_ID]) {
             enabledCount++;
         }
-        mAutoAttachOnCreation = dataEnabled[APN_DEFAULT_ID];
+
+        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mPhone.getContext());
+        mAutoAttachOnCreation = sp.getBoolean(PhoneBase.DATA_DISABLED_ON_BOOT_KEY, false);
     }
 
     public void dispose() {
@@ -982,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/cdma/CdmaLteServiceStateTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java
index 32c5d75..d79f0a1e 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java
@@ -290,13 +290,6 @@
         newSS.setStateOutOfService();
         mLteSS.setStateOutOfService();
 
-        // TODO: 4G Tech Handoff
-        // if (has4gHandoff) {
-        // Message msg = phone.mDataConnectionTracker.obtainMessage(
-        // DataConnectionTracker.EVENT_4G_TECHNOLOGY_CHANGE);
-        // phone.mDataConnectionTracker.sendMessage(msg);
-        // }
-
         if ((hasMultiApnSupport)
                 && (phone.mDataConnectionTracker instanceof CdmaDataConnectionTracker)) {
             if (DBG) log("GsmDataConnectionTracker Created");
@@ -390,8 +383,7 @@
             mDetachedRegistrants.notifyRegistrants();
         }
 
-        if ((hasCdmaDataConnectionChanged || hasNetworkTypeChanged)
-                && (phone.mDataConnectionTracker instanceof CdmaDataConnectionTracker)) {
+        if ((hasCdmaDataConnectionChanged || hasNetworkTypeChanged)) {
             phone.notifyDataConnection();
         }
 
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
index 6416e49..e1a6fef 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
@@ -22,7 +22,6 @@
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
-import android.content.SharedPreferences;
 import android.database.ContentObserver;
 import android.database.Cursor;
 import android.net.ConnectivityManager;
@@ -101,6 +100,10 @@
     // call reRegisterNetwork, or pingTest succeeds.
     private int mPdpResetCount = 0;
 
+    // Recovery action taken in case of data stall
+    enum RecoveryAction {REREGISTER, RADIO_RESTART, RADIO_RESET};
+    private RecoveryAction mRecoveryAction = RecoveryAction.REREGISTER;
+
 
     //***** Constants
 
@@ -124,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));
         }
@@ -266,8 +266,7 @@
     }
 
     protected void initApnContextsAndDataConnection() {
-        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mPhone.getContext());
-        boolean defaultEnabled = !sp.getBoolean(PhoneBase.DATA_DISABLED_ON_BOOT_KEY, false);
+        boolean defaultEnabled = SystemProperties.getBoolean(DEFALUT_DATA_ON_BOOT_PROP, true);
         // Load device network attributes from resources
         String[] networkConfigStrings = mPhone.getContext().getResources().getStringArray(
                 com.android.internal.R.array.networkAttributes);
@@ -581,7 +580,7 @@
         boolean desiredPowerState = mPhone.getServiceStateTracker().getDesiredPowerState();
 
         boolean allowed =
-                    gprsState == ServiceState.STATE_IN_SERVICE &&
+                    (gprsState == ServiceState.STATE_IN_SERVICE || mAutoAttachOnCreation) &&
                     mPhone.mIccRecords.getRecordsLoaded() &&
                     mPhone.getState() == Phone.State.IDLE &&
                     mInternalDataEnabled &&
@@ -590,7 +589,7 @@
                     desiredPowerState;
         if (!allowed && DBG) {
             String reason = "";
-            if (!(gprsState == ServiceState.STATE_IN_SERVICE)) {
+            if (!((gprsState == ServiceState.STATE_IN_SERVICE) || mAutoAttachOnCreation)) {
                 reason += " - gprs= " + gprsState;
             }
             if (!mPhone.mIccRecords.getRecordsLoaded()) reason += " - SIM not loaded";
@@ -613,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) {
@@ -642,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();
                     }
@@ -798,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) {
@@ -809,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
@@ -925,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;
@@ -968,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.
      */
@@ -1012,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) {
@@ -1031,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) {
@@ -1132,12 +1159,40 @@
                 cleanUpAllConnections(true, Phone.REASON_PDP_RESET);
             } else {
                 mPdpResetCount = 0;
-                EventLog.writeEvent(EventLogTags.PDP_REREGISTER_NETWORK, mSentSinceLastRecv);
-                if (DBG) log("doRecovery() re-register getting preferred network type");
-                mPhone.getServiceStateTracker().reRegisterNetwork(null);
+                switch (mRecoveryAction) {
+                case REREGISTER:
+                    EventLog.writeEvent(EventLogTags.PDP_REREGISTER_NETWORK, mSentSinceLastRecv);
+                    if (DBG) log("doRecovery() re-register getting preferred network type");
+                    mPhone.getServiceStateTracker().reRegisterNetwork(null);
+                    mRecoveryAction = RecoveryAction.RADIO_RESTART;
+                    break;
+                case RADIO_RESTART:
+                    EventLog.writeEvent(EventLogTags.PDP_RADIO_RESET, mSentSinceLastRecv);
+                    if (DBG) log("restarting radio");
+                    mRecoveryAction = RecoveryAction.RADIO_RESET;
+                    restartRadio();
+                    break;
+                case RADIO_RESET:
+                    // This is in case radio restart has not recovered the data.
+                    // It will set an additional "gsm.radioreset" property to tell
+                    // RIL or system to take further action.
+                    // The implementation of hard reset recovery action is up to OEM product.
+                    // Once gsm.radioreset property is consumed, it is expected to set back
+                    // to false by RIL.
+                    EventLog.writeEvent(EventLogTags.PDP_RADIO_RESET, -1);
+                    if (DBG) log("restarting radio with reset indication");
+                    SystemProperties.set("gsm.radioreset", "true");
+                    // give 1 sec so property change can be notified.
+                    try {
+                        Thread.sleep(1000);
+                    } catch (InterruptedException e) {}
+                    restartRadio();
+                    break;
+                default:
+                    throw new RuntimeException("doRecovery: Invalid mRecoveryAction " +
+                        mRecoveryAction);
+                }
             }
-            // TODO: Add increasingly drastic recovery steps, eg,
-            // reset the radio, reset the device.
         } else {
             if (DBG) log("doRecovery(): ignore, we're not connected");
         }
@@ -1189,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;
@@ -1202,6 +1277,7 @@
                     mSentSinceLastRecv = 0;
                     newActivity = Activity.DATAINANDOUT;
                     mPdpResetCount = 0;
+                    mRecoveryAction = RecoveryAction.REREGISTER;
                 } else if (sent > 0 && received == 0) {
                     if (mPhone.getState() == Phone.State.IDLE) {
                         mSentSinceLastRecv += sent;
@@ -1213,6 +1289,7 @@
                     mSentSinceLastRecv = 0;
                     newActivity = Activity.DATAIN;
                     mPdpResetCount = 0;
+                    mRecoveryAction = RecoveryAction.REREGISTER;
                 } else if (sent == 0 && received == 0) {
                     newActivity = Activity.NONE;
                 } else {
@@ -1255,7 +1332,7 @@
                 } else {
                     if (DBG) log("Polling: Sent " + String.valueOf(mSentSinceLastRecv) +
                                         " pkts since last received start recovery process");
-                    stopNetStatPoll();
+                    mNoRecvPollCount = 0;
                     sendMessage(obtainMessage(EVENT_START_RECOVERY));
                 }
             } else {
@@ -1306,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());
@@ -1326,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)) {
@@ -1356,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());
@@ -1410,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);
@@ -1561,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) {
@@ -1628,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);
@@ -1637,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);
             }
         }
     }
@@ -1683,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);
         }
     }
 
@@ -1726,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() {
@@ -2089,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/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
index d3018e8..fa82070 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
@@ -101,6 +101,7 @@
     }
 
     public void requestWebKitData() {
+        setDumpTimeout(DUMP_TIMEOUT_MS);
         Message callback = mHandler.obtainMessage(MSG_WEBKIT_DATA);
 
         if (mRequestedWebKitData)
@@ -112,12 +113,10 @@
             case DUMP_AS_TEXT:
                 callback.arg1 = mDumpTopFrameAsText ? 1 : 0;
                 callback.arg2 = mDumpChildFramesAsText ? 1 : 0;
-                setDumpTimeout(DUMP_TIMEOUT_MS);
                 mWebView.documentAsText(callback);
                 break;
             case EXT_REPR:
                 mWebView.externalRepresentation(callback);
-                setDumpTimeout(DUMP_TIMEOUT_MS);
                 break;
             default:
                 finished();
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 */