diff options
306 files changed, 14154 insertions, 13263 deletions
diff --git a/api/current.txt b/api/current.txt index fa2a475370c3..f946dda21ce8 100644 --- a/api/current.txt +++ b/api/current.txt @@ -1992,10 +1992,11 @@ package android.accessibilityservice { method public static java.lang.String feedbackTypeToString(int); method public static java.lang.String flagToString(int); method public boolean getCanRetrieveWindowContent(); - method public java.lang.String getDescription(); + method public deprecated java.lang.String getDescription(); method public java.lang.String getId(); method public android.content.pm.ResolveInfo getResolveInfo(); method public java.lang.String getSettingsActivityName(); + method public java.lang.String loadDescription(android.content.pm.PackageManager); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; field public static final int DEFAULT = 1; // 0x1 @@ -7204,7 +7205,7 @@ package android.database.sqlite { method public long insertWithOnConflict(java.lang.String, java.lang.String, android.content.ContentValues, int); method public boolean isDatabaseIntegrityOk(); method public boolean isDbLockedByCurrentThread(); - method public boolean isDbLockedByOtherThreads(); + method public deprecated boolean isDbLockedByOtherThreads(); method public boolean isOpen(); method public boolean isReadOnly(); method public deprecated void markTableSyncable(java.lang.String, java.lang.String); @@ -7226,7 +7227,7 @@ package android.database.sqlite { method public long replace(java.lang.String, java.lang.String, android.content.ContentValues); method public long replaceOrThrow(java.lang.String, java.lang.String, android.content.ContentValues) throws android.database.SQLException; method public void setLocale(java.util.Locale); - method public void setLockingEnabled(boolean); + method public deprecated void setLockingEnabled(boolean); method public void setMaxSqlCacheSize(int); method public long setMaximumSize(long); method public void setPageSize(long); @@ -24618,6 +24619,7 @@ package android.view.inputmethod { field public static final int IME_ACTION_SEARCH = 3; // 0x3 field public static final int IME_ACTION_SEND = 4; // 0x4 field public static final int IME_ACTION_UNSPECIFIED = 0; // 0x0 + field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000 field public static final int IME_FLAG_NAVIGATE_NEXT = 134217728; // 0x8000000 field public static final int IME_FLAG_NAVIGATE_PREVIOUS = 67108864; // 0x4000000 field public static final int IME_FLAG_NO_ACCESSORY_ACTION = 536870912; // 0x20000000 diff --git a/cmds/requestsync/Android.mk b/cmds/requestsync/Android.mk new file mode 100644 index 000000000000..fe2ffd8de4dc --- /dev/null +++ b/cmds/requestsync/Android.mk @@ -0,0 +1,16 @@ +# Copyright 2012 The Android Open Source Project +# +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := $(call all-subdir-java-files) +LOCAL_MODULE := requestsync +LOCAL_MODULE_TAGS := optional +include $(BUILD_JAVA_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := requestsync +LOCAL_SRC_FILES := requestsync +LOCAL_MODULE_CLASS := EXECUTABLES +LOCAL_MODULE_TAGS := optional +include $(BUILD_PREBUILT) diff --git a/cmds/requestsync/MODULE_LICENSE_APACHE2 b/cmds/requestsync/MODULE_LICENSE_APACHE2 new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/cmds/requestsync/MODULE_LICENSE_APACHE2 diff --git a/cmds/requestsync/NOTICE b/cmds/requestsync/NOTICE new file mode 100644 index 000000000000..c5b1efa7aac7 --- /dev/null +++ b/cmds/requestsync/NOTICE @@ -0,0 +1,190 @@ + + Copyright (c) 2005-2008, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + diff --git a/cmds/requestsync/requestsync b/cmds/requestsync/requestsync new file mode 100755 index 000000000000..931567583e90 --- /dev/null +++ b/cmds/requestsync/requestsync @@ -0,0 +1,6 @@ +# Script to start "requestsync" on the device +# +base=/system +export CLASSPATH=$base/framework/requestsync.jar +exec app_process $base/bin com.android.commands.requestsync.RequestSync "$@" + diff --git a/cmds/requestsync/src/com/android/commands/requestsync/RequestSync.java b/cmds/requestsync/src/com/android/commands/requestsync/RequestSync.java new file mode 100644 index 000000000000..808618f28666 --- /dev/null +++ b/cmds/requestsync/src/com/android/commands/requestsync/RequestSync.java @@ -0,0 +1,237 @@ +/* +** +** Copyright 2012, 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.commands.requestsync; + +import android.accounts.Account; +import android.content.ContentResolver; +import android.os.Bundle; + +import java.net.URISyntaxException; + +public class RequestSync { + // agr parsing fields + private String[] mArgs; + private int mNextArg; + private String mCurArgData; + + // account & authority + private String mAccountName = null; + private String mAccountType = null; + private String mAuthority = null; + + // extras + private Bundle mExtras = new Bundle(); + + /** + * Command-line entry point. + * + * @param args The command-line arguments + */ + public static void main(String[] args) { + try { + (new RequestSync()).run(args); + } catch (IllegalArgumentException e) { + showUsage(); + System.err.println("Error: " + e); + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(System.err); + System.exit(1); + } + } + + private void run(String[] args) throws Exception { + mArgs = args; + mNextArg = 0; + + final boolean ok = parseArgs(); + if (ok) { + final Account account = mAccountName != null && mAccountType != null + ? new Account(mAccountName, mAccountType) : null; + + System.out.printf("Requesting sync for: \n"); + if (account != null) { + System.out.printf(" Account: %s (%s)\n", account.name, account.type); + } else { + System.out.printf(" Account: all\n"); + } + + System.out.printf(" Authority: %s\n", mAuthority != null ? mAuthority : "All"); + + if (mExtras.size() > 0) { + System.out.printf(" Extras:\n"); + for (String key : mExtras.keySet()) { + System.out.printf(" %s: %s\n", key, mExtras.get(key)); + } + } + + ContentResolver.requestSync(account, mAuthority, mExtras); + } + } + + private boolean parseArgs() throws URISyntaxException { + String opt; + while ((opt=nextOption()) != null) { + if (opt.equals("-h") || opt.equals("--help")) { + showUsage(); + return false; + } else if (opt.equals("-n") || opt.equals("--account-name")) { + mAccountName = nextArgRequired(); + } else if (opt.equals("-t") || opt.equals("--account-type")) { + mAccountType = nextArgRequired(); + } else if (opt.equals("-a") || opt.equals("--authority")) { + mAuthority = nextArgRequired(); + } else if (opt.equals("--is") || opt.equals("--ignore-settings")) { + mExtras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, true); + } else if (opt.equals("--ib") || opt.equals("--ignore-backoff")) { + mExtras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_BACKOFF, true); + } else if (opt.equals("--dd") || opt.equals("--discard-deletions")) { + mExtras.putBoolean(ContentResolver.SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS, true); + } else if (opt.equals("--nr") || opt.equals("--no-retry")) { + mExtras.putBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, true); + } else if (opt.equals("--ex") || opt.equals("--expedited")) { + mExtras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true); + } else if (opt.equals("-i") || opt.equals("--initialize")) { + mExtras.putBoolean(ContentResolver.SYNC_EXTRAS_INITIALIZE, true); + } else if (opt.equals("-m") || opt.equals("--manual")) { + mExtras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); + } else if (opt.equals("--od") || opt.equals("--override-deletions")) { + mExtras.putBoolean(ContentResolver.SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS, true); + } else if (opt.equals("-u") || opt.equals("--upload-only")) { + mExtras.putBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, true); + } else if (opt.equals("-e") || opt.equals("--es") || opt.equals("--extra-string")) { + final String key = nextArgRequired(); + final String value = nextArgRequired(); + mExtras.putString(key, value); + } else if (opt.equals("--esn") || opt.equals("--extra-string-null")) { + final String key = nextArgRequired(); + mExtras.putString(key, null); + } else if (opt.equals("--ei") || opt.equals("--extra-int")) { + final String key = nextArgRequired(); + final String value = nextArgRequired(); + mExtras.putInt(key, Integer.valueOf(value)); + } else if (opt.equals("--el") || opt.equals("--extra-long")) { + final String key = nextArgRequired(); + final String value = nextArgRequired(); + mExtras.putLong(key, Long.valueOf(value)); + } else if (opt.equals("--ef") || opt.equals("--extra-float")) { + final String key = nextArgRequired(); + final String value = nextArgRequired(); + mExtras.putFloat(key, Long.valueOf(value)); + } else if (opt.equals("--ed") || opt.equals("--extra-double")) { + final String key = nextArgRequired(); + final String value = nextArgRequired(); + mExtras.putFloat(key, Long.valueOf(value)); + } else if (opt.equals("--ez") || opt.equals("--extra-bool")) { + final String key = nextArgRequired(); + final String value = nextArgRequired(); + mExtras.putBoolean(key, Boolean.valueOf(value)); + } else { + System.err.println("Error: Unknown option: " + opt); + showUsage(); + return false; + } + } + + if (mNextArg < mArgs.length) { + showUsage(); + return false; + } + return true; + } + + private String nextOption() { + if (mCurArgData != null) { + String prev = mArgs[mNextArg - 1]; + throw new IllegalArgumentException("No argument expected after \"" + prev + "\""); + } + if (mNextArg >= mArgs.length) { + return null; + } + String arg = mArgs[mNextArg]; + if (!arg.startsWith("-")) { + return null; + } + mNextArg++; + if (arg.equals("--")) { + return null; + } + if (arg.length() > 1 && arg.charAt(1) != '-') { + if (arg.length() > 2) { + mCurArgData = arg.substring(2); + return arg.substring(0, 2); + } else { + mCurArgData = null; + return arg; + } + } + mCurArgData = null; + return arg; + } + + private String nextArg() { + if (mCurArgData != null) { + String arg = mCurArgData; + mCurArgData = null; + return arg; + } else if (mNextArg < mArgs.length) { + return mArgs[mNextArg++]; + } else { + return null; + } + } + + private String nextArgRequired() { + String arg = nextArg(); + if (arg == null) { + String prev = mArgs[mNextArg - 1]; + throw new IllegalArgumentException("Argument expected after \"" + prev + "\""); + } + return arg; + } + + private static void showUsage() { + System.err.println( + "usage: requestsync [options]\n" + + "With no options, a sync will be requested for all account and all sync\n" + + "authorities with no extras. Options can be:\n" + + " -h|--help: Display this message\n" + + " -n|--account-name <ACCOUNT-NAME>\n" + + " -t|--account-type <ACCOUNT-TYPE>\n" + + " -a|--authority <AUTHORITY>\n" + + " Add ContentResolver extras:\n" + + " --is|--ignore-settings: Add SYNC_EXTRAS_IGNORE_SETTINGS\n" + + " --ib|--ignore-backoff: Add SYNC_EXTRAS_IGNORE_BACKOFF\n" + + " --dd|--discard-deletions: Add SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS\n" + + " --nr|--no-retry: Add SYNC_EXTRAS_DO_NOT_RETRY\n" + + " --ex|--expedited: Add SYNC_EXTRAS_EXPEDITED\n" + + " --i|--initialize: Add SYNC_EXTRAS_INITIALIZE\n" + + " --m|--manual: Add SYNC_EXTRAS_MANUAL\n" + + " --od|--override-deletions: Add SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS\n" + + " --u|--upload-only: Add SYNC_EXTRAS_UPLOAD\n" + + " Add custom extras:\n" + + " -e|--es|--extra-string <KEY> <VALUE>\n" + + " --esn|--extra-string-null <KEY>\n" + + " --ei|--extra-int <KEY> <VALUE>\n" + + " --el|--extra-long <KEY> <VALUE>\n" + + " --ef|--extra-float <KEY> <VALUE>\n" + + " --ed|--extra-double <KEY> <VALUE>\n" + + " --ez|--extra-bool <KEY> <VALUE>\n" + ); + } +} diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java index e5a5e986e704..eae0a4c1bec8 100644 --- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java +++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java @@ -28,6 +28,7 @@ import android.content.res.XmlResourceParser; import android.os.Parcel; import android.os.Parcelable; import android.util.AttributeSet; +import android.util.TypedValue; import android.util.Xml; import android.view.accessibility.AccessibilityEvent; @@ -182,9 +183,14 @@ public class AccessibilityServiceInfo implements Parcelable { private boolean mCanRetrieveWindowContent; /** - * Description of the accessibility service. + * Resource id of the description of the accessibility service. */ - private String mDescription; + private int mDescriptionResId; + + /** + * Non localized description of the accessibility service. + */ + private String mNonLocalizedDescription; /** * Creates a new instance. @@ -256,8 +262,15 @@ public class AccessibilityServiceInfo implements Parcelable { mCanRetrieveWindowContent = asAttributes.getBoolean( com.android.internal.R.styleable.AccessibilityService_canRetrieveWindowContent, false); - mDescription = asAttributes.getString( + TypedValue peekedValue = asAttributes.peekValue( com.android.internal.R.styleable.AccessibilityService_description); + if (peekedValue != null) { + mDescriptionResId = peekedValue.resourceId; + CharSequence nonLocalizedDescription = peekedValue.coerceToString(); + if (nonLocalizedDescription != null) { + mNonLocalizedDescription = nonLocalizedDescription.toString().trim(); + } + } asAttributes.recycle(); } catch (NameNotFoundException e) { throw new XmlPullParserException( "Unable to create context for: " @@ -331,15 +344,38 @@ public class AccessibilityServiceInfo implements Parcelable { } /** - * Description of the accessibility service. + * Gets the non-localized description of the accessibility service. * <p> * <strong>Statically set from * {@link AccessibilityService#SERVICE_META_DATA meta-data}.</strong> * </p> * @return The description. + * + * @deprecated Use {@link #loadDescription(PackageManager)}. */ public String getDescription() { - return mDescription; + return mNonLocalizedDescription; + } + + /** + * The localized description of the accessibility service. + * <p> + * <strong>Statically set from + * {@link AccessibilityService#SERVICE_META_DATA meta-data}.</strong> + * </p> + * @return The localized description. + */ + public String loadDescription(PackageManager packageManager) { + if (mDescriptionResId == 0) { + return mNonLocalizedDescription; + } + ServiceInfo serviceInfo = mResolveInfo.serviceInfo; + CharSequence description = packageManager.getText(serviceInfo.packageName, + mDescriptionResId, serviceInfo.applicationInfo); + if (description != null) { + return description.toString().trim(); + } + return null; } /** @@ -359,7 +395,8 @@ public class AccessibilityServiceInfo implements Parcelable { parcel.writeParcelable(mResolveInfo, 0); parcel.writeString(mSettingsActivityName); parcel.writeInt(mCanRetrieveWindowContent ? 1 : 0); - parcel.writeString(mDescription); + parcel.writeInt(mDescriptionResId); + parcel.writeString(mNonLocalizedDescription); } private void initFromParcel(Parcel parcel) { @@ -372,7 +409,8 @@ public class AccessibilityServiceInfo implements Parcelable { mResolveInfo = parcel.readParcelable(null); mSettingsActivityName = parcel.readString(); mCanRetrieveWindowContent = (parcel.readInt() == 1); - mDescription = parcel.readString(); + mDescriptionResId = parcel.readInt(); + mNonLocalizedDescription = parcel.readString(); } @Override diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index f5add25162c4..d569e2071463 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -113,7 +113,10 @@ public class Notification implements Parcelable * {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK} flag, which requires * that you take care of task management as described in the * <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back - * Stack</a> document. + * Stack</a> document. In particular, make sure to read the notification section + * <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#HandlingNotifications">Handling + * Notifications</a> for the correct ways to launch an application from a + * notification. */ public PendingIntent contentIntent; @@ -765,7 +768,9 @@ public class Notification implements Parcelable * Supply a {@link PendingIntent} to send when the notification is clicked. * If you do not supply an intent, you can now add PendingIntents to individual * views to be launched when clicked by calling {@link RemoteViews#setOnClickPendingIntent - * RemoteViews.setOnClickPendingIntent(int,PendingIntent)}. + * RemoteViews.setOnClickPendingIntent(int,PendingIntent)}. Be sure to + * read {@link Notification#contentIntent Notification.contentIntent} for + * how to correctly use this. */ public Builder setContentIntent(PendingIntent intent) { mContentIntent = intent; diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index b1c1f3077a9d..c1e28b007ea8 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -213,10 +213,6 @@ public class WallpaperManager { mHandler.sendEmptyMessage(MSG_CLEAR_WALLPAPER); } - public Handler getHandler() { - return mHandler; - } - public Bitmap peekWallpaperBitmap(Context context, boolean returnDefault) { synchronized (this) { if (mWallpaper != null) { @@ -623,24 +619,14 @@ public class WallpaperManager { * @param yOffset The offset along the Y dimension, from 0 to 1. */ public void setWallpaperOffsets(IBinder windowToken, float xOffset, float yOffset) { - final IBinder fWindowToken = windowToken; - final float fXOffset = xOffset; - final float fYOffset = yOffset; - sGlobals.getHandler().post(new Runnable() { - public void run() { - try { - //Log.v(TAG, "Sending new wallpaper offsets from app..."); - ViewRootImpl.getWindowSession(mContext.getMainLooper()).setWallpaperPosition( - fWindowToken, fXOffset, fYOffset, mWallpaperXStep, mWallpaperYStep); - //Log.v(TAG, "...app returning after sending offsets!"); - } catch (RemoteException e) { - // Ignore. - } catch (IllegalArgumentException e) { - // Since this is being posted, it's possible that this windowToken is no longer - // valid, for example, if setWallpaperOffsets is called just before rotation. - } - } - }); + try { + //Log.v(TAG, "Sending new wallpaper offsets from app..."); + ViewRootImpl.getWindowSession(mContext.getMainLooper()).setWallpaperPosition( + windowToken, xOffset, yOffset, mWallpaperXStep, mWallpaperYStep); + //Log.v(TAG, "...app returning after sending offsets!"); + } catch (RemoteException e) { + // Ignore. + } } /** diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java index 3c4e54533699..ba24036f0973 100644 --- a/core/java/android/content/SyncManager.java +++ b/core/java/android/content/SyncManager.java @@ -1034,6 +1034,7 @@ public class SyncManager implements OnAccountsUpdateListener { protected void dumpSyncState(PrintWriter pw) { pw.print("data connected: "); pw.println(mDataConnectionIsConnected); + pw.print("auto sync: "); pw.println(mSyncStorageEngine.getMasterSyncAutomatically()); pw.print("memory low: "); pw.println(mStorageIsLow); final Account[] accounts = mAccounts; @@ -1272,57 +1273,17 @@ public class SyncManager implements OnAccountsUpdateListener { } - pw.println(); - pw.printf("Detailed Statistics (Recent history): %d (# of times) %ds (sync time)\n", - totalTimes, totalElapsedTime / 1000); - - final List<AuthoritySyncStats> sortedAuthorities = - new ArrayList<AuthoritySyncStats>(authorityMap.values()); - Collections.sort(sortedAuthorities, new Comparator<AuthoritySyncStats>() { - @Override - public int compare(AuthoritySyncStats lhs, AuthoritySyncStats rhs) { - // reverse order - int compare = Integer.compare(rhs.times, lhs.times); - if (compare == 0) { - compare = Long.compare(rhs.elapsedTime, lhs.elapsedTime); - } - return compare; - } - }); - - final int maxLength = Math.max(maxAuthority, maxAccount + 3); - final int padLength = 2 + 2 + maxLength + 2 + 10 + 11; - final char chars[] = new char[padLength]; - Arrays.fill(chars, '-'); - final String separator = new String(chars); - - final String authorityFormat = String.format(" %%-%ds: %%-9s %%-11s\n", maxLength + 2); - final String accountFormat = String.format(" %%-%ds: %%-9s %%-11s\n", maxLength); - - pw.println(separator); - for (AuthoritySyncStats authoritySyncStats : sortedAuthorities) { - String name = authoritySyncStats.name; - long elapsedTime; - int times; - String timeStr; - String timesStr; - - elapsedTime = authoritySyncStats.elapsedTime; - times = authoritySyncStats.times; - timeStr = String.format("%ds/%d%%", - elapsedTime / 1000, - elapsedTime * 100 / totalElapsedTime); - timesStr = String.format("%d/%d%%", - times, - times * 100 / totalTimes); - pw.printf(authorityFormat, name, timesStr, timeStr); - - final List<AccountSyncStats> sortedAccounts = - new ArrayList<AccountSyncStats>( - authoritySyncStats.accountMap.values()); - Collections.sort(sortedAccounts, new Comparator<AccountSyncStats>() { + if (totalElapsedTime > 0) { + pw.println(); + pw.printf("Detailed Statistics (Recent history): " + + "%d (# of times) %ds (sync time)\n", + totalTimes, totalElapsedTime / 1000); + + final List<AuthoritySyncStats> sortedAuthorities = + new ArrayList<AuthoritySyncStats>(authorityMap.values()); + Collections.sort(sortedAuthorities, new Comparator<AuthoritySyncStats>() { @Override - public int compare(AccountSyncStats lhs, AccountSyncStats rhs) { + public int compare(AuthoritySyncStats lhs, AuthoritySyncStats rhs) { // reverse order int compare = Integer.compare(rhs.times, lhs.times); if (compare == 0) { @@ -1331,18 +1292,63 @@ public class SyncManager implements OnAccountsUpdateListener { return compare; } }); - for (AccountSyncStats stats: sortedAccounts) { - elapsedTime = stats.elapsedTime; - times = stats.times; + + final int maxLength = Math.max(maxAuthority, maxAccount + 3); + final int padLength = 2 + 2 + maxLength + 2 + 10 + 11; + final char chars[] = new char[padLength]; + Arrays.fill(chars, '-'); + final String separator = new String(chars); + + final String authorityFormat = + String.format(" %%-%ds: %%-9s %%-11s\n", maxLength + 2); + final String accountFormat = + String.format(" %%-%ds: %%-9s %%-11s\n", maxLength); + + pw.println(separator); + for (AuthoritySyncStats authoritySyncStats : sortedAuthorities) { + String name = authoritySyncStats.name; + long elapsedTime; + int times; + String timeStr; + String timesStr; + + elapsedTime = authoritySyncStats.elapsedTime; + times = authoritySyncStats.times; timeStr = String.format("%ds/%d%%", elapsedTime / 1000, elapsedTime * 100 / totalElapsedTime); timesStr = String.format("%d/%d%%", times, times * 100 / totalTimes); - pw.printf(accountFormat, stats.name, timesStr, timeStr); + pw.printf(authorityFormat, name, timesStr, timeStr); + + final List<AccountSyncStats> sortedAccounts = + new ArrayList<AccountSyncStats>( + authoritySyncStats.accountMap.values()); + Collections.sort(sortedAccounts, new Comparator<AccountSyncStats>() { + @Override + public int compare(AccountSyncStats lhs, AccountSyncStats rhs) { + // reverse order + int compare = Integer.compare(rhs.times, lhs.times); + if (compare == 0) { + compare = Long.compare(rhs.elapsedTime, lhs.elapsedTime); + } + return compare; + } + }); + for (AccountSyncStats stats: sortedAccounts) { + elapsedTime = stats.elapsedTime; + times = stats.times; + timeStr = String.format("%ds/%d%%", + elapsedTime / 1000, + elapsedTime * 100 / totalElapsedTime); + timesStr = String.format("%d/%d%%", + times, + times * 100 / totalTimes); + pw.printf(accountFormat, stats.name, timesStr, timeStr); + } + pw.println(separator); } - pw.println(separator); } pw.println(); diff --git a/core/java/android/database/CursorWindow.java b/core/java/android/database/CursorWindow.java index e9675e8a1d22..85f570c1b8e5 100644 --- a/core/java/android/database/CursorWindow.java +++ b/core/java/android/database/CursorWindow.java @@ -98,8 +98,8 @@ public class CursorWindow extends SQLiteClosable implements Parcelable { */ public CursorWindow(String name) { mStartPos = 0; - mName = name; - mWindowPtr = nativeCreate(name, sCursorWindowSize); + mName = name != null && name.length() != 0 ? name : "<unnamed>"; + mWindowPtr = nativeCreate(mName, sCursorWindowSize); if (mWindowPtr == 0) { throw new CursorWindowAllocationException("Cursor window allocation of " + (sCursorWindowSize / 1024) + " kb failed. " + printStats()); @@ -161,7 +161,7 @@ public class CursorWindow extends SQLiteClosable implements Parcelable { } /** - * Gets the name of this cursor window. + * Gets the name of this cursor window, never null. * @hide */ public String getName() { diff --git a/core/java/android/database/sqlite/DatabaseConnectionPool.java b/core/java/android/database/sqlite/DatabaseConnectionPool.java deleted file mode 100644 index 39a9d23c0220..000000000000 --- a/core/java/android/database/sqlite/DatabaseConnectionPool.java +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright (C) 20010 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.database.sqlite; - -import android.content.res.Resources; -import android.os.SystemClock; -import android.util.Log; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Random; - -/** - * A connection pool to be used by readers. - * Note that each connection can be used by only one reader at a time. - */ -/* package */ class DatabaseConnectionPool { - - private static final String TAG = "DatabaseConnectionPool"; - - /** The default connection pool size. */ - private volatile int mMaxPoolSize = - Resources.getSystem().getInteger(com.android.internal.R.integer.db_connection_pool_size); - - /** The connection pool objects are stored in this member. - * TODO: revisit this data struct as the number of pooled connections increase beyond - * single-digit values. - */ - private final ArrayList<PoolObj> mPool = new ArrayList<PoolObj>(mMaxPoolSize); - - /** the main database connection to which this connection pool is attached */ - private final SQLiteDatabase mParentDbObj; - - /** Random number generator used to pick a free connection out of the pool */ - private Random rand; // lazily initialized - - /* package */ DatabaseConnectionPool(SQLiteDatabase db) { - this.mParentDbObj = db; - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "Max Pool Size: " + mMaxPoolSize); - } - } - - /** - * close all database connections in the pool - even if they are in use! - */ - /* package */ synchronized void close() { - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "Closing the connection pool on " + mParentDbObj.getPath() + toString()); - } - for (int i = mPool.size() - 1; i >= 0; i--) { - mPool.get(i).mDb.close(); - } - mPool.clear(); - } - - /** - * get a free connection from the pool - * - * @param sql if not null, try to find a connection inthe pool which already has cached - * the compiled statement for this sql. - * @return the Database connection that the caller can use - */ - /* package */ synchronized SQLiteDatabase get(String sql) { - SQLiteDatabase db = null; - PoolObj poolObj = null; - int poolSize = mPool.size(); - if (Log.isLoggable(TAG, Log.DEBUG)) { - assert sql != null; - doAsserts(); - } - if (getFreePoolSize() == 0) { - // no free ( = available) connections - if (mMaxPoolSize == poolSize) { - // maxed out. can't open any more connections. - // let the caller wait on one of the pooled connections - // preferably a connection caching the pre-compiled statement of the given SQL - if (mMaxPoolSize == 1) { - poolObj = mPool.get(0); - } else { - for (int i = 0; i < mMaxPoolSize; i++) { - if (mPool.get(i).mDb.isInStatementCache(sql)) { - poolObj = mPool.get(i); - break; - } - } - if (poolObj == null) { - // there are no database connections with the given SQL pre-compiled. - // ok to return any of the connections. - if (rand == null) { - rand = new Random(SystemClock.elapsedRealtime()); - } - poolObj = mPool.get(rand.nextInt(mMaxPoolSize)); - } - } - db = poolObj.mDb; - } else { - // create a new connection and add it to the pool, since we haven't reached - // max pool size allowed - db = mParentDbObj.createPoolConnection((short)(poolSize + 1)); - poolObj = new PoolObj(db); - mPool.add(poolSize, poolObj); - } - } else { - // there are free connections available. pick one - // preferably a connection caching the pre-compiled statement of the given SQL - for (int i = 0; i < poolSize; i++) { - if (mPool.get(i).isFree() && mPool.get(i).mDb.isInStatementCache(sql)) { - poolObj = mPool.get(i); - break; - } - } - if (poolObj == null) { - // didn't find a free database connection with the given SQL already - // pre-compiled. return a free connection (this means, the same SQL could be - // pre-compiled on more than one database connection. potential wasted memory.) - for (int i = 0; i < poolSize; i++) { - if (mPool.get(i).isFree()) { - poolObj = mPool.get(i); - break; - } - } - } - db = poolObj.mDb; - } - - assert poolObj != null; - assert poolObj.mDb == db; - - poolObj.acquire(); - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "END get-connection: " + toString() + poolObj.toString()); - } - return db; - // TODO if a thread acquires a connection and dies without releasing the connection, then - // there could be a connection leak. - } - - /** - * release the given database connection back to the pool. - * @param db the connection to be released - */ - /* package */ synchronized void release(SQLiteDatabase db) { - if (Log.isLoggable(TAG, Log.DEBUG)) { - assert db.mConnectionNum > 0; - doAsserts(); - assert mPool.get(db.mConnectionNum - 1).mDb == db; - } - - PoolObj poolObj = mPool.get(db.mConnectionNum - 1); - - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "BEGIN release-conn: " + toString() + poolObj.toString()); - } - - if (poolObj.isFree()) { - throw new IllegalStateException("Releasing object already freed: " + - db.mConnectionNum); - } - - poolObj.release(); - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "END release-conn: " + toString() + poolObj.toString()); - } - } - - /** - * Returns a list of all database connections in the pool (both free and busy connections). - * This method is used when "adb bugreport" is done. - */ - /* package */ synchronized ArrayList<SQLiteDatabase> getConnectionList() { - ArrayList<SQLiteDatabase> list = new ArrayList<SQLiteDatabase>(); - for (int i = mPool.size() - 1; i >= 0; i--) { - list.add(mPool.get(i).mDb); - } - return list; - } - - /** - * package level access for testing purposes only. otherwise, private should be sufficient. - */ - /* package */ int getFreePoolSize() { - int count = 0; - for (int i = mPool.size() - 1; i >= 0; i--) { - if (mPool.get(i).isFree()) { - count++; - } - } - return count++; - } - - /** - * only for testing purposes - */ - /* package */ ArrayList<PoolObj> getPool() { - return mPool; - } - - @Override - public String toString() { - StringBuilder buff = new StringBuilder(); - buff.append("db: "); - buff.append(mParentDbObj.getPath()); - buff.append(", totalsize = "); - buff.append(mPool.size()); - buff.append(", #free = "); - buff.append(getFreePoolSize()); - buff.append(", maxpoolsize = "); - buff.append(mMaxPoolSize); - for (PoolObj p : mPool) { - buff.append("\n"); - buff.append(p.toString()); - } - return buff.toString(); - } - - private void doAsserts() { - for (int i = 0; i < mPool.size(); i++) { - mPool.get(i).verify(); - assert mPool.get(i).mDb.mConnectionNum == (i + 1); - } - } - - /** only used for testing purposes. */ - /* package */ synchronized void setMaxPoolSize(int size) { - mMaxPoolSize = size; - } - - /** only used for testing purposes. */ - /* package */ synchronized int getMaxPoolSize() { - return mMaxPoolSize; - } - - /** only used for testing purposes. */ - /* package */ boolean isDatabaseObjFree(SQLiteDatabase db) { - return mPool.get(db.mConnectionNum - 1).isFree(); - } - - /** only used for testing purposes. */ - /* package */ int getSize() { - return mPool.size(); - } - - /** - * represents objects in the connection pool. - * package-level access for testing purposes only. - */ - /* package */ static class PoolObj { - - private final SQLiteDatabase mDb; - private boolean mFreeBusyFlag = FREE; - private static final boolean FREE = true; - private static final boolean BUSY = false; - - /** the number of threads holding this connection */ - // @GuardedBy("this") - private int mNumHolders = 0; - - /** contains the threadIds of the threads holding this connection. - * used for debugging purposes only. - */ - // @GuardedBy("this") - private HashSet<Long> mHolderIds = new HashSet<Long>(); - - public PoolObj(SQLiteDatabase db) { - mDb = db; - } - - private synchronized void acquire() { - if (Log.isLoggable(TAG, Log.DEBUG)) { - assert isFree(); - long id = Thread.currentThread().getId(); - assert !mHolderIds.contains(id); - mHolderIds.add(id); - } - - mNumHolders++; - mFreeBusyFlag = BUSY; - } - - private synchronized void release() { - if (Log.isLoggable(TAG, Log.DEBUG)) { - long id = Thread.currentThread().getId(); - assert mHolderIds.size() == mNumHolders; - assert mHolderIds.contains(id); - mHolderIds.remove(id); - } - - mNumHolders--; - if (mNumHolders == 0) { - mFreeBusyFlag = FREE; - } - } - - private synchronized boolean isFree() { - if (Log.isLoggable(TAG, Log.DEBUG)) { - verify(); - } - return (mFreeBusyFlag == FREE); - } - - private synchronized void verify() { - if (mFreeBusyFlag == FREE) { - assert mNumHolders == 0; - } else { - assert mNumHolders > 0; - } - } - - /** - * only for testing purposes - */ - /* package */ synchronized int getNumHolders() { - return mNumHolders; - } - - @Override - public String toString() { - StringBuilder buff = new StringBuilder(); - buff.append(", conn # "); - buff.append(mDb.mConnectionNum); - buff.append(", mCountHolders = "); - synchronized(this) { - buff.append(mNumHolders); - buff.append(", freeBusyFlag = "); - buff.append(mFreeBusyFlag); - for (Long l : mHolderIds) { - buff.append(", id = " + l); - } - } - return buff.toString(); - } - } -} diff --git a/core/java/android/database/sqlite/SQLiteClosable.java b/core/java/android/database/sqlite/SQLiteClosable.java index 01e9fb3347b0..7e91a7b33eb6 100644 --- a/core/java/android/database/sqlite/SQLiteClosable.java +++ b/core/java/android/database/sqlite/SQLiteClosable.java @@ -16,8 +16,6 @@ package android.database.sqlite; -import android.database.CursorWindow; - /** * An object created from a SQLiteDatabase that can be closed. */ @@ -31,7 +29,7 @@ public abstract class SQLiteClosable { synchronized(this) { if (mReferenceCount <= 0) { throw new IllegalStateException( - "attempt to re-open an already-closed object: " + getObjInfo()); + "attempt to re-open an already-closed object: " + this); } mReferenceCount++; } @@ -56,22 +54,4 @@ public abstract class SQLiteClosable { onAllReferencesReleasedFromContainer(); } } - - private String getObjInfo() { - StringBuilder buff = new StringBuilder(); - buff.append(this.getClass().getName()); - buff.append(" ("); - if (this instanceof SQLiteDatabase) { - buff.append("database = "); - buff.append(((SQLiteDatabase)this).getPath()); - } else if (this instanceof SQLiteProgram) { - buff.append("mSql = "); - buff.append(((SQLiteProgram)this).mSql); - } else if (this instanceof CursorWindow) { - buff.append("mStartPos = "); - buff.append(((CursorWindow)this).getStartPosition()); - } - buff.append(") "); - return buff.toString(); - } } diff --git a/core/java/android/database/sqlite/SQLiteCompiledSql.java b/core/java/android/database/sqlite/SQLiteCompiledSql.java deleted file mode 100644 index dafbc79ad6cc..000000000000 --- a/core/java/android/database/sqlite/SQLiteCompiledSql.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.database.sqlite; - -import android.os.StrictMode; -import android.util.Log; - -/** - * This class encapsulates compilation of sql statement and release of the compiled statement obj. - * Once a sql statement is compiled, it is cached in {@link SQLiteDatabase} - * and it is released in one of the 2 following ways - * 1. when {@link SQLiteDatabase} object is closed. - * 2. if this is not cached in {@link SQLiteDatabase}, {@link android.database.Cursor#close()} - * releaases this obj. - */ -/* package */ class SQLiteCompiledSql { - - private static final String TAG = "SQLiteCompiledSql"; - - /** The database this program is compiled against. */ - /* package */ final SQLiteDatabase mDatabase; - - /** - * Native linkage, do not modify. This comes from the database. - */ - /* package */ final int nHandle; - - /** - * Native linkage, do not modify. When non-0 this holds a reference to a valid - * sqlite3_statement object. It is only updated by the native code, but may be - * checked in this class when the database lock is held to determine if there - * is a valid native-side program or not. - */ - /* package */ int nStatement = 0; - - /** the following are for debugging purposes */ - private String mSqlStmt = null; - private final Throwable mStackTrace; - - /** when in cache and is in use, this member is set */ - private boolean mInUse = false; - - /* package */ SQLiteCompiledSql(SQLiteDatabase db, String sql) { - db.verifyDbIsOpen(); - db.verifyLockOwner(); - mDatabase = db; - mSqlStmt = sql; - if (StrictMode.vmSqliteObjectLeaksEnabled()) { - mStackTrace = new DatabaseObjectNotClosedException().fillInStackTrace(); - } else { - mStackTrace = null; - } - nHandle = db.mNativeHandle; - native_compile(sql); - } - - /* package */ void releaseSqlStatement() { - // Note that native_finalize() checks to make sure that nStatement is - // non-null before destroying it. - if (nStatement != 0) { - mDatabase.finalizeStatementLater(nStatement); - nStatement = 0; - } - } - - /** - * returns true if acquire() succeeds. false otherwise. - */ - /* package */ synchronized boolean acquire() { - if (mInUse) { - // it is already in use. - return false; - } - mInUse = true; - return true; - } - - /* package */ synchronized void release() { - mInUse = false; - } - - /* package */ synchronized void releaseIfNotInUse() { - // if it is not in use, release its memory from the database - if (!mInUse) { - releaseSqlStatement(); - } - } - - /** - * Make sure that the native resource is cleaned up. - */ - @Override - protected void finalize() throws Throwable { - try { - if (nStatement == 0) return; - // don't worry about finalizing this object if it is ALREADY in the - // queue of statements to be finalized later - if (mDatabase.isInQueueOfStatementsToBeFinalized(nStatement)) { - return; - } - // finalizer should NEVER get called - // but if the database itself is not closed and is GC'ed, then - // all sub-objects attached to the database could end up getting GC'ed too. - // in that case, don't print any warning. - if (mInUse && mStackTrace != null) { - int len = mSqlStmt.length(); - StrictMode.onSqliteObjectLeaked( - "Releasing statement in a finalizer. Please ensure " + - "that you explicitly call close() on your cursor: " + - mSqlStmt.substring(0, (len > 1000) ? 1000 : len), - mStackTrace); - } - releaseSqlStatement(); - } finally { - super.finalize(); - } - } - - @Override public String toString() { - synchronized(this) { - StringBuilder buff = new StringBuilder(); - buff.append(" nStatement="); - buff.append(nStatement); - buff.append(", mInUse="); - buff.append(mInUse); - buff.append(", db="); - buff.append(mDatabase.getPath()); - buff.append(", db_connectionNum="); - buff.append(mDatabase.mConnectionNum); - buff.append(", sql="); - int len = mSqlStmt.length(); - buff.append(mSqlStmt.substring(0, (len > 100) ? 100 : len)); - return buff.toString(); - } - } - - /** - * Compiles SQL into a SQLite program. - * - * <P>The database lock must be held when calling this method. - * @param sql The SQL to compile. - */ - private final native void native_compile(String sql); -} diff --git a/core/java/android/database/sqlite/SQLiteConnection.java b/core/java/android/database/sqlite/SQLiteConnection.java new file mode 100644 index 000000000000..e45d66dd2864 --- /dev/null +++ b/core/java/android/database/sqlite/SQLiteConnection.java @@ -0,0 +1,1149 @@ +/* + * 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.database.sqlite; + +import dalvik.system.BlockGuard; +import dalvik.system.CloseGuard; + +import android.database.Cursor; +import android.database.CursorWindow; +import android.database.DatabaseUtils; +import android.database.sqlite.SQLiteDebug.DbStats; +import android.os.ParcelFileDescriptor; +import android.util.Log; +import android.util.LruCache; +import android.util.Printer; + +import java.sql.Date; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Map; +import java.util.regex.Pattern; + +/** + * Represents a SQLite database connection. + * Each connection wraps an instance of a native <code>sqlite3</code> object. + * <p> + * When database connection pooling is enabled, there can be multiple active + * connections to the same database. Otherwise there is typically only one + * connection per database. + * </p><p> + * When the SQLite WAL feature is enabled, multiple readers and one writer + * can concurrently access the database. Without WAL, readers and writers + * are mutually exclusive. + * </p> + * + * <h2>Ownership and concurrency guarantees</h2> + * <p> + * Connection objects are not thread-safe. They are acquired as needed to + * perform a database operation and are then returned to the pool. At any + * given time, a connection is either owned and used by a {@link SQLiteSession} + * object or the {@link SQLiteConnectionPool}. Those classes are + * responsible for serializing operations to guard against concurrent + * use of a connection. + * </p><p> + * The guarantee of having a single owner allows this class to be implemented + * without locks and greatly simplifies resource management. + * </p> + * + * <h2>Encapsulation guarantees</h2> + * <p> + * The connection object object owns *all* of the SQLite related native + * objects that are associated with the connection. What's more, there are + * no other objects in the system that are capable of obtaining handles to + * those native objects. Consequently, when the connection is closed, we do + * not have to worry about what other components might have references to + * its associated SQLite state -- there are none. + * </p><p> + * Encapsulation is what ensures that the connection object's + * lifecycle does not become a tortured mess of finalizers and reference + * queues. + * </p> + * + * @hide + */ +public final class SQLiteConnection { + private static final String TAG = "SQLiteConnection"; + + private static final String[] EMPTY_STRING_ARRAY = new String[0]; + private static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; + + private static final Pattern TRIM_SQL_PATTERN = Pattern.compile("[\\s]*\\n+[\\s]*"); + + private final CloseGuard mCloseGuard = CloseGuard.get(); + + private final SQLiteConnectionPool mPool; + private final SQLiteDatabaseConfiguration mConfiguration; + private final int mConnectionId; + private final boolean mIsPrimaryConnection; + private final PreparedStatementCache mPreparedStatementCache; + private PreparedStatement mPreparedStatementPool; + + // The recent operations log. + private final OperationLog mRecentOperations = new OperationLog(); + + // The native SQLiteConnection pointer. (FOR INTERNAL USE ONLY) + private int mConnectionPtr; + + private boolean mOnlyAllowReadOnlyOperations; + + private static native int nativeOpen(String path, int openFlags, String label, + boolean enableTrace, boolean enableProfile); + private static native void nativeClose(int connectionPtr); + private static native void nativeRegisterCustomFunction(int connectionPtr, + SQLiteCustomFunction function); + private static native void nativeSetLocale(int connectionPtr, String locale); + private static native int nativePrepareStatement(int connectionPtr, String sql); + private static native void nativeFinalizeStatement(int connectionPtr, int statementPtr); + private static native int nativeGetParameterCount(int connectionPtr, int statementPtr); + private static native boolean nativeIsReadOnly(int connectionPtr, int statementPtr); + private static native int nativeGetColumnCount(int connectionPtr, int statementPtr); + private static native String nativeGetColumnName(int connectionPtr, int statementPtr, + int index); + private static native void nativeBindNull(int connectionPtr, int statementPtr, + int index); + private static native void nativeBindLong(int connectionPtr, int statementPtr, + int index, long value); + private static native void nativeBindDouble(int connectionPtr, int statementPtr, + int index, double value); + private static native void nativeBindString(int connectionPtr, int statementPtr, + int index, String value); + private static native void nativeBindBlob(int connectionPtr, int statementPtr, + int index, byte[] value); + private static native void nativeResetStatementAndClearBindings( + int connectionPtr, int statementPtr); + private static native void nativeExecute(int connectionPtr, int statementPtr); + private static native long nativeExecuteForLong(int connectionPtr, int statementPtr); + private static native String nativeExecuteForString(int connectionPtr, int statementPtr); + private static native int nativeExecuteForBlobFileDescriptor( + int connectionPtr, int statementPtr); + private static native int nativeExecuteForChangedRowCount(int connectionPtr, int statementPtr); + private static native long nativeExecuteForLastInsertedRowId( + int connectionPtr, int statementPtr); + private static native long nativeExecuteForCursorWindow( + int connectionPtr, int statementPtr, int windowPtr, + int startPos, int requiredPos, boolean countAllRows); + private static native int nativeGetDbLookaside(int connectionPtr); + + private SQLiteConnection(SQLiteConnectionPool pool, + SQLiteDatabaseConfiguration configuration, + int connectionId, boolean primaryConnection) { + mPool = pool; + mConfiguration = new SQLiteDatabaseConfiguration(configuration); + mConnectionId = connectionId; + mIsPrimaryConnection = primaryConnection; + mPreparedStatementCache = new PreparedStatementCache( + mConfiguration.maxSqlCacheSize); + mCloseGuard.open("close"); + } + + @Override + protected void finalize() throws Throwable { + try { + if (mPool != null && mConnectionPtr != 0) { + mPool.onConnectionLeaked(); + } + + dispose(true); + } finally { + super.finalize(); + } + } + + // Called by SQLiteConnectionPool only. + static SQLiteConnection open(SQLiteConnectionPool pool, + SQLiteDatabaseConfiguration configuration, + int connectionId, boolean primaryConnection) { + SQLiteConnection connection = new SQLiteConnection(pool, configuration, + connectionId, primaryConnection); + try { + connection.open(); + return connection; + } catch (SQLiteException ex) { + connection.dispose(false); + throw ex; + } + } + + // Called by SQLiteConnectionPool only. + // Closes the database closes and releases all of its associated resources. + // Do not call methods on the connection after it is closed. It will probably crash. + void close() { + dispose(false); + } + + private void open() { + SQLiteGlobal.initializeOnce(); + + mConnectionPtr = nativeOpen(mConfiguration.path, mConfiguration.openFlags, + mConfiguration.label, + SQLiteDebug.DEBUG_SQL_STATEMENTS, SQLiteDebug.DEBUG_SQL_TIME); + + setLocaleFromConfiguration(); + } + + private void dispose(boolean finalized) { + if (mCloseGuard != null) { + if (finalized) { + mCloseGuard.warnIfOpen(); + } + mCloseGuard.close(); + } + + if (mConnectionPtr != 0) { + mRecentOperations.beginOperation("close", null, null); + try { + mPreparedStatementCache.evictAll(); + nativeClose(mConnectionPtr); + mConnectionPtr = 0; + } finally { + mRecentOperations.endOperation(); + } + } + } + + private void setLocaleFromConfiguration() { + nativeSetLocale(mConnectionPtr, mConfiguration.locale.toString()); + } + + // Called by SQLiteConnectionPool only. + void reconfigure(SQLiteDatabaseConfiguration configuration) { + // Register custom functions. + final int functionCount = configuration.customFunctions.size(); + for (int i = 0; i < functionCount; i++) { + SQLiteCustomFunction function = configuration.customFunctions.get(i); + if (!mConfiguration.customFunctions.contains(function)) { + nativeRegisterCustomFunction(mConnectionPtr, function); + } + } + + // Remember whether locale has changed. + boolean localeChanged = !configuration.locale.equals(mConfiguration.locale); + + // Update configuration parameters. + mConfiguration.updateParametersFrom(configuration); + + // Update prepared statement cache size. + mPreparedStatementCache.resize(configuration.maxSqlCacheSize); + + // Update locale. + if (localeChanged) { + setLocaleFromConfiguration(); + } + } + + // Called by SQLiteConnectionPool only. + // When set to true, executing write operations will throw SQLiteException. + // Preparing statements that might write is ok, just don't execute them. + void setOnlyAllowReadOnlyOperations(boolean readOnly) { + mOnlyAllowReadOnlyOperations = readOnly; + } + + // Called by SQLiteConnectionPool only. + // Returns true if the prepared statement cache contains the specified SQL. + boolean isPreparedStatementInCache(String sql) { + return mPreparedStatementCache.get(sql) != null; + } + + /** + * Gets the unique id of this connection. + * @return The connection id. + */ + public int getConnectionId() { + return mConnectionId; + } + + /** + * Returns true if this is the primary database connection. + * @return True if this is the primary database connection. + */ + public boolean isPrimaryConnection() { + return mIsPrimaryConnection; + } + + /** + * Prepares a statement for execution but does not bind its parameters or execute it. + * <p> + * This method can be used to check for syntax errors during compilation + * prior to execution of the statement. If the {@code outStatementInfo} argument + * is not null, the provided {@link SQLiteStatementInfo} object is populated + * with information about the statement. + * </p><p> + * A prepared statement makes no reference to the arguments that may eventually + * be bound to it, consequently it it possible to cache certain prepared statements + * such as SELECT or INSERT/UPDATE statements. If the statement is cacheable, + * then it will be stored in the cache for later. + * </p><p> + * To take advantage of this behavior as an optimization, the connection pool + * provides a method to acquire a connection that already has a given SQL statement + * in its prepared statement cache so that it is ready for execution. + * </p> + * + * @param sql The SQL statement to prepare. + * @param outStatementInfo The {@link SQLiteStatementInfo} object to populate + * with information about the statement, or null if none. + * + * @throws SQLiteException if an error occurs, such as a syntax error. + */ + public void prepare(String sql, SQLiteStatementInfo outStatementInfo) { + if (sql == null) { + throw new IllegalArgumentException("sql must not be null."); + } + + mRecentOperations.beginOperation("prepare", sql, null); + try { + PreparedStatement statement = acquirePreparedStatement(sql); + try { + if (outStatementInfo != null) { + outStatementInfo.numParameters = statement.mNumParameters; + outStatementInfo.readOnly = statement.mReadOnly; + + final int columnCount = nativeGetColumnCount( + mConnectionPtr, statement.mStatementPtr); + if (columnCount == 0) { + outStatementInfo.columnNames = EMPTY_STRING_ARRAY; + } else { + outStatementInfo.columnNames = new String[columnCount]; + for (int i = 0; i < columnCount; i++) { + outStatementInfo.columnNames[i] = nativeGetColumnName( + mConnectionPtr, statement.mStatementPtr, i); + } + } + } + } finally { + releasePreparedStatement(statement); + } + } catch (RuntimeException ex) { + mRecentOperations.failOperation(ex); + throw ex; + } finally { + mRecentOperations.endOperation(); + } + } + + /** + * Executes a statement that does not return a result. + * + * @param sql The SQL statement to execute. + * @param bindArgs The arguments to bind, or null if none. + * + * @throws SQLiteException if an error occurs, such as a syntax error + * or invalid number of bind arguments. + */ + public void execute(String sql, Object[] bindArgs) { + if (sql == null) { + throw new IllegalArgumentException("sql must not be null."); + } + + mRecentOperations.beginOperation("execute", sql, bindArgs); + try { + PreparedStatement statement = acquirePreparedStatement(sql); + try { + throwIfStatementForbidden(statement); + bindArguments(statement, bindArgs); + applyBlockGuardPolicy(statement); + nativeExecute(mConnectionPtr, statement.mStatementPtr); + } finally { + releasePreparedStatement(statement); + } + } catch (RuntimeException ex) { + mRecentOperations.failOperation(ex); + throw ex; + } finally { + mRecentOperations.endOperation(); + } + } + + /** + * Executes a statement that returns a single <code>long</code> result. + * + * @param sql The SQL statement to execute. + * @param bindArgs The arguments to bind, or null if none. + * @return The value of the first column in the first row of the result set + * as a <code>long</code>, or zero if none. + * + * @throws SQLiteException if an error occurs, such as a syntax error + * or invalid number of bind arguments. + */ + public long executeForLong(String sql, Object[] bindArgs) { + if (sql == null) { + throw new IllegalArgumentException("sql must not be null."); + } + + mRecentOperations.beginOperation("executeForLong", sql, bindArgs); + try { + PreparedStatement statement = acquirePreparedStatement(sql); + try { + throwIfStatementForbidden(statement); + bindArguments(statement, bindArgs); + applyBlockGuardPolicy(statement); + return nativeExecuteForLong(mConnectionPtr, statement.mStatementPtr); + } finally { + releasePreparedStatement(statement); + } + } catch (RuntimeException ex) { + mRecentOperations.failOperation(ex); + throw ex; + } finally { + mRecentOperations.endOperation(); + } + } + + /** + * Executes a statement that returns a single {@link String} result. + * + * @param sql The SQL statement to execute. + * @param bindArgs The arguments to bind, or null if none. + * @return The value of the first column in the first row of the result set + * as a <code>String</code>, or null if none. + * + * @throws SQLiteException if an error occurs, such as a syntax error + * or invalid number of bind arguments. + */ + public String executeForString(String sql, Object[] bindArgs) { + if (sql == null) { + throw new IllegalArgumentException("sql must not be null."); + } + + mRecentOperations.beginOperation("executeForString", sql, bindArgs); + try { + PreparedStatement statement = acquirePreparedStatement(sql); + try { + throwIfStatementForbidden(statement); + bindArguments(statement, bindArgs); + applyBlockGuardPolicy(statement); + return nativeExecuteForString(mConnectionPtr, statement.mStatementPtr); + } finally { + releasePreparedStatement(statement); + } + } catch (RuntimeException ex) { + mRecentOperations.failOperation(ex); + throw ex; + } finally { + mRecentOperations.endOperation(); + } + } + + /** + * Executes a statement that returns a single BLOB result as a + * file descriptor to a shared memory region. + * + * @param sql The SQL statement to execute. + * @param bindArgs The arguments to bind, or null if none. + * @return The file descriptor for a shared memory region that contains + * the value of the first column in the first row of the result set as a BLOB, + * or null if none. + * + * @throws SQLiteException if an error occurs, such as a syntax error + * or invalid number of bind arguments. + */ + public ParcelFileDescriptor executeForBlobFileDescriptor(String sql, Object[] bindArgs) { + if (sql == null) { + throw new IllegalArgumentException("sql must not be null."); + } + + mRecentOperations.beginOperation("executeForBlobFileDescriptor", sql, bindArgs); + try { + PreparedStatement statement = acquirePreparedStatement(sql); + try { + throwIfStatementForbidden(statement); + bindArguments(statement, bindArgs); + applyBlockGuardPolicy(statement); + int fd = nativeExecuteForBlobFileDescriptor( + mConnectionPtr, statement.mStatementPtr); + return fd >= 0 ? ParcelFileDescriptor.adoptFd(fd) : null; + } finally { + releasePreparedStatement(statement); + } + } catch (RuntimeException ex) { + mRecentOperations.failOperation(ex); + throw ex; + } finally { + mRecentOperations.endOperation(); + } + } + + /** + * Executes a statement that returns a count of the number of rows + * that were changed. Use for UPDATE or DELETE SQL statements. + * + * @param sql The SQL statement to execute. + * @param bindArgs The arguments to bind, or null if none. + * @return The number of rows that were changed. + * + * @throws SQLiteException if an error occurs, such as a syntax error + * or invalid number of bind arguments. + */ + public int executeForChangedRowCount(String sql, Object[] bindArgs) { + if (sql == null) { + throw new IllegalArgumentException("sql must not be null."); + } + + mRecentOperations.beginOperation("executeForChangedRowCount", sql, bindArgs); + try { + PreparedStatement statement = acquirePreparedStatement(sql); + try { + throwIfStatementForbidden(statement); + bindArguments(statement, bindArgs); + applyBlockGuardPolicy(statement); + return nativeExecuteForChangedRowCount( + mConnectionPtr, statement.mStatementPtr); + } finally { + releasePreparedStatement(statement); + } + } catch (RuntimeException ex) { + mRecentOperations.failOperation(ex); + throw ex; + } finally { + mRecentOperations.endOperation(); + } + } + + /** + * Executes a statement that returns the row id of the last row inserted + * by the statement. Use for INSERT SQL statements. + * + * @param sql The SQL statement to execute. + * @param bindArgs The arguments to bind, or null if none. + * @return The row id of the last row that was inserted, or 0 if none. + * + * @throws SQLiteException if an error occurs, such as a syntax error + * or invalid number of bind arguments. + */ + public long executeForLastInsertedRowId(String sql, Object[] bindArgs) { + if (sql == null) { + throw new IllegalArgumentException("sql must not be null."); + } + + mRecentOperations.beginOperation("executeForLastInsertedRowId", sql, bindArgs); + try { + PreparedStatement statement = acquirePreparedStatement(sql); + try { + throwIfStatementForbidden(statement); + bindArguments(statement, bindArgs); + applyBlockGuardPolicy(statement); + return nativeExecuteForLastInsertedRowId( + mConnectionPtr, statement.mStatementPtr); + } finally { + releasePreparedStatement(statement); + } + } catch (RuntimeException ex) { + mRecentOperations.failOperation(ex); + throw ex; + } finally { + mRecentOperations.endOperation(); + } + } + + /** + * Executes a statement and populates the specified {@link CursorWindow} + * with a range of results. Returns the number of rows that were counted + * during query execution. + * + * @param sql The SQL statement to execute. + * @param bindArgs The arguments to bind, or null if none. + * @param window The cursor window to clear and fill. + * @param startPos The start position for filling the window. + * @param requiredPos The position of a row that MUST be in the window. + * If it won't fit, then the query should discard part of what it filled + * so that it does. Must be greater than or equal to <code>startPos</code>. + * @param countAllRows True to count all rows that the query would return + * regagless of whether they fit in the window. + * @return The number of rows that were counted during query execution. Might + * not be all rows in the result set unless <code>countAllRows</code> is true. + * + * @throws SQLiteException if an error occurs, such as a syntax error + * or invalid number of bind arguments. + */ + public int executeForCursorWindow(String sql, Object[] bindArgs, + CursorWindow window, int startPos, int requiredPos, boolean countAllRows) { + if (sql == null) { + throw new IllegalArgumentException("sql must not be null."); + } + if (window == null) { + throw new IllegalArgumentException("window must not be null."); + } + + int actualPos = -1; + int countedRows = -1; + int filledRows = -1; + mRecentOperations.beginOperation("executeForCursorWindow", sql, bindArgs); + try { + PreparedStatement statement = acquirePreparedStatement(sql); + try { + throwIfStatementForbidden(statement); + bindArguments(statement, bindArgs); + applyBlockGuardPolicy(statement); + final long result = nativeExecuteForCursorWindow( + mConnectionPtr, statement.mStatementPtr, window.mWindowPtr, + startPos, requiredPos, countAllRows); + actualPos = (int)(result >> 32); + countedRows = (int)result; + filledRows = window.getNumRows(); + window.setStartPosition(actualPos); + return countedRows; + } finally { + releasePreparedStatement(statement); + } + } catch (RuntimeException ex) { + mRecentOperations.failOperation(ex); + throw ex; + } finally { + if (mRecentOperations.endOperationDeferLog()) { + mRecentOperations.logOperation("window='" + window + + "', startPos=" + startPos + + ", actualPos=" + actualPos + + ", filledRows=" + filledRows + + ", countedRows=" + countedRows); + } + } + } + + private PreparedStatement acquirePreparedStatement(String sql) { + PreparedStatement statement = mPreparedStatementCache.get(sql); + if (statement != null) { + return statement; + } + + final int statementPtr = nativePrepareStatement(mConnectionPtr, sql); + try { + final int numParameters = nativeGetParameterCount(mConnectionPtr, statementPtr); + final int type = DatabaseUtils.getSqlStatementType(sql); + final boolean readOnly = nativeIsReadOnly(mConnectionPtr, statementPtr); + statement = obtainPreparedStatement(sql, statementPtr, numParameters, type, readOnly); + if (isCacheable(type)) { + mPreparedStatementCache.put(sql, statement); + statement.mInCache = true; + } + } catch (RuntimeException ex) { + // Finalize the statement if an exception occurred and we did not add + // it to the cache. If it is already in the cache, then leave it there. + if (statement == null || !statement.mInCache) { + nativeFinalizeStatement(mConnectionPtr, statementPtr); + } + throw ex; + } + return statement; + } + + private void releasePreparedStatement(PreparedStatement statement) { + if (statement.mInCache) { + try { + nativeResetStatementAndClearBindings(mConnectionPtr, statement.mStatementPtr); + } catch (SQLiteException ex) { + // The statement could not be reset due to an error. + // The entryRemoved() callback for the cache will recursively call + // releasePreparedStatement() again, but this time mInCache will be false + // so the statement will be finalized and recycled. + if (SQLiteDebug.DEBUG_SQL_CACHE) { + Log.v(TAG, "Could not reset prepared statement due to an exception. " + + "Removing it from the cache. SQL: " + + trimSqlForDisplay(statement.mSql), ex); + } + mPreparedStatementCache.remove(statement.mSql); + } + } else { + nativeFinalizeStatement(mConnectionPtr, statement.mStatementPtr); + recyclePreparedStatement(statement); + } + } + + private void bindArguments(PreparedStatement statement, Object[] bindArgs) { + final int count = bindArgs != null ? bindArgs.length : 0; + if (count != statement.mNumParameters) { + throw new SQLiteBindOrColumnIndexOutOfRangeException( + "Expected " + statement.mNumParameters + " bind arguments but " + + bindArgs.length + " were provided."); + } + if (count == 0) { + return; + } + + final int statementPtr = statement.mStatementPtr; + for (int i = 0; i < count; i++) { + final Object arg = bindArgs[i]; + switch (DatabaseUtils.getTypeOfObject(arg)) { + case Cursor.FIELD_TYPE_NULL: + nativeBindNull(mConnectionPtr, statementPtr, i + 1); + break; + case Cursor.FIELD_TYPE_INTEGER: + nativeBindLong(mConnectionPtr, statementPtr, i + 1, + ((Number)arg).longValue()); + break; + case Cursor.FIELD_TYPE_FLOAT: + nativeBindDouble(mConnectionPtr, statementPtr, i + 1, + ((Number)arg).doubleValue()); + break; + case Cursor.FIELD_TYPE_BLOB: + nativeBindBlob(mConnectionPtr, statementPtr, i + 1, (byte[])arg); + break; + case Cursor.FIELD_TYPE_STRING: + default: + if (arg instanceof Boolean) { + // Provide compatibility with legacy applications which may pass + // Boolean values in bind args. + nativeBindLong(mConnectionPtr, statementPtr, i + 1, + ((Boolean)arg).booleanValue() ? 1 : 0); + } else { + nativeBindString(mConnectionPtr, statementPtr, i + 1, arg.toString()); + } + break; + } + } + } + + private void throwIfStatementForbidden(PreparedStatement statement) { + if (mOnlyAllowReadOnlyOperations && !statement.mReadOnly) { + throw new SQLiteException("Cannot execute this statement because it " + + "might modify the database but the connection is read-only."); + } + } + + private static boolean isCacheable(int statementType) { + if (statementType == DatabaseUtils.STATEMENT_UPDATE + || statementType == DatabaseUtils.STATEMENT_SELECT) { + return true; + } + return false; + } + + private void applyBlockGuardPolicy(PreparedStatement statement) { + if (!mConfiguration.isInMemoryDb()) { + if (statement.mReadOnly) { + BlockGuard.getThreadPolicy().onReadFromDisk(); + } else { + BlockGuard.getThreadPolicy().onWriteToDisk(); + } + } + } + + /** + * Dumps debugging information about this connection. + * + * @param printer The printer to receive the dump, not null. + */ + public void dump(Printer printer) { + dumpUnsafe(printer); + } + + /** + * Dumps debugging information about this connection, in the case where the + * caller might not actually own the connection. + * + * This function is written so that it may be called by a thread that does not + * own the connection. We need to be very careful because the connection state is + * not synchronized. + * + * At worst, the method may return stale or slightly wrong data, however + * it should not crash. This is ok as it is only used for diagnostic purposes. + * + * @param printer The printer to receive the dump, not null. + */ + void dumpUnsafe(Printer printer) { + printer.println("Connection #" + mConnectionId + ":"); + printer.println(" isPrimaryConnection: " + mIsPrimaryConnection); + printer.println(" connectionPtr: 0x" + Integer.toHexString(mConnectionPtr)); + printer.println(" onlyAllowReadOnlyOperations: " + mOnlyAllowReadOnlyOperations); + + mRecentOperations.dump(printer); + mPreparedStatementCache.dump(printer); + } + + /** + * Describes the currently executing operation, in the case where the + * caller might not actually own the connection. + * + * This function is written so that it may be called by a thread that does not + * own the connection. We need to be very careful because the connection state is + * not synchronized. + * + * At worst, the method may return stale or slightly wrong data, however + * it should not crash. This is ok as it is only used for diagnostic purposes. + * + * @return A description of the current operation including how long it has been running, + * or null if none. + */ + String describeCurrentOperationUnsafe() { + return mRecentOperations.describeCurrentOperation(); + } + + /** + * Collects statistics about database connection memory usage. + * + * @param dbStatsList The list to populate. + */ + void collectDbStats(ArrayList<DbStats> dbStatsList) { + // Get information about the main database. + int lookaside = nativeGetDbLookaside(mConnectionPtr); + long pageCount = 0; + long pageSize = 0; + try { + pageCount = executeForLong("PRAGMA page_count;", null); + pageSize = executeForLong("PRAGMA page_size;", null); + } catch (SQLiteException ex) { + // Ignore. + } + dbStatsList.add(getMainDbStatsUnsafe(lookaside, pageCount, pageSize)); + + // Get information about attached databases. + // We ignore the first row in the database list because it corresponds to + // the main database which we have already described. + CursorWindow window = new CursorWindow("collectDbStats"); + try { + executeForCursorWindow("PRAGMA database_list;", null, window, 0, 0, false); + for (int i = 1; i < window.getNumRows(); i++) { + String name = window.getString(i, 1); + String path = window.getString(i, 2); + pageCount = 0; + pageSize = 0; + try { + pageCount = executeForLong("PRAGMA " + name + ".page_count;", null); + pageSize = executeForLong("PRAGMA " + name + ".page_size;", null); + } catch (SQLiteException ex) { + // Ignore. + } + String label = " (attached) " + name; + if (!path.isEmpty()) { + label += ": " + path; + } + dbStatsList.add(new DbStats(label, pageCount, pageSize, 0, 0, 0, 0)); + } + } catch (SQLiteException ex) { + // Ignore. + } finally { + window.close(); + } + } + + /** + * Collects statistics about database connection memory usage, in the case where the + * caller might not actually own the connection. + * + * @return The statistics object, never null. + */ + void collectDbStatsUnsafe(ArrayList<DbStats> dbStatsList) { + dbStatsList.add(getMainDbStatsUnsafe(0, 0, 0)); + } + + private DbStats getMainDbStatsUnsafe(int lookaside, long pageCount, long pageSize) { + // The prepared statement cache is thread-safe so we can access its statistics + // even if we do not own the database connection. + String label = mConfiguration.path; + if (!mIsPrimaryConnection) { + label += " (" + mConnectionId + ")"; + } + return new DbStats(label, pageCount, pageSize, lookaside, + mPreparedStatementCache.hitCount(), + mPreparedStatementCache.missCount(), + mPreparedStatementCache.size()); + } + + @Override + public String toString() { + return "SQLiteConnection: " + mConfiguration.path + " (" + mConnectionId + ")"; + } + + private PreparedStatement obtainPreparedStatement(String sql, int statementPtr, + int numParameters, int type, boolean readOnly) { + PreparedStatement statement = mPreparedStatementPool; + if (statement != null) { + mPreparedStatementPool = statement.mPoolNext; + statement.mPoolNext = null; + statement.mInCache = false; + } else { + statement = new PreparedStatement(); + } + statement.mSql = sql; + statement.mStatementPtr = statementPtr; + statement.mNumParameters = numParameters; + statement.mType = type; + statement.mReadOnly = readOnly; + return statement; + } + + private void recyclePreparedStatement(PreparedStatement statement) { + statement.mSql = null; + statement.mPoolNext = mPreparedStatementPool; + mPreparedStatementPool = statement; + } + + private static String trimSqlForDisplay(String sql) { + return TRIM_SQL_PATTERN.matcher(sql).replaceAll(" "); + } + + /** + * Holder type for a prepared statement. + * + * Although this object holds a pointer to a native statement object, it + * does not have a finalizer. This is deliberate. The {@link SQLiteConnection} + * owns the statement object and will take care of freeing it when needed. + * In particular, closing the connection requires a guarantee of deterministic + * resource disposal because all native statement objects must be freed before + * the native database object can be closed. So no finalizers here. + */ + private static final class PreparedStatement { + // Next item in pool. + public PreparedStatement mPoolNext; + + // The SQL from which the statement was prepared. + public String mSql; + + // The native sqlite3_stmt object pointer. + // Lifetime is managed explicitly by the connection. + public int mStatementPtr; + + // The number of parameters that the prepared statement has. + public int mNumParameters; + + // The statement type. + public int mType; + + // True if the statement is read-only. + public boolean mReadOnly; + + // True if the statement is in the cache. + public boolean mInCache; + } + + private final class PreparedStatementCache + extends LruCache<String, PreparedStatement> { + public PreparedStatementCache(int size) { + super(size); + } + + @Override + protected void entryRemoved(boolean evicted, String key, + PreparedStatement oldValue, PreparedStatement newValue) { + oldValue.mInCache = false; + releasePreparedStatement(oldValue); + } + + public void dump(Printer printer) { + printer.println(" Prepared statement cache:"); + Map<String, PreparedStatement> cache = snapshot(); + if (!cache.isEmpty()) { + int i = 0; + for (Map.Entry<String, PreparedStatement> entry : cache.entrySet()) { + PreparedStatement statement = entry.getValue(); + if (statement.mInCache) { // might be false due to a race with entryRemoved + String sql = entry.getKey(); + printer.println(" " + i + ": statementPtr=0x" + + Integer.toHexString(statement.mStatementPtr) + + ", numParameters=" + statement.mNumParameters + + ", type=" + statement.mType + + ", readOnly=" + statement.mReadOnly + + ", sql=\"" + trimSqlForDisplay(sql) + "\""); + } + i += 1; + } + } else { + printer.println(" <none>"); + } + } + } + + private static final class OperationLog { + private static final int MAX_RECENT_OPERATIONS = 10; + + private final Operation[] mOperations = new Operation[MAX_RECENT_OPERATIONS]; + private int mIndex; + + public void beginOperation(String kind, String sql, Object[] bindArgs) { + synchronized (mOperations) { + final int index = (mIndex + 1) % MAX_RECENT_OPERATIONS; + Operation operation = mOperations[index]; + if (operation == null) { + operation = new Operation(); + mOperations[index] = operation; + } else { + operation.mFinished = false; + operation.mException = null; + if (operation.mBindArgs != null) { + operation.mBindArgs.clear(); + } + } + operation.mStartTime = System.currentTimeMillis(); + operation.mKind = kind; + operation.mSql = sql; + if (bindArgs != null) { + if (operation.mBindArgs == null) { + operation.mBindArgs = new ArrayList<Object>(); + } else { + operation.mBindArgs.clear(); + } + for (int i = 0; i < bindArgs.length; i++) { + final Object arg = bindArgs[i]; + if (arg != null && arg instanceof byte[]) { + // Don't hold onto the real byte array longer than necessary. + operation.mBindArgs.add(EMPTY_BYTE_ARRAY); + } else { + operation.mBindArgs.add(arg); + } + } + } + mIndex = index; + } + } + + public void failOperation(Exception ex) { + synchronized (mOperations) { + final Operation operation = mOperations[mIndex]; + operation.mException = ex; + } + } + + public boolean endOperationDeferLog() { + synchronized (mOperations) { + return endOperationDeferLogLocked(); + } + } + + private boolean endOperationDeferLogLocked() { + final Operation operation = mOperations[mIndex]; + operation.mEndTime = System.currentTimeMillis(); + operation.mFinished = true; + return SQLiteDebug.DEBUG_LOG_SLOW_QUERIES && SQLiteDebug.shouldLogSlowQuery( + operation.mEndTime - operation.mStartTime); + } + + public void endOperation() { + synchronized (mOperations) { + if (endOperationDeferLogLocked()) { + logOperationLocked(null); + } + } + } + + public void logOperation(String detail) { + synchronized (mOperations) { + logOperationLocked(detail); + } + } + + private void logOperationLocked(String detail) { + final Operation operation = mOperations[mIndex]; + StringBuilder msg = new StringBuilder(); + operation.describe(msg); + if (detail != null) { + msg.append(", ").append(detail); + } + Log.d(TAG, msg.toString()); + } + + public String describeCurrentOperation() { + synchronized (mOperations) { + final Operation operation = mOperations[mIndex]; + if (operation != null && !operation.mFinished) { + StringBuilder msg = new StringBuilder(); + operation.describe(msg); + return msg.toString(); + } + return null; + } + } + + public void dump(Printer printer) { + synchronized (mOperations) { + printer.println(" Most recently executed operations:"); + int index = mIndex; + Operation operation = mOperations[index]; + if (operation != null) { + int n = 0; + do { + StringBuilder msg = new StringBuilder(); + msg.append(" ").append(n).append(": ["); + msg.append(operation.getFormattedStartTime()); + msg.append("] "); + operation.describe(msg); + printer.println(msg.toString()); + + if (index > 0) { + index -= 1; + } else { + index = MAX_RECENT_OPERATIONS - 1; + } + n += 1; + operation = mOperations[index]; + } while (operation != null && n < MAX_RECENT_OPERATIONS); + } else { + printer.println(" <none>"); + } + } + } + } + + private static final class Operation { + private static final SimpleDateFormat sDateFormat = + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + + public long mStartTime; + public long mEndTime; + public String mKind; + public String mSql; + public ArrayList<Object> mBindArgs; + public boolean mFinished; + public Exception mException; + + public void describe(StringBuilder msg) { + msg.append(mKind); + if (mFinished) { + msg.append(" took ").append(mEndTime - mStartTime).append("ms"); + } else { + msg.append(" started ").append(System.currentTimeMillis() - mStartTime) + .append("ms ago"); + } + msg.append(" - ").append(getStatus()); + if (mSql != null) { + msg.append(", sql=\"").append(trimSqlForDisplay(mSql)).append("\""); + } + if (mBindArgs != null && mBindArgs.size() != 0) { + msg.append(", bindArgs=["); + final int count = mBindArgs.size(); + for (int i = 0; i < count; i++) { + final Object arg = mBindArgs.get(i); + if (i != 0) { + msg.append(", "); + } + if (arg == null) { + msg.append("null"); + } else if (arg instanceof byte[]) { + msg.append("<byte[]>"); + } else if (arg instanceof String) { + msg.append("\"").append((String)arg).append("\""); + } else { + msg.append(arg); + } + } + msg.append("]"); + } + if (mException != null) { + msg.append(", exception=\"").append(mException.getMessage()).append("\""); + } + } + + private String getStatus() { + if (!mFinished) { + return "running"; + } + return mException != null ? "failed" : "succeeded"; + } + + private String getFormattedStartTime() { + return sDateFormat.format(new Date(mStartTime)); + } + } +} diff --git a/core/java/android/database/sqlite/SQLiteConnectionPool.java b/core/java/android/database/sqlite/SQLiteConnectionPool.java new file mode 100644 index 000000000000..b88bfeef074d --- /dev/null +++ b/core/java/android/database/sqlite/SQLiteConnectionPool.java @@ -0,0 +1,907 @@ +/* + * 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.database.sqlite; + +import dalvik.system.CloseGuard; + +import android.database.sqlite.SQLiteDebug.DbStats; +import android.os.SystemClock; +import android.util.Log; +import android.util.PrefixPrinter; +import android.util.Printer; + +import java.io.Closeable; +import java.util.ArrayList; +import java.util.Map; +import java.util.WeakHashMap; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.LockSupport; + +/** + * Maintains a pool of active SQLite database connections. + * <p> + * At any given time, a connection is either owned by the pool, or it has been + * acquired by a {@link SQLiteSession}. When the {@link SQLiteSession} is + * finished with the connection it is using, it must return the connection + * back to the pool. + * </p><p> + * The pool holds strong references to the connections it owns. However, + * it only holds <em>weak references</em> to the connections that sessions + * have acquired from it. Using weak references in the latter case ensures + * that the connection pool can detect when connections have been improperly + * abandoned so that it can create new connections to replace them if needed. + * </p><p> + * The connection pool is thread-safe (but the connections themselves are not). + * </p> + * + * <h2>Exception safety</h2> + * <p> + * This code attempts to maintain the invariant that opened connections are + * always owned. Unfortunately that means it needs to handle exceptions + * all over to ensure that broken connections get cleaned up. Most + * operations invokving SQLite can throw {@link SQLiteException} or other + * runtime exceptions. This is a bit of a pain to deal with because the compiler + * cannot help us catch missing exception handling code. + * </p><p> + * The general rule for this file: If we are making calls out to + * {@link SQLiteConnection} then we must be prepared to handle any + * runtime exceptions it might throw at us. Note that out-of-memory + * is an {@link Error}, not a {@link RuntimeException}. We don't trouble ourselves + * handling out of memory because it is hard to do anything at all sensible then + * and most likely the VM is about to crash. + * </p> + * + * @hide + */ +public final class SQLiteConnectionPool implements Closeable { + private static final String TAG = "SQLiteConnectionPool"; + + // Amount of time to wait in milliseconds before unblocking acquireConnection + // and logging a message about the connection pool being busy. + private static final long CONNECTION_POOL_BUSY_MILLIS = 30 * 1000; // 30 seconds + + private final CloseGuard mCloseGuard = CloseGuard.get(); + + private final Object mLock = new Object(); + private final AtomicBoolean mConnectionLeaked = new AtomicBoolean(); + private final SQLiteDatabaseConfiguration mConfiguration; + private boolean mIsOpen; + private int mNextConnectionId; + + private ConnectionWaiter mConnectionWaiterPool; + private ConnectionWaiter mConnectionWaiterQueue; + + // Strong references to all available connections. + private final ArrayList<SQLiteConnection> mAvailableNonPrimaryConnections = + new ArrayList<SQLiteConnection>(); + private SQLiteConnection mAvailablePrimaryConnection; + + // Weak references to all acquired connections. The associated value + // is a boolean that indicates whether the connection must be reconfigured + // before being returned to the available connection list. + // For example, the prepared statement cache size may have changed and + // need to be updated. + private final WeakHashMap<SQLiteConnection, Boolean> mAcquiredConnections = + new WeakHashMap<SQLiteConnection, Boolean>(); + + /** + * Connection flag: Read-only. + * <p> + * This flag indicates that the connection will only be used to + * perform read-only operations. + * </p> + */ + public static final int CONNECTION_FLAG_READ_ONLY = 1 << 0; + + /** + * Connection flag: Primary connection affinity. + * <p> + * This flag indicates that the primary connection is required. + * This flag helps support legacy applications that expect most data modifying + * operations to be serialized by locking the primary database connection. + * Setting this flag essentially implements the old "db lock" concept by preventing + * an operation from being performed until it can obtain exclusive access to + * the primary connection. + * </p> + */ + public static final int CONNECTION_FLAG_PRIMARY_CONNECTION_AFFINITY = 1 << 1; + + /** + * Connection flag: Connection is being used interactively. + * <p> + * This flag indicates that the connection is needed by the UI thread. + * The connection pool can use this flag to elevate the priority + * of the database connection request. + * </p> + */ + public static final int CONNECTION_FLAG_INTERACTIVE = 1 << 2; + + private SQLiteConnectionPool(SQLiteDatabaseConfiguration configuration) { + mConfiguration = new SQLiteDatabaseConfiguration(configuration); + } + + @Override + protected void finalize() throws Throwable { + try { + dispose(true); + } finally { + super.finalize(); + } + } + + /** + * Opens a connection pool for the specified database. + * + * @param configuration The database configuration. + * @return The connection pool. + * + * @throws SQLiteException if a database error occurs. + */ + public static SQLiteConnectionPool open(SQLiteDatabaseConfiguration configuration) { + if (configuration == null) { + throw new IllegalArgumentException("configuration must not be null."); + } + + // Create the pool. + SQLiteConnectionPool pool = new SQLiteConnectionPool(configuration); + pool.open(); // might throw + return pool; + } + + // Might throw + private void open() { + // Open the primary connection. + // This might throw if the database is corrupt. + mAvailablePrimaryConnection = openConnectionLocked( + true /*primaryConnection*/); // might throw + + // Mark the pool as being open for business. + mIsOpen = true; + mCloseGuard.open("close"); + } + + /** + * Closes the connection pool. + * <p> + * When the connection pool is closed, it will refuse all further requests + * to acquire connections. All connections that are currently available in + * the pool are closed immediately. Any connections that are still in use + * will be closed as soon as they are returned to the pool. + * </p> + * + * @throws IllegalStateException if the pool has been closed. + */ + public void close() { + dispose(false); + } + + private void dispose(boolean finalized) { + if (mCloseGuard != null) { + if (finalized) { + mCloseGuard.warnIfOpen(); + } + mCloseGuard.close(); + } + + if (!finalized) { + // Close all connections. We don't need (or want) to do this + // when finalized because we don't know what state the connections + // themselves will be in. The finalizer is really just here for CloseGuard. + // The connections will take care of themselves when their own finalizers run. + synchronized (mLock) { + throwIfClosedLocked(); + + mIsOpen = false; + + final int count = mAvailableNonPrimaryConnections.size(); + for (int i = 0; i < count; i++) { + closeConnectionAndLogExceptionsLocked(mAvailableNonPrimaryConnections.get(i)); + } + mAvailableNonPrimaryConnections.clear(); + + if (mAvailablePrimaryConnection != null) { + closeConnectionAndLogExceptionsLocked(mAvailablePrimaryConnection); + mAvailablePrimaryConnection = null; + } + + final int pendingCount = mAcquiredConnections.size(); + if (pendingCount != 0) { + Log.i(TAG, "The connection pool for " + mConfiguration.label + + " has been closed but there are still " + + pendingCount + " connections in use. They will be closed " + + "as they are released back to the pool."); + } + + wakeConnectionWaitersLocked(); + } + } + } + + /** + * Reconfigures the database configuration of the connection pool and all of its + * connections. + * <p> + * Configuration changes are propagated down to connections immediately if + * they are available or as soon as they are released. This includes changes + * that affect the size of the pool. + * </p> + * + * @param configuration The new configuration. + * + * @throws IllegalStateException if the pool has been closed. + */ + public void reconfigure(SQLiteDatabaseConfiguration configuration) { + if (configuration == null) { + throw new IllegalArgumentException("configuration must not be null."); + } + + synchronized (mLock) { + throwIfClosedLocked(); + + final boolean poolSizeChanged = mConfiguration.maxConnectionPoolSize + != configuration.maxConnectionPoolSize; + mConfiguration.updateParametersFrom(configuration); + + if (poolSizeChanged) { + int availableCount = mAvailableNonPrimaryConnections.size(); + while (availableCount-- > mConfiguration.maxConnectionPoolSize - 1) { + SQLiteConnection connection = + mAvailableNonPrimaryConnections.remove(availableCount); + closeConnectionAndLogExceptionsLocked(connection); + } + } + + reconfigureAllConnectionsLocked(); + + wakeConnectionWaitersLocked(); + } + } + + /** + * Acquires a connection from the pool. + * <p> + * The caller must call {@link #releaseConnection} to release the connection + * back to the pool when it is finished. Failure to do so will result + * in much unpleasantness. + * </p> + * + * @param sql If not null, try to find a connection that already has + * the specified SQL statement in its prepared statement cache. + * @param connectionFlags The connection request flags. + * @return The connection that was acquired, never null. + * + * @throws IllegalStateException if the pool has been closed. + * @throws SQLiteException if a database error occurs. + */ + public SQLiteConnection acquireConnection(String sql, int connectionFlags) { + return waitForConnection(sql, connectionFlags); + } + + /** + * Releases a connection back to the pool. + * <p> + * It is ok to call this method after the pool has closed, to release + * connections that were still in use at the time of closure. + * </p> + * + * @param connection The connection to release. Must not be null. + * + * @throws IllegalStateException if the connection was not acquired + * from this pool or if it has already been released. + */ + public void releaseConnection(SQLiteConnection connection) { + synchronized (mLock) { + Boolean mustReconfigure = mAcquiredConnections.remove(connection); + if (mustReconfigure == null) { + throw new IllegalStateException("Cannot perform this operation " + + "because the specified connection was not acquired " + + "from this pool or has already been released."); + } + + if (!mIsOpen) { + closeConnectionAndLogExceptionsLocked(connection); + } else if (connection.isPrimaryConnection()) { + assert mAvailablePrimaryConnection == null; + try { + if (mustReconfigure == Boolean.TRUE) { + connection.reconfigure(mConfiguration); // might throw + } + } catch (RuntimeException ex) { + Log.e(TAG, "Failed to reconfigure released primary connection, closing it: " + + connection, ex); + closeConnectionAndLogExceptionsLocked(connection); + connection = null; + } + if (connection != null) { + mAvailablePrimaryConnection = connection; + } + wakeConnectionWaitersLocked(); + } else if (mAvailableNonPrimaryConnections.size() >= + mConfiguration.maxConnectionPoolSize - 1) { + closeConnectionAndLogExceptionsLocked(connection); + } else { + try { + if (mustReconfigure == Boolean.TRUE) { + connection.reconfigure(mConfiguration); // might throw + } + } catch (RuntimeException ex) { + Log.e(TAG, "Failed to reconfigure released non-primary connection, " + + "closing it: " + connection, ex); + closeConnectionAndLogExceptionsLocked(connection); + connection = null; + } + if (connection != null) { + mAvailableNonPrimaryConnections.add(connection); + } + wakeConnectionWaitersLocked(); + } + } + } + + /** + * Returns true if the session should yield the connection due to + * contention over available database connections. + * + * @param connection The connection owned by the session. + * @param connectionFlags The connection request flags. + * @return True if the session should yield its connection. + * + * @throws IllegalStateException if the connection was not acquired + * from this pool or if it has already been released. + */ + public boolean shouldYieldConnection(SQLiteConnection connection, int connectionFlags) { + synchronized (mLock) { + if (!mAcquiredConnections.containsKey(connection)) { + throw new IllegalStateException("Cannot perform this operation " + + "because the specified connection was not acquired " + + "from this pool or has already been released."); + } + + if (!mIsOpen) { + return false; + } + + return isSessionBlockingImportantConnectionWaitersLocked( + connection.isPrimaryConnection(), connectionFlags); + } + } + + /** + * Collects statistics about database connection memory usage. + * + * @param dbStatsList The list to populate. + */ + public void collectDbStats(ArrayList<DbStats> dbStatsList) { + synchronized (mLock) { + if (mAvailablePrimaryConnection != null) { + mAvailablePrimaryConnection.collectDbStats(dbStatsList); + } + + for (SQLiteConnection connection : mAvailableNonPrimaryConnections) { + connection.collectDbStats(dbStatsList); + } + + for (SQLiteConnection connection : mAcquiredConnections.keySet()) { + connection.collectDbStatsUnsafe(dbStatsList); + } + } + } + + // Might throw. + private SQLiteConnection openConnectionLocked(boolean primaryConnection) { + final int connectionId = mNextConnectionId++; + return SQLiteConnection.open(this, mConfiguration, + connectionId, primaryConnection); // might throw + } + + void onConnectionLeaked() { + // This code is running inside of the SQLiteConnection finalizer. + // + // We don't know whether it is just the connection that has been finalized (and leaked) + // or whether the connection pool has also been or is about to be finalized. + // Consequently, it would be a bad idea to try to grab any locks or to + // do any significant work here. So we do the simplest possible thing and + // set a flag. waitForConnection() periodically checks this flag (when it + // times out) so that it can recover from leaked connections and wake + // itself or other threads up if necessary. + // + // You might still wonder why we don't try to do more to wake up the waiters + // immediately. First, as explained above, it would be hard to do safely + // unless we started an extra Thread to function as a reference queue. Second, + // this is never supposed to happen in normal operation. Third, there is no + // guarantee that the GC will actually detect the leak in a timely manner so + // it's not all that important that we recover from the leak in a timely manner + // either. Fourth, if a badly behaved application finds itself hung waiting for + // several seconds while waiting for a leaked connection to be detected and recreated, + // then perhaps its authors will have added incentive to fix the problem! + + Log.w(TAG, "A SQLiteConnection object for database '" + + mConfiguration.label + "' was leaked! Please fix your application " + + "to end transactions in progress properly and to close the database " + + "when it is no longer needed."); + + mConnectionLeaked.set(true); + } + + // Can't throw. + private void closeConnectionAndLogExceptionsLocked(SQLiteConnection connection) { + try { + connection.close(); // might throw + } catch (RuntimeException ex) { + Log.e(TAG, "Failed to close connection, its fate is now in the hands " + + "of the merciful GC: " + connection, ex); + } + } + + // Can't throw. + private void reconfigureAllConnectionsLocked() { + boolean wake = false; + if (mAvailablePrimaryConnection != null) { + try { + mAvailablePrimaryConnection.reconfigure(mConfiguration); // might throw + } catch (RuntimeException ex) { + Log.e(TAG, "Failed to reconfigure available primary connection, closing it: " + + mAvailablePrimaryConnection, ex); + closeConnectionAndLogExceptionsLocked(mAvailablePrimaryConnection); + mAvailablePrimaryConnection = null; + wake = true; + } + } + + int count = mAvailableNonPrimaryConnections.size(); + for (int i = 0; i < count; i++) { + final SQLiteConnection connection = mAvailableNonPrimaryConnections.get(i); + try { + connection.reconfigure(mConfiguration); // might throw + } catch (RuntimeException ex) { + Log.e(TAG, "Failed to reconfigure available non-primary connection, closing it: " + + connection, ex); + closeConnectionAndLogExceptionsLocked(connection); + mAvailableNonPrimaryConnections.remove(i--); + count -= 1; + wake = true; + } + } + + if (!mAcquiredConnections.isEmpty()) { + ArrayList<SQLiteConnection> keysToUpdate = new ArrayList<SQLiteConnection>( + mAcquiredConnections.size()); + for (Map.Entry<SQLiteConnection, Boolean> entry : mAcquiredConnections.entrySet()) { + if (entry.getValue() != Boolean.TRUE) { + keysToUpdate.add(entry.getKey()); + } + } + final int updateCount = keysToUpdate.size(); + for (int i = 0; i < updateCount; i++) { + mAcquiredConnections.put(keysToUpdate.get(i), Boolean.TRUE); + } + } + + if (wake) { + wakeConnectionWaitersLocked(); + } + } + + // Might throw. + private SQLiteConnection waitForConnection(String sql, int connectionFlags) { + final boolean wantPrimaryConnection = + (connectionFlags & CONNECTION_FLAG_PRIMARY_CONNECTION_AFFINITY) != 0; + + final ConnectionWaiter waiter; + synchronized (mLock) { + throwIfClosedLocked(); + + // Try to acquire a connection. + SQLiteConnection connection = null; + if (!wantPrimaryConnection) { + connection = tryAcquireNonPrimaryConnectionLocked( + sql, connectionFlags); // might throw + } + if (connection == null) { + connection = tryAcquirePrimaryConnectionLocked(connectionFlags); // might throw + } + if (connection != null) { + return connection; + } + + // No connections available. Enqueue a waiter in priority order. + final int priority = getPriority(connectionFlags); + final long startTime = SystemClock.uptimeMillis(); + waiter = obtainConnectionWaiterLocked(Thread.currentThread(), startTime, + priority, wantPrimaryConnection, sql, connectionFlags); + ConnectionWaiter predecessor = null; + ConnectionWaiter successor = mConnectionWaiterQueue; + while (successor != null) { + if (priority > successor.mPriority) { + waiter.mNext = successor; + break; + } + predecessor = successor; + successor = successor.mNext; + } + if (predecessor != null) { + predecessor.mNext = waiter; + } else { + mConnectionWaiterQueue = waiter; + } + } + + // Park the thread until a connection is assigned or the pool is closed. + // Rethrow an exception from the wait, if we got one. + long busyTimeoutMillis = CONNECTION_POOL_BUSY_MILLIS; + long nextBusyTimeoutTime = waiter.mStartTime + busyTimeoutMillis; + for (;;) { + // Detect and recover from connection leaks. + if (mConnectionLeaked.compareAndSet(true, false)) { + wakeConnectionWaitersLocked(); + } + + // Wait to be unparked (may already have happened), a timeout, or interruption. + LockSupport.parkNanos(this, busyTimeoutMillis * 1000000L); + + // Clear the interrupted flag, just in case. + Thread.interrupted(); + + // Check whether we are done waiting yet. + synchronized (mLock) { + throwIfClosedLocked(); + + SQLiteConnection connection = waiter.mAssignedConnection; + if (connection != null) { + recycleConnectionWaiterLocked(waiter); + return connection; + } + + RuntimeException ex = waiter.mException; + if (ex != null) { + recycleConnectionWaiterLocked(waiter); + throw ex; // rethrow! + } + + final long now = SystemClock.uptimeMillis(); + if (now < nextBusyTimeoutTime) { + busyTimeoutMillis = now - nextBusyTimeoutTime; + } else { + logConnectionPoolBusyLocked(now - waiter.mStartTime, connectionFlags); + busyTimeoutMillis = CONNECTION_POOL_BUSY_MILLIS; + nextBusyTimeoutTime = now + busyTimeoutMillis; + } + } + } + } + + // Can't throw. + private void logConnectionPoolBusyLocked(long waitMillis, int connectionFlags) { + final Thread thread = Thread.currentThread(); + StringBuilder msg = new StringBuilder(); + msg.append("The connection pool for database '").append(mConfiguration.label); + msg.append("' has been unable to grant a connection to thread "); + msg.append(thread.getId()).append(" (").append(thread.getName()).append(") "); + msg.append("with flags 0x").append(Integer.toHexString(connectionFlags)); + msg.append(" for ").append(waitMillis * 0.001f).append(" seconds.\n"); + + ArrayList<String> requests = new ArrayList<String>(); + int activeConnections = 0; + int idleConnections = 0; + if (!mAcquiredConnections.isEmpty()) { + for (Map.Entry<SQLiteConnection, Boolean> entry : mAcquiredConnections.entrySet()) { + final SQLiteConnection connection = entry.getKey(); + String description = connection.describeCurrentOperationUnsafe(); + if (description != null) { + requests.add(description); + activeConnections += 1; + } else { + idleConnections += 1; + } + } + } + int availableConnections = mAvailableNonPrimaryConnections.size(); + if (mAvailablePrimaryConnection != null) { + availableConnections += 1; + } + + msg.append("Connections: ").append(activeConnections).append(" active, "); + msg.append(idleConnections).append(" idle, "); + msg.append(availableConnections).append(" available.\n"); + + if (!requests.isEmpty()) { + msg.append("\nRequests in progress:\n"); + for (String request : requests) { + msg.append(" ").append(request).append("\n"); + } + } + + Log.w(TAG, msg.toString()); + } + + // Can't throw. + private void wakeConnectionWaitersLocked() { + // Unpark all waiters that have requests that we can fulfill. + // This method is designed to not throw runtime exceptions, although we might send + // a waiter an exception for it to rethrow. + ConnectionWaiter predecessor = null; + ConnectionWaiter waiter = mConnectionWaiterQueue; + boolean primaryConnectionNotAvailable = false; + boolean nonPrimaryConnectionNotAvailable = false; + while (waiter != null) { + boolean unpark = false; + if (!mIsOpen) { + unpark = true; + } else { + try { + SQLiteConnection connection = null; + if (!waiter.mWantPrimaryConnection && !nonPrimaryConnectionNotAvailable) { + connection = tryAcquireNonPrimaryConnectionLocked( + waiter.mSql, waiter.mConnectionFlags); // might throw + if (connection == null) { + nonPrimaryConnectionNotAvailable = true; + } + } + if (connection == null && !primaryConnectionNotAvailable) { + connection = tryAcquirePrimaryConnectionLocked( + waiter.mConnectionFlags); // might throw + if (connection == null) { + primaryConnectionNotAvailable = true; + } + } + if (connection != null) { + waiter.mAssignedConnection = connection; + unpark = true; + } else if (nonPrimaryConnectionNotAvailable && primaryConnectionNotAvailable) { + // There are no connections available and the pool is still open. + // We cannot fulfill any more connection requests, so stop here. + break; + } + } catch (RuntimeException ex) { + // Let the waiter handle the exception from acquiring a connection. + waiter.mException = ex; + unpark = true; + } + } + + final ConnectionWaiter successor = waiter.mNext; + if (unpark) { + if (predecessor != null) { + predecessor.mNext = successor; + } else { + mConnectionWaiterQueue = successor; + } + waiter.mNext = null; + + LockSupport.unpark(waiter.mThread); + } else { + predecessor = waiter; + } + waiter = successor; + } + } + + // Might throw. + private SQLiteConnection tryAcquirePrimaryConnectionLocked(int connectionFlags) { + // If the primary connection is available, acquire it now. + SQLiteConnection connection = mAvailablePrimaryConnection; + if (connection != null) { + mAvailablePrimaryConnection = null; + finishAcquireConnectionLocked(connection, connectionFlags); // might throw + return connection; + } + + // Make sure that the primary connection actually exists and has just been acquired. + for (SQLiteConnection acquiredConnection : mAcquiredConnections.keySet()) { + if (acquiredConnection.isPrimaryConnection()) { + return null; + } + } + + // Uhoh. No primary connection! Either this is the first time we asked + // for it, or maybe it leaked? + connection = openConnectionLocked(true /*primaryConnection*/); // might throw + finishAcquireConnectionLocked(connection, connectionFlags); // might throw + return connection; + } + + // Might throw. + private SQLiteConnection tryAcquireNonPrimaryConnectionLocked( + String sql, int connectionFlags) { + // Try to acquire the next connection in the queue. + SQLiteConnection connection; + final int availableCount = mAvailableNonPrimaryConnections.size(); + if (availableCount > 1 && sql != null) { + // If we have a choice, then prefer a connection that has the + // prepared statement in its cache. + for (int i = 0; i < availableCount; i++) { + connection = mAvailableNonPrimaryConnections.get(i); + if (connection.isPreparedStatementInCache(sql)) { + mAvailableNonPrimaryConnections.remove(i); + finishAcquireConnectionLocked(connection, connectionFlags); // might throw + return connection; + } + } + } + if (availableCount > 0) { + // Otherwise, just grab the next one. + connection = mAvailableNonPrimaryConnections.remove(availableCount - 1); + finishAcquireConnectionLocked(connection, connectionFlags); // might throw + return connection; + } + + // Expand the pool if needed. + int openConnections = mAcquiredConnections.size(); + if (mAvailablePrimaryConnection != null) { + openConnections += 1; + } + if (openConnections >= mConfiguration.maxConnectionPoolSize) { + return null; + } + connection = openConnectionLocked(false /*primaryConnection*/); // might throw + finishAcquireConnectionLocked(connection, connectionFlags); // might throw + return connection; + } + + // Might throw. + private void finishAcquireConnectionLocked(SQLiteConnection connection, int connectionFlags) { + try { + final boolean readOnly = (connectionFlags & CONNECTION_FLAG_READ_ONLY) != 0; + connection.setOnlyAllowReadOnlyOperations(readOnly); + + mAcquiredConnections.put(connection, Boolean.FALSE); + } catch (RuntimeException ex) { + Log.e(TAG, "Failed to prepare acquired connection for session, closing it: " + + connection +", connectionFlags=" + connectionFlags); + closeConnectionAndLogExceptionsLocked(connection); + throw ex; // rethrow! + } + } + + private boolean isSessionBlockingImportantConnectionWaitersLocked( + boolean holdingPrimaryConnection, int connectionFlags) { + ConnectionWaiter waiter = mConnectionWaiterQueue; + if (waiter != null) { + final int priority = getPriority(connectionFlags); + do { + // Only worry about blocked connections that have same or lower priority. + if (priority > waiter.mPriority) { + break; + } + + // If we are holding the primary connection then we are blocking the waiter. + // Likewise, if we are holding a non-primary connection and the waiter + // would accept a non-primary connection, then we are blocking the waier. + if (holdingPrimaryConnection || !waiter.mWantPrimaryConnection) { + return true; + } + + waiter = waiter.mNext; + } while (waiter != null); + } + return false; + } + + private static int getPriority(int connectionFlags) { + return (connectionFlags & CONNECTION_FLAG_INTERACTIVE) != 0 ? 1 : 0; + } + + private void throwIfClosedLocked() { + if (!mIsOpen) { + throw new IllegalStateException("Cannot perform this operation " + + "because the connection pool have been closed."); + } + } + + private ConnectionWaiter obtainConnectionWaiterLocked(Thread thread, long startTime, + int priority, boolean wantPrimaryConnection, String sql, int connectionFlags) { + ConnectionWaiter waiter = mConnectionWaiterPool; + if (waiter != null) { + mConnectionWaiterPool = waiter.mNext; + waiter.mNext = null; + } else { + waiter = new ConnectionWaiter(); + } + waiter.mThread = thread; + waiter.mStartTime = startTime; + waiter.mPriority = priority; + waiter.mWantPrimaryConnection = wantPrimaryConnection; + waiter.mSql = sql; + waiter.mConnectionFlags = connectionFlags; + return waiter; + } + + private void recycleConnectionWaiterLocked(ConnectionWaiter waiter) { + waiter.mNext = mConnectionWaiterPool; + waiter.mThread = null; + waiter.mSql = null; + waiter.mAssignedConnection = null; + waiter.mException = null; + mConnectionWaiterPool = waiter; + } + + /** + * Dumps debugging information about this connection pool. + * + * @param printer The printer to receive the dump, not null. + */ + public void dump(Printer printer) { + Printer indentedPrinter = PrefixPrinter.create(printer, " "); + synchronized (mLock) { + printer.println("Connection pool for " + mConfiguration.path + ":"); + printer.println(" Open: " + mIsOpen); + printer.println(" Max connections: " + mConfiguration.maxConnectionPoolSize); + + printer.println(" Available primary connection:"); + if (mAvailablePrimaryConnection != null) { + mAvailablePrimaryConnection.dump(indentedPrinter); + } else { + indentedPrinter.println("<none>"); + } + + printer.println(" Available non-primary connections:"); + if (!mAvailableNonPrimaryConnections.isEmpty()) { + final int count = mAvailableNonPrimaryConnections.size(); + for (int i = 0; i < count; i++) { + mAvailableNonPrimaryConnections.get(i).dump(indentedPrinter); + } + } else { + indentedPrinter.println("<none>"); + } + + printer.println(" Acquired connections:"); + if (!mAcquiredConnections.isEmpty()) { + for (Map.Entry<SQLiteConnection, Boolean> entry : + mAcquiredConnections.entrySet()) { + final SQLiteConnection connection = entry.getKey(); + connection.dumpUnsafe(indentedPrinter); + indentedPrinter.println(" Pending reconfiguration: " + entry.getValue()); + } + } else { + indentedPrinter.println("<none>"); + } + + printer.println(" Connection waiters:"); + if (mConnectionWaiterQueue != null) { + int i = 0; + final long now = SystemClock.uptimeMillis(); + for (ConnectionWaiter waiter = mConnectionWaiterQueue; waiter != null; + waiter = waiter.mNext, i++) { + indentedPrinter.println(i + ": waited for " + + ((now - waiter.mStartTime) * 0.001f) + + " ms - thread=" + waiter.mThread + + ", priority=" + waiter.mPriority + + ", sql='" + waiter.mSql + "'"); + } + } else { + indentedPrinter.println("<none>"); + } + } + } + + @Override + public String toString() { + return "SQLiteConnectionPool: " + mConfiguration.path; + } + + private static final class ConnectionWaiter { + public ConnectionWaiter mNext; + public Thread mThread; + public long mStartTime; + public int mPriority; + public boolean mWantPrimaryConnection; + public String mSql; + public int mConnectionFlags; + public SQLiteConnection mAssignedConnection; + public RuntimeException mException; + } +} diff --git a/core/java/android/database/sqlite/SQLiteCursor.java b/core/java/android/database/sqlite/SQLiteCursor.java index 8dcedf2fdd05..9dcb498c9ebe 100644 --- a/core/java/android/database/sqlite/SQLiteCursor.java +++ b/core/java/android/database/sqlite/SQLiteCursor.java @@ -43,7 +43,7 @@ public class SQLiteCursor extends AbstractWindowedCursor { private final String[] mColumns; /** The query object for the cursor */ - private SQLiteQuery mQuery; + private final SQLiteQuery mQuery; /** The compiled query this cursor came from */ private final SQLiteCursorDriver mDriver; @@ -96,9 +96,6 @@ public class SQLiteCursor extends AbstractWindowedCursor { if (query == null) { throw new IllegalArgumentException("query object cannot be null"); } - if (query.mDatabase == null) { - throw new IllegalArgumentException("query.mDatabase cannot be null"); - } if (StrictMode.vmSqliteObjectLeaksEnabled()) { mStackTrace = new DatabaseObjectNotClosedException().fillInStackTrace(); } else { @@ -109,38 +106,21 @@ public class SQLiteCursor extends AbstractWindowedCursor { mColumnNameMap = null; mQuery = query; - query.mDatabase.lock(query.mSql); - try { - // Setup the list of columns - int columnCount = mQuery.columnCountLocked(); - mColumns = new String[columnCount]; - - // Read in all column names - for (int i = 0; i < columnCount; i++) { - String columnName = mQuery.columnNameLocked(i); - mColumns[i] = columnName; - if (false) { - Log.v("DatabaseWindow", "mColumns[" + i + "] is " - + mColumns[i]); - } - - // Make note of the row ID column index for quick access to it - if ("_id".equals(columnName)) { - mRowIdColumnIndex = i; - } + mColumns = query.getColumnNames(); + for (int i = 0; i < mColumns.length; i++) { + // Make note of the row ID column index for quick access to it + if ("_id".equals(mColumns[i])) { + mRowIdColumnIndex = i; } - } finally { - query.mDatabase.unlock(); } } /** + * Get the database that this cursor is associated with. * @return the SQLiteDatabase that this cursor is associated with. */ public SQLiteDatabase getDatabase() { - synchronized (this) { - return mQuery.mDatabase; - } + return mQuery.getDatabase(); } @Override @@ -167,7 +147,7 @@ public class SQLiteCursor extends AbstractWindowedCursor { if (mCount == NO_COUNT) { int startPos = DatabaseUtils.cursorPickFillWindowStartPosition(requiredPos, 0); - mCount = getQuery().fillWindow(mWindow, startPos, requiredPos, true); + mCount = mQuery.fillWindow(mWindow, startPos, requiredPos, true); mCursorWindowCapacity = mWindow.getNumRows(); if (Log.isLoggable(TAG, Log.DEBUG)) { Log.d(TAG, "received count(*) from native_fill_window: " + mCount); @@ -175,14 +155,10 @@ public class SQLiteCursor extends AbstractWindowedCursor { } else { int startPos = DatabaseUtils.cursorPickFillWindowStartPosition(requiredPos, mCursorWindowCapacity); - getQuery().fillWindow(mWindow, startPos, requiredPos, false); + mQuery.fillWindow(mWindow, startPos, requiredPos, false); } } - private synchronized SQLiteQuery getQuery() { - return mQuery; - } - @Override public int getColumnIndex(String columnName) { // Create mColumnNameMap on demand @@ -237,75 +213,28 @@ public class SQLiteCursor extends AbstractWindowedCursor { if (isClosed()) { return false; } - long timeStart = 0; - if (false) { - timeStart = System.currentTimeMillis(); - } synchronized (this) { + if (!mQuery.getDatabase().isOpen()) { + return false; + } + if (mWindow != null) { mWindow.clear(); } mPos = -1; - SQLiteDatabase db = null; - try { - db = mQuery.mDatabase.getDatabaseHandle(mQuery.mSql); - } catch (IllegalStateException e) { - // for backwards compatibility, just return false - Log.w(TAG, "requery() failed " + e.getMessage(), e); - return false; - } - if (!db.equals(mQuery.mDatabase)) { - // since we need to use a different database connection handle, - // re-compile the query - try { - db.lock(mQuery.mSql); - } catch (IllegalStateException e) { - // for backwards compatibility, just return false - Log.w(TAG, "requery() failed " + e.getMessage(), e); - return false; - } - try { - // close the old mQuery object and open a new one - mQuery.close(); - mQuery = new SQLiteQuery(db, mQuery); - } catch (IllegalStateException e) { - // for backwards compatibility, just return false - Log.w(TAG, "requery() failed " + e.getMessage(), e); - return false; - } finally { - db.unlock(); - } - } - // This one will recreate the temp table, and get its count - mDriver.cursorRequeried(this); mCount = NO_COUNT; - try { - mQuery.requery(); - } catch (IllegalStateException e) { - // for backwards compatibility, just return false - Log.w(TAG, "requery() failed " + e.getMessage(), e); - return false; - } - } - if (false) { - Log.v("DatabaseWindow", "closing window in requery()"); - Log.v(TAG, "--- Requery()ed cursor " + this + ": " + mQuery); + mDriver.cursorRequeried(this); } - boolean result = false; try { - result = super.requery(); + return super.requery(); } catch (IllegalStateException e) { // for backwards compatibility, just return false Log.w(TAG, "requery() failed " + e.getMessage(), e); + return false; } - if (false) { - long timeEnd = System.currentTimeMillis(); - Log.v(TAG, "requery (" + (timeEnd - timeStart) + " ms): " + mDriver.toString()); - } - return result; } @Override @@ -330,20 +259,17 @@ public class SQLiteCursor extends AbstractWindowedCursor { // if the cursor hasn't been closed yet, close it first if (mWindow != null) { if (mStackTrace != null) { - int len = mQuery.mSql.length(); + String sql = mQuery.getSql(); + int len = sql.length(); StrictMode.onSqliteObjectLeaked( "Finalizing a Cursor that has not been deactivated or closed. " + - "database = " + mQuery.mDatabase.getPath() + ", table = " + mEditTable + - ", query = " + mQuery.mSql.substring(0, (len > 1000) ? 1000 : len), + "database = " + mQuery.getDatabase().getLabel() + + ", table = " + mEditTable + + ", query = " + sql.substring(0, (len > 1000) ? 1000 : len), mStackTrace); } close(); SQLiteDebug.notifyActiveCursorFinalized(); - } else { - if (false) { - Log.v(TAG, "Finalizing cursor on database = " + mQuery.mDatabase.getPath() + - ", table = " + mEditTable + ", query = " + mQuery.mSql); - } } } finally { super.finalize(); diff --git a/core/java/android/database/sqlite/SQLiteCursorDriver.java b/core/java/android/database/sqlite/SQLiteCursorDriver.java index b3963f9bcb1e..ad2cdd227f60 100644 --- a/core/java/android/database/sqlite/SQLiteCursorDriver.java +++ b/core/java/android/database/sqlite/SQLiteCursorDriver.java @@ -39,7 +39,7 @@ public interface SQLiteCursorDriver { void cursorDeactivated(); /** - * Called by a SQLiteCursor when it is requeryed. + * Called by a SQLiteCursor when it is requeried. */ void cursorRequeried(Cursor cursor); diff --git a/core/java/android/database/sqlite/SQLiteCustomFunction.java b/core/java/android/database/sqlite/SQLiteCustomFunction.java new file mode 100644 index 000000000000..02f3284b4258 --- /dev/null +++ b/core/java/android/database/sqlite/SQLiteCustomFunction.java @@ -0,0 +1,53 @@ +/* + * 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.database.sqlite; + +/** + * Describes a custom SQL function. + * + * @hide + */ +public final class SQLiteCustomFunction { + public final String name; + public final int numArgs; + public final SQLiteDatabase.CustomFunction callback; + + /** + * Create custom function. + * + * @param name The name of the sqlite3 function. + * @param numArgs The number of arguments for the function, or -1 to + * support any number of arguments. + * @param callback The callback to invoke when the function is executed. + */ + public SQLiteCustomFunction(String name, int numArgs, + SQLiteDatabase.CustomFunction callback) { + if (name == null) { + throw new IllegalArgumentException("name must not be null."); + } + + this.name = name; + this.numArgs = numArgs; + this.callback = callback; + } + + // Called from native. + @SuppressWarnings("unused") + private void dispatchCallback(String[] args) { + callback.callback(args); + } +} diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java index f990be60809d..377a680cf5e1 100644 --- a/core/java/android/database/sqlite/SQLiteDatabase.java +++ b/core/java/android/database/sqlite/SQLiteDatabase.java @@ -16,7 +16,6 @@ package android.database.sqlite; -import android.app.AppGlobals; import android.content.ContentValues; import android.content.res.Resources; import android.database.Cursor; @@ -25,61 +24,117 @@ import android.database.DatabaseUtils; import android.database.DefaultDatabaseErrorHandler; import android.database.SQLException; import android.database.sqlite.SQLiteDebug.DbStats; -import android.os.Debug; -import android.os.StatFs; -import android.os.SystemClock; -import android.os.SystemProperties; +import android.os.Looper; import android.text.TextUtils; import android.util.EventLog; import android.util.Log; -import android.util.LruCache; import android.util.Pair; -import dalvik.system.BlockGuard; +import android.util.Printer; + +import dalvik.system.CloseGuard; + import java.io.File; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Random; import java.util.WeakHashMap; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.ReentrantLock; -import java.util.regex.Pattern; /** * Exposes methods to manage a SQLite database. - * <p>SQLiteDatabase has methods to create, delete, execute SQL commands, and + * + * <p> + * SQLiteDatabase has methods to create, delete, execute SQL commands, and * perform other common database management tasks. - * <p>See the Notepad sample application in the SDK for an example of creating + * </p><p> + * See the Notepad sample application in the SDK for an example of creating * and managing a database. - * <p> Database names must be unique within an application, not across all - * applications. + * </p><p> + * Database names must be unique within an application, not across all applications. + * </p> * * <h3>Localized Collation - ORDER BY</h3> - * <p>In addition to SQLite's default <code>BINARY</code> collator, Android supplies - * two more, <code>LOCALIZED</code>, which changes with the system's current locale - * if you wire it up correctly (XXX a link needed!), and <code>UNICODE</code>, which - * is the Unicode Collation Algorithm and not tailored to the current locale. + * <p> + * In addition to SQLite's default <code>BINARY</code> collator, Android supplies + * two more, <code>LOCALIZED</code>, which changes with the system's current locale, + * and <code>UNICODE</code>, which is the Unicode Collation Algorithm and not tailored + * to the current locale. + * </p> */ public class SQLiteDatabase extends SQLiteClosable { private static final String TAG = "SQLiteDatabase"; - private static final boolean ENABLE_DB_SAMPLE = false; // true to enable stats in event log - private static final int EVENT_DB_OPERATION = 52000; + private static final int EVENT_DB_CORRUPT = 75004; - /** - * Algorithms used in ON CONFLICT clause - * http://www.sqlite.org/lang_conflict.html - */ - /** - * When a constraint violation occurs, an immediate ROLLBACK occurs, + // Stores reference to all databases opened in the current process. + // (The referent Object is not used at this time.) + // INVARIANT: Guarded by sActiveDatabases. + private static WeakHashMap<SQLiteDatabase, Object> sActiveDatabases = + new WeakHashMap<SQLiteDatabase, Object>(); + + // Thread-local for database sessions that belong to this database. + // Each thread has its own database session. + // INVARIANT: Immutable. + private final ThreadLocal<SQLiteSession> mThreadSession = new ThreadLocal<SQLiteSession>() { + @Override + protected SQLiteSession initialValue() { + return createSession(); + } + }; + + // The optional factory to use when creating new Cursors. May be null. + // INVARIANT: Immutable. + private final CursorFactory mCursorFactory; + + // Error handler to be used when SQLite returns corruption errors. + // INVARIANT: Immutable. + private final DatabaseErrorHandler mErrorHandler; + + // Shared database state lock. + // This lock guards all of the shared state of the database, such as its + // configuration, whether it is open or closed, and so on. This lock should + // be held for as little time as possible. + // + // The lock MUST NOT be held while attempting to acquire database connections or + // while executing SQL statements on behalf of the client as it can lead to deadlock. + // + // It is ok to hold the lock while reconfiguring the connection pool or dumping + // statistics because those operations are non-reentrant and do not try to acquire + // connections that might be held by other threads. + // + // Basic rule: grab the lock, access or modify global state, release the lock, then + // do the required SQL work. + private final Object mLock = new Object(); + + // Warns if the database is finalized without being closed properly. + // INVARIANT: Guarded by mLock. + private final CloseGuard mCloseGuardLocked = CloseGuard.get(); + + // The database configuration. + // INVARIANT: Guarded by mLock. + private final SQLiteDatabaseConfiguration mConfigurationLocked; + + // The connection pool for the database, null when closed. + // The pool itself is thread-safe, but the reference to it can only be acquired + // when the lock is held. + // INVARIANT: Guarded by mLock. + private SQLiteConnectionPool mConnectionPoolLocked; + + // True if the database has attached databases. + // INVARIANT: Guarded by mLock. + private boolean mHasAttachedDbsLocked; + + // True if the database is in WAL mode. + // INVARIANT: Guarded by mLock. + private boolean mIsWALEnabledLocked; + + /** + * When a constraint violation occurs, an immediate ROLLBACK occurs, * thus ending the current transaction, and the command aborts with a * return code of SQLITE_CONSTRAINT. If no transaction is active * (other than the implied transaction that is created on every command) - * then this algorithm works the same as ABORT. + * then this algorithm works the same as ABORT. */ public static final int CONFLICT_ROLLBACK = 1; @@ -118,14 +173,15 @@ public class SQLiteDatabase extends SQLiteClosable { * violation occurs then the IGNORE algorithm is used. When this conflict * resolution strategy deletes rows in order to satisfy a constraint, * it does not invoke delete triggers on those rows. - * This behavior might change in a future release. + * This behavior might change in a future release. */ public static final int CONFLICT_REPLACE = 5; /** - * use the following when no conflict action is specified. + * Use the following when no conflict action is specified. */ public static final int CONFLICT_NONE = 0; + private static final String[] CONFLICT_VALUES = new String[] {"", " OR ROLLBACK ", " OR ABORT ", " OR FAIL ", " OR IGNORE ", " OR REPLACE "}; @@ -146,7 +202,7 @@ public class SQLiteDatabase extends SQLiteClosable { public static final int SQLITE_MAX_LIKE_PATTERN_LENGTH = 50000; /** - * Flag for {@link #openDatabase} to open the database for reading and writing. + * Open flag: Flag for {@link #openDatabase} to open the database for reading and writing. * If the disk is full, this may fail even before you actually write anything. * * {@more} Note that the value of this flag is 0, so it is the default. @@ -154,7 +210,7 @@ public class SQLiteDatabase extends SQLiteClosable { public static final int OPEN_READWRITE = 0x00000000; // update native code if changing /** - * Flag for {@link #openDatabase} to open the database for reading only. + * Open flag: Flag for {@link #openDatabase} to open the database for reading only. * This is the only reliable way to open a database if the disk may be full. */ public static final int OPEN_READONLY = 0x00000001; // update native code if changing @@ -162,7 +218,8 @@ public class SQLiteDatabase extends SQLiteClosable { private static final int OPEN_READ_MASK = 0x00000001; // update native code if changing /** - * Flag for {@link #openDatabase} to open the database without support for localized collators. + * Open flag: Flag for {@link #openDatabase} to open the database without support for + * localized collators. * * {@more} This causes the collator <code>LOCALIZED</code> not to be created. * You must be consistent when using this flag to use the setting the database was @@ -171,190 +228,62 @@ public class SQLiteDatabase extends SQLiteClosable { public static final int NO_LOCALIZED_COLLATORS = 0x00000010; // update native code if changing /** - * Flag for {@link #openDatabase} to create the database file if it does not already exist. + * Open flag: Flag for {@link #openDatabase} to create the database file if it does not + * already exist. */ public static final int CREATE_IF_NECESSARY = 0x10000000; // update native code if changing /** - * Indicates whether the most-recently started transaction has been marked as successful. - */ - private boolean mInnerTransactionIsSuccessful; - - /** - * Valid during the life of a transaction, and indicates whether the entire transaction (the - * outer one and all of the inner ones) so far has been successful. - */ - private boolean mTransactionIsSuccessful; - - /** - * Valid during the life of a transaction. - */ - private SQLiteTransactionListener mTransactionListener; - - /** - * this member is set if {@link #execSQL(String)} is used to begin and end transactions. - */ - private boolean mTransactionUsingExecSql; - - /** Synchronize on this when accessing the database */ - private final DatabaseReentrantLock mLock = new DatabaseReentrantLock(true); - - private long mLockAcquiredWallTime = 0L; - private long mLockAcquiredThreadTime = 0L; - - // limit the frequency of complaints about each database to one within 20 sec - // unless run command adb shell setprop log.tag.Database VERBOSE - private static final int LOCK_WARNING_WINDOW_IN_MS = 20000; - /** If the lock is held this long then a warning will be printed when it is released. */ - private static final int LOCK_ACQUIRED_WARNING_TIME_IN_MS = 300; - private static final int LOCK_ACQUIRED_WARNING_THREAD_TIME_IN_MS = 100; - private static final int LOCK_ACQUIRED_WARNING_TIME_IN_MS_ALWAYS_PRINT = 2000; - - private static final int SLEEP_AFTER_YIELD_QUANTUM = 1000; - - // The pattern we remove from database filenames before - // potentially logging them. - private static final Pattern EMAIL_IN_DB_PATTERN = Pattern.compile("[\\w\\.\\-]+@[\\w\\.\\-]+"); - - private long mLastLockMessageTime = 0L; - - // Things related to query logging/sampling for debugging - // slow/frequent queries during development. Always log queries - // which take (by default) 500ms+; shorter queries are sampled - // accordingly. Commit statements, which are typically slow, are - // logged together with the most recently executed SQL statement, - // for disambiguation. The 500ms value is configurable via a - // SystemProperty, but developers actively debugging database I/O - // should probably use the regular log tunable, - // LOG_SLOW_QUERIES_PROPERTY, defined below. - private static int sQueryLogTimeInMillis = 0; // lazily initialized - private static final int QUERY_LOG_SQL_LENGTH = 64; - private static final String COMMIT_SQL = "COMMIT;"; - private static final String BEGIN_SQL = "BEGIN;"; - private final Random mRandom = new Random(); - /** the last non-commit/rollback sql statement in a transaction */ - // guarded by 'this' - private String mLastSqlStatement = null; - - synchronized String getLastSqlStatement() { - return mLastSqlStatement; - } - - synchronized void setLastSqlStatement(String sql) { - mLastSqlStatement = sql; - } - - /** guarded by {@link #mLock} */ - private long mTransStartTime; - - // String prefix for slow database query EventLog records that show - // lock acquistions of the database. - /* package */ static final String GET_LOCK_LOG_PREFIX = "GETLOCK:"; - - /** Used by native code, do not rename. make it volatile, so it is thread-safe. */ - /* package */ volatile int mNativeHandle = 0; - - /** - * The size, in bytes, of a block on "/data". This corresponds to the Unix - * statfs.f_bsize field. note that this field is lazily initialized. - */ - private static int sBlockSize = 0; - - /** The path for the database file */ - private final String mPath; - - /** The anonymized path for the database file for logging purposes */ - private String mPathForLogs = null; // lazily populated - - /** The flags passed to open/create */ - private final int mFlags; - - /** The optional factory to use when creating new Cursors */ - private final CursorFactory mFactory; - - private final WeakHashMap<SQLiteClosable, Object> mPrograms; - - /** Default statement-cache size per database connection ( = instance of this class) */ - private static final int DEFAULT_SQL_CACHE_SIZE = 25; - - /** - * for each instance of this class, a LRU cache is maintained to store - * the compiled query statement ids returned by sqlite database. - * key = SQL statement with "?" for bind args - * value = {@link SQLiteCompiledSql} - * If an application opens the database and keeps it open during its entire life, then - * there will not be an overhead of compilation of SQL statements by sqlite. + * Absolute max value that can be set by {@link #setMaxSqlCacheSize(int)}. * - * why is this cache NOT static? because sqlite attaches compiledsql statements to the - * struct created when {@link SQLiteDatabase#openDatabase(String, CursorFactory, int)} is - * invoked. - * - * this cache's max size is settable by calling the method - * (@link #setMaxSqlCacheSize(int)}. - */ - // guarded by this - private LruCache<String, SQLiteCompiledSql> mCompiledQueries; - - /** - * absolute max value that can be set by {@link #setMaxSqlCacheSize(int)} - * size of each prepared-statement is between 1K - 6K, depending on the complexity of the - * SQL statement & schema. + * Each prepared-statement is between 1K - 6K, depending on the complexity of the + * SQL statement & schema. A large SQL cache may use a significant amount of memory. */ public static final int MAX_SQL_CACHE_SIZE = 100; - private boolean mCacheFullWarning; - - /** Used to find out where this object was created in case it never got closed. */ - private final Throwable mStackTrace; - - /** stores the list of statement ids that need to be finalized by sqlite */ - private final ArrayList<Integer> mClosedStatementIds = new ArrayList<Integer>(); - - /** {@link DatabaseErrorHandler} to be used when SQLite returns any of the following errors - * Corruption - * */ - private final DatabaseErrorHandler mErrorHandler; - - /** The Database connection pool {@link DatabaseConnectionPool}. - * Visibility is package-private for testing purposes. otherwise, private visibility is enough. - */ - /* package */ volatile DatabaseConnectionPool mConnectionPool = null; - - /** Each database connection handle in the pool is assigned a number 1..N, where N is the - * size of the connection pool. - * The main connection handle to which the pool is attached is assigned a value of 0. - */ - /* package */ final short mConnectionNum; - - /** on pooled database connections, this member points to the parent ( = main) - * database connection handle. - * package visibility only for testing purposes - */ - /* package */ SQLiteDatabase mParentConnObj = null; - - private static final String MEMORY_DB_PATH = ":memory:"; - /** set to true if the database has attached databases */ - private volatile boolean mHasAttachedDbs = false; - - /** stores reference to all databases opened in the current process. */ - private static ArrayList<WeakReference<SQLiteDatabase>> mActiveDatabases = - new ArrayList<WeakReference<SQLiteDatabase>>(); - - synchronized void addSQLiteClosable(SQLiteClosable closable) { - // mPrograms is per instance of SQLiteDatabase and it doesn't actually touch the database - // itself. so, there is no need to lock(). - mPrograms.put(closable, null); + private SQLiteDatabase(String path, int openFlags, CursorFactory cursorFactory, + DatabaseErrorHandler errorHandler) { + mCursorFactory = cursorFactory; + mErrorHandler = errorHandler != null ? errorHandler : new DefaultDatabaseErrorHandler(); + mConfigurationLocked = new SQLiteDatabaseConfiguration(path, openFlags); } - synchronized void removeSQLiteClosable(SQLiteClosable closable) { - mPrograms.remove(closable); + @Override + protected void finalize() throws Throwable { + try { + dispose(true); + } finally { + super.finalize(); + } } @Override protected void onAllReferencesReleased() { - if (isOpen()) { - // close the database which will close all pending statements to be finalized also - close(); + dispose(false); + } + + private void dispose(boolean finalized) { + final SQLiteConnectionPool pool; + synchronized (mLock) { + if (mCloseGuardLocked != null) { + if (finalized) { + mCloseGuardLocked.warnIfOpen(); + } + mCloseGuardLocked.close(); + } + + pool = mConnectionPoolLocked; + mConnectionPoolLocked = null; + } + + if (!finalized) { + synchronized (sActiveDatabases) { + sActiveDatabases.remove(this); + } + + if (pool != null) { + pool.close(); + } } } @@ -364,7 +293,9 @@ public class SQLiteDatabase extends SQLiteClosable { * * @return the number of bytes actually released */ - static public native int releaseMemory(); + public static int releaseMemory() { + return SQLiteGlobal.releaseMemory(); + } /** * Control whether or not the SQLiteDatabase is made thread-safe by using locks @@ -372,159 +303,82 @@ public class SQLiteDatabase extends SQLiteClosable { * DB will only be used by a single thread then you should set this to false. * The default is true. * @param lockingEnabled set to true to enable locks, false otherwise + * + * @deprecated This method now does nothing. Do not use. */ + @Deprecated public void setLockingEnabled(boolean lockingEnabled) { - mLockingEnabled = lockingEnabled; } /** - * If set then the SQLiteDatabase is made thread-safe by using locks - * around critical sections + * Gets a label to use when describing the database in log messages. + * @return The label. */ - private boolean mLockingEnabled = true; - - /* package */ void onCorruption() { - EventLog.writeEvent(EVENT_DB_CORRUPT, mPath); - mErrorHandler.onCorruption(this); + String getLabel() { + synchronized (mLock) { + return mConfigurationLocked.label; + } } /** - * Locks the database for exclusive access. The database lock must be held when - * touch the native sqlite3* object since it is single threaded and uses - * a polling lock contention algorithm. The lock is recursive, and may be acquired - * multiple times by the same thread. This is a no-op if mLockingEnabled is false. - * - * @see #unlock() + * Sends a corruption message to the database error handler. */ - /* package */ void lock(String sql) { - lock(sql, false); - } - - /* pachage */ void lock() { - lock(null, false); - } - - private static final long LOCK_WAIT_PERIOD = 30L; - private void lock(String sql, boolean forced) { - // make sure this method is NOT being called from a 'synchronized' method - if (Thread.holdsLock(this)) { - Log.w(TAG, "don't lock() while in a synchronized method"); - } - verifyDbIsOpen(); - if (!forced && !mLockingEnabled) return; - boolean done = false; - long timeStart = SystemClock.uptimeMillis(); - while (!done) { - try { - // wait for 30sec to acquire the lock - done = mLock.tryLock(LOCK_WAIT_PERIOD, TimeUnit.SECONDS); - if (!done) { - // lock not acquired in NSec. print a message and stacktrace saying the lock - // has not been available for 30sec. - Log.w(TAG, "database lock has not been available for " + LOCK_WAIT_PERIOD + - " sec. Current Owner of the lock is " + mLock.getOwnerDescription() + - ". Continuing to wait in thread: " + Thread.currentThread().getId()); - } - } catch (InterruptedException e) { - // ignore the interruption - } - } - if (SQLiteDebug.DEBUG_LOCK_TIME_TRACKING) { - if (mLock.getHoldCount() == 1) { - // Use elapsed real-time since the CPU may sleep when waiting for IO - mLockAcquiredWallTime = SystemClock.elapsedRealtime(); - mLockAcquiredThreadTime = Debug.threadCpuTimeNanos(); - } - } - if (sql != null) { - if (ENABLE_DB_SAMPLE) { - logTimeStat(sql, timeStart, GET_LOCK_LOG_PREFIX); - } - } - } - private static class DatabaseReentrantLock extends ReentrantLock { - DatabaseReentrantLock(boolean fair) { - super(fair); - } - @Override - public Thread getOwner() { - return super.getOwner(); - } - public String getOwnerDescription() { - Thread t = getOwner(); - return (t== null) ? "none" : String.valueOf(t.getId()); - } + void onCorruption() { + EventLog.writeEvent(EVENT_DB_CORRUPT, getLabel()); + mErrorHandler.onCorruption(this); } /** - * Locks the database for exclusive access. The database lock must be held when - * touch the native sqlite3* object since it is single threaded and uses - * a polling lock contention algorithm. The lock is recursive, and may be acquired - * multiple times by the same thread. + * Gets the {@link SQLiteSession} that belongs to this thread for this database. + * Once a thread has obtained a session, it will continue to obtain the same + * session even after the database has been closed (although the session will not + * be usable). However, a thread that does not already have a session cannot + * obtain one after the database has been closed. * - * @see #unlockForced() + * The idea is that threads that have active connections to the database may still + * have work to complete even after the call to {@link #close}. Active database + * connections are not actually disposed until they are released by the threads + * that own them. + * + * @return The session, never null. + * + * @throws IllegalStateException if the thread does not yet have a session and + * the database is not open. */ - private void lockForced() { - lock(null, true); - } - - private void lockForced(String sql) { - lock(sql, true); + SQLiteSession getThreadSession() { + return mThreadSession.get(); // initialValue() throws if database closed } - /** - * Releases the database lock. This is a no-op if mLockingEnabled is false. - * - * @see #unlock() - */ - /* package */ void unlock() { - if (!mLockingEnabled) return; - if (SQLiteDebug.DEBUG_LOCK_TIME_TRACKING) { - if (mLock.getHoldCount() == 1) { - checkLockHoldTime(); - } + SQLiteSession createSession() { + final SQLiteConnectionPool pool; + synchronized (mLock) { + throwIfNotOpenLocked(); + pool = mConnectionPoolLocked; } - mLock.unlock(); + return new SQLiteSession(pool); } /** - * Releases the database lock. + * Gets default connection flags that are appropriate for this thread, taking into + * account whether the thread is acting on behalf of the UI. * - * @see #unlockForced() + * @param readOnly True if the connection should be read-only. + * @return The connection flags. */ - private void unlockForced() { - if (SQLiteDebug.DEBUG_LOCK_TIME_TRACKING) { - if (mLock.getHoldCount() == 1) { - checkLockHoldTime(); - } + int getThreadDefaultConnectionFlags(boolean readOnly) { + int flags = readOnly ? SQLiteConnectionPool.CONNECTION_FLAG_READ_ONLY : + SQLiteConnectionPool.CONNECTION_FLAG_PRIMARY_CONNECTION_AFFINITY; + if (isMainThread()) { + flags |= SQLiteConnectionPool.CONNECTION_FLAG_INTERACTIVE; } - mLock.unlock(); + return flags; } - private void checkLockHoldTime() { - // Use elapsed real-time since the CPU may sleep when waiting for IO - long elapsedTime = SystemClock.elapsedRealtime(); - long lockedTime = elapsedTime - mLockAcquiredWallTime; - if (lockedTime < LOCK_ACQUIRED_WARNING_TIME_IN_MS_ALWAYS_PRINT && - !Log.isLoggable(TAG, Log.VERBOSE) && - (elapsedTime - mLastLockMessageTime) < LOCK_WARNING_WINDOW_IN_MS) { - return; - } - if (lockedTime > LOCK_ACQUIRED_WARNING_TIME_IN_MS) { - int threadTime = (int) - ((Debug.threadCpuTimeNanos() - mLockAcquiredThreadTime) / 1000000); - if (threadTime > LOCK_ACQUIRED_WARNING_THREAD_TIME_IN_MS || - lockedTime > LOCK_ACQUIRED_WARNING_TIME_IN_MS_ALWAYS_PRINT) { - mLastLockMessageTime = elapsedTime; - String msg = "lock held on " + mPath + " for " + lockedTime + "ms. Thread time was " - + threadTime + "ms"; - if (SQLiteDebug.DEBUG_LOCK_TIME_TRACKING_STACK_TRACE) { - Log.d(TAG, msg, new Exception()); - } else { - Log.d(TAG, msg); - } - } - } + private static boolean isMainThread() { + // FIXME: There should be a better way to do this. + // Would also be nice to have something that would work across Binder calls. + Looper looper = Looper.myLooper(); + return looper != null && looper == Looper.getMainLooper(); } /** @@ -636,50 +490,9 @@ public class SQLiteDatabase extends SQLiteClosable { private void beginTransaction(SQLiteTransactionListener transactionListener, boolean exclusive) { - verifyDbIsOpen(); - lockForced(BEGIN_SQL); - boolean ok = false; - try { - // If this thread already had the lock then get out - if (mLock.getHoldCount() > 1) { - if (mInnerTransactionIsSuccessful) { - String msg = "Cannot call beginTransaction between " - + "calling setTransactionSuccessful and endTransaction"; - IllegalStateException e = new IllegalStateException(msg); - Log.e(TAG, "beginTransaction() failed", e); - throw e; - } - ok = true; - return; - } - - // This thread didn't already have the lock, so begin a database - // transaction now. - if (exclusive && mConnectionPool == null) { - execSQL("BEGIN EXCLUSIVE;"); - } else { - execSQL("BEGIN IMMEDIATE;"); - } - mTransStartTime = SystemClock.uptimeMillis(); - mTransactionListener = transactionListener; - mTransactionIsSuccessful = true; - mInnerTransactionIsSuccessful = false; - if (transactionListener != null) { - try { - transactionListener.onBegin(); - } catch (RuntimeException e) { - execSQL("ROLLBACK;"); - throw e; - } - } - ok = true; - } finally { - if (!ok) { - // beginTransaction is called before the try block so we must release the lock in - // the case of failure. - unlockForced(); - } - } + getThreadSession().beginTransaction(exclusive ? SQLiteSession.TRANSACTION_MODE_EXCLUSIVE : + SQLiteSession.TRANSACTION_MODE_IMMEDIATE, transactionListener, + getThreadDefaultConnectionFlags(false /*readOnly*/)); } /** @@ -687,68 +500,7 @@ public class SQLiteDatabase extends SQLiteClosable { * are committed and rolled back. */ public void endTransaction() { - verifyLockOwner(); - try { - if (mInnerTransactionIsSuccessful) { - mInnerTransactionIsSuccessful = false; - } else { - mTransactionIsSuccessful = false; - } - if (mLock.getHoldCount() != 1) { - return; - } - RuntimeException savedException = null; - if (mTransactionListener != null) { - try { - if (mTransactionIsSuccessful) { - mTransactionListener.onCommit(); - } else { - mTransactionListener.onRollback(); - } - } catch (RuntimeException e) { - savedException = e; - mTransactionIsSuccessful = false; - } - } - if (mTransactionIsSuccessful) { - execSQL(COMMIT_SQL); - // if write-ahead logging is used, we have to take care of checkpoint. - // TODO: should applications be given the flexibility of choosing when to - // trigger checkpoint? - // for now, do checkpoint after every COMMIT because that is the fastest - // way to guarantee that readers will see latest data. - // but this is the slowest way to run sqlite with in write-ahead logging mode. - if (this.mConnectionPool != null) { - execSQL("PRAGMA wal_checkpoint;"); - if (SQLiteDebug.DEBUG_SQL_STATEMENTS) { - Log.i(TAG, "PRAGMA wal_Checkpoint done"); - } - } - // log the transaction time to the Eventlog. - if (ENABLE_DB_SAMPLE) { - logTimeStat(getLastSqlStatement(), mTransStartTime, COMMIT_SQL); - } - } else { - try { - execSQL("ROLLBACK;"); - if (savedException != null) { - throw savedException; - } - } catch (SQLException e) { - if (false) { - Log.d(TAG, "exception during rollback, maybe the DB previously " - + "performed an auto-rollback"); - } - } - } - } finally { - mTransactionListener = null; - unlockForced(); - if (false) { - Log.v(TAG, "unlocked " + Thread.currentThread() - + ", holdCount is " + mLock.getHoldCount()); - } - } + getThreadSession().endTransaction(); } /** @@ -761,86 +513,46 @@ public class SQLiteDatabase extends SQLiteClosable { * transaction is already marked as successful. */ public void setTransactionSuccessful() { - verifyDbIsOpen(); - if (!mLock.isHeldByCurrentThread()) { - throw new IllegalStateException("no transaction pending"); - } - if (mInnerTransactionIsSuccessful) { - throw new IllegalStateException( - "setTransactionSuccessful may only be called once per call to beginTransaction"); - } - mInnerTransactionIsSuccessful = true; + getThreadSession().setTransactionSuccessful(); } /** - * return true if there is a transaction pending + * Returns true if the current thread has a transaction pending. + * + * @return True if the current thread is in a transaction. */ public boolean inTransaction() { - return mLock.getHoldCount() > 0 || mTransactionUsingExecSql; - } - - /* package */ synchronized void setTransactionUsingExecSqlFlag() { - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.i(TAG, "found execSQL('begin transaction')"); - } - mTransactionUsingExecSql = true; - } - - /* package */ synchronized void resetTransactionUsingExecSqlFlag() { - if (Log.isLoggable(TAG, Log.DEBUG)) { - if (mTransactionUsingExecSql) { - Log.i(TAG, "found execSQL('commit or end or rollback')"); - } - } - mTransactionUsingExecSql = false; + return getThreadSession().hasTransaction(); } /** - * Returns true if the caller is considered part of the current transaction, if any. + * Returns true if the current thread is holding an active connection to the database. * <p> - * Caller is part of the current transaction if either of the following is true - * <ol> - * <li>If transaction is started by calling beginTransaction() methods AND if the caller is - * in the same thread as the thread that started the transaction. - * </li> - * <li>If the transaction is started by calling {@link #execSQL(String)} like this: - * execSQL("BEGIN transaction"). In this case, every thread in the process is considered - * part of the current transaction.</li> - * </ol> - * - * @return true if the caller is considered part of the current transaction, if any. - */ - /* package */ synchronized boolean amIInTransaction() { - // always do this test on the main database connection - NOT on pooled database connection - // since transactions always occur on the main database connections only. - SQLiteDatabase db = (isPooledConnection()) ? mParentConnObj : this; - boolean b = (!db.inTransaction()) ? false : - db.mTransactionUsingExecSql || db.mLock.isHeldByCurrentThread(); - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.i(TAG, "amIinTransaction: " + b); - } - return b; - } - - /** - * Checks if the database lock is held by this thread. + * The name of this method comes from a time when having an active connection + * to the database meant that the thread was holding an actual lock on the + * database. Nowadays, there is no longer a true "database lock" although threads + * may block if they cannot acquire a database connection to perform a + * particular operation. + * </p> * - * @return true, if this thread is holding the database lock. + * @return True if the current thread is holding an active connection to the database. */ public boolean isDbLockedByCurrentThread() { - return mLock.isHeldByCurrentThread(); + return getThreadSession().hasConnection(); } /** - * Checks if the database is locked by another thread. This is - * just an estimate, since this status can change at any time, - * including after the call is made but before the result has - * been acted upon. + * Always returns false. + * <p> + * There is no longer the concept of a database lock, so this method always returns false. + * </p> * - * @return true, if the database is locked by another thread + * @return False. + * @deprecated Always returns false. Do not use this method. */ + @Deprecated public boolean isDbLockedByOtherThreads() { - return !mLock.isHeldByCurrentThread() && mLock.isLocked(); + return false; } /** @@ -884,46 +596,12 @@ public class SQLiteDatabase extends SQLiteClosable { return yieldIfContendedHelper(true /* check yielding */, sleepAfterYieldDelay); } - private boolean yieldIfContendedHelper(boolean checkFullyYielded, long sleepAfterYieldDelay) { - if (mLock.getQueueLength() == 0) { - // Reset the lock acquire time since we know that the thread was willing to yield - // the lock at this time. - mLockAcquiredWallTime = SystemClock.elapsedRealtime(); - mLockAcquiredThreadTime = Debug.threadCpuTimeNanos(); - return false; - } - setTransactionSuccessful(); - SQLiteTransactionListener transactionListener = mTransactionListener; - endTransaction(); - if (checkFullyYielded) { - if (this.isDbLockedByCurrentThread()) { - throw new IllegalStateException( - "Db locked more than once. yielfIfContended cannot yield"); - } - } - if (sleepAfterYieldDelay > 0) { - // Sleep for up to sleepAfterYieldDelay milliseconds, waking up periodically to - // check if anyone is using the database. If the database is not contended, - // retake the lock and return. - long remainingDelay = sleepAfterYieldDelay; - while (remainingDelay > 0) { - try { - Thread.sleep(remainingDelay < SLEEP_AFTER_YIELD_QUANTUM ? - remainingDelay : SLEEP_AFTER_YIELD_QUANTUM); - } catch (InterruptedException e) { - Thread.interrupted(); - } - remainingDelay -= SLEEP_AFTER_YIELD_QUANTUM; - if (mLock.getQueueLength() == 0) { - break; - } - } - } - beginTransactionWithListener(transactionListener); - return true; + private boolean yieldIfContendedHelper(boolean throwIfUnsafe, long sleepAfterYieldDelay) { + return getThreadSession().yieldTransaction(sleepAfterYieldDelay, throwIfUnsafe); } /** + * Deprecated. * @deprecated This method no longer serves any useful purpose and has been deprecated. */ @Deprecated @@ -932,19 +610,6 @@ public class SQLiteDatabase extends SQLiteClosable { } /** - * Used to allow returning sub-classes of {@link Cursor} when calling query. - */ - public interface CursorFactory { - /** - * See - * {@link SQLiteCursor#SQLiteCursor(SQLiteCursorDriver, String, SQLiteQuery)}. - */ - public Cursor newCursor(SQLiteDatabase db, - SQLiteCursorDriver masterQuery, String editTable, - SQLiteQuery query); - } - - /** * Open the database according to the flags {@link #OPEN_READWRITE} * {@link #OPEN_READONLY} {@link #CREATE_IF_NECESSARY} and/or {@link #NO_LOCALIZED_COLLATORS}. * @@ -983,50 +648,9 @@ public class SQLiteDatabase extends SQLiteClosable { */ public static SQLiteDatabase openDatabase(String path, CursorFactory factory, int flags, DatabaseErrorHandler errorHandler) { - SQLiteDatabase sqliteDatabase = openDatabase(path, factory, flags, errorHandler, - (short) 0 /* the main connection handle */); - - // set sqlite pagesize to mBlockSize - if (sBlockSize == 0) { - // TODO: "/data" should be a static final String constant somewhere. it is hardcoded - // in several places right now. - sBlockSize = new StatFs("/data").getBlockSize(); - } - sqliteDatabase.setPageSize(sBlockSize); - sqliteDatabase.setJournalMode(path, "TRUNCATE"); - - // add this database to the list of databases opened in this process - synchronized(mActiveDatabases) { - mActiveDatabases.add(new WeakReference<SQLiteDatabase>(sqliteDatabase)); - } - return sqliteDatabase; - } - - private static SQLiteDatabase openDatabase(String path, CursorFactory factory, int flags, - DatabaseErrorHandler errorHandler, short connectionNum) { - SQLiteDatabase db = new SQLiteDatabase(path, factory, flags, errorHandler, connectionNum); - try { - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.i(TAG, "opening the db : " + path); - } - // Open the database. - db.dbopen(path, flags); - db.setLocale(Locale.getDefault()); - if (SQLiteDebug.DEBUG_SQL_STATEMENTS) { - db.enableSqlTracing(path, connectionNum); - } - if (SQLiteDebug.DEBUG_SQL_TIME) { - db.enableSqlProfiling(path, connectionNum); - } - return db; - } catch (SQLiteDatabaseCorruptException e) { - db.mErrorHandler.onCorruption(db); - return SQLiteDatabase.openDatabase(path, factory, flags, errorHandler); - } catch (SQLiteException e) { - Log.e(TAG, "Failed to open the database. closing it.", e); - db.close(); - throw e; - } + SQLiteDatabase db = new SQLiteDatabase(path, flags, factory, errorHandler); + db.open(); + return db; } /** @@ -1051,16 +675,46 @@ public class SQLiteDatabase extends SQLiteClosable { return openDatabase(path, factory, CREATE_IF_NECESSARY, errorHandler); } - private void setJournalMode(final String dbPath, final String mode) { - // journal mode can be set only for non-memory databases + private void open() { + try { + try { + openInner(); + } catch (SQLiteDatabaseCorruptException ex) { + onCorruption(); + openInner(); + } + + // Disable WAL if it was previously enabled. + setJournalMode("TRUNCATE"); + } catch (SQLiteException ex) { + Log.e(TAG, "Failed to open database '" + getLabel() + "'.", ex); + close(); + throw ex; + } + } + + private void openInner() { + synchronized (mLock) { + assert mConnectionPoolLocked == null; + mConnectionPoolLocked = SQLiteConnectionPool.open(mConfigurationLocked); + mCloseGuardLocked.open("close"); + } + + synchronized (sActiveDatabases) { + sActiveDatabases.put(this, null); + } + } + + private void setJournalMode(String mode) { + // Journal mode can be set only for non-memory databases // AND can't be set for readonly databases - if (dbPath.equalsIgnoreCase(MEMORY_DB_PATH) || isReadOnly()) { + if (isInMemoryDatabase() || isReadOnly()) { return; } String s = DatabaseUtils.stringForQuery(this, "PRAGMA journal_mode=" + mode, null); if (!s.equalsIgnoreCase(mode)) { - Log.e(TAG, "setting journal_mode to " + mode + " failed for db: " + dbPath + - " (on pragma set journal_mode, sqlite returned:" + s); + Log.e(TAG, "setting journal_mode to " + mode + " failed for db: " + getLabel() + + " (on pragma set journal_mode, sqlite returned:" + s); } } @@ -1077,159 +731,37 @@ public class SQLiteDatabase extends SQLiteClosable { */ public static SQLiteDatabase create(CursorFactory factory) { // This is a magic string with special meaning for SQLite. - return openDatabase(MEMORY_DB_PATH, factory, CREATE_IF_NECESSARY); + return openDatabase(SQLiteDatabaseConfiguration.MEMORY_DB_PATH, + factory, CREATE_IF_NECESSARY); } /** * Close the database. */ public void close() { - if (!isOpen()) { - return; - } - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.i(TAG, "closing db: " + mPath + " (connection # " + mConnectionNum); - } - lock(); - try { - // some other thread could have closed this database while I was waiting for lock. - // check the database state - if (!isOpen()) { - return; - } - closeClosable(); - // finalize ALL statements queued up so far - closePendingStatements(); - releaseCustomFunctions(); - // close this database instance - regardless of its reference count value - closeDatabase(); - if (mConnectionPool != null) { - if (Log.isLoggable(TAG, Log.DEBUG)) { - assert mConnectionPool != null; - Log.i(TAG, mConnectionPool.toString()); - } - mConnectionPool.close(); - } - } finally { - unlock(); - } - } - - private void closeClosable() { - /* deallocate all compiled SQL statement objects from mCompiledQueries cache. - * this should be done before de-referencing all {@link SQLiteClosable} objects - * from this database object because calling - * {@link SQLiteClosable#onAllReferencesReleasedFromContainer()} could cause the database - * to be closed. sqlite doesn't let a database close if there are - * any unfinalized statements - such as the compiled-sql objects in mCompiledQueries. - */ - deallocCachedSqlStatements(); - - Iterator<Map.Entry<SQLiteClosable, Object>> iter = mPrograms.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry<SQLiteClosable, Object> entry = iter.next(); - SQLiteClosable program = entry.getKey(); - if (program != null) { - program.onAllReferencesReleasedFromContainer(); - } - } - } - - /** - * package level access for testing purposes - */ - /* package */ void closeDatabase() throws SQLiteException { - try { - dbclose(); - } catch (SQLiteUnfinalizedObjectsException e) { - String msg = e.getMessage(); - String[] tokens = msg.split(",", 2); - int stmtId = Integer.parseInt(tokens[0]); - // get extra info about this statement, if it is still to be released by closeClosable() - Iterator<Map.Entry<SQLiteClosable, Object>> iter = mPrograms.entrySet().iterator(); - boolean found = false; - while (iter.hasNext()) { - Map.Entry<SQLiteClosable, Object> entry = iter.next(); - SQLiteClosable program = entry.getKey(); - if (program != null && program instanceof SQLiteProgram) { - SQLiteCompiledSql compiledSql = ((SQLiteProgram)program).mCompiledSql; - if (compiledSql.nStatement == stmtId) { - msg = compiledSql.toString(); - found = true; - } - } - } - if (!found) { - // the statement is already released by closeClosable(). is it waiting to be - // finalized? - if (mClosedStatementIds.contains(stmtId)) { - Log.w(TAG, "this shouldn't happen. finalizing the statement now: "); - closePendingStatements(); - // try to close the database again - closeDatabase(); - } - } else { - // the statement is not yet closed. most probably programming error in the app. - throw new SQLiteUnfinalizedObjectsException( - "close() on database: " + getPath() + - " failed due to un-close()d SQL statements: " + msg); - } - } - } - - /** - * Native call to close the database. - */ - private native void dbclose(); - - /** - * A callback interface for a custom sqlite3 function. - * This can be used to create a function that can be called from - * sqlite3 database triggers. - * @hide - */ - public interface CustomFunction { - public void callback(String[] args); + dispose(false); } /** * Registers a CustomFunction callback as a function that can be called from - * sqlite3 database triggers. + * SQLite database triggers. + * * @param name the name of the sqlite3 function * @param numArgs the number of arguments for the function * @param function callback to call when the function is executed * @hide */ public void addCustomFunction(String name, int numArgs, CustomFunction function) { - verifyDbIsOpen(); - synchronized (mCustomFunctions) { - int ref = native_addCustomFunction(name, numArgs, function); - if (ref != 0) { - // save a reference to the function for cleanup later - mCustomFunctions.add(new Integer(ref)); - } else { - throw new SQLiteException("failed to add custom function " + name); - } - } - } + // Create wrapper (also validates arguments). + SQLiteCustomFunction wrapper = new SQLiteCustomFunction(name, numArgs, function); - private void releaseCustomFunctions() { - synchronized (mCustomFunctions) { - for (int i = 0; i < mCustomFunctions.size(); i++) { - Integer function = mCustomFunctions.get(i); - native_releaseCustomFunction(function.intValue()); - } - mCustomFunctions.clear(); + synchronized (mLock) { + throwIfNotOpenLocked(); + mConfigurationLocked.customFunctions.add(wrapper); + mConnectionPoolLocked.reconfigure(mConfigurationLocked); } } - // list of CustomFunction references so we can clean up when the database closes - private final ArrayList<Integer> mCustomFunctions = - new ArrayList<Integer>(); - - private native int native_addCustomFunction(String name, int numArgs, CustomFunction function); - private native void native_releaseCustomFunction(int function); - /** * Gets the database version. * @@ -1364,7 +896,7 @@ public class SQLiteDatabase extends SQLiteClosable { * {@link SQLiteStatement}s are not synchronized, see the documentation for more details. */ public SQLiteStatement compileStatement(String sql) throws SQLException { - verifyDbIsOpen(); + throwIfNotOpen(); // fail fast return new SQLiteStatement(this, sql, null); } @@ -1442,7 +974,7 @@ public class SQLiteDatabase extends SQLiteClosable { boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) { - verifyDbIsOpen(); + throwIfNotOpen(); // fail fast String sql = SQLiteQueryBuilder.buildQueryString( distinct, table, columns, selection, groupBy, having, orderBy, limit); @@ -1553,21 +1085,11 @@ public class SQLiteDatabase extends SQLiteClosable { public Cursor rawQueryWithFactory( CursorFactory cursorFactory, String sql, String[] selectionArgs, String editTable) { - verifyDbIsOpen(); - BlockGuard.getThreadPolicy().onReadFromDisk(); + throwIfNotOpen(); // fail fast - SQLiteDatabase db = getDbConnection(sql); - SQLiteCursorDriver driver = new SQLiteDirectCursorDriver(db, sql, editTable); - - Cursor cursor = null; - try { - cursor = driver.query( - cursorFactory != null ? cursorFactory : mFactory, - selectionArgs); - } finally { - releaseDbConnection(db); - } - return cursor; + SQLiteCursorDriver driver = new SQLiteDirectCursorDriver(this, sql, editTable); + return driver.query(cursorFactory != null ? cursorFactory : mCursorFactory, + selectionArgs); } /** @@ -1716,9 +1238,6 @@ public class SQLiteDatabase extends SQLiteClosable { SQLiteStatement statement = new SQLiteStatement(this, sql.toString(), bindArgs); try { return statement.executeInsert(); - } catch (SQLiteDatabaseCorruptException e) { - onCorruption(); - throw e; } finally { statement.close(); } @@ -1739,9 +1258,6 @@ public class SQLiteDatabase extends SQLiteClosable { (!TextUtils.isEmpty(whereClause) ? " WHERE " + whereClause : ""), whereArgs); try { return statement.executeUpdateDelete(); - } catch (SQLiteDatabaseCorruptException e) { - onCorruption(); - throw e; } finally { statement.close(); } @@ -1808,9 +1324,6 @@ public class SQLiteDatabase extends SQLiteClosable { SQLiteStatement statement = new SQLiteStatement(this, sql.toString(), bindArgs); try { return statement.executeUpdateDelete(); - } catch (SQLiteDatabaseCorruptException e) { - onCorruption(); - throw e; } finally { statement.close(); } @@ -1891,264 +1404,105 @@ public class SQLiteDatabase extends SQLiteClosable { private int executeSql(String sql, Object[] bindArgs) throws SQLException { if (DatabaseUtils.getSqlStatementType(sql) == DatabaseUtils.STATEMENT_ATTACH) { - disableWriteAheadLogging(); - mHasAttachedDbs = true; + boolean disableWal = false; + synchronized (mLock) { + if (!mHasAttachedDbsLocked) { + mHasAttachedDbsLocked = true; + disableWal = true; + } + } + if (disableWal) { + disableWriteAheadLogging(); + } } + SQLiteStatement statement = new SQLiteStatement(this, sql, bindArgs); try { return statement.executeUpdateDelete(); - } catch (SQLiteDatabaseCorruptException e) { - onCorruption(); - throw e; } finally { statement.close(); } } - @Override - protected void finalize() throws Throwable { - try { - if (isOpen()) { - Log.e(TAG, "close() was never explicitly called on database '" + - mPath + "' ", mStackTrace); - closeClosable(); - onAllReferencesReleased(); - releaseCustomFunctions(); - } - } finally { - super.finalize(); - } - } - /** - * Private constructor. + * Returns true if the database is opened as read only. * - * @param path The full path to the database - * @param factory The factory to use when creating cursors, may be NULL. - * @param flags 0 or {@link #NO_LOCALIZED_COLLATORS}. If the database file already - * exists, mFlags will be updated appropriately. - * @param errorHandler The {@link DatabaseErrorHandler} to be used when sqlite reports database - * corruption. may be NULL. - * @param connectionNum 0 for main database connection handle. 1..N for pooled database - * connection handles. + * @return True if database is opened as read only. */ - private SQLiteDatabase(String path, CursorFactory factory, int flags, - DatabaseErrorHandler errorHandler, short connectionNum) { - if (path == null) { - throw new IllegalArgumentException("path should not be null"); + public boolean isReadOnly() { + synchronized (mLock) { + return isReadOnlyLocked(); } - setMaxSqlCacheSize(DEFAULT_SQL_CACHE_SIZE); - mFlags = flags; - mPath = path; - mStackTrace = new DatabaseObjectNotClosedException().fillInStackTrace(); - mFactory = factory; - mPrograms = new WeakHashMap<SQLiteClosable,Object>(); - // Set the DatabaseErrorHandler to be used when SQLite reports corruption. - // If the caller sets errorHandler = null, then use default errorhandler. - mErrorHandler = (errorHandler == null) ? new DefaultDatabaseErrorHandler() : errorHandler; - mConnectionNum = connectionNum; - /* sqlite soft heap limit http://www.sqlite.org/c3ref/soft_heap_limit64.html - * set it to 4 times the default cursor window size. - * TODO what is an appropriate value, considering the WAL feature which could burn - * a lot of memory with many connections to the database. needs testing to figure out - * optimal value for this. - */ - int limit = Resources.getSystem().getInteger( - com.android.internal.R.integer.config_cursorWindowSize) * 1024 * 4; - native_setSqliteSoftHeapLimit(limit); + } + + private boolean isReadOnlyLocked() { + return (mConfigurationLocked.openFlags & OPEN_READ_MASK) == OPEN_READONLY; } /** - * return whether the DB is opened as read only. - * @return true if DB is opened as read only + * Returns true if the database is in-memory db. + * + * @return True if the database is in-memory. + * @hide */ - public boolean isReadOnly() { - return (mFlags & OPEN_READ_MASK) == OPEN_READONLY; + public boolean isInMemoryDatabase() { + synchronized (mLock) { + return mConfigurationLocked.isInMemoryDb(); + } } /** - * @return true if the DB is currently open (has not been closed) + * Returns true if the database is currently open. + * + * @return True if the database is currently open (has not been closed). */ public boolean isOpen() { - return mNativeHandle != 0; + synchronized (mLock) { + return mConnectionPoolLocked != null; + } } + /** + * Returns true if the new version code is greater than the current database version. + * + * @param newVersion The new version code. + * @return True if the new version code is greater than the current database version. + */ public boolean needUpgrade(int newVersion) { return newVersion > getVersion(); } /** - * Getter for the path to the database file. + * Gets the path to the database file. * - * @return the path to our database file. + * @return The path to the database file. */ public final String getPath() { - return mPath; - } - - /* package */ void logTimeStat(String sql, long beginMillis) { - if (ENABLE_DB_SAMPLE) { - logTimeStat(sql, beginMillis, null); + synchronized (mLock) { + return mConfigurationLocked.path; } } - private void logTimeStat(String sql, long beginMillis, String prefix) { - // Sample fast queries in proportion to the time taken. - // Quantize the % first, so the logged sampling probability - // exactly equals the actual sampling rate for this query. - - int samplePercent; - long durationMillis = SystemClock.uptimeMillis() - beginMillis; - if (durationMillis == 0 && prefix == GET_LOCK_LOG_PREFIX) { - // The common case is locks being uncontended. Don't log those, - // even at 1%, which is our default below. - return; - } - if (sQueryLogTimeInMillis == 0) { - sQueryLogTimeInMillis = SystemProperties.getInt("db.db_operation.threshold_ms", 500); - } - if (durationMillis >= sQueryLogTimeInMillis) { - samplePercent = 100; - } else { - samplePercent = (int) (100 * durationMillis / sQueryLogTimeInMillis) + 1; - if (mRandom.nextInt(100) >= samplePercent) return; - } - - // Note: the prefix will be "COMMIT;" or "GETLOCK:" when non-null. We wait to do - // it here so we avoid allocating in the common case. - if (prefix != null) { - sql = prefix + sql; - } - if (sql.length() > QUERY_LOG_SQL_LENGTH) sql = sql.substring(0, QUERY_LOG_SQL_LENGTH); - - // ActivityThread.currentPackageName() only returns non-null if the - // current thread is an application main thread. This parameter tells - // us whether an event loop is blocked, and if so, which app it is. - // - // Sadly, there's no fast way to determine app name if this is *not* a - // main thread, or when we are invoked via Binder (e.g. ContentProvider). - // Hopefully the full path to the database will be informative enough. - - String blockingPackage = AppGlobals.getInitialPackage(); - if (blockingPackage == null) blockingPackage = ""; - - EventLog.writeEvent( - EVENT_DB_OPERATION, - getPathForLogs(), - sql, - durationMillis, - blockingPackage, - samplePercent); - } - - /** - * Removes email addresses from database filenames before they're - * logged to the EventLog where otherwise apps could potentially - * read them. - */ - private String getPathForLogs() { - if (mPathForLogs != null) { - return mPathForLogs; - } - if (mPath == null) { - return null; - } - if (mPath.indexOf('@') == -1) { - mPathForLogs = mPath; - } else { - mPathForLogs = EMAIL_IN_DB_PATTERN.matcher(mPath).replaceAll("XX@YY"); - } - return mPathForLogs; - } - /** * Sets the locale for this database. Does nothing if this database has * the NO_LOCALIZED_COLLATORS flag set or was opened read only. + * + * @param locale The new locale. + * * @throws SQLException if the locale could not be set. The most common reason * for this is that there is no collator available for the locale you requested. * In this case the database remains unchanged. */ public void setLocale(Locale locale) { - lock(); - try { - native_setLocale(locale.toString(), mFlags); - } finally { - unlock(); - } - } - - /* package */ void verifyDbIsOpen() { - if (!isOpen()) { - throw new IllegalStateException("database " + getPath() + " (conn# " + - mConnectionNum + ") already closed"); - } - } - - /* package */ void verifyLockOwner() { - verifyDbIsOpen(); - if (mLockingEnabled && !isDbLockedByCurrentThread()) { - throw new IllegalStateException("Don't have database lock!"); - } - } - - /** - * Adds the given SQL and its compiled-statement-id-returned-by-sqlite to the - * cache of compiledQueries attached to 'this'. - * <p> - * If there is already a {@link SQLiteCompiledSql} in compiledQueries for the given SQL, - * the new {@link SQLiteCompiledSql} object is NOT inserted into the cache (i.e.,the current - * mapping is NOT replaced with the new mapping). - */ - /* package */ synchronized void addToCompiledQueries( - String sql, SQLiteCompiledSql compiledStatement) { - // don't insert the new mapping if a mapping already exists - if (mCompiledQueries.get(sql) != null) { - return; + if (locale == null) { + throw new IllegalArgumentException("locale must not be null."); } - int maxCacheSz = (mConnectionNum == 0) ? mCompiledQueries.maxSize() : - mParentConnObj.mCompiledQueries.maxSize(); - - if (SQLiteDebug.DEBUG_SQL_CACHE) { - boolean printWarning = (mConnectionNum == 0) - ? (!mCacheFullWarning && mCompiledQueries.size() == maxCacheSz) - : (!mParentConnObj.mCacheFullWarning && - mParentConnObj.mCompiledQueries.size() == maxCacheSz); - if (printWarning) { - /* - * cache size is not enough for this app. log a warning. - * chances are it is NOT using ? for bindargs - or cachesize is too small. - */ - Log.w(TAG, "Reached MAX size for compiled-sql statement cache for database " + - getPath() + ". Use setMaxSqlCacheSize() to increase cachesize. "); - mCacheFullWarning = true; - Log.d(TAG, "Here are the SQL statements in Cache of database: " + mPath); - for (String s : mCompiledQueries.snapshot().keySet()) { - Log.d(TAG, "Sql statement in Cache: " + s); - } - } + synchronized (mLock) { + throwIfNotOpenLocked(); + mConfigurationLocked.locale = locale; + mConnectionPoolLocked.reconfigure(mConfigurationLocked); } - /* add the given SQLiteCompiledSql compiledStatement to cache. - * no need to worry about the cache size - because {@link #mCompiledQueries} - * self-limits its size. - */ - mCompiledQueries.put(sql, compiledStatement); - } - - /** package-level access for testing purposes */ - /* package */ synchronized void deallocCachedSqlStatements() { - for (SQLiteCompiledSql compiledSql : mCompiledQueries.snapshot().values()) { - compiledSql.releaseSqlStatement(); - } - mCompiledQueries.evictAll(); - } - - /** - * From the compiledQueries cache, returns the compiled-statement-id for the given SQL. - * Returns null, if not found in the cache. - */ - /* package */ synchronized SQLiteCompiledSql getCompiledStatementForSql(String sql) { - return mCompiledQueries.get(sql); } /** @@ -2162,116 +1516,22 @@ public class SQLiteDatabase extends SQLiteClosable { * This method is thread-safe. * * @param cacheSize the size of the cache. can be (0 to {@link #MAX_SQL_CACHE_SIZE}) - * @throws IllegalStateException if input cacheSize > {@link #MAX_SQL_CACHE_SIZE} or - * the value set with previous setMaxSqlCacheSize() call. + * @throws IllegalStateException if input cacheSize > {@link #MAX_SQL_CACHE_SIZE}. */ public void setMaxSqlCacheSize(int cacheSize) { - synchronized (this) { - LruCache<String, SQLiteCompiledSql> oldCompiledQueries = mCompiledQueries; - if (cacheSize > MAX_SQL_CACHE_SIZE || cacheSize < 0) { - throw new IllegalStateException( - "expected value between 0 and " + MAX_SQL_CACHE_SIZE); - } else if (oldCompiledQueries != null && cacheSize < oldCompiledQueries.maxSize()) { - throw new IllegalStateException("cannot set cacheSize to a value less than the " - + "value set with previous setMaxSqlCacheSize() call."); - } - mCompiledQueries = new LruCache<String, SQLiteCompiledSql>(cacheSize) { - @Override - protected void entryRemoved(boolean evicted, String key, SQLiteCompiledSql oldValue, - SQLiteCompiledSql newValue) { - verifyLockOwner(); - oldValue.releaseIfNotInUse(); - } - }; - if (oldCompiledQueries != null) { - for (Map.Entry<String, SQLiteCompiledSql> entry - : oldCompiledQueries.snapshot().entrySet()) { - mCompiledQueries.put(entry.getKey(), entry.getValue()); - } - } - } - } - - /* package */ synchronized boolean isInStatementCache(String sql) { - return mCompiledQueries.get(sql) != null; - } - - /* package */ synchronized void releaseCompiledSqlObj( - String sql, SQLiteCompiledSql compiledSql) { - if (mCompiledQueries.get(sql) == compiledSql) { - // it is in cache - reset its inUse flag - compiledSql.release(); - } else { - // it is NOT in cache. finalize it. - compiledSql.releaseSqlStatement(); - } - } - - private synchronized int getCacheHitNum() { - return mCompiledQueries.hitCount(); - } - - private synchronized int getCacheMissNum() { - return mCompiledQueries.missCount(); - } - - private synchronized int getCachesize() { - return mCompiledQueries.size(); - } - - /* package */ void finalizeStatementLater(int id) { - if (!isOpen()) { - // database already closed. this statement will already have been finalized. - return; - } - synchronized(mClosedStatementIds) { - if (mClosedStatementIds.contains(id)) { - // this statement id is already queued up for finalization. - return; - } - mClosedStatementIds.add(id); - } - } - - /* package */ boolean isInQueueOfStatementsToBeFinalized(int id) { - if (!isOpen()) { - // database already closed. this statement will already have been finalized. - // return true so that the caller doesn't have to worry about finalizing this statement. - return true; - } - synchronized(mClosedStatementIds) { - return mClosedStatementIds.contains(id); + if (cacheSize > MAX_SQL_CACHE_SIZE || cacheSize < 0) { + throw new IllegalStateException( + "expected value between 0 and " + MAX_SQL_CACHE_SIZE); } - } - /* package */ void closePendingStatements() { - if (!isOpen()) { - // since this database is already closed, no need to finalize anything. - mClosedStatementIds.clear(); - return; - } - verifyLockOwner(); - /* to minimize synchronization on mClosedStatementIds, make a copy of the list */ - ArrayList<Integer> list = new ArrayList<Integer>(mClosedStatementIds.size()); - synchronized(mClosedStatementIds) { - list.addAll(mClosedStatementIds); - mClosedStatementIds.clear(); - } - // finalize all the statements from the copied list - int size = list.size(); - for (int i = 0; i < size; i++) { - native_finalize(list.get(i)); + synchronized (mLock) { + throwIfNotOpenLocked(); + mConfigurationLocked.maxSqlCacheSize = cacheSize; + mConnectionPoolLocked.reconfigure(mConfigurationLocked); } } /** - * for testing only - */ - /* package */ ArrayList<Integer> getQueuedUpStmtList() { - return mClosedStatementIds; - } - - /** * This method enables parallel execution of queries from multiple threads on the same database. * It does this by opening multiple handles to the database and using a different * database handle for each query. @@ -2314,37 +1574,43 @@ public class SQLiteDatabase extends SQLiteClosable { * @return true if write-ahead-logging is set. false otherwise */ public boolean enableWriteAheadLogging() { - // make sure the database is not READONLY. WAL doesn't make sense for readonly-databases. - if (isReadOnly()) { - return false; - } - // acquire lock - no that no other thread is enabling WAL at the same time - lock(); - try { - if (mConnectionPool != null) { - // already enabled + synchronized (mLock) { + throwIfNotOpenLocked(); + + if (mIsWALEnabledLocked) { return true; } - if (mPath.equalsIgnoreCase(MEMORY_DB_PATH)) { + + if (isReadOnlyLocked()) { + // WAL doesn't make sense for readonly-databases. + // TODO: True, but connection pooling does still make sense... + return false; + } + + if (mConfigurationLocked.isInMemoryDb()) { Log.i(TAG, "can't enable WAL for memory databases."); return false; } // make sure this database has NO attached databases because sqlite's write-ahead-logging // doesn't work for databases with attached databases - if (mHasAttachedDbs) { + if (mHasAttachedDbsLocked) { if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, - "this database: " + mPath + " has attached databases. can't enable WAL."); + Log.d(TAG, "this database: " + mConfigurationLocked.label + + " has attached databases. can't enable WAL."); } return false; } - mConnectionPool = new DatabaseConnectionPool(this); - setJournalMode(mPath, "WAL"); - return true; - } finally { - unlock(); + + mIsWALEnabledLocked = true; + mConfigurationLocked.maxConnectionPoolSize = Math.max(2, + Resources.getSystem().getInteger( + com.android.internal.R.integer.db_connection_pool_size)); + mConnectionPoolLocked.reconfigure(mConfigurationLocked); } + + setJournalMode("WAL"); + return true; } /** @@ -2352,176 +1618,66 @@ public class SQLiteDatabase extends SQLiteClosable { * @hide */ public void disableWriteAheadLogging() { - // grab database lock so that writeAheadLogging is not disabled from 2 different threads - // at the same time - lock(); - try { - if (mConnectionPool == null) { - return; // already disabled - } - mConnectionPool.close(); - setJournalMode(mPath, "TRUNCATE"); - mConnectionPool = null; - } finally { - unlock(); - } - } + synchronized (mLock) { + throwIfNotOpenLocked(); - /* package */ SQLiteDatabase getDatabaseHandle(String sql) { - if (isPooledConnection()) { - // this is a pooled database connection - // use it if it is open AND if I am not currently part of a transaction - if (isOpen() && !amIInTransaction()) { - // TODO: use another connection from the pool - // if this connection is currently in use by some other thread - // AND if there are free connections in the pool - return this; - } else { - // the pooled connection is not open! could have been closed either due - // to corruption on this or some other connection to the database - // OR, maybe the connection pool is disabled after this connection has been - // allocated to me. try to get some other pooled or main database connection - return getParentDbConnObj().getDbConnection(sql); + if (!mIsWALEnabledLocked) { + return; } - } else { - // this is NOT a pooled connection. can we get one? - return getDbConnection(sql); - } - } - /* package */ SQLiteDatabase createPoolConnection(short connectionNum) { - SQLiteDatabase db = openDatabase(mPath, mFactory, mFlags, mErrorHandler, connectionNum); - db.mParentConnObj = this; - return db; - } - - private synchronized SQLiteDatabase getParentDbConnObj() { - return mParentConnObj; - } + mIsWALEnabledLocked = false; + mConfigurationLocked.maxConnectionPoolSize = 1; + mConnectionPoolLocked.reconfigure(mConfigurationLocked); + } - private boolean isPooledConnection() { - return this.mConnectionNum > 0; + setJournalMode("TRUNCATE"); } - /* package */ SQLiteDatabase getDbConnection(String sql) { - verifyDbIsOpen(); - // this method should always be called with main database connection handle. - // the only time when it is called with pooled database connection handle is - // corruption occurs while trying to open a pooled database connection handle. - // in that case, simply return 'this' handle - if (isPooledConnection()) { - return this; + /** + * Collect statistics about all open databases in the current process. + * Used by bug report. + */ + static ArrayList<DbStats> getDbStats() { + ArrayList<DbStats> dbStatsList = new ArrayList<DbStats>(); + for (SQLiteDatabase db : getActiveDatabases()) { + db.collectDbStats(dbStatsList); } + return dbStatsList; + } - // use the current connection handle if - // 1. if the caller is part of the ongoing transaction, if any - // 2. OR, if there is NO connection handle pool setup - if (amIInTransaction() || mConnectionPool == null) { - return this; - } else { - // get a connection handle from the pool - if (Log.isLoggable(TAG, Log.DEBUG)) { - assert mConnectionPool != null; - Log.i(TAG, mConnectionPool.toString()); + private void collectDbStats(ArrayList<DbStats> dbStatsList) { + synchronized (mLock) { + if (mConnectionPoolLocked != null) { + mConnectionPoolLocked.collectDbStats(dbStatsList); } - return mConnectionPool.get(sql); } } - private void releaseDbConnection(SQLiteDatabase db) { - // ignore this release call if - // 1. the database is closed - // 2. OR, if db is NOT a pooled connection handle - // 3. OR, if the database being released is same as 'this' (this condition means - // that we should always be releasing a pooled connection handle by calling this method - // from the 'main' connection handle - if (!isOpen() || !db.isPooledConnection() || (db == this)) { - return; + private static ArrayList<SQLiteDatabase> getActiveDatabases() { + ArrayList<SQLiteDatabase> databases = new ArrayList<SQLiteDatabase>(); + synchronized (sActiveDatabases) { + databases.addAll(sActiveDatabases.keySet()); } - if (Log.isLoggable(TAG, Log.DEBUG)) { - assert isPooledConnection(); - assert mConnectionPool != null; - Log.d(TAG, "releaseDbConnection threadid = " + Thread.currentThread().getId() + - ", releasing # " + db.mConnectionNum + ", " + getPath()); - } - mConnectionPool.release(db); + return databases; } /** - * this method is used to collect data about ALL open databases in the current process. - * bugreport is a user of this data. + * Dump detailed information about all open databases in the current process. + * Used by bug report. */ - /* package */ static ArrayList<DbStats> getDbStats() { - ArrayList<DbStats> dbStatsList = new ArrayList<DbStats>(); - // make a local copy of mActiveDatabases - so that this method is not competing - // for synchronization lock on mActiveDatabases - ArrayList<WeakReference<SQLiteDatabase>> tempList; - synchronized(mActiveDatabases) { - tempList = (ArrayList<WeakReference<SQLiteDatabase>>)mActiveDatabases.clone(); + static void dumpAll(Printer printer) { + for (SQLiteDatabase db : getActiveDatabases()) { + db.dump(printer); } - for (WeakReference<SQLiteDatabase> w : tempList) { - SQLiteDatabase db = w.get(); - if (db == null || !db.isOpen()) { - continue; - } + } - try { - // get SQLITE_DBSTATUS_LOOKASIDE_USED for the db - int lookasideUsed = db.native_getDbLookaside(); - - // get the lastnode of the dbname - String path = db.getPath(); - int indx = path.lastIndexOf("/"); - String lastnode = path.substring((indx != -1) ? ++indx : 0); - - // get list of attached dbs and for each db, get its size and pagesize - List<Pair<String, String>> attachedDbs = db.getAttachedDbs(); - if (attachedDbs == null) { - continue; - } - for (int i = 0; i < attachedDbs.size(); i++) { - Pair<String, String> p = attachedDbs.get(i); - long pageCount = DatabaseUtils.longForQuery(db, "PRAGMA " + p.first - + ".page_count;", null); - - // first entry in the attached db list is always the main database - // don't worry about prefixing the dbname with "main" - String dbName; - if (i == 0) { - dbName = lastnode; - } else { - // lookaside is only relevant for the main db - lookasideUsed = 0; - dbName = " (attached) " + p.first; - // if the attached db has a path, attach the lastnode from the path to above - if (p.second.trim().length() > 0) { - int idx = p.second.lastIndexOf("/"); - dbName += " : " + p.second.substring((idx != -1) ? ++idx : 0); - } - } - if (pageCount > 0) { - dbStatsList.add(new DbStats(dbName, pageCount, db.getPageSize(), - lookasideUsed, db.getCacheHitNum(), db.getCacheMissNum(), - db.getCachesize())); - } - } - // if there are pooled connections, return the cache stats for them also. - // while we are trying to query the pooled connections for stats, some other thread - // could be disabling conneciton pool. so, grab a reference to the connection pool. - DatabaseConnectionPool connPool = db.mConnectionPool; - if (connPool != null) { - for (SQLiteDatabase pDb : connPool.getConnectionList()) { - dbStatsList.add(new DbStats("(pooled # " + pDb.mConnectionNum + ") " - + lastnode, 0, 0, 0, pDb.getCacheHitNum(), - pDb.getCacheMissNum(), pDb.getCachesize())); - } - } - } catch (SQLiteException e) { - // ignore. we don't care about exceptions when we are taking adb - // bugreport! + private void dump(Printer printer) { + synchronized (mLock) { + if (mConnectionPoolLocked != null) { + printer.println(""); + mConnectionPoolLocked.dump(printer); } } - return dbStatsList; } /** @@ -2532,23 +1688,27 @@ public class SQLiteDatabase extends SQLiteClosable { * is not open. */ public List<Pair<String, String>> getAttachedDbs() { - if (!isOpen()) { - return null; - } ArrayList<Pair<String, String>> attachedDbs = new ArrayList<Pair<String, String>>(); - if (!mHasAttachedDbs) { - // No attached databases. - // There is a small window where attached databases exist but this flag is not set yet. - // This can occur when this thread is in a race condition with another thread - // that is executing the SQL statement: "attach database <blah> as <foo>" - // If this thread is NOT ok with such a race condition (and thus possibly not receive - // the entire list of attached databases), then the caller should ensure that no thread - // is executing any SQL statements while a thread is calling this method. - // Typically, this method is called when 'adb bugreport' is done or the caller wants to - // collect stats on the database and all its attached databases. - attachedDbs.add(new Pair<String, String>("main", mPath)); - return attachedDbs; + synchronized (mLock) { + if (mConnectionPoolLocked == null) { + return null; // not open + } + + if (!mHasAttachedDbsLocked) { + // No attached databases. + // There is a small window where attached databases exist but this flag is not + // set yet. This can occur when this thread is in a race condition with another + // thread that is executing the SQL statement: "attach database <blah> as <foo>" + // If this thread is NOT ok with such a race condition (and thus possibly not + // receivethe entire list of attached databases), then the caller should ensure + // that no thread is executing any SQL statements while a thread is calling this + // method. Typically, this method is called when 'adb bugreport' is done or the + // caller wants to collect stats on the database and all its attached databases. + attachedDbs.add(new Pair<String, String>("main", mConfigurationLocked.path)); + return attachedDbs; + } } + // has attached databases. query sqlite to get the list of attached databases. Cursor c = null; try { @@ -2583,7 +1743,8 @@ public class SQLiteDatabase extends SQLiteClosable { * false otherwise. */ public boolean isDatabaseIntegrityOk() { - verifyDbIsOpen(); + throwIfNotOpen(); // fail fast + List<Pair<String, String>> attachedDbs = null; try { attachedDbs = getAttachedDbs(); @@ -2594,8 +1755,9 @@ public class SQLiteDatabase extends SQLiteClosable { } catch (SQLiteException e) { // can't get attachedDb list. do integrity check on the main database attachedDbs = new ArrayList<Pair<String, String>>(); - attachedDbs.add(new Pair<String, String>("main", this.mPath)); + attachedDbs.add(new Pair<String, String>("main", getPath())); } + for (int i = 0; i < attachedDbs.size(); i++) { Pair<String, String> p = attachedDbs.get(i); SQLiteStatement prog = null; @@ -2615,59 +1777,64 @@ public class SQLiteDatabase extends SQLiteClosable { } /** - * Native call to open the database. + * Prevent other threads from using the database's primary connection. * - * @param path The full path to the database - */ - private native void dbopen(String path, int flags); - - /** - * Native call to setup tracing of all SQL statements + * This method is only used by {@link SQLiteOpenHelper} when transitioning from + * a readable to a writable database. It should not be used in any other way. * - * @param path the full path to the database - * @param connectionNum connection number: 0 - N, where the main database - * connection handle is numbered 0 and the connection handles in the connection - * pool are numbered 1..N. + * @see #unlockPrimaryConnection() */ - private native void enableSqlTracing(String path, short connectionNum); + void lockPrimaryConnection() { + getThreadSession().beginTransaction(SQLiteSession.TRANSACTION_MODE_DEFERRED, + null, SQLiteConnectionPool.CONNECTION_FLAG_PRIMARY_CONNECTION_AFFINITY); + } /** - * Native call to setup profiling of all SQL statements. - * currently, sqlite's profiling = printing of execution-time - * (wall-clock time) of each of the SQL statements, as they - * are executed. + * Allow other threads to use the database's primary connection. * - * @param path the full path to the database - * @param connectionNum connection number: 0 - N, where the main database - * connection handle is numbered 0 and the connection handles in the connection - * pool are numbered 1..N. + * @see #lockPrimaryConnection() */ - private native void enableSqlProfiling(String path, short connectionNum); + void unlockPrimaryConnection() { + getThreadSession().endTransaction(); + } - /** - * Native call to set the locale. {@link #lock} must be held when calling - * this method. - * @throws SQLException - */ - private native void native_setLocale(String loc, int flags); + @Override + public String toString() { + return "SQLiteDatabase: " + getPath(); + } - /** - * return the SQLITE_DBSTATUS_LOOKASIDE_USED documented here - * http://www.sqlite.org/c3ref/c_dbstatus_lookaside_used.html - * @return int value of SQLITE_DBSTATUS_LOOKASIDE_USED - */ - private native int native_getDbLookaside(); + private void throwIfNotOpen() { + synchronized (mConnectionPoolLocked) { + throwIfNotOpenLocked(); + } + } + + private void throwIfNotOpenLocked() { + if (mConnectionPoolLocked == null) { + throw new IllegalStateException("The database '" + mConfigurationLocked.label + + "' is not open."); + } + } /** - * finalizes the given statement id. - * - * @param statementId statement to be finzlied by sqlite + * Used to allow returning sub-classes of {@link Cursor} when calling query. */ - private final native void native_finalize(int statementId); + public interface CursorFactory { + /** + * See {@link SQLiteCursor#SQLiteCursor(SQLiteCursorDriver, String, SQLiteQuery)}. + */ + public Cursor newCursor(SQLiteDatabase db, + SQLiteCursorDriver masterQuery, String editTable, + SQLiteQuery query); + } /** - * set sqlite soft heap limit - * http://www.sqlite.org/c3ref/soft_heap_limit64.html + * A callback interface for a custom sqlite3 function. + * This can be used to create a function that can be called from + * sqlite3 database triggers. + * @hide */ - private native void native_setSqliteSoftHeapLimit(int softHeapLimit); + public interface CustomFunction { + public void callback(String[] args); + } } diff --git a/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java b/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java new file mode 100644 index 000000000000..bc79ad3d4674 --- /dev/null +++ b/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java @@ -0,0 +1,167 @@ +/* + * 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.database.sqlite; + +import java.util.ArrayList; +import java.util.Locale; +import java.util.regex.Pattern; + +/** + * Describes how to configure a database. + * <p> + * The purpose of this object is to keep track of all of the little + * configuration settings that are applied to a database after it + * is opened so that they can be applied to all connections in the + * connection pool uniformly. + * </p><p> + * Each connection maintains its own copy of this object so it can + * keep track of which settings have already been applied. + * </p> + * + * @hide + */ +public final class SQLiteDatabaseConfiguration { + // The pattern we use to strip email addresses from database paths + // when constructing a label to use in log messages. + private static final Pattern EMAIL_IN_DB_PATTERN = + Pattern.compile("[\\w\\.\\-]+@[\\w\\.\\-]+"); + + /** + * Special path used by in-memory databases. + */ + public static final String MEMORY_DB_PATH = ":memory:"; + + /** + * The database path. + */ + public final String path; + + /** + * The flags used to open the database. + */ + public final int openFlags; + + /** + * The label to use to describe the database when it appears in logs. + * This is derived from the path but is stripped to remove PII. + */ + public final String label; + + /** + * The maximum number of connections to retain in the connection pool. + * Must be at least 1. + * + * Default is 1. + */ + public int maxConnectionPoolSize; + + /** + * The maximum size of the prepared statement cache for each database connection. + * Must be non-negative. + * + * Default is 25. + */ + public int maxSqlCacheSize; + + /** + * The database locale. + * + * Default is the value returned by {@link Locale#getDefault()}. + */ + public Locale locale; + + /** + * The custom functions to register. + */ + public final ArrayList<SQLiteCustomFunction> customFunctions = + new ArrayList<SQLiteCustomFunction>(); + + /** + * Creates a database configuration with the required parameters for opening a + * database and default values for all other parameters. + * + * @param path The database path. + * @param openFlags Open flags for the database, such as {@link SQLiteDatabase#OPEN_READWRITE}. + */ + public SQLiteDatabaseConfiguration(String path, int openFlags) { + if (path == null) { + throw new IllegalArgumentException("path must not be null."); + } + + this.path = path; + this.openFlags = openFlags; + label = stripPathForLogs(path); + + // Set default values for optional parameters. + maxConnectionPoolSize = 1; + maxSqlCacheSize = 25; + locale = Locale.getDefault(); + } + + /** + * Creates a database configuration as a copy of another configuration. + * + * @param other The other configuration. + */ + public SQLiteDatabaseConfiguration(SQLiteDatabaseConfiguration other) { + if (other == null) { + throw new IllegalArgumentException("other must not be null."); + } + + this.path = other.path; + this.openFlags = other.openFlags; + this.label = other.label; + updateParametersFrom(other); + } + + /** + * Updates the non-immutable parameters of this configuration object + * from the other configuration object. + * + * @param other The object from which to copy the parameters. + */ + public void updateParametersFrom(SQLiteDatabaseConfiguration other) { + if (other == null) { + throw new IllegalArgumentException("other must not be null."); + } + if (!path.equals(other.path) || openFlags != other.openFlags) { + throw new IllegalArgumentException("other configuration must refer to " + + "the same database."); + } + + maxConnectionPoolSize = other.maxConnectionPoolSize; + maxSqlCacheSize = other.maxSqlCacheSize; + locale = other.locale; + customFunctions.clear(); + customFunctions.addAll(other.customFunctions); + } + + /** + * Returns true if the database is in-memory. + * @return True if the database is in-memory. + */ + public boolean isInMemoryDb() { + return path.equalsIgnoreCase(MEMORY_DB_PATH); + } + + private static String stripPathForLogs(String path) { + if (path.indexOf('@') == -1) { + return path; + } + return EMAIL_IN_DB_PATTERN.matcher(path).replaceAll("XX@YY"); + } +} diff --git a/core/java/android/database/sqlite/SQLiteDebug.java b/core/java/android/database/sqlite/SQLiteDebug.java index 029bb4a87249..d87c3e4b810d 100644 --- a/core/java/android/database/sqlite/SQLiteDebug.java +++ b/core/java/android/database/sqlite/SQLiteDebug.java @@ -30,6 +30,12 @@ import android.util.Printer; */ public final class SQLiteDebug { /** + * Controls the printing of informational SQL log messages. + */ + public static final boolean DEBUG_SQL_LOG = + Log.isLoggable("SQLiteLog", Log.VERBOSE); + + /** * Controls the printing of SQL statements as they are executed. */ public static final boolean DEBUG_SQL_STATEMENTS = @@ -186,6 +192,7 @@ public final class SQLiteDebug { * @param printer The printer for dumping database state. */ public static void dump(Printer printer, String[] args) { + SQLiteDatabase.dumpAll(printer); } /** diff --git a/core/java/android/database/sqlite/SQLiteDirectCursorDriver.java b/core/java/android/database/sqlite/SQLiteDirectCursorDriver.java index a5e762e66f7a..52fd1d2709fa 100644 --- a/core/java/android/database/sqlite/SQLiteDirectCursorDriver.java +++ b/core/java/android/database/sqlite/SQLiteDirectCursorDriver.java @@ -25,10 +25,9 @@ import android.database.sqlite.SQLiteDatabase.CursorFactory; * @hide */ public class SQLiteDirectCursorDriver implements SQLiteCursorDriver { - private String mEditTable; - private SQLiteDatabase mDatabase; - private Cursor mCursor; - private String mSql; + private final SQLiteDatabase mDatabase; + private final String mEditTable; + private final String mSql; private SQLiteQuery mQuery; public SQLiteDirectCursorDriver(SQLiteDatabase db, String sql, String editTable) { @@ -38,33 +37,27 @@ public class SQLiteDirectCursorDriver implements SQLiteCursorDriver { } public Cursor query(CursorFactory factory, String[] selectionArgs) { - // Compile the query - SQLiteQuery query = null; - + final SQLiteQuery query = new SQLiteQuery(mDatabase, mSql); + final Cursor cursor; try { - mDatabase.lock(mSql); - mDatabase.closePendingStatements(); - query = new SQLiteQuery(mDatabase, mSql, 0, selectionArgs); + query.bindAllArgsAsStrings(selectionArgs); - // Create the cursor if (factory == null) { - mCursor = new SQLiteCursor(this, mEditTable, query); + cursor = new SQLiteCursor(this, mEditTable, query); } else { - mCursor = factory.newCursor(mDatabase, this, mEditTable, query); + cursor = factory.newCursor(mDatabase, this, mEditTable, query); } - - mQuery = query; - query = null; - return mCursor; - } finally { - // Make sure this object is cleaned up if something happens - if (query != null) query.close(); - mDatabase.unlock(); + } catch (RuntimeException ex) { + query.close(); + throw ex; } + + mQuery = query; + return cursor; } public void cursorClosed() { - mCursor = null; + // Do nothing } public void setBindArguments(String[] bindArgs) { diff --git a/core/java/android/database/sqlite/SQLiteGlobal.java b/core/java/android/database/sqlite/SQLiteGlobal.java new file mode 100644 index 000000000000..5e129be721bc --- /dev/null +++ b/core/java/android/database/sqlite/SQLiteGlobal.java @@ -0,0 +1,89 @@ +/* + * 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.database.sqlite; + +import android.os.StatFs; + +/** + * Provides access to SQLite functions that affect all database connection, + * such as memory management. + * + * @hide + */ +public final class SQLiteGlobal { + private static final String TAG = "SQLiteGlobal"; + + private static final Object sLock = new Object(); + private static boolean sInitialized; + private static int sSoftHeapLimit; + private static int sDefaultPageSize; + + private static native void nativeConfig(boolean verboseLog, int softHeapLimit); + private static native int nativeReleaseMemory(int bytesToFree); + + private SQLiteGlobal() { + } + + /** + * Initializes global SQLite settings the first time it is called. + * Should be called before opening the first (or any) database. + * Does nothing on repeated subsequent calls. + */ + public static void initializeOnce() { + synchronized (sLock) { + if (!sInitialized) { + sInitialized = true; + + // Limit to 8MB for now. This is 4 times the maximum cursor window + // size, as has been used by the original code in SQLiteDatabase for + // a long time. + // TODO: We really do need to test whether this helps or hurts us. + sSoftHeapLimit = 8 * 1024 * 1024; + + // Configure SQLite. + nativeConfig(SQLiteDebug.DEBUG_SQL_LOG, sSoftHeapLimit); + } + } + } + + /** + * Attempts to release memory by pruning the SQLite page cache and other + * internal data structures. + * + * @return The number of bytes that were freed. + */ + public static int releaseMemory() { + synchronized (sLock) { + if (!sInitialized) { + return 0; + } + return nativeReleaseMemory(sSoftHeapLimit); + } + } + + /** + * Gets the default page size to use when creating a database. + */ + public static int getDefaultPageSize() { + synchronized (sLock) { + if (sDefaultPageSize == 0) { + sDefaultPageSize = new StatFs("/data").getBlockSize(); + } + return sDefaultPageSize; + } + } +} diff --git a/core/java/android/database/sqlite/SQLiteOpenHelper.java b/core/java/android/database/sqlite/SQLiteOpenHelper.java index 56cf94832cda..31da7e4e9caf 100644 --- a/core/java/android/database/sqlite/SQLiteOpenHelper.java +++ b/core/java/android/database/sqlite/SQLiteOpenHelper.java @@ -143,12 +143,14 @@ public abstract class SQLiteOpenHelper { // If we have a read-only database open, someone could be using it // (though they shouldn't), which would cause a lock to be held on // the file, and our attempts to open the database read-write would - // fail waiting for the file lock. To prevent that, we acquire the - // lock on the read-only database, which shuts out other users. + // fail waiting for the file lock. To prevent that, we acquire a lock + // on the read-only database, which shuts out other users. boolean success = false; SQLiteDatabase db = null; - if (mDatabase != null) mDatabase.lock(); + if (mDatabase != null) { + mDatabase.lockPrimaryConnection(); + } try { mIsInitializing = true; if (mName == null) { @@ -185,11 +187,13 @@ public abstract class SQLiteOpenHelper { if (success) { if (mDatabase != null) { try { mDatabase.close(); } catch (Exception e) { } - mDatabase.unlock(); + mDatabase.unlockPrimaryConnection(); } mDatabase = db; } else { - if (mDatabase != null) mDatabase.unlock(); + if (mDatabase != null) { + mDatabase.unlockPrimaryConnection(); + } if (db != null) db.close(); } } diff --git a/core/java/android/database/sqlite/SQLiteProgram.java b/core/java/android/database/sqlite/SQLiteProgram.java index 2bbc6d70c2a6..81944587aa4d 100644 --- a/core/java/android/database/sqlite/SQLiteProgram.java +++ b/core/java/android/database/sqlite/SQLiteProgram.java @@ -17,225 +17,104 @@ package android.database.sqlite; import android.database.DatabaseUtils; -import android.database.Cursor; -import java.util.HashMap; +import java.util.Arrays; /** * A base class for compiled SQLite programs. - *<p> - * SQLiteProgram is NOT internally synchronized so code using a SQLiteProgram from multiple - * threads should perform its own synchronization when using the SQLiteProgram. + * <p> + * This class is not thread-safe. + * </p> */ public abstract class SQLiteProgram extends SQLiteClosable { + private static final String[] EMPTY_STRING_ARRAY = new String[0]; - private static final String TAG = "SQLiteProgram"; + private final SQLiteDatabase mDatabase; + private final String mSql; + private final boolean mReadOnly; + private final String[] mColumnNames; + private final int mNumParameters; + private final Object[] mBindArgs; - /** The database this program is compiled against. - * @hide - */ - protected SQLiteDatabase mDatabase; - - /** The SQL used to create this query */ - /* package */ final String mSql; - - /** - * Native linkage, do not modify. This comes from the database and should not be modified - * in here or in the native code. - * @hide - */ - protected int nHandle; - - /** - * the SQLiteCompiledSql object for the given sql statement. - */ - /* package */ SQLiteCompiledSql mCompiledSql; - - /** - * SQLiteCompiledSql statement id is populated with the corresponding object from the above - * member. This member is used by the native_bind_* methods - * @hide - */ - protected int nStatement; - - /** - * In the case of {@link SQLiteStatement}, this member stores the bindargs passed - * to the following methods, instead of actually doing the binding. - * <ul> - * <li>{@link #bindBlob(int, byte[])}</li> - * <li>{@link #bindDouble(int, double)}</li> - * <li>{@link #bindLong(int, long)}</li> - * <li>{@link #bindNull(int)}</li> - * <li>{@link #bindString(int, String)}</li> - * </ul> - * <p> - * Each entry in the array is a Pair of - * <ol> - * <li>bind arg position number</li> - * <li>the value to be bound to the bindarg</li> - * </ol> - * <p> - * It is lazily initialized in the above bind methods - * and it is cleared in {@link #clearBindings()} method. - * <p> - * It is protected (in multi-threaded environment) by {@link SQLiteProgram}.this - */ - /* package */ HashMap<Integer, Object> mBindArgs = null; - /* package */ final int mStatementType; - /* package */ static final int STATEMENT_CACHEABLE = 16; - /* package */ static final int STATEMENT_DONT_PREPARE = 32; - /* package */ static final int STATEMENT_USE_POOLED_CONN = 64; - /* package */ static final int STATEMENT_TYPE_MASK = 0x0f; - - /* package */ SQLiteProgram(SQLiteDatabase db, String sql) { - this(db, sql, null, true); - } - - /* package */ SQLiteProgram(SQLiteDatabase db, String sql, Object[] bindArgs, - boolean compileFlag) { + SQLiteProgram(SQLiteDatabase db, String sql, Object[] bindArgs) { + mDatabase = db; mSql = sql.trim(); + int n = DatabaseUtils.getSqlStatementType(mSql); switch (n) { - case DatabaseUtils.STATEMENT_UPDATE: - mStatementType = n | STATEMENT_CACHEABLE; - break; - case DatabaseUtils.STATEMENT_SELECT: - mStatementType = n | STATEMENT_CACHEABLE | STATEMENT_USE_POOLED_CONN; - break; case DatabaseUtils.STATEMENT_BEGIN: case DatabaseUtils.STATEMENT_COMMIT: case DatabaseUtils.STATEMENT_ABORT: - mStatementType = n | STATEMENT_DONT_PREPARE; + mReadOnly = false; + mColumnNames = EMPTY_STRING_ARRAY; + mNumParameters = 0; break; + default: - mStatementType = n; - } - db.acquireReference(); - db.addSQLiteClosable(this); - mDatabase = db; - nHandle = db.mNativeHandle; - if (bindArgs != null) { - int size = bindArgs.length; - for (int i = 0; i < size; i++) { - this.addToBindArgs(i + 1, bindArgs[i]); - } - } - if (compileFlag) { - compileAndbindAllArgs(); + boolean assumeReadOnly = (n == DatabaseUtils.STATEMENT_SELECT); + SQLiteStatementInfo info = new SQLiteStatementInfo(); + db.getThreadSession().prepare(mSql, + db.getThreadDefaultConnectionFlags(assumeReadOnly), info); + mReadOnly = info.readOnly; + mColumnNames = info.columnNames; + mNumParameters = info.numParameters; + break; } - } - private void compileSql() { - // only cache CRUD statements - if ((mStatementType & STATEMENT_CACHEABLE) == 0) { - mCompiledSql = new SQLiteCompiledSql(mDatabase, mSql); - nStatement = mCompiledSql.nStatement; - // since it is not in the cache, no need to acquire() it. - return; + if (mNumParameters != 0) { + mBindArgs = new Object[mNumParameters]; + } else { + mBindArgs = null; } - mCompiledSql = mDatabase.getCompiledStatementForSql(mSql); - if (mCompiledSql == null) { - // create a new compiled-sql obj - mCompiledSql = new SQLiteCompiledSql(mDatabase, mSql); - - // add it to the cache of compiled-sqls - // but before adding it and thus making it available for anyone else to use it, - // make sure it is acquired by me. - mCompiledSql.acquire(); - mDatabase.addToCompiledQueries(mSql, mCompiledSql); - } else { - // it is already in compiled-sql cache. - // try to acquire the object. - if (!mCompiledSql.acquire()) { - int last = mCompiledSql.nStatement; - // the SQLiteCompiledSql in cache is in use by some other SQLiteProgram object. - // we can't have two different SQLiteProgam objects can't share the same - // CompiledSql object. create a new one. - // finalize it when I am done with it in "this" object. - mCompiledSql = new SQLiteCompiledSql(mDatabase, mSql); - // since it is not in the cache, no need to acquire() it. + if (bindArgs != null) { + if (bindArgs.length > mNumParameters) { + throw new IllegalArgumentException("Too many bind arguments. " + + bindArgs.length + " arguments were provided but the statement needs " + + mNumParameters + " arguments."); } + System.arraycopy(bindArgs, 0, mBindArgs, 0, bindArgs.length); } - nStatement = mCompiledSql.nStatement; } - @Override - protected void onAllReferencesReleased() { - release(); - mDatabase.removeSQLiteClosable(this); - mDatabase.releaseReference(); + final SQLiteDatabase getDatabase() { + return mDatabase; } - @Override - protected void onAllReferencesReleasedFromContainer() { - release(); - mDatabase.releaseReference(); + final String getSql() { + return mSql; } - /* package */ void release() { - if (mCompiledSql == null) { - return; - } - mDatabase.releaseCompiledSqlObj(mSql, mCompiledSql); - mCompiledSql = null; - nStatement = 0; + final Object[] getBindArgs() { + return mBindArgs; } - /** - * Returns a unique identifier for this program. - * - * @return a unique identifier for this program - * @deprecated do not use this method. it is not guaranteed to be the same across executions of - * the SQL statement contained in this object. - */ - @Deprecated - public final int getUniqueId() { - return -1; + final String[] getColumnNames() { + return mColumnNames; } - /** - * used only for testing purposes - */ - /* package */ int getSqlStatementId() { - synchronized(this) { - return (mCompiledSql == null) ? 0 : nStatement; - } + /** @hide */ + protected final SQLiteSession getSession() { + return mDatabase.getThreadSession(); } - /* package */ String getSqlString() { - return mSql; + /** @hide */ + protected final int getConnectionFlags() { + return mDatabase.getThreadDefaultConnectionFlags(mReadOnly); } - private void bind(int type, int index, Object value) { - mDatabase.verifyDbIsOpen(); - addToBindArgs(index, (type == Cursor.FIELD_TYPE_NULL) ? null : value); - if (nStatement > 0) { - // bind only if the SQL statement is compiled - acquireReference(); - try { - switch (type) { - case Cursor.FIELD_TYPE_NULL: - native_bind_null(index); - break; - case Cursor.FIELD_TYPE_BLOB: - native_bind_blob(index, (byte[]) value); - break; - case Cursor.FIELD_TYPE_FLOAT: - native_bind_double(index, (Double) value); - break; - case Cursor.FIELD_TYPE_INTEGER: - native_bind_long(index, (Long) value); - break; - case Cursor.FIELD_TYPE_STRING: - default: - native_bind_string(index, (String) value); - break; - } - } finally { - releaseReference(); - } - } + /** @hide */ + protected final void onCorruption() { + mDatabase.onCorruption(); + } + + /** + * Unimplemented. + * @deprecated This method is deprecated and must not be used. + */ + @Deprecated + public final int getUniqueId() { + return -1; } /** @@ -245,7 +124,7 @@ public abstract class SQLiteProgram extends SQLiteClosable { * @param index The 1-based index to the parameter to bind null to */ public void bindNull(int index) { - bind(Cursor.FIELD_TYPE_NULL, index, null); + bind(index, null); } /** @@ -256,7 +135,7 @@ public abstract class SQLiteProgram extends SQLiteClosable { * @param value The value to bind */ public void bindLong(int index, long value) { - bind(Cursor.FIELD_TYPE_INTEGER, index, value); + bind(index, value); } /** @@ -267,7 +146,7 @@ public abstract class SQLiteProgram extends SQLiteClosable { * @param value The value to bind */ public void bindDouble(int index, double value) { - bind(Cursor.FIELD_TYPE_FLOAT, index, value); + bind(index, value); } /** @@ -275,13 +154,13 @@ public abstract class SQLiteProgram extends SQLiteClosable { * {@link #clearBindings} is called. * * @param index The 1-based index to the parameter to bind - * @param value The value to bind + * @param value The value to bind, must not be null */ public void bindString(int index, String value) { if (value == null) { throw new IllegalArgumentException("the bind value at index " + index + " is null"); } - bind(Cursor.FIELD_TYPE_STRING, index, value); + bind(index, value); } /** @@ -289,29 +168,21 @@ public abstract class SQLiteProgram extends SQLiteClosable { * {@link #clearBindings} is called. * * @param index The 1-based index to the parameter to bind - * @param value The value to bind + * @param value The value to bind, must not be null */ public void bindBlob(int index, byte[] value) { if (value == null) { throw new IllegalArgumentException("the bind value at index " + index + " is null"); } - bind(Cursor.FIELD_TYPE_BLOB, index, value); + bind(index, value); } /** * Clears all existing bindings. Unset bindings are treated as NULL. */ public void clearBindings() { - mBindArgs = null; - if (this.nStatement == 0) { - return; - } - mDatabase.verifyDbIsOpen(); - acquireReference(); - try { - native_clear_bindings(); - } finally { - releaseReference(); + if (mBindArgs != null) { + Arrays.fill(mBindArgs, null); } } @@ -319,102 +190,33 @@ public abstract class SQLiteProgram extends SQLiteClosable { * Release this program's resources, making it invalid. */ public void close() { - mBindArgs = null; - if (nHandle == 0 || !mDatabase.isOpen()) { - return; - } releaseReference(); } - private void addToBindArgs(int index, Object value) { - if (mBindArgs == null) { - mBindArgs = new HashMap<Integer, Object>(); - } - mBindArgs.put(index, value); - } - - /* package */ void compileAndbindAllArgs() { - if ((mStatementType & STATEMENT_DONT_PREPARE) > 0) { - if (mBindArgs != null) { - throw new IllegalArgumentException("Can't pass bindargs for this sql :" + mSql); - } - // no need to prepare this SQL statement - return; - } - if (nStatement == 0) { - // SQL statement is not compiled yet. compile it now. - compileSql(); - } - if (mBindArgs == null) { - return; - } - for (int index : mBindArgs.keySet()) { - Object value = mBindArgs.get(index); - if (value == null) { - native_bind_null(index); - } else if (value instanceof Double || value instanceof Float) { - native_bind_double(index, ((Number) value).doubleValue()); - } else if (value instanceof Number) { - native_bind_long(index, ((Number) value).longValue()); - } else if (value instanceof Boolean) { - Boolean bool = (Boolean)value; - native_bind_long(index, (bool) ? 1 : 0); - if (bool) { - native_bind_long(index, 1); - } else { - native_bind_long(index, 0); - } - } else if (value instanceof byte[]){ - native_bind_blob(index, (byte[]) value); - } else { - native_bind_string(index, value.toString()); - } - } - } - /** * Given an array of String bindArgs, this method binds all of them in one single call. * - * @param bindArgs the String array of bind args. + * @param bindArgs the String array of bind args, none of which must be null. */ public void bindAllArgsAsStrings(String[] bindArgs) { - if (bindArgs == null) { - return; - } - int size = bindArgs.length; - for (int i = 0; i < size; i++) { - bindString(i + 1, bindArgs[i]); + if (bindArgs != null) { + for (int i = bindArgs.length; i != 0; i--) { + bindString(i, bindArgs[i - 1]); + } } } - /* package */ synchronized final void setNativeHandle(int nHandle) { - this.nHandle = nHandle; + @Override + protected void onAllReferencesReleased() { + clearBindings(); } - /** - * @hide - * Compiles SQL into a SQLite program. - * - * <P>The database lock must be held when calling this method. - * @param sql The SQL to compile. - */ - protected final native void native_compile(String sql); - - /** - * @hide - */ - protected final native void native_finalize(); - - /** @hide */ - protected final native void native_bind_null(int index); - /** @hide */ - protected final native void native_bind_long(int index, long value); - /** @hide */ - protected final native void native_bind_double(int index, double value); - /** @hide */ - protected final native void native_bind_string(int index, String value); - /** @hide */ - protected final native void native_bind_blob(int index, byte[] value); - private final native void native_clear_bindings(); + private void bind(int index, Object value) { + if (index < 1 || index > mNumParameters) { + throw new IllegalArgumentException("Cannot bind argument at index " + + index + " because the index is out of range. " + + "The statement has " + mNumParameters + " parameters."); + } + mBindArgs[index - 1] = value; + } } - diff --git a/core/java/android/database/sqlite/SQLiteQuery.java b/core/java/android/database/sqlite/SQLiteQuery.java index 6dd25393674c..17aa8865ee49 100644 --- a/core/java/android/database/sqlite/SQLiteQuery.java +++ b/core/java/android/database/sqlite/SQLiteQuery.java @@ -17,60 +17,24 @@ package android.database.sqlite; import android.database.CursorWindow; -import android.os.SystemClock; -import android.text.TextUtils; import android.util.Log; /** - * A SQLite program that represents a query that reads the resulting rows into a CursorWindow. - * This class is used by SQLiteCursor and isn't useful itself. - * - * SQLiteQuery is not internally synchronized so code using a SQLiteQuery from multiple - * threads should perform its own synchronization when using the SQLiteQuery. + * Represents a query that reads the resulting rows into a {@link SQLiteQuery}. + * This class is used by {@link SQLiteCursor} and isn't useful itself. + * <p> + * This class is not thread-safe. + * </p> */ public final class SQLiteQuery extends SQLiteProgram { private static final String TAG = "SQLiteQuery"; - private static native long nativeFillWindow(int databasePtr, int statementPtr, int windowPtr, - int offsetParam, int startPos, int requiredPos, boolean countAllRows); - - private static native int nativeColumnCount(int statementPtr); - private static native String nativeColumnName(int statementPtr, int columnIndex); - - /** The index of the unbound OFFSET parameter */ - private int mOffsetIndex = 0; - - private boolean mClosed = false; - - /** - * Create a persistent query object. - * - * @param db The database that this query object is associated with - * @param query The SQL string for this query. - * @param offsetIndex The 1-based index to the OFFSET parameter, - */ - /* package */ SQLiteQuery(SQLiteDatabase db, String query, int offsetIndex, String[] bindArgs) { - super(db, query); - mOffsetIndex = offsetIndex; - bindAllArgsAsStrings(bindArgs); - } - - /** - * Constructor used to create new instance to replace a given instance of this class. - * This constructor is used when the current Query object is now associated with a different - * {@link SQLiteDatabase} object. - * - * @param db The database that this query object is associated with - * @param query the instance of {@link SQLiteQuery} to be replaced - */ - /* package */ SQLiteQuery(SQLiteDatabase db, SQLiteQuery query) { - super(db, query.mSql); - this.mBindArgs = query.mBindArgs; - this.mOffsetIndex = query.mOffsetIndex; + SQLiteQuery(SQLiteDatabase db, String query) { + super(db, query, null); } /** - * Reads rows into a buffer. This method acquires the database lock. + * Reads rows into a buffer. * * @param window The window to fill into * @param startPos The start position for filling the window. @@ -81,106 +45,30 @@ public final class SQLiteQuery extends SQLiteProgram { * @return Number of rows that were enumerated. Might not be all rows * unless countAllRows is true. */ - /* package */ int fillWindow(CursorWindow window, - int startPos, int requiredPos, boolean countAllRows) { - mDatabase.lock(mSql); - long timeStart = SystemClock.uptimeMillis(); + int fillWindow(CursorWindow window, int startPos, int requiredPos, boolean countAllRows) { + acquireReference(); try { - acquireReference(); + window.acquireReference(); try { - window.acquireReference(); - long result = nativeFillWindow(nHandle, nStatement, window.mWindowPtr, - mOffsetIndex, startPos, requiredPos, countAllRows); - int actualPos = (int)(result >> 32); - int countedRows = (int)result; - window.setStartPosition(actualPos); - if (SQLiteDebug.DEBUG_LOG_SLOW_QUERIES) { - long elapsed = SystemClock.uptimeMillis() - timeStart; - if (SQLiteDebug.shouldLogSlowQuery(elapsed)) { - Log.d(TAG, "fillWindow took " + elapsed - + " ms: window=\"" + window - + "\", startPos=" + startPos - + ", requiredPos=" + requiredPos - + ", offset=" + mOffsetIndex - + ", actualPos=" + actualPos - + ", filledRows=" + window.getNumRows() - + ", countedRows=" + countedRows - + ", query=\"" + mSql + "\"" - + ", args=[" + (mBindArgs != null ? - TextUtils.join(", ", mBindArgs.values()) : "") - + "]"); - } - } - mDatabase.logTimeStat(mSql, timeStart); - return countedRows; - } catch (IllegalStateException e){ - // simply ignore it - return 0; - } catch (SQLiteDatabaseCorruptException e) { - mDatabase.onCorruption(); - throw e; - } catch (SQLiteException e) { - Log.e(TAG, "exception: " + e.getMessage() + "; query: " + mSql); - throw e; + int numRows = getSession().executeForCursorWindow(getSql(), getBindArgs(), + window, startPos, requiredPos, countAllRows, getConnectionFlags()); + return numRows; + } catch (SQLiteDatabaseCorruptException ex) { + onCorruption(); + throw ex; + } catch (SQLiteException ex) { + Log.e(TAG, "exception: " + ex.getMessage() + "; query: " + getSql()); + throw ex; } finally { window.releaseReference(); } } finally { releaseReference(); - mDatabase.unlock(); - } - } - - /** - * Get the column count for the statement. Only valid on query based - * statements. The database must be locked - * when calling this method. - * - * @return The number of column in the statement's result set. - */ - /* package */ int columnCountLocked() { - acquireReference(); - try { - return nativeColumnCount(nStatement); - } finally { - releaseReference(); - } - } - - /** - * Retrieves the column name for the given column index. The database must be locked - * when calling this method. - * - * @param columnIndex the index of the column to get the name for - * @return The requested column's name - */ - /* package */ String columnNameLocked(int columnIndex) { - acquireReference(); - try { - return nativeColumnName(nStatement, columnIndex); - } finally { - releaseReference(); } } @Override public String toString() { - return "SQLiteQuery: " + mSql; - } - - @Override - public void close() { - super.close(); - mClosed = true; - } - - /** - * Called by SQLiteCursor when it is requeried. - */ - /* package */ void requery() { - if (mClosed) { - throw new IllegalStateException("requerying a closed cursor"); - } - compileAndbindAllArgs(); + return "SQLiteQuery: " + getSql(); } } diff --git a/core/java/android/database/sqlite/SQLiteQueryBuilder.java b/core/java/android/database/sqlite/SQLiteQueryBuilder.java index 8f8eb6e4d331..1b7b39800d35 100644 --- a/core/java/android/database/sqlite/SQLiteQueryBuilder.java +++ b/core/java/android/database/sqlite/SQLiteQueryBuilder.java @@ -341,7 +341,7 @@ public class SQLiteQueryBuilder // in both the wrapped and original forms. String sqlForValidation = buildQuery(projectionIn, "(" + selection + ")", groupBy, having, sortOrder, limit); - validateSql(db, sqlForValidation); // will throw if query is invalid + validateQuerySql(db, sqlForValidation); // will throw if query is invalid } String sql = buildQuery( @@ -357,16 +357,12 @@ public class SQLiteQueryBuilder } /** - * Verifies that a SQL statement is valid by compiling it. + * Verifies that a SQL SELECT statement is valid by compiling it. * If the SQL statement is not valid, this method will throw a {@link SQLiteException}. */ - private void validateSql(SQLiteDatabase db, String sql) { - db.lock(sql); - try { - new SQLiteCompiledSql(db, sql).releaseSqlStatement(); - } finally { - db.unlock(); - } + private void validateQuerySql(SQLiteDatabase db, String sql) { + db.getThreadSession().prepare(sql, + db.getThreadDefaultConnectionFlags(true /*readOnly*/), null); } /** diff --git a/core/java/android/database/sqlite/SQLiteSession.java b/core/java/android/database/sqlite/SQLiteSession.java new file mode 100644 index 000000000000..61fe45af5947 --- /dev/null +++ b/core/java/android/database/sqlite/SQLiteSession.java @@ -0,0 +1,878 @@ +/* + * 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.database.sqlite; + +import android.database.CursorWindow; +import android.database.DatabaseUtils; +import android.os.ParcelFileDescriptor; + +/** + * Provides a single client the ability to use a database. + * + * <h2>About database sessions</h2> + * <p> + * Database access is always performed using a session. The session + * manages the lifecycle of transactions and database connections. + * </p><p> + * Sessions can be used to perform both read-only and read-write operations. + * There is some advantage to knowing when a session is being used for + * read-only purposes because the connection pool can optimize the use + * of the available connections to permit multiple read-only operations + * to execute in parallel whereas read-write operations may need to be serialized. + * </p><p> + * When <em>Write Ahead Logging (WAL)</em> is enabled, the database can + * execute simultaneous read-only and read-write transactions, provided that + * at most one read-write transaction is performed at a time. When WAL is not + * enabled, read-only transactions can execute in parallel but read-write + * transactions are mutually exclusive. + * </p> + * + * <h2>Ownership and concurrency guarantees</h2> + * <p> + * Session objects are not thread-safe. In fact, session objects are thread-bound. + * The {@link SQLiteDatabase} uses a thread-local variable to associate a session + * with each thread for the use of that thread alone. Consequently, each thread + * has its own session object and therefore its own transaction state independent + * of other threads. + * </p><p> + * A thread has at most one session per database. This constraint ensures that + * a thread can never use more than one database connection at a time for a + * given database. As the number of available database connections is limited, + * if a single thread tried to acquire multiple connections for the same database + * at the same time, it might deadlock. Therefore we allow there to be only + * one session (so, at most one connection) per thread per database. + * </p> + * + * <h2>Transactions</h2> + * <p> + * There are two kinds of transaction: implicit transactions and explicit + * transactions. + * </p><p> + * An implicit transaction is created whenever a database operation is requested + * and there is no explicit transaction currently in progress. An implicit transaction + * only lasts for the duration of the database operation in question and then it + * is ended. If the database operation was successful, then its changes are committed. + * </p><p> + * An explicit transaction is started by calling {@link #beginTransaction} and + * specifying the desired transaction mode. Once an explicit transaction has begun, + * all subsequent database operations will be performed as part of that transaction. + * To end an explicit transaction, first call {@link #setTransactionSuccessful} if the + * transaction was successful, then call {@link #end}. If the transaction was + * marked successful, its changes will be committed, otherwise they will be rolled back. + * </p><p> + * Explicit transactions can also be nested. A nested explicit transaction is + * started with {@link #beginTransaction}, marked successful with + * {@link #setTransactionSuccessful}and ended with {@link #endTransaction}. + * If any nested transaction is not marked successful, then the entire transaction + * including all of its nested transactions will be rolled back + * when the outermost transaction is ended. + * </p><p> + * To improve concurrency, an explicit transaction can be yielded by calling + * {@link #yieldTransaction}. If there is contention for use of the database, + * then yielding ends the current transaction, commits its changes, releases the + * database connection for use by another session for a little while, and starts a + * new transaction with the same properties as the original one. + * Changes committed by {@link #yieldTransaction} cannot be rolled back. + * </p><p> + * When a transaction is started, the client can provide a {@link SQLiteTransactionListener} + * to listen for notifications of transaction-related events. + * </p><p> + * Recommended usage: + * <code><pre> + * // First, begin the transaction. + * session.beginTransaction(SQLiteSession.TRANSACTION_MODE_DEFERRED, 0); + * try { + * // Then do stuff... + * session.execute("INSERT INTO ...", null, 0); + * + * // As the very last step before ending the transaction, mark it successful. + * session.setTransactionSuccessful(); + * } finally { + * // Finally, end the transaction. + * // This statement will commit the transaction if it was marked successful or + * // roll it back otherwise. + * session.endTransaction(); + * } + * </pre></code> + * </p> + * + * <h2>Database connections</h2> + * <p> + * A {@link SQLiteDatabase} can have multiple active sessions at the same + * time. Each session acquires and releases connections to the database + * as needed to perform each requested database transaction. If all connections + * are in use, then database transactions on some sessions will block until a + * connection becomes available. + * </p><p> + * The session acquires a single database connection only for the duration + * of a single (implicit or explicit) database transaction, then releases it. + * This characteristic allows a small pool of database connections to be shared + * efficiently by multiple sessions as long as they are not all trying to perform + * database transactions at the same time. + * </p> + * + * <h2>Responsiveness</h2> + * <p> + * Because there are a limited number of database connections and the session holds + * a database connection for the entire duration of a database transaction, + * it is important to keep transactions short. This is especially important + * for read-write transactions since they may block other transactions + * from executing. Consider calling {@link #yieldTransaction} periodically + * during long-running transactions. + * </p><p> + * Another important consideration is that transactions that take too long to + * run may cause the application UI to become unresponsive. Even if the transaction + * is executed in a background thread, the user will get bored and + * frustrated if the application shows no data for several seconds while + * a transaction runs. + * </p><p> + * Guidelines: + * <ul> + * <li>Do not perform database transactions on the UI thread.</li> + * <li>Keep database transactions as short as possible.</li> + * <li>Simple queries often run faster than complex queries.</li> + * <li>Measure the performance of your database transactions.</li> + * <li>Consider what will happen when the size of the data set grows. + * A query that works well on 100 rows may struggle with 10,000.</li> + * </ul> + * + * TODO: Support timeouts on all possibly blocking operations. + * + * @hide + */ +public final class SQLiteSession { + private final SQLiteConnectionPool mConnectionPool; + + private SQLiteConnection mConnection; + private int mConnectionFlags; + private Transaction mTransactionPool; + private Transaction mTransactionStack; + + /** + * Transaction mode: Deferred. + * <p> + * In a deferred transaction, no locks are acquired on the database + * until the first operation is performed. If the first operation is + * read-only, then a <code>SHARED</code> lock is acquired, otherwise + * a <code>RESERVED</code> lock is acquired. + * </p><p> + * While holding a <code>SHARED</code> lock, this session is only allowed to + * read but other sessions are allowed to read or write. + * While holding a <code>RESERVED</code> lock, this session is allowed to read + * or write but other sessions are only allowed to read. + * </p><p> + * Because the lock is only acquired when needed in a deferred transaction, + * it is possible for another session to write to the database first before + * this session has a chance to do anything. + * </p><p> + * Corresponds to the SQLite <code>BEGIN DEFERRED</code> transaction mode. + * </p> + */ + public static final int TRANSACTION_MODE_DEFERRED = 0; + + /** + * Transaction mode: Immediate. + * <p> + * When an immediate transaction begins, the session acquires a + * <code>RESERVED</code> lock. + * </p><p> + * While holding a <code>RESERVED</code> lock, this session is allowed to read + * or write but other sessions are only allowed to read. + * </p><p> + * Corresponds to the SQLite <code>BEGIN IMMEDIATE</code> transaction mode. + * </p> + */ + public static final int TRANSACTION_MODE_IMMEDIATE = 1; + + /** + * Transaction mode: Exclusive. + * <p> + * When an exclusive transaction begins, the session acquires an + * <code>EXCLUSIVE</code> lock. + * </p><p> + * While holding an <code>EXCLUSIVE</code> lock, this session is allowed to read + * or write but no other sessions are allowed to access the database. + * </p><p> + * Corresponds to the SQLite <code>BEGIN EXCLUSIVE</code> transaction mode. + * </p> + */ + public static final int TRANSACTION_MODE_EXCLUSIVE = 2; + + /** + * Creates a session bound to the specified connection pool. + * + * @param connectionPool The connection pool. + */ + public SQLiteSession(SQLiteConnectionPool connectionPool) { + if (connectionPool == null) { + throw new IllegalArgumentException("connectionPool must not be null"); + } + + mConnectionPool = connectionPool; + } + + /** + * Returns true if the session has a transaction in progress. + * + * @return True if the session has a transaction in progress. + */ + public boolean hasTransaction() { + return mTransactionStack != null; + } + + /** + * Returns true if the session has a nested transaction in progress. + * + * @return True if the session has a nested transaction in progress. + */ + public boolean hasNestedTransaction() { + return mTransactionStack != null && mTransactionStack.mParent != null; + } + + /** + * Returns true if the session has an active database connection. + * + * @return True if the session has an active database connection. + */ + public boolean hasConnection() { + return mConnection != null; + } + + /** + * Begins a transaction. + * <p> + * Transactions may nest. If the transaction is not in progress, + * then a database connection is obtained and a new transaction is started. + * Otherwise, a nested transaction is started. + * </p><p> + * Each call to {@link #beginTransaction} must be matched exactly by a call + * to {@link #endTransaction}. To mark a transaction as successful, + * call {@link #setTransactionSuccessful} before calling {@link #endTransaction}. + * If the transaction is not successful, or if any of its nested + * transactions were not successful, then the entire transaction will + * be rolled back when the outermost transaction is ended. + * </p> + * + * @param transactionMode The transaction mode. One of: {@link #TRANSACTION_MODE_DEFERRED}, + * {@link #TRANSACTION_MODE_IMMEDIATE}, or {@link #TRANSACTION_MODE_EXCLUSIVE}. + * Ignored when creating a nested transaction. + * @param transactionListener The transaction listener, or null if none. + * @param connectionFlags The connection flags to use if a connection must be + * acquired by this operation. Refer to {@link SQLiteConnectionPool}. + * + * @throws IllegalStateException if {@link #setTransactionSuccessful} has already been + * called for the current transaction. + * + * @see #setTransactionSuccessful + * @see #yieldTransaction + * @see #endTransaction + */ + public void beginTransaction(int transactionMode, + SQLiteTransactionListener transactionListener, int connectionFlags) { + throwIfTransactionMarkedSuccessful(); + beginTransactionUnchecked(transactionMode, transactionListener, connectionFlags); + } + + private void beginTransactionUnchecked(int transactionMode, + SQLiteTransactionListener transactionListener, int connectionFlags) { + acquireConnectionIfNoTransaction(null, connectionFlags); // might throw + try { + // Set up the transaction such that we can back out safely + // in case we fail part way. + if (mTransactionStack == null) { + // Execute SQL might throw a runtime exception. + switch (transactionMode) { + case TRANSACTION_MODE_IMMEDIATE: + mConnection.execute("BEGIN IMMEDIATE;", null); // might throw + break; + case TRANSACTION_MODE_EXCLUSIVE: + mConnection.execute("BEGIN EXCLUSIVE;", null); // might throw + break; + default: + mConnection.execute("BEGIN;", null); // might throw + break; + } + } + + // Listener might throw a runtime exception. + if (transactionListener != null) { + try { + transactionListener.onBegin(); // might throw + } catch (RuntimeException ex) { + if (mTransactionStack == null) { + mConnection.execute("ROLLBACK;", null); // might throw + } + throw ex; + } + } + + // Bookkeeping can't throw, except an OOM, which is just too bad... + Transaction transaction = obtainTransaction(transactionMode, transactionListener); + transaction.mParent = mTransactionStack; + mTransactionStack = transaction; + } finally { + releaseConnectionIfNoTransaction(); // might throw + } + } + + /** + * Marks the current transaction as having completed successfully. + * <p> + * This method can be called at most once between {@link #beginTransaction} and + * {@link #endTransaction} to indicate that the changes made by the transaction should be + * committed. If this method is not called, the changes will be rolled back + * when the transaction is ended. + * </p> + * + * @throws IllegalStateException if there is no current transaction, or if + * {@link #setTransactionSuccessful} has already been called for the current transaction. + * + * @see #beginTransaction + * @see #endTransaction + */ + public void setTransactionSuccessful() { + throwIfNoTransaction(); + throwIfTransactionMarkedSuccessful(); + + mTransactionStack.mMarkedSuccessful = true; + } + + /** + * Ends the current transaction and commits or rolls back changes. + * <p> + * If this is the outermost transaction (not nested within any other + * transaction), then the changes are committed if {@link #setTransactionSuccessful} + * was called or rolled back otherwise. + * </p><p> + * This method must be called exactly once for each call to {@link #beginTransaction}. + * </p> + * + * @throws IllegalStateException if there is no current transaction. + * + * @see #beginTransaction + * @see #setTransactionSuccessful + * @see #yieldTransaction + */ + public void endTransaction() { + throwIfNoTransaction(); + assert mConnection != null; + + endTransactionUnchecked(); + } + + private void endTransactionUnchecked() { + final Transaction top = mTransactionStack; + boolean successful = top.mMarkedSuccessful && !top.mChildFailed; + + RuntimeException listenerException = null; + final SQLiteTransactionListener listener = top.mListener; + if (listener != null) { + try { + if (successful) { + listener.onCommit(); // might throw + } else { + listener.onRollback(); // might throw + } + } catch (RuntimeException ex) { + listenerException = ex; + successful = false; + } + } + + mTransactionStack = top.mParent; + recycleTransaction(top); + + if (mTransactionStack != null) { + if (!successful) { + mTransactionStack.mChildFailed = true; + } + } else { + try { + if (successful) { + mConnection.execute("COMMIT;", null); // might throw + } else { + mConnection.execute("ROLLBACK;", null); // might throw + } + } finally { + releaseConnectionIfNoTransaction(); // might throw + } + } + + if (listenerException != null) { + throw listenerException; + } + } + + /** + * Temporarily ends a transaction to let other threads have use of + * the database. Begins a new transaction after a specified delay. + * <p> + * If there are other threads waiting to acquire connections, + * then the current transaction is committed and the database + * connection is released. After a short delay, a new transaction + * is started. + * </p><p> + * The transaction is assumed to be successful so far. Do not call + * {@link #setTransactionSuccessful()} before calling this method. + * This method will fail if the transaction has already been marked + * successful. + * </p><p> + * The changes that were committed by a yield cannot be rolled back later. + * </p><p> + * Before this method was called, there must already have been + * a transaction in progress. When this method returns, there will + * still be a transaction in progress, either the same one as before + * or a new one if the transaction was actually yielded. + * </p><p> + * This method should not be called when there is a nested transaction + * in progress because it is not possible to yield a nested transaction. + * If <code>throwIfNested</code> is true, then attempting to yield + * a nested transaction will throw {@link IllegalStateException}, otherwise + * the method will return <code>false</code> in that case. + * </p><p> + * If there is no nested transaction in progress but a previous nested + * transaction failed, then the transaction is not yielded (because it + * must be rolled back) and this method returns <code>false</code>. + * </p> + * + * @param sleepAfterYieldDelayMillis A delay time to wait after yielding + * the database connection to allow other threads some time to run. + * If the value is less than or equal to zero, there will be no additional + * delay beyond the time it will take to begin a new transaction. + * @param throwIfUnsafe If true, then instead of returning false when no + * transaction is in progress, a nested transaction is in progress, or when + * the transaction has already been marked successful, throws {@link IllegalStateException}. + * @return True if the transaction was actually yielded. + * + * @throws IllegalStateException if <code>throwIfNested</code> is true and + * there is no current transaction, there is a nested transaction in progress or + * if {@link #setTransactionSuccessful} has already been called for the current transaction. + * + * @see #beginTransaction + * @see #endTransaction + */ + public boolean yieldTransaction(long sleepAfterYieldDelayMillis, boolean throwIfUnsafe) { + if (throwIfUnsafe) { + throwIfNoTransaction(); + throwIfTransactionMarkedSuccessful(); + throwIfNestedTransaction(); + } else { + if (mTransactionStack == null || mTransactionStack.mMarkedSuccessful + || mTransactionStack.mParent != null) { + return false; + } + } + assert mConnection != null; + + if (mTransactionStack.mChildFailed) { + return false; + } + + return yieldTransactionUnchecked(sleepAfterYieldDelayMillis); // might throw + } + + private boolean yieldTransactionUnchecked(long sleepAfterYieldDelayMillis) { + if (!mConnectionPool.shouldYieldConnection(mConnection, mConnectionFlags)) { + return false; + } + + final int transactionMode = mTransactionStack.mMode; + final SQLiteTransactionListener listener = mTransactionStack.mListener; + final int connectionFlags = mConnectionFlags; + endTransactionUnchecked(); // might throw + + if (sleepAfterYieldDelayMillis > 0) { + try { + Thread.sleep(sleepAfterYieldDelayMillis); + } catch (InterruptedException ex) { + // we have been interrupted, that's all we need to do + } + } + + beginTransactionUnchecked(transactionMode, listener, connectionFlags); // might throw + return true; + } + + /** + * Prepares a statement for execution but does not bind its parameters or execute it. + * <p> + * This method can be used to check for syntax errors during compilation + * prior to execution of the statement. If the {@code outStatementInfo} argument + * is not null, the provided {@link SQLiteStatementInfo} object is populated + * with information about the statement. + * </p><p> + * A prepared statement makes no reference to the arguments that may eventually + * be bound to it, consequently it it possible to cache certain prepared statements + * such as SELECT or INSERT/UPDATE statements. If the statement is cacheable, + * then it will be stored in the cache for later and reused if possible. + * </p> + * + * @param sql The SQL statement to prepare. + * @param connectionFlags The connection flags to use if a connection must be + * acquired by this operation. Refer to {@link SQLiteConnectionPool}. + * @param outStatementInfo The {@link SQLiteStatementInfo} object to populate + * with information about the statement, or null if none. + * + * @throws SQLiteException if an error occurs, such as a syntax error. + */ + public void prepare(String sql, int connectionFlags, SQLiteStatementInfo outStatementInfo) { + if (sql == null) { + throw new IllegalArgumentException("sql must not be null."); + } + + acquireConnectionIfNoTransaction(sql, connectionFlags); // might throw + try { + mConnection.prepare(sql, outStatementInfo); // might throw + } finally { + releaseConnectionIfNoTransaction(); // might throw + } + } + + /** + * Executes a statement that does not return a result. + * + * @param sql The SQL statement to execute. + * @param bindArgs The arguments to bind, or null if none. + * @param connectionFlags The connection flags to use if a connection must be + * acquired by this operation. Refer to {@link SQLiteConnectionPool}. + * + * @throws SQLiteException if an error occurs, such as a syntax error + * or invalid number of bind arguments. + */ + public void execute(String sql, Object[] bindArgs, int connectionFlags) { + if (sql == null) { + throw new IllegalArgumentException("sql must not be null."); + } + + if (executeSpecial(sql, bindArgs, connectionFlags)) { + return; + } + + acquireConnectionIfNoTransaction(sql, connectionFlags); // might throw + try { + mConnection.execute(sql, bindArgs); // might throw + } finally { + releaseConnectionIfNoTransaction(); // might throw + } + } + + /** + * Executes a statement that returns a single <code>long</code> result. + * + * @param sql The SQL statement to execute. + * @param bindArgs The arguments to bind, or null if none. + * @param connectionFlags The connection flags to use if a connection must be + * acquired by this operation. Refer to {@link SQLiteConnectionPool}. + * @return The value of the first column in the first row of the result set + * as a <code>long</code>, or zero if none. + * + * @throws SQLiteException if an error occurs, such as a syntax error + * or invalid number of bind arguments. + */ + public long executeForLong(String sql, Object[] bindArgs, int connectionFlags) { + if (sql == null) { + throw new IllegalArgumentException("sql must not be null."); + } + + if (executeSpecial(sql, bindArgs, connectionFlags)) { + return 0; + } + + acquireConnectionIfNoTransaction(sql, connectionFlags); // might throw + try { + return mConnection.executeForLong(sql, bindArgs); // might throw + } finally { + releaseConnectionIfNoTransaction(); // might throw + } + } + + /** + * Executes a statement that returns a single {@link String} result. + * + * @param sql The SQL statement to execute. + * @param bindArgs The arguments to bind, or null if none. + * @param connectionFlags The connection flags to use if a connection must be + * acquired by this operation. Refer to {@link SQLiteConnectionPool}. + * @return The value of the first column in the first row of the result set + * as a <code>String</code>, or null if none. + * + * @throws SQLiteException if an error occurs, such as a syntax error + * or invalid number of bind arguments. + */ + public String executeForString(String sql, Object[] bindArgs, int connectionFlags) { + if (sql == null) { + throw new IllegalArgumentException("sql must not be null."); + } + + if (executeSpecial(sql, bindArgs, connectionFlags)) { + return null; + } + + acquireConnectionIfNoTransaction(sql, connectionFlags); // might throw + try { + return mConnection.executeForString(sql, bindArgs); // might throw + } finally { + releaseConnectionIfNoTransaction(); // might throw + } + } + + /** + * Executes a statement that returns a single BLOB result as a + * file descriptor to a shared memory region. + * + * @param sql The SQL statement to execute. + * @param bindArgs The arguments to bind, or null if none. + * @param connectionFlags The connection flags to use if a connection must be + * acquired by this operation. Refer to {@link SQLiteConnectionPool}. + * @return The file descriptor for a shared memory region that contains + * the value of the first column in the first row of the result set as a BLOB, + * or null if none. + * + * @throws SQLiteException if an error occurs, such as a syntax error + * or invalid number of bind arguments. + */ + public ParcelFileDescriptor executeForBlobFileDescriptor(String sql, Object[] bindArgs, + int connectionFlags) { + if (sql == null) { + throw new IllegalArgumentException("sql must not be null."); + } + + if (executeSpecial(sql, bindArgs, connectionFlags)) { + return null; + } + + acquireConnectionIfNoTransaction(sql, connectionFlags); // might throw + try { + return mConnection.executeForBlobFileDescriptor(sql, bindArgs); // might throw + } finally { + releaseConnectionIfNoTransaction(); // might throw + } + } + + /** + * Executes a statement that returns a count of the number of rows + * that were changed. Use for UPDATE or DELETE SQL statements. + * + * @param sql The SQL statement to execute. + * @param bindArgs The arguments to bind, or null if none. + * @param connectionFlags The connection flags to use if a connection must be + * acquired by this operation. Refer to {@link SQLiteConnectionPool}. + * @return The number of rows that were changed. + * + * @throws SQLiteException if an error occurs, such as a syntax error + * or invalid number of bind arguments. + */ + public int executeForChangedRowCount(String sql, Object[] bindArgs, int connectionFlags) { + if (sql == null) { + throw new IllegalArgumentException("sql must not be null."); + } + + if (executeSpecial(sql, bindArgs, connectionFlags)) { + return 0; + } + + acquireConnectionIfNoTransaction(sql, connectionFlags); // might throw + try { + return mConnection.executeForChangedRowCount(sql, bindArgs); // might throw + } finally { + releaseConnectionIfNoTransaction(); // might throw + } + } + + /** + * Executes a statement that returns the row id of the last row inserted + * by the statement. Use for INSERT SQL statements. + * + * @param sql The SQL statement to execute. + * @param bindArgs The arguments to bind, or null if none. + * @param connectionFlags The connection flags to use if a connection must be + * acquired by this operation. Refer to {@link SQLiteConnectionPool}. + * @return The row id of the last row that was inserted, or 0 if none. + * + * @throws SQLiteException if an error occurs, such as a syntax error + * or invalid number of bind arguments. + */ + public long executeForLastInsertedRowId(String sql, Object[] bindArgs, int connectionFlags) { + if (sql == null) { + throw new IllegalArgumentException("sql must not be null."); + } + + if (executeSpecial(sql, bindArgs, connectionFlags)) { + return 0; + } + + acquireConnectionIfNoTransaction(sql, connectionFlags); // might throw + try { + return mConnection.executeForLastInsertedRowId(sql, bindArgs); // might throw + } finally { + releaseConnectionIfNoTransaction(); // might throw + } + } + + /** + * Executes a statement and populates the specified {@link CursorWindow} + * with a range of results. Returns the number of rows that were counted + * during query execution. + * + * @param sql The SQL statement to execute. + * @param bindArgs The arguments to bind, or null if none. + * @param window The cursor window to clear and fill. + * @param startPos The start position for filling the window. + * @param requiredPos The position of a row that MUST be in the window. + * If it won't fit, then the query should discard part of what it filled + * so that it does. Must be greater than or equal to <code>startPos</code>. + * @param countAllRows True to count all rows that the query would return + * regagless of whether they fit in the window. + * @param connectionFlags The connection flags to use if a connection must be + * acquired by this operation. Refer to {@link SQLiteConnectionPool}. + * @return The number of rows that were counted during query execution. Might + * not be all rows in the result set unless <code>countAllRows</code> is true. + * + * @throws SQLiteException if an error occurs, such as a syntax error + * or invalid number of bind arguments. + */ + public int executeForCursorWindow(String sql, Object[] bindArgs, + CursorWindow window, int startPos, int requiredPos, boolean countAllRows, + int connectionFlags) { + if (sql == null) { + throw new IllegalArgumentException("sql must not be null."); + } + if (window == null) { + throw new IllegalArgumentException("window must not be null."); + } + + if (executeSpecial(sql, bindArgs, connectionFlags)) { + window.clear(); + return 0; + } + + acquireConnectionIfNoTransaction(sql, connectionFlags); // might throw + try { + return mConnection.executeForCursorWindow(sql, bindArgs, + window, startPos, requiredPos, countAllRows); // might throw + } finally { + releaseConnectionIfNoTransaction(); // might throw + } + } + + /** + * Performs special reinterpretation of certain SQL statements such as "BEGIN", + * "COMMIT" and "ROLLBACK" to ensure that transaction state invariants are + * maintained. + * + * This function is mainly used to support legacy apps that perform their + * own transactions by executing raw SQL rather than calling {@link #beginTransaction} + * and the like. + * + * @param sql The SQL statement to execute. + * @param bindArgs The arguments to bind, or null if none. + * @param connectionFlags The connection flags to use if a connection must be + * acquired by this operation. Refer to {@link SQLiteConnectionPool}. + * @return True if the statement was of a special form that was handled here, + * false otherwise. + * + * @throws SQLiteException if an error occurs, such as a syntax error + * or invalid number of bind arguments. + */ + private boolean executeSpecial(String sql, Object[] bindArgs, int connectionFlags) { + final int type = DatabaseUtils.getSqlStatementType(sql); + switch (type) { + case DatabaseUtils.STATEMENT_BEGIN: + beginTransaction(TRANSACTION_MODE_EXCLUSIVE, null, connectionFlags); + return true; + + case DatabaseUtils.STATEMENT_COMMIT: + setTransactionSuccessful(); + endTransaction(); + return true; + + case DatabaseUtils.STATEMENT_ABORT: + endTransaction(); + return true; + } + return false; + } + + private void acquireConnectionIfNoTransaction(String sql, int connectionFlags) { + if (mTransactionStack == null) { + assert mConnection == null; + mConnection = mConnectionPool.acquireConnection(sql, connectionFlags); // might throw + mConnectionFlags = connectionFlags; + } + } + + private void releaseConnectionIfNoTransaction() { + if (mTransactionStack == null && mConnection != null) { + try { + mConnectionPool.releaseConnection(mConnection); // might throw + } finally { + mConnection = null; + } + } + } + + private void throwIfNoTransaction() { + if (mTransactionStack == null) { + throw new IllegalStateException("Cannot perform this operation because " + + "there is no current transaction."); + } + } + + private void throwIfTransactionMarkedSuccessful() { + if (mTransactionStack != null && mTransactionStack.mMarkedSuccessful) { + throw new IllegalStateException("Cannot perform this operation because " + + "the transaction has already been marked successful. The only " + + "thing you can do now is call endTransaction()."); + } + } + + private void throwIfNestedTransaction() { + if (mTransactionStack == null && mTransactionStack.mParent != null) { + throw new IllegalStateException("Cannot perform this operation because " + + "a nested transaction is in progress."); + } + } + + private Transaction obtainTransaction(int mode, SQLiteTransactionListener listener) { + Transaction transaction = mTransactionPool; + if (transaction != null) { + mTransactionPool = transaction.mParent; + transaction.mParent = null; + transaction.mMarkedSuccessful = false; + transaction.mChildFailed = false; + } else { + transaction = new Transaction(); + } + transaction.mMode = mode; + transaction.mListener = listener; + return transaction; + } + + private void recycleTransaction(Transaction transaction) { + transaction.mParent = mTransactionPool; + transaction.mListener = null; + mTransactionPool = transaction; + } + + private static final class Transaction { + public Transaction mParent; + public int mMode; + public SQLiteTransactionListener mListener; + public boolean mMarkedSuccessful; + public boolean mChildFailed; + } +} diff --git a/core/java/android/database/sqlite/SQLiteStatement.java b/core/java/android/database/sqlite/SQLiteStatement.java index c99a6fb8cd5f..4e20da00c25c 100644 --- a/core/java/android/database/sqlite/SQLiteStatement.java +++ b/core/java/android/database/sqlite/SQLiteStatement.java @@ -16,47 +16,19 @@ package android.database.sqlite; -import android.database.DatabaseUtils; import android.os.ParcelFileDescriptor; -import android.os.SystemClock; -import android.util.Log; - -import java.io.IOException; - -import dalvik.system.BlockGuard; /** - * A pre-compiled statement against a {@link SQLiteDatabase} that can be reused. - * The statement cannot return multiple rows, but 1x1 result sets are allowed. - * Don't use SQLiteStatement constructor directly, please use - * {@link SQLiteDatabase#compileStatement(String)} - *<p> - * SQLiteStatement is NOT internally synchronized so code using a SQLiteStatement from multiple - * threads should perform its own synchronization when using the SQLiteStatement. + * Represents a statement that can be executed against a database. The statement + * cannot return multiple rows or columns, but single value (1 x 1) result sets + * are supported. + * <p> + * This class is not thread-safe. + * </p> */ -@SuppressWarnings("deprecation") -public final class SQLiteStatement extends SQLiteProgram -{ - private static final String TAG = "SQLiteStatement"; - - private static final boolean READ = true; - private static final boolean WRITE = false; - - private SQLiteDatabase mOrigDb; - private int mState; - /** possible value for {@link #mState}. indicates that a transaction is started. */ - private static final int TRANS_STARTED = 1; - /** possible value for {@link #mState}. indicates that a lock is acquired. */ - private static final int LOCK_ACQUIRED = 2; - - /** - * Don't use SQLiteStatement constructor directly, please use - * {@link SQLiteDatabase#compileStatement(String)} - * @param db - * @param sql - */ - /* package */ SQLiteStatement(SQLiteDatabase db, String sql, Object[] bindArgs) { - super(db, sql, bindArgs, false /* don't compile sql statement */); +public final class SQLiteStatement extends SQLiteProgram { + SQLiteStatement(SQLiteDatabase db, String sql, Object[] bindArgs) { + super(db, sql, bindArgs); } /** @@ -67,7 +39,15 @@ public final class SQLiteStatement extends SQLiteProgram * some reason */ public void execute() { - executeUpdateDelete(); + acquireReference(); + try { + getSession().execute(getSql(), getBindArgs(), getConnectionFlags()); + } catch (SQLiteDatabaseCorruptException ex) { + onCorruption(); + throw ex; + } finally { + releaseReference(); + } } /** @@ -79,21 +59,15 @@ public final class SQLiteStatement extends SQLiteProgram * some reason */ public int executeUpdateDelete() { + acquireReference(); try { - saveSqlAsLastSqlStatement(); - acquireAndLock(WRITE); - int numChanges = 0; - if ((mStatementType & STATEMENT_DONT_PREPARE) > 0) { - // since the statement doesn't have to be prepared, - // call the following native method which will not prepare - // the query plan - native_executeSql(mSql); - } else { - numChanges = native_execute(); - } - return numChanges; + return getSession().executeForChangedRowCount( + getSql(), getBindArgs(), getConnectionFlags()); + } catch (SQLiteDatabaseCorruptException ex) { + onCorruption(); + throw ex; } finally { - releaseAndUnlock(); + releaseReference(); } } @@ -107,23 +81,18 @@ public final class SQLiteStatement extends SQLiteProgram * some reason */ public long executeInsert() { + acquireReference(); try { - saveSqlAsLastSqlStatement(); - acquireAndLock(WRITE); - return native_executeInsert(); + return getSession().executeForLastInsertedRowId( + getSql(), getBindArgs(), getConnectionFlags()); + } catch (SQLiteDatabaseCorruptException ex) { + onCorruption(); + throw ex; } finally { - releaseAndUnlock(); + releaseReference(); } } - private void saveSqlAsLastSqlStatement() { - if (((mStatementType & SQLiteProgram.STATEMENT_TYPE_MASK) == - DatabaseUtils.STATEMENT_UPDATE) || - (mStatementType & SQLiteProgram.STATEMENT_TYPE_MASK) == - DatabaseUtils.STATEMENT_BEGIN) { - mDatabase.setLastSqlStatement(mSql); - } - } /** * Execute a statement that returns a 1 by 1 table with a numeric value. * For example, SELECT COUNT(*) FROM table; @@ -133,17 +102,15 @@ public final class SQLiteStatement extends SQLiteProgram * @throws android.database.sqlite.SQLiteDoneException if the query returns zero rows */ public long simpleQueryForLong() { + acquireReference(); try { - long timeStart = acquireAndLock(READ); - long retValue = native_1x1_long(); - mDatabase.logTimeStat(mSql, timeStart); - return retValue; - } catch (SQLiteDoneException e) { - throw new SQLiteDoneException( - "expected 1 row from this query but query returned no data. check the query: " + - mSql); + return getSession().executeForLong( + getSql(), getBindArgs(), getConnectionFlags()); + } catch (SQLiteDatabaseCorruptException ex) { + onCorruption(); + throw ex; } finally { - releaseAndUnlock(); + releaseReference(); } } @@ -156,17 +123,15 @@ public final class SQLiteStatement extends SQLiteProgram * @throws android.database.sqlite.SQLiteDoneException if the query returns zero rows */ public String simpleQueryForString() { + acquireReference(); try { - long timeStart = acquireAndLock(READ); - String retValue = native_1x1_string(); - mDatabase.logTimeStat(mSql, timeStart); - return retValue; - } catch (SQLiteDoneException e) { - throw new SQLiteDoneException( - "expected 1 row from this query but query returned no data. check the query: " + - mSql); + return getSession().executeForString( + getSql(), getBindArgs(), getConnectionFlags()); + } catch (SQLiteDatabaseCorruptException ex) { + onCorruption(); + throw ex; } finally { - releaseAndUnlock(); + releaseReference(); } } @@ -179,121 +144,20 @@ public final class SQLiteStatement extends SQLiteProgram * @throws android.database.sqlite.SQLiteDoneException if the query returns zero rows */ public ParcelFileDescriptor simpleQueryForBlobFileDescriptor() { + acquireReference(); try { - long timeStart = acquireAndLock(READ); - ParcelFileDescriptor retValue = native_1x1_blob_ashmem(); - mDatabase.logTimeStat(mSql, timeStart); - return retValue; - } catch (IOException ex) { - Log.e(TAG, "simpleQueryForBlobFileDescriptor() failed", ex); - return null; - } catch (SQLiteDoneException e) { - throw new SQLiteDoneException( - "expected 1 row from this query but query returned no data. check the query: " + - mSql); + return getSession().executeForBlobFileDescriptor( + getSql(), getBindArgs(), getConnectionFlags()); + } catch (SQLiteDatabaseCorruptException ex) { + onCorruption(); + throw ex; } finally { - releaseAndUnlock(); - } - } - - /** - * Called before every method in this class before executing a SQL statement, - * this method does the following: - * <ul> - * <li>make sure the database is open</li> - * <li>get a database connection from the connection pool,if possible</li> - * <li>notifies {@link BlockGuard} of read/write</li> - * <li>if the SQL statement is an update, start transaction if not already in one. - * otherwise, get lock on the database</li> - * <li>acquire reference on this object</li> - * <li>and then return the current time _after_ the database lock was acquired</li> - * </ul> - * <p> - * This method removes the duplicate code from the other public - * methods in this class. - */ - private long acquireAndLock(boolean rwFlag) { - mState = 0; - // use pooled database connection handles for SELECT SQL statements - mDatabase.verifyDbIsOpen(); - SQLiteDatabase db = ((mStatementType & SQLiteProgram.STATEMENT_USE_POOLED_CONN) > 0) - ? mDatabase.getDbConnection(mSql) : mDatabase; - // use the database connection obtained above - mOrigDb = mDatabase; - mDatabase = db; - setNativeHandle(mDatabase.mNativeHandle); - if (rwFlag == WRITE) { - BlockGuard.getThreadPolicy().onWriteToDisk(); - } else { - BlockGuard.getThreadPolicy().onReadFromDisk(); - } - - /* - * Special case handling of SQLiteDatabase.execSQL("BEGIN transaction"). - * we know it is execSQL("BEGIN transaction") from the caller IF there is no lock held. - * beginTransaction() methods in SQLiteDatabase call lockForced() before - * calling execSQL("BEGIN transaction"). - */ - if ((mStatementType & SQLiteProgram.STATEMENT_TYPE_MASK) == DatabaseUtils.STATEMENT_BEGIN) { - if (!mDatabase.isDbLockedByCurrentThread()) { - // transaction is NOT started by calling beginTransaction() methods in - // SQLiteDatabase - mDatabase.setTransactionUsingExecSqlFlag(); - } - } else if ((mStatementType & SQLiteProgram.STATEMENT_TYPE_MASK) == - DatabaseUtils.STATEMENT_UPDATE) { - // got update SQL statement. if there is NO pending transaction, start one - if (!mDatabase.inTransaction()) { - mDatabase.beginTransactionNonExclusive(); - mState = TRANS_STARTED; - } + releaseReference(); } - // do I have database lock? if not, grab it. - if (!mDatabase.isDbLockedByCurrentThread()) { - mDatabase.lock(mSql); - mState = LOCK_ACQUIRED; - } - - acquireReference(); - long startTime = SystemClock.uptimeMillis(); - mDatabase.closePendingStatements(); - compileAndbindAllArgs(); - return startTime; } - /** - * this method releases locks and references acquired in {@link #acquireAndLock(boolean)} - */ - private void releaseAndUnlock() { - releaseReference(); - if (mState == TRANS_STARTED) { - try { - mDatabase.setTransactionSuccessful(); - } finally { - mDatabase.endTransaction(); - } - } else if (mState == LOCK_ACQUIRED) { - mDatabase.unlock(); - } - if ((mStatementType & SQLiteProgram.STATEMENT_TYPE_MASK) == - DatabaseUtils.STATEMENT_COMMIT || - (mStatementType & SQLiteProgram.STATEMENT_TYPE_MASK) == - DatabaseUtils.STATEMENT_ABORT) { - mDatabase.resetTransactionUsingExecSqlFlag(); - } - clearBindings(); - // release the compiled sql statement so that the caller's SQLiteStatement no longer - // has a hard reference to a database object that may get deallocated at any point. - release(); - // restore the database connection handle to the original value - mDatabase = mOrigDb; - setNativeHandle(mDatabase.mNativeHandle); + @Override + public String toString() { + return "SQLiteProgram: " + getSql(); } - - private final native int native_execute(); - private final native long native_executeInsert(); - private final native long native_1x1_long(); - private final native String native_1x1_string(); - private final native ParcelFileDescriptor native_1x1_blob_ashmem() throws IOException; - private final native void native_executeSql(String sql); } diff --git a/core/java/android/database/sqlite/SQLiteStatementInfo.java b/core/java/android/database/sqlite/SQLiteStatementInfo.java new file mode 100644 index 000000000000..3edfdb05206c --- /dev/null +++ b/core/java/android/database/sqlite/SQLiteStatementInfo.java @@ -0,0 +1,39 @@ +/* + * 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.database.sqlite; + +/** + * Describes a SQLite statement. + * + * @hide + */ +public final class SQLiteStatementInfo { + /** + * The number of parameters that the statement has. + */ + public int numParameters; + + /** + * The names of all columns in the result set of the statement. + */ + public String[] columnNames; + + /** + * True if the statement is read-only. + */ + public boolean readOnly; +} diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index e1bc275bc6f2..cdf235df9a08 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -219,6 +219,36 @@ public class Process { public static final int THREAD_PRIORITY_LESS_FAVORABLE = +1; /** + * Default scheduling policy + * @hide + */ + public static final int SCHED_OTHER = 0; + + /** + * First-In First-Out scheduling policy + * @hide + */ + public static final int SCHED_FIFO = 1; + + /** + * Round-Robin scheduling policy + * @hide + */ + public static final int SCHED_RR = 2; + + /** + * Batch scheduling policy + * @hide + */ + public static final int SCHED_BATCH = 3; + + /** + * Idle scheduling policy + * @hide + */ + public static final int SCHED_IDLE = 5; + + /** * Default thread group - gets a 'normal' share of the CPU * @hide */ @@ -675,6 +705,24 @@ public class Process { throws IllegalArgumentException; /** + * Set the scheduling policy and priority of a thread, based on Linux. + * + * @param tid The identifier of the thread/process to change. + * @param policy A Linux scheduling policy such as SCHED_OTHER etc. + * @param priority A Linux priority level in a range appropriate for the given policy. + * + * @throws IllegalArgumentException Throws IllegalArgumentException if + * <var>tid</var> does not exist, or if <var>priority</var> is out of range for the policy. + * @throws SecurityException Throws SecurityException if your process does + * not have permission to modify the given thread, or to use the given + * scheduling policy or priority. + * + * {@hide} + */ + public static final native void setThreadScheduler(int tid, int policy, int priority) + throws IllegalArgumentException; + + /** * Determine whether the current environment supports multiple processes. * * @return Returns true if the system can run in multiple processes, else diff --git a/core/java/android/util/LruCache.java b/core/java/android/util/LruCache.java index f1014a7ae1b1..51e373c8dddc 100644 --- a/core/java/android/util/LruCache.java +++ b/core/java/android/util/LruCache.java @@ -86,6 +86,23 @@ public class LruCache<K, V> { } /** + * Sets the size of the cache. + * @param maxSize The new maximum size. + * + * @hide + */ + public void resize(int maxSize) { + if (maxSize <= 0) { + throw new IllegalArgumentException("maxSize <= 0"); + } + + synchronized (this) { + this.maxSize = maxSize; + } + trimToSize(maxSize); + } + + /** * Returns the value for {@code key} if it exists in the cache or can be * created by {@code #create}. If a value was returned, it is moved to the * head of the queue. This returns null if a value is not cached and cannot diff --git a/core/java/android/view/DisplayList.java b/core/java/android/view/DisplayList.java index 8f4ece04b113..fec0d4b94e8f 100644 --- a/core/java/android/view/DisplayList.java +++ b/core/java/android/view/DisplayList.java @@ -32,20 +32,20 @@ public abstract class DisplayList { * * @return A canvas to record drawing operations. */ - abstract HardwareCanvas start(); + public abstract HardwareCanvas start(); /** * Ends the recording for this display list. A display list cannot be * replayed if recording is not finished. */ - abstract void end(); + public abstract void end(); /** * Invalidates the display list, indicating that it should be repopulated * with new drawing commands prior to being used again. Calling this method * causes calls to {@link #isValid()} to return <code>false</code>. */ - abstract void invalidate(); + public abstract void invalidate(); /** * Returns whether the display list is currently usable. If this returns false, @@ -53,12 +53,12 @@ public abstract class DisplayList { * * @return boolean true if the display list is able to be replayed, false otherwise. */ - abstract boolean isValid(); + public abstract boolean isValid(); /** * Return the amount of memory used by this display list. * * @return The size of this display list in bytes */ - abstract int getSize(); + public abstract int getSize(); } diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index 43a451d0cdc5..8a9be8563d91 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/GLES20Canvas.java @@ -247,7 +247,7 @@ class GLES20Canvas extends HardwareCanvas { private static native void nDisableVsync(); @Override - void onPreDraw(Rect dirty) { + public void onPreDraw(Rect dirty) { if (dirty != null) { nPrepareDirty(mRenderer, dirty.left, dirty.top, dirty.right, dirty.bottom, mOpaque); } else { @@ -260,7 +260,7 @@ class GLES20Canvas extends HardwareCanvas { boolean opaque); @Override - void onPostDraw() { + public void onPostDraw() { nFinish(mRenderer); } diff --git a/core/java/android/view/GLES20DisplayList.java b/core/java/android/view/GLES20DisplayList.java index 4ca5e9844ffb..0cb944957130 100644 --- a/core/java/android/view/GLES20DisplayList.java +++ b/core/java/android/view/GLES20DisplayList.java @@ -43,7 +43,7 @@ class GLES20DisplayList extends DisplayList { } @Override - HardwareCanvas start() { + public HardwareCanvas start() { if (mCanvas != null) { throw new IllegalStateException("Recording has already started"); } @@ -55,7 +55,7 @@ class GLES20DisplayList extends DisplayList { } @Override - void invalidate() { + public void invalidate() { if (mCanvas != null) { mCanvas.recycle(); mCanvas = null; @@ -64,12 +64,12 @@ class GLES20DisplayList extends DisplayList { } @Override - boolean isValid() { + public boolean isValid() { return mValid; } @Override - void end() { + public void end() { if (mCanvas != null) { if (mFinalizer != null) { mCanvas.end(mFinalizer.mNativeDisplayList); @@ -83,7 +83,7 @@ class GLES20DisplayList extends DisplayList { } @Override - int getSize() { + public int getSize() { if (mFinalizer == null) return 0; return GLES20Canvas.getDisplayListSize(mFinalizer.mNativeDisplayList); } diff --git a/core/java/android/view/HardwareCanvas.java b/core/java/android/view/HardwareCanvas.java index 23b3abcc3cd6..cbdbbde45b70 100644 --- a/core/java/android/view/HardwareCanvas.java +++ b/core/java/android/view/HardwareCanvas.java @@ -42,12 +42,12 @@ public abstract class HardwareCanvas extends Canvas { * * @param dirty The dirty rectangle to update, can be null. */ - abstract void onPreDraw(Rect dirty); + public abstract void onPreDraw(Rect dirty); /** * Invoked after all drawing operation have been performed. */ - abstract void onPostDraw(); + public abstract void onPostDraw(); /** * Draws the specified display list onto this canvas. @@ -61,7 +61,7 @@ public abstract class HardwareCanvas extends Canvas { * @return True if the content of the display list requires another * drawing pass (invalidate()), false otherwise */ - abstract boolean drawDisplayList(DisplayList displayList, int width, int height, Rect dirty); + public abstract boolean drawDisplayList(DisplayList displayList, int width, int height, Rect dirty); /** * Outputs the specified display list to the log. This method exists for use by diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 3f793bb24428..4592ae6c1a57 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -276,7 +276,7 @@ public abstract class HardwareRenderer { * * @return A new display list. */ - abstract DisplayList createDisplayList(); + public abstract DisplayList createDisplayList(); /** * Creates a new hardware layer. A hardware layer built by calling this @@ -316,14 +316,13 @@ public abstract class HardwareRenderer { * potentially lost the hardware renderer. The hardware renderer should be * reinitialized and setup when the render {@link #isRequested()} and * {@link #isEnabled()}. - * + * * @param width The width of the drawing surface. * @param height The height of the drawing surface. - * @param attachInfo The - * @param holder + * @param holder The target surface */ - void initializeIfNeeded(int width, int height, View.AttachInfo attachInfo, - SurfaceHolder holder) throws Surface.OutOfResourcesException { + void initializeIfNeeded(int width, int height, SurfaceHolder holder) + throws Surface.OutOfResourcesException { if (isRequested()) { // We lost the gl context, so recreate it. if (!isEnabled()) { @@ -1083,7 +1082,7 @@ public abstract class HardwareRenderer { } @Override - DisplayList createDisplayList() { + public DisplayList createDisplayList() { return new GLES20DisplayList(); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 64f862aa0ea1..e28028634852 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -10433,6 +10433,19 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal } /** + * @return The HardwareRenderer associated with that view or null if hardware rendering + * is not supported or this this has not been attached to a window. + * + * @hide + */ + public HardwareRenderer getHardwareRenderer() { + if (mAttachInfo != null) { + return mAttachInfo.mHardwareRenderer; + } + return null; + } + + /** * <p>Returns a display list that can be used to draw this view again * without executing its draw method.</p> * diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 72966ef4dbbb..1a4bdf4bc373 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -57,7 +57,6 @@ import android.util.Poolable; import android.util.PoolableManager; import android.util.Pools; import android.util.Slog; -import android.util.SparseArray; import android.util.TypedValue; import android.view.View.MeasureSpec; import android.view.accessibility.AccessibilityEvent; @@ -2530,7 +2529,7 @@ public final class ViewRootImpl extends Handler implements ViewParent, mFullRedrawNeeded = true; try { mAttachInfo.mHardwareRenderer.initializeIfNeeded(mWidth, mHeight, - mAttachInfo, mHolder); + mHolder); } catch (Surface.OutOfResourcesException e) { Log.e(TAG, "OutOfResourcesException locking surface", e); try { diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index c7cd662d2c27..994565a7cae7 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -298,6 +298,11 @@ public interface WindowManagerPolicy { boolean isDisplayedLw(); /** + * Is this window considered to be gone for purposes of layout? + */ + boolean isGoneForLayoutLw(); + + /** * Returns true if this window has been shown on screen at some time in * the past. Must be called with the window manager lock held. * diff --git a/core/java/android/view/inputmethod/EditorInfo.java b/core/java/android/view/inputmethod/EditorInfo.java index ac378fc46bdd..514656752618 100644 --- a/core/java/android/view/inputmethod/EditorInfo.java +++ b/core/java/android/view/inputmethod/EditorInfo.java @@ -168,6 +168,22 @@ public class EditorInfo implements InputType, Parcelable { public static final int IME_FLAG_NO_ENTER_ACTION = 0x40000000; /** + * Flag of {@link #imeOptions}: used to request that the IME is capable of + * inputting ASCII characters. The intention of this flag is to ensure that + * the user can type Roman alphabet characters in a {@link android.widget.TextView} + * used for, typically, account ID or password input. It is expected that IMEs + * normally are able to input ASCII even without being told so (such IMEs + * already respect this flag in a sense), but there could be some cases they + * aren't when, for instance, only non-ASCII input languagaes like Arabic, + * Greek, Hebrew, Russian are enabled in the IME. Applications need to be + * aware that the flag is not a guarantee, and not all IMEs will respect it. + * However, it is strongly recommended for IME authors to respect this flag + * especially when their IME could end up with a state that has only non-ASCII + * input languages enabled. + */ + public static final int IME_FLAG_FORCE_ASCII = 0x80000000; + + /** * Generic unspecified type for {@link #imeOptions}. */ public static final int IME_NULL = 0x00000000; diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index efd5d5692ece..e46c88e72f1f 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -3760,6 +3760,8 @@ public class WebView extends AbsoluteLayout nativeScrollLayer(mCurrentScrollingLayerId, x, y); mScrollingLayerRect.left = x; mScrollingLayerRect.top = y; + mWebViewCore.sendMessage(WebViewCore.EventHub.SCROLL_LAYER, mCurrentScrollingLayerId, + mScrollingLayerRect); onScrollChanged(mScrollX, mScrollY, mScrollX, mScrollY); invalidate(); } diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 70c77638ae0a..fb9c98a1cbe6 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -1109,6 +1109,8 @@ public final class WebViewCore { static final int HEARTBEAT = 197; + static final int SCROLL_LAYER = 198; + // private message ids private static final int DESTROY = 200; @@ -1718,6 +1720,11 @@ public final class WebViewCore { mBrowserFrame.stringByEvaluatingJavaScriptFromString((String) msg.obj); } break; + case SCROLL_LAYER: + int nativeLayer = msg.arg1; + Rect rect = (Rect) msg.obj; + nativeScrollLayer(mNativeClass, nativeLayer, + rect); } } }; diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 3dd7a9f2832e..acea1a1a782e 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -84,6 +84,7 @@ import android.text.method.TimeKeyListener; import android.text.method.TransformationMethod; import android.text.method.TransformationMethod2; import android.text.method.WordIterator; +import android.text.style.CharacterStyle; import android.text.style.ClickableSpan; import android.text.style.EasyEditSpan; import android.text.style.ParagraphStyle; @@ -101,9 +102,11 @@ import android.util.Log; import android.util.TypedValue; import android.view.ActionMode; import android.view.ActionMode.Callback; +import android.view.DisplayList; import android.view.DragEvent; import android.view.Gravity; import android.view.HapticFeedbackConstants; +import android.view.HardwareCanvas; import android.view.KeyCharacterMap; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -283,6 +286,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } private Drawables mDrawables; + private DisplayList mTextDisplayList; + private boolean mTextDisplayListIsValid; + private CharSequence mError; private boolean mErrorWasChanged; private ErrorPopup mPopup; @@ -4520,6 +4526,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener resetResolvedDrawables(); + if (mTextDisplayList != null) { + mTextDisplayList.invalidate(); + } + if (mSpellChecker != null) { mSpellChecker.closeSession(); // Forces the creation of a new SpellChecker next time this window is created. @@ -4970,17 +4980,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } - /* Comment out until we decide what to do about animations - boolean isLinearTextOn = false; - if (currentTransformation != null) { - isLinearTextOn = mTextPaint.isLinearTextOn(); - Matrix m = currentTransformation.getMatrix(); - if (!m.isIdentity()) { - // mTextPaint.setLinearTextOn(true); - } - } - */ - final InputMethodState ims = mInputMethodState; final int cursorOffsetVertical = voffsetCursor - voffsetText; if (ims != null && ims.mBatchEditNesting == 0) { @@ -5038,18 +5037,38 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener highlight = null; } - layout.draw(canvas, highlight, mHighlightPaint, cursorOffsetVertical); + if (canHaveDisplayList() && canvas.isHardwareAccelerated()) { + final int width = mRight - mLeft; + final int height = mBottom - mTop; - if (mMarquee != null && mMarquee.shouldDrawGhost()) { - canvas.translate((int) mMarquee.getGhostOffset(), 0.0f); + if (mTextDisplayList == null || !mTextDisplayList.isValid() || + !mTextDisplayListIsValid) { + if (mTextDisplayList == null) { + mTextDisplayList = getHardwareRenderer().createDisplayList(); + } + + final HardwareCanvas hardwareCanvas = mTextDisplayList.start(); + try { + hardwareCanvas.setViewport(width, height); + // The dirty rect should always be null for a display list + hardwareCanvas.onPreDraw(null); + layout.draw(hardwareCanvas, highlight, mHighlightPaint, cursorOffsetVertical); + } finally { + hardwareCanvas.onPostDraw(); + mTextDisplayList.end(); + mTextDisplayListIsValid = true; + } + } + ((HardwareCanvas) canvas).drawDisplayList(mTextDisplayList, + mScrollX + width, mScrollY + height, null); + } else { layout.draw(canvas, highlight, mHighlightPaint, cursorOffsetVertical); } - /* Comment out until we decide what to do about animations - if (currentTransformation != null) { - mTextPaint.setLinearTextOn(isLinearTextOn); + if (mMarquee != null && mMarquee.shouldDrawGhost()) { + canvas.translate((int) mMarquee.getGhostOffset(), 0.0f); + layout.draw(canvas, highlight, mHighlightPaint, cursorOffsetVertical); } - */ canvas.restore(); } @@ -7562,6 +7581,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener */ protected void onSelectionChanged(int selStart, int selEnd) { sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED); + mTextDisplayListIsValid = false; } /** @@ -7641,6 +7661,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } updateSpellCheckSpans(start, start + after, false); + mTextDisplayListIsValid = false; // Hide the controllers as soon as text is modified (typing, procedural...) // We do not hide the span controllers, since they can be added when a new text is @@ -7743,7 +7764,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } - if (what instanceof UpdateAppearance || what instanceof ParagraphStyle) { + if (what instanceof UpdateAppearance || what instanceof ParagraphStyle || + what instanceof CharacterStyle) { if (ims == null || ims.mBatchEditNesting == 0) { invalidate(); mHighlightPathBogus = true; @@ -7751,6 +7773,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } else { ims.mContentChanged = true; } + mTextDisplayListIsValid = false; } if (MetaKeyKeyListener.isMetaTracker(buf, what)) { diff --git a/core/java/com/android/internal/util/FileRotator.java b/core/java/com/android/internal/util/FileRotator.java new file mode 100644 index 000000000000..3ce95e7d506a --- /dev/null +++ b/core/java/com/android/internal/util/FileRotator.java @@ -0,0 +1,330 @@ +/* + * Copyright (C) 2012 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.util; + +import android.os.FileUtils; + +import com.android.internal.util.FileRotator.Reader; +import com.android.internal.util.FileRotator.Writer; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import libcore.io.IoUtils; + +/** + * Utility that rotates files over time, similar to {@code logrotate}. There is + * a single "active" file, which is periodically rotated into historical files, + * and eventually deleted entirely. Files are stored under a specific directory + * with a well-known prefix. + * <p> + * Instead of manipulating files directly, users implement interfaces that + * perform operations on {@link InputStream} and {@link OutputStream}. This + * enables atomic rewriting of file contents in + * {@link #combineActive(Reader, Writer, long)}. + * <p> + * Users must periodically call {@link #maybeRotate(long)} to perform actual + * rotation. Not inherently thread safe. + */ +public class FileRotator { + private final File mBasePath; + private final String mPrefix; + private final long mRotateAgeMillis; + private final long mDeleteAgeMillis; + + private static final String SUFFIX_BACKUP = ".backup"; + private static final String SUFFIX_NO_BACKUP = ".no_backup"; + + // TODO: provide method to append to active file + + /** + * External class that reads data from a given {@link InputStream}. May be + * called multiple times when reading rotated data. + */ + public interface Reader { + public void read(InputStream in) throws IOException; + } + + /** + * External class that writes data to a given {@link OutputStream}. + */ + public interface Writer { + public void write(OutputStream out) throws IOException; + } + + /** + * Create a file rotator. + * + * @param basePath Directory under which all files will be placed. + * @param prefix Filename prefix used to identify this rotator. + * @param rotateAgeMillis Age in milliseconds beyond which an active file + * may be rotated into a historical file. + * @param deleteAgeMillis Age in milliseconds beyond which a rotated file + * may be deleted. + */ + public FileRotator(File basePath, String prefix, long rotateAgeMillis, long deleteAgeMillis) { + mBasePath = Preconditions.checkNotNull(basePath); + mPrefix = Preconditions.checkNotNull(prefix); + mRotateAgeMillis = rotateAgeMillis; + mDeleteAgeMillis = deleteAgeMillis; + + // ensure that base path exists + mBasePath.mkdirs(); + + // recover any backup files + for (String name : mBasePath.list()) { + if (!name.startsWith(mPrefix)) continue; + + if (name.endsWith(SUFFIX_BACKUP)) { + final File backupFile = new File(mBasePath, name); + final File file = new File( + mBasePath, name.substring(0, name.length() - SUFFIX_BACKUP.length())); + + // write failed with backup; recover last file + backupFile.renameTo(file); + + } else if (name.endsWith(SUFFIX_NO_BACKUP)) { + final File noBackupFile = new File(mBasePath, name); + final File file = new File( + mBasePath, name.substring(0, name.length() - SUFFIX_NO_BACKUP.length())); + + // write failed without backup; delete both + noBackupFile.delete(); + file.delete(); + } + } + } + + /** + * Atomically combine data with existing data in currently active file. + * Maintains a backup during write, which is restored if the write fails. + */ + public void combineActive(Reader reader, Writer writer, long currentTimeMillis) + throws IOException { + final String activeName = getActiveName(currentTimeMillis); + + final File file = new File(mBasePath, activeName); + final File backupFile; + + if (file.exists()) { + // read existing data + readFile(file, reader); + + // backup existing data during write + backupFile = new File(mBasePath, activeName + SUFFIX_BACKUP); + file.renameTo(backupFile); + + try { + writeFile(file, writer); + + // write success, delete backup + backupFile.delete(); + } catch (IOException e) { + // write failed, delete file and restore backup + file.delete(); + backupFile.renameTo(file); + throw e; + } + + } else { + // create empty backup during write + backupFile = new File(mBasePath, activeName + SUFFIX_NO_BACKUP); + backupFile.createNewFile(); + + try { + writeFile(file, writer); + + // write success, delete empty backup + backupFile.delete(); + } catch (IOException e) { + // write failed, delete file and empty backup + file.delete(); + backupFile.delete(); + throw e; + } + } + } + + /** + * Read any rotated data that overlap the requested time range. + */ + public void readMatching(Reader reader, long matchStartMillis, long matchEndMillis) + throws IOException { + final FileInfo info = new FileInfo(mPrefix); + for (String name : mBasePath.list()) { + if (!info.parse(name)) continue; + + // read file when it overlaps + if (info.startMillis <= matchEndMillis && matchStartMillis <= info.endMillis) { + final File file = new File(mBasePath, name); + readFile(file, reader); + } + } + } + + /** + * Return the currently active file, which may not exist yet. + */ + private String getActiveName(long currentTimeMillis) { + String oldestActiveName = null; + long oldestActiveStart = Long.MAX_VALUE; + + final FileInfo info = new FileInfo(mPrefix); + for (String name : mBasePath.list()) { + if (!info.parse(name)) continue; + + // pick the oldest active file which covers current time + if (info.isActive() && info.startMillis < currentTimeMillis + && info.startMillis < oldestActiveStart) { + oldestActiveName = name; + oldestActiveStart = info.startMillis; + } + } + + if (oldestActiveName != null) { + return oldestActiveName; + } else { + // no active file found above; create one starting now + info.startMillis = currentTimeMillis; + info.endMillis = Long.MAX_VALUE; + return info.build(); + } + } + + /** + * Examine all files managed by this rotator, renaming or deleting if their + * age matches the configured thresholds. + */ + public void maybeRotate(long currentTimeMillis) { + final long rotateBefore = currentTimeMillis - mRotateAgeMillis; + final long deleteBefore = currentTimeMillis - mDeleteAgeMillis; + + final FileInfo info = new FileInfo(mPrefix); + for (String name : mBasePath.list()) { + if (!info.parse(name)) continue; + + if (info.isActive()) { + // found active file; rotate if old enough + if (info.startMillis < rotateBefore) { + info.endMillis = currentTimeMillis; + + final File file = new File(mBasePath, name); + final File destFile = new File(mBasePath, info.build()); + file.renameTo(destFile); + } + } else if (info.endMillis < deleteBefore) { + // found rotated file; delete if old enough + final File file = new File(mBasePath, name); + file.delete(); + } + } + } + + private static void readFile(File file, Reader reader) throws IOException { + final FileInputStream fis = new FileInputStream(file); + final BufferedInputStream bis = new BufferedInputStream(fis); + try { + reader.read(bis); + } finally { + IoUtils.closeQuietly(bis); + } + } + + private static void writeFile(File file, Writer writer) throws IOException { + final FileOutputStream fos = new FileOutputStream(file); + final BufferedOutputStream bos = new BufferedOutputStream(fos); + try { + writer.write(bos); + bos.flush(); + } finally { + FileUtils.sync(fos); + IoUtils.closeQuietly(bos); + } + } + + /** + * Details for a rotated file, either parsed from an existing filename, or + * ready to be built into a new filename. + */ + private static class FileInfo { + public final String prefix; + + public long startMillis; + public long endMillis; + + public FileInfo(String prefix) { + this.prefix = Preconditions.checkNotNull(prefix); + } + + /** + * Attempt parsing the given filename. + * + * @return Whether parsing was successful. + */ + public boolean parse(String name) { + startMillis = endMillis = -1; + + final int dotIndex = name.lastIndexOf('.'); + final int dashIndex = name.lastIndexOf('-'); + + // skip when missing time section + if (dotIndex == -1 || dashIndex == -1) return false; + + // skip when prefix doesn't match + if (!prefix.equals(name.substring(0, dotIndex))) return false; + + try { + startMillis = Long.parseLong(name.substring(dotIndex + 1, dashIndex)); + + if (name.length() - dashIndex == 1) { + endMillis = Long.MAX_VALUE; + } else { + endMillis = Long.parseLong(name.substring(dashIndex + 1)); + } + + return true; + } catch (NumberFormatException e) { + return false; + } + } + + /** + * Build current state into filename. + */ + public String build() { + final StringBuilder name = new StringBuilder(); + name.append(prefix).append('.').append(startMillis).append('-'); + if (endMillis != Long.MAX_VALUE) { + name.append(endMillis); + } + return name.toString(); + } + + /** + * Test if current file is active (no end timestamp). + */ + public boolean isActive() { + return endMillis == Long.MAX_VALUE; + } + } +} diff --git a/core/jni/Android.mk b/core/jni/Android.mk index 8be1996d67a2..39b84bba15d3 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -39,12 +39,10 @@ LOCAL_SRC_FILES:= \ android_opengl_GLES11Ext.cpp \ android_opengl_GLES20.cpp \ android_database_CursorWindow.cpp \ - android_database_SQLiteCompiledSql.cpp \ + android_database_SQLiteCommon.cpp \ + android_database_SQLiteConnection.cpp \ + android_database_SQLiteGlobal.cpp \ android_database_SQLiteDebug.cpp \ - android_database_SQLiteDatabase.cpp \ - android_database_SQLiteProgram.cpp \ - android_database_SQLiteQuery.cpp \ - android_database_SQLiteStatement.cpp \ android_emoji_EmojiFactory.cpp \ android_view_Display.cpp \ android_view_DisplayEventReceiver.cpp \ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index c00661532009..8a3063fa1d79 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -121,12 +121,9 @@ extern int register_android_view_HardwareRenderer(JNIEnv* env); extern int register_android_view_Surface(JNIEnv* env); extern int register_android_view_TextureView(JNIEnv* env); extern int register_android_database_CursorWindow(JNIEnv* env); -extern int register_android_database_SQLiteCompiledSql(JNIEnv* env); -extern int register_android_database_SQLiteDatabase(JNIEnv* env); +extern int register_android_database_SQLiteConnection(JNIEnv* env); +extern int register_android_database_SQLiteGlobal(JNIEnv* env); extern int register_android_database_SQLiteDebug(JNIEnv* env); -extern int register_android_database_SQLiteProgram(JNIEnv* env); -extern int register_android_database_SQLiteQuery(JNIEnv* env); -extern int register_android_database_SQLiteStatement(JNIEnv* env); extern int register_android_debug_JNITest(JNIEnv* env); extern int register_android_nio_utils(JNIEnv* env); extern int register_android_text_format_Time(JNIEnv* env); @@ -1141,12 +1138,9 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_graphics_YuvImage), REG_JNI(register_android_database_CursorWindow), - REG_JNI(register_android_database_SQLiteCompiledSql), - REG_JNI(register_android_database_SQLiteDatabase), + REG_JNI(register_android_database_SQLiteConnection), + REG_JNI(register_android_database_SQLiteGlobal), REG_JNI(register_android_database_SQLiteDebug), - REG_JNI(register_android_database_SQLiteProgram), - REG_JNI(register_android_database_SQLiteQuery), - REG_JNI(register_android_database_SQLiteStatement), REG_JNI(register_android_os_Debug), REG_JNI(register_android_os_FileObserver), REG_JNI(register_android_os_FileUtils), diff --git a/core/jni/android_database_CursorWindow.cpp b/core/jni/android_database_CursorWindow.cpp index f9270641fd90..d53644de318a 100644 --- a/core/jni/android_database_CursorWindow.cpp +++ b/core/jni/android_database_CursorWindow.cpp @@ -31,8 +31,8 @@ #include <unistd.h> #include "binder/CursorWindow.h" -#include "sqlite3_exception.h" #include "android_util_Binder.h" +#include "android_database_SQLiteCommon.h" namespace android { @@ -59,14 +59,9 @@ static void throwUnknownTypeException(JNIEnv * env, jint type) { static jint nativeCreate(JNIEnv* env, jclass clazz, jstring nameObj, jint cursorWindowSize) { String8 name; - if (nameObj) { - const char* nameStr = env->GetStringUTFChars(nameObj, NULL); - name.setTo(nameStr); - env->ReleaseStringUTFChars(nameObj, nameStr); - } - if (name.size() == 0) { - name.setTo("<unnamed>"); - } + const char* nameStr = env->GetStringUTFChars(nameObj, NULL); + name.setTo(nameStr); + env->ReleaseStringUTFChars(nameObj, nameStr); CursorWindow* window; status_t status = CursorWindow::create(name, cursorWindowSize, &window); diff --git a/core/jni/android_database_SQLiteCommon.cpp b/core/jni/android_database_SQLiteCommon.cpp new file mode 100644 index 000000000000..d5fdb15e5711 --- /dev/null +++ b/core/jni/android_database_SQLiteCommon.cpp @@ -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. + */ + +#include "android_database_SQLiteCommon.h" + +namespace android { + +/* throw a SQLiteException with a message appropriate for the error in handle */ +void throw_sqlite3_exception(JNIEnv* env, sqlite3* handle) { + throw_sqlite3_exception(env, handle, NULL); +} + +/* throw a SQLiteException with the given message */ +void throw_sqlite3_exception(JNIEnv* env, const char* message) { + throw_sqlite3_exception(env, NULL, message); +} + +/* throw a SQLiteException with a message appropriate for the error in handle + concatenated with the given message + */ +void throw_sqlite3_exception(JNIEnv* env, sqlite3* handle, const char* message) { + if (handle) { + throw_sqlite3_exception(env, sqlite3_errcode(handle), + sqlite3_errmsg(handle), message); + } else { + // we use SQLITE_OK so that a generic SQLiteException is thrown; + // any code not specified in the switch statement below would do. + throw_sqlite3_exception(env, SQLITE_OK, "unknown error", message); + } +} + +/* throw a SQLiteException for a given error code */ +void throw_sqlite3_exception_errcode(JNIEnv* env, int errcode, const char* message) { + if (errcode == SQLITE_DONE) { + throw_sqlite3_exception(env, errcode, NULL, message); + } else { + char temp[21]; + sprintf(temp, "error code %d", errcode); + throw_sqlite3_exception(env, errcode, temp, message); + } +} + +/* throw a SQLiteException for a given error code, sqlite3message, and + user message + */ +void throw_sqlite3_exception(JNIEnv* env, int errcode, + const char* sqlite3Message, const char* message) { + const char* exceptionClass; + switch (errcode) { + case SQLITE_IOERR: + exceptionClass = "android/database/sqlite/SQLiteDiskIOException"; + break; + case SQLITE_CORRUPT: + case SQLITE_NOTADB: // treat "unsupported file format" error as corruption also + exceptionClass = "android/database/sqlite/SQLiteDatabaseCorruptException"; + break; + case SQLITE_CONSTRAINT: + exceptionClass = "android/database/sqlite/SQLiteConstraintException"; + break; + case SQLITE_ABORT: + exceptionClass = "android/database/sqlite/SQLiteAbortException"; + break; + case SQLITE_DONE: + exceptionClass = "android/database/sqlite/SQLiteDoneException"; + break; + case SQLITE_FULL: + exceptionClass = "android/database/sqlite/SQLiteFullException"; + break; + case SQLITE_MISUSE: + exceptionClass = "android/database/sqlite/SQLiteMisuseException"; + break; + case SQLITE_PERM: + exceptionClass = "android/database/sqlite/SQLiteAccessPermException"; + break; + case SQLITE_BUSY: + exceptionClass = "android/database/sqlite/SQLiteDatabaseLockedException"; + break; + case SQLITE_LOCKED: + exceptionClass = "android/database/sqlite/SQLiteTableLockedException"; + break; + case SQLITE_READONLY: + exceptionClass = "android/database/sqlite/SQLiteReadOnlyDatabaseException"; + break; + case SQLITE_CANTOPEN: + exceptionClass = "android/database/sqlite/SQLiteCantOpenDatabaseException"; + break; + case SQLITE_TOOBIG: + exceptionClass = "android/database/sqlite/SQLiteBlobTooBigException"; + break; + case SQLITE_RANGE: + exceptionClass = "android/database/sqlite/SQLiteBindOrColumnIndexOutOfRangeException"; + break; + case SQLITE_NOMEM: + exceptionClass = "android/database/sqlite/SQLiteOutOfMemoryException"; + break; + case SQLITE_MISMATCH: + exceptionClass = "android/database/sqlite/SQLiteDatatypeMismatchException"; + break; + case SQLITE_UNCLOSED: + exceptionClass = "android/database/sqlite/SQLiteUnfinalizedObjectsException"; + break; + default: + exceptionClass = "android/database/sqlite/SQLiteException"; + break; + } + + if (sqlite3Message != NULL && message != NULL) { + char* fullMessage = (char *)malloc(strlen(sqlite3Message) + strlen(message) + 3); + if (fullMessage != NULL) { + strcpy(fullMessage, sqlite3Message); + strcat(fullMessage, ": "); + strcat(fullMessage, message); + jniThrowException(env, exceptionClass, fullMessage); + free(fullMessage); + } else { + jniThrowException(env, exceptionClass, sqlite3Message); + } + } else if (sqlite3Message != NULL) { + jniThrowException(env, exceptionClass, sqlite3Message); + } else { + jniThrowException(env, exceptionClass, message); + } +} + + +} // namespace android diff --git a/core/jni/android_database_SQLiteCommon.h b/core/jni/android_database_SQLiteCommon.h new file mode 100644 index 000000000000..0cac176502e2 --- /dev/null +++ b/core/jni/android_database_SQLiteCommon.h @@ -0,0 +1,51 @@ +/* + * 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. + */ + +#ifndef _ANDROID_DATABASE_SQLITE_COMMON_H +#define _ANDROID_DATABASE_SQLITE_COMMON_H + +#include <jni.h> +#include <JNIHelp.h> + +#include <sqlite3.h> + +// Special log tags defined in SQLiteDebug.java. +#define SQLITE_LOG_TAG "SQLiteLog" +#define SQLITE_TRACE_TAG "SQLiteStatements" +#define SQLITE_PROFILE_TAG "SQLiteTime" + +namespace android { + +/* throw a SQLiteException with a message appropriate for the error in handle */ +void throw_sqlite3_exception(JNIEnv* env, sqlite3* handle); + +/* throw a SQLiteException with the given message */ +void throw_sqlite3_exception(JNIEnv* env, const char* message); + +/* throw a SQLiteException with a message appropriate for the error in handle + concatenated with the given message + */ +void throw_sqlite3_exception(JNIEnv* env, sqlite3* handle, const char* message); + +/* throw a SQLiteException for a given error code */ +void throw_sqlite3_exception_errcode(JNIEnv* env, int errcode, const char* message); + +void throw_sqlite3_exception(JNIEnv* env, int errcode, + const char* sqlite3Message, const char* message); + +} + +#endif // _ANDROID_DATABASE_SQLITE_COMMON_H diff --git a/core/jni/android_database_SQLiteCompiledSql.cpp b/core/jni/android_database_SQLiteCompiledSql.cpp deleted file mode 100644 index 857267a18da5..000000000000 --- a/core/jni/android_database_SQLiteCompiledSql.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) 2006-2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#undef LOG_TAG -#define LOG_TAG "Cursor" - -#include <jni.h> -#include <JNIHelp.h> -#include <android_runtime/AndroidRuntime.h> - -#include <sqlite3.h> - -#include <utils/Log.h> - -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -#include "sqlite3_exception.h" - - -namespace android { - -static jfieldID gHandleField; -static jfieldID gStatementField; - - -#define GET_STATEMENT(env, object) \ - (sqlite3_stmt *)env->GetIntField(object, gStatementField) -#define GET_HANDLE(env, object) \ - (sqlite3 *)env->GetIntField(object, gHandleField) - - -sqlite3_stmt * compile(JNIEnv* env, jobject object, - sqlite3 * handle, jstring sqlString) -{ - int err; - jchar const * sql; - jsize sqlLen; - sqlite3_stmt * statement = GET_STATEMENT(env, object); - - // Make sure not to leak the statement if it already exists - if (statement != NULL) { - sqlite3_finalize(statement); - env->SetIntField(object, gStatementField, 0); - } - - // Compile the SQL - sql = env->GetStringChars(sqlString, NULL); - sqlLen = env->GetStringLength(sqlString); - err = sqlite3_prepare16_v2(handle, sql, sqlLen * 2, &statement, NULL); - env->ReleaseStringChars(sqlString, sql); - - if (err == SQLITE_OK) { - // Store the statement in the Java object for future calls - ALOGV("Prepared statement %p on %p", statement, handle); - env->SetIntField(object, gStatementField, (int)statement); - return statement; - } else { - // Error messages like 'near ")": syntax error' are not - // always helpful enough, so construct an error string that - // includes the query itself. - const char *query = env->GetStringUTFChars(sqlString, NULL); - char *message = (char*) malloc(strlen(query) + 50); - if (message) { - strcpy(message, ", while compiling: "); // less than 50 chars - strcat(message, query); - } - env->ReleaseStringUTFChars(sqlString, query); - throw_sqlite3_exception(env, handle, message); - free(message); - return NULL; - } -} - -static void native_compile(JNIEnv* env, jobject object, jstring sqlString) -{ - compile(env, object, GET_HANDLE(env, object), sqlString); -} - - -static JNINativeMethod sMethods[] = -{ - /* name, signature, funcPtr */ - {"native_compile", "(Ljava/lang/String;)V", (void *)native_compile}, -}; - -int register_android_database_SQLiteCompiledSql(JNIEnv * env) -{ - jclass clazz; - - clazz = env->FindClass("android/database/sqlite/SQLiteCompiledSql"); - if (clazz == NULL) { - ALOGE("Can't find android/database/sqlite/SQLiteCompiledSql"); - return -1; - } - - gHandleField = env->GetFieldID(clazz, "nHandle", "I"); - gStatementField = env->GetFieldID(clazz, "nStatement", "I"); - - if (gHandleField == NULL || gStatementField == NULL) { - ALOGE("Error locating fields"); - return -1; - } - - return AndroidRuntime::registerNativeMethods(env, - "android/database/sqlite/SQLiteCompiledSql", sMethods, NELEM(sMethods)); -} - -} // namespace android diff --git a/core/jni/android_database_SQLiteConnection.cpp b/core/jni/android_database_SQLiteConnection.cpp new file mode 100644 index 000000000000..d0d53f6f451d --- /dev/null +++ b/core/jni/android_database_SQLiteConnection.cpp @@ -0,0 +1,959 @@ +/* + * 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_TAG "SQLiteConnection" + +#include <jni.h> +#include <JNIHelp.h> +#include <android_runtime/AndroidRuntime.h> + +#include <utils/Log.h> +#include <utils/String8.h> +#include <utils/String16.h> +#include <cutils/ashmem.h> +#include <sys/mman.h> + +#include <string.h> +#include <unistd.h> + +#include "binder/CursorWindow.h" + +#include <sqlite3.h> +#include <sqlite3_android.h> + +#include "android_database_SQLiteCommon.h" + +#define UTF16_STORAGE 0 +#define ANDROID_TABLE "android_metadata" + +namespace android { + +static struct { + jfieldID name; + jfieldID numArgs; + jmethodID dispatchCallback; +} gSQLiteCustomFunctionClassInfo; + +static struct { + jclass clazz; +} gStringClassInfo; + +struct SQLiteConnection { + // Open flags. + // Must be kept in sync with the constants defined in SQLiteDatabase.java. + enum { + OPEN_READWRITE = 0x00000000, + OPEN_READONLY = 0x00000001, + OPEN_READ_MASK = 0x00000001, + NO_LOCALIZED_COLLATORS = 0x00000010, + CREATE_IF_NECESSARY = 0x10000000, + }; + + sqlite3* const db; + const int openFlags; + const String8 path; + const String8 label; + + SQLiteConnection(sqlite3* db, int openFlags, const String8& path, const String8& label) : + db(db), openFlags(openFlags), path(path), label(label) { } +}; + +// Called each time a statement begins execution, when tracing is enabled. +static void sqliteTraceCallback(void *data, const char *sql) { + SQLiteConnection* connection = static_cast<SQLiteConnection*>(data); + ALOG(LOG_VERBOSE, SQLITE_TRACE_TAG, "%s: \"%s\"\n", + connection->label.string(), sql); +} + +// Called each time a statement finishes execution, when profiling is enabled. +static void sqliteProfileCallback(void *data, const char *sql, sqlite3_uint64 tm) { + SQLiteConnection* connection = static_cast<SQLiteConnection*>(data); + ALOG(LOG_VERBOSE, SQLITE_PROFILE_TAG, "%s: \"%s\" took %0.3f ms\n", + connection->label.string(), sql, tm * 0.000001f); +} + + +static jint nativeOpen(JNIEnv* env, jclass clazz, jstring pathStr, jint openFlags, + jstring labelStr, jboolean enableTrace, jboolean enableProfile) { + int sqliteFlags; + if (openFlags & SQLiteConnection::CREATE_IF_NECESSARY) { + sqliteFlags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; + } else if (openFlags & SQLiteConnection::OPEN_READONLY) { + sqliteFlags = SQLITE_OPEN_READONLY; + } else { + sqliteFlags = SQLITE_OPEN_READWRITE; + } + + const char* pathChars = env->GetStringUTFChars(pathStr, NULL); + String8 path(pathChars); + env->ReleaseStringUTFChars(pathStr, pathChars); + + const char* labelChars = env->GetStringUTFChars(labelStr, NULL); + String8 label(labelChars); + env->ReleaseStringUTFChars(labelStr, labelChars); + + sqlite3* db; + int err = sqlite3_open_v2(path.string(), &db, sqliteFlags, NULL); + if (err != SQLITE_OK) { + throw_sqlite3_exception_errcode(env, err, "Could not open database"); + return 0; + } + + // Set the default busy handler to retry for 1000ms and then return SQLITE_BUSY + err = sqlite3_busy_timeout(db, 1000 /* ms */); + if (err != SQLITE_OK) { + throw_sqlite3_exception(env, db, "Could not set busy timeout"); + sqlite3_close(db); + return 0; + } + + // Enable WAL auto-checkpointing after a commit whenever at least one frame is in the log. + // This ensures that a checkpoint will occur after each transaction if needed. + err = sqlite3_wal_autocheckpoint(db, 1); + if (err) { + throw_sqlite3_exception(env, db, "Could not enable auto-checkpointing."); + sqlite3_close(db); + return 0; + } + + // Register custom Android functions. + err = register_android_functions(db, UTF16_STORAGE); + if (err) { + throw_sqlite3_exception(env, db, "Could not register Android SQL functions."); + sqlite3_close(db); + return 0; + } + + // Create wrapper object. + SQLiteConnection* connection = new SQLiteConnection(db, openFlags, path, label); + + // Enable tracing and profiling if requested. + if (enableTrace) { + sqlite3_trace(db, &sqliteTraceCallback, connection); + } + if (enableProfile) { + sqlite3_profile(db, &sqliteProfileCallback, connection); + } + + ALOGV("Opened connection %p with label '%s'", db, label.string()); + return reinterpret_cast<jint>(connection); +} + +static void nativeClose(JNIEnv* env, jclass clazz, jint connectionPtr) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + + if (connection) { + ALOGV("Closing connection %p", connection->db); + int err = sqlite3_close(connection->db); + if (err != SQLITE_OK) { + // This can happen if sub-objects aren't closed first. Make sure the caller knows. + ALOGE("sqlite3_close(%p) failed: %d", connection->db, err); + throw_sqlite3_exception(env, connection->db, "Count not close db."); + return; + } + + delete connection; + } +} + +// Called each time a custom function is evaluated. +static void sqliteCustomFunctionCallback(sqlite3_context *context, + int argc, sqlite3_value **argv) { + JNIEnv* env = AndroidRuntime::getJNIEnv(); + + // Get the callback function object. + // Create a new local reference to it in case the callback tries to do something + // dumb like unregister the function (thereby destroying the global ref) while it is running. + jobject functionObjGlobal = reinterpret_cast<jobject>(sqlite3_user_data(context)); + jobject functionObj = env->NewLocalRef(functionObjGlobal); + + jobjectArray argsArray = env->NewObjectArray(argc, gStringClassInfo.clazz, NULL); + if (argsArray) { + for (int i = 0; i < argc; i++) { + const jchar* arg = static_cast<const jchar*>(sqlite3_value_text16(argv[i])); + if (!arg) { + ALOGW("NULL argument in custom_function_callback. This should not happen."); + } else { + size_t argLen = sqlite3_value_bytes16(argv[i]) / sizeof(jchar); + jstring argStr = env->NewString(arg, argLen); + if (!argStr) { + goto error; // out of memory error + } + env->SetObjectArrayElement(argsArray, i, argStr); + env->DeleteLocalRef(argStr); + } + } + + // TODO: Support functions that return values. + env->CallVoidMethod(functionObj, + gSQLiteCustomFunctionClassInfo.dispatchCallback, argsArray); + +error: + env->DeleteLocalRef(argsArray); + } + + env->DeleteLocalRef(functionObj); + + if (env->ExceptionCheck()) { + ALOGE("An exception was thrown by custom SQLite function."); + LOGE_EX(env); + env->ExceptionClear(); + } +} + +// Called when a custom function is destroyed. +static void sqliteCustomFunctionDestructor(void* data) { + jobject functionObjGlobal = reinterpret_cast<jobject>(data); + + JNIEnv* env = AndroidRuntime::getJNIEnv(); + env->DeleteGlobalRef(functionObjGlobal); +} + +static void nativeRegisterCustomFunction(JNIEnv* env, jclass clazz, jint connectionPtr, + jobject functionObj) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + + jstring nameStr = jstring(env->GetObjectField( + functionObj, gSQLiteCustomFunctionClassInfo.name)); + jint numArgs = env->GetIntField(functionObj, gSQLiteCustomFunctionClassInfo.numArgs); + + jobject functionObjGlobal = env->NewGlobalRef(functionObj); + + const char* name = env->GetStringUTFChars(nameStr, NULL); + int err = sqlite3_create_function_v2(connection->db, name, numArgs, SQLITE_UTF16, + reinterpret_cast<void*>(functionObjGlobal), + &sqliteCustomFunctionCallback, NULL, NULL, &sqliteCustomFunctionDestructor); + env->ReleaseStringUTFChars(nameStr, name); + + if (err != SQLITE_OK) { + ALOGE("sqlite3_create_function returned %d", err); + env->DeleteGlobalRef(functionObjGlobal); + throw_sqlite3_exception(env, connection->db); + return; + } +} + +// Set locale in the android_metadata table, install localized collators, and rebuild indexes +static void nativeSetLocale(JNIEnv* env, jclass clazz, jint connectionPtr, jstring localeStr) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + + if (connection->openFlags & SQLiteConnection::NO_LOCALIZED_COLLATORS) { + // We should probably throw IllegalStateException but the contract for + // setLocale says that we just do nothing. Oh well. + return; + } + + int err; + char const* locale = env->GetStringUTFChars(localeStr, NULL); + sqlite3_stmt* stmt = NULL; + char** meta = NULL; + int rowCount, colCount; + char* dbLocale = NULL; + + // create the table, if necessary and possible + if (!(connection->openFlags & SQLiteConnection::OPEN_READONLY)) { + err = sqlite3_exec(connection->db, + "CREATE TABLE IF NOT EXISTS " ANDROID_TABLE " (locale TEXT)", + NULL, NULL, NULL); + if (err != SQLITE_OK) { + ALOGE("CREATE TABLE " ANDROID_TABLE " failed"); + throw_sqlite3_exception(env, connection->db); + goto done; + } + } + + // try to read from the table + err = sqlite3_get_table(connection->db, + "SELECT locale FROM " ANDROID_TABLE " LIMIT 1", + &meta, &rowCount, &colCount, NULL); + if (err != SQLITE_OK) { + ALOGE("SELECT locale FROM " ANDROID_TABLE " failed"); + throw_sqlite3_exception(env, connection->db); + goto done; + } + + dbLocale = (rowCount >= 1) ? meta[colCount] : NULL; + + if (dbLocale != NULL && !strcmp(dbLocale, locale)) { + // database locale is the same as the desired locale; set up the collators and go + err = register_localized_collators(connection->db, locale, UTF16_STORAGE); + if (err != SQLITE_OK) { + throw_sqlite3_exception(env, connection->db); + } + goto done; // no database changes needed + } + + if (connection->openFlags & SQLiteConnection::OPEN_READONLY) { + // read-only database, so we're going to have to put up with whatever we got + // For registering new index. Not for modifing the read-only database. + err = register_localized_collators(connection->db, locale, UTF16_STORAGE); + if (err != SQLITE_OK) { + throw_sqlite3_exception(env, connection->db); + } + goto done; + } + + // need to update android_metadata and indexes atomically, so use a transaction... + err = sqlite3_exec(connection->db, "BEGIN TRANSACTION", NULL, NULL, NULL); + if (err != SQLITE_OK) { + ALOGE("BEGIN TRANSACTION failed setting locale"); + throw_sqlite3_exception(env, connection->db); + goto done; + } + + err = register_localized_collators(connection->db, locale, UTF16_STORAGE); + if (err != SQLITE_OK) { + ALOGE("register_localized_collators() failed setting locale"); + throw_sqlite3_exception(env, connection->db); + goto rollback; + } + + err = sqlite3_exec(connection->db, "DELETE FROM " ANDROID_TABLE, NULL, NULL, NULL); + if (err != SQLITE_OK) { + ALOGE("DELETE failed setting locale"); + throw_sqlite3_exception(env, connection->db); + goto rollback; + } + + static const char *sql = "INSERT INTO " ANDROID_TABLE " (locale) VALUES(?);"; + err = sqlite3_prepare_v2(connection->db, sql, -1, &stmt, NULL); + if (err != SQLITE_OK) { + ALOGE("sqlite3_prepare_v2(\"%s\") failed", sql); + throw_sqlite3_exception(env, connection->db); + goto rollback; + } + + err = sqlite3_bind_text(stmt, 1, locale, -1, SQLITE_TRANSIENT); + if (err != SQLITE_OK) { + ALOGE("sqlite3_bind_text() failed setting locale"); + throw_sqlite3_exception(env, connection->db); + goto rollback; + } + + err = sqlite3_step(stmt); + if (err != SQLITE_OK && err != SQLITE_DONE) { + ALOGE("sqlite3_step(\"%s\") failed setting locale", sql); + throw_sqlite3_exception(env, connection->db); + goto rollback; + } + + err = sqlite3_exec(connection->db, "REINDEX LOCALIZED", NULL, NULL, NULL); + if (err != SQLITE_OK) { + ALOGE("REINDEX LOCALIZED failed"); + throw_sqlite3_exception(env, connection->db); + goto rollback; + } + + // all done, yay! + err = sqlite3_exec(connection->db, "COMMIT TRANSACTION", NULL, NULL, NULL); + if (err != SQLITE_OK) { + ALOGE("COMMIT TRANSACTION failed setting locale"); + throw_sqlite3_exception(env, connection->db); + goto done; + } + +rollback: + if (err != SQLITE_OK) { + sqlite3_exec(connection->db, "ROLLBACK TRANSACTION", NULL, NULL, NULL); + } + +done: + if (stmt) { + sqlite3_finalize(stmt); + } + if (meta) { + sqlite3_free_table(meta); + } + if (locale) { + env->ReleaseStringUTFChars(localeStr, locale); + } +} + +static jint nativePrepareStatement(JNIEnv* env, jclass clazz, jint connectionPtr, + jstring sqlString) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + + jsize sqlLength = env->GetStringLength(sqlString); + const jchar* sql = env->GetStringCritical(sqlString, NULL); + sqlite3_stmt* statement; + int err = sqlite3_prepare16_v2(connection->db, + sql, sqlLength * sizeof(jchar), &statement, NULL); + env->ReleaseStringCritical(sqlString, sql); + + if (err != SQLITE_OK) { + // Error messages like 'near ")": syntax error' are not + // always helpful enough, so construct an error string that + // includes the query itself. + const char *query = env->GetStringUTFChars(sqlString, NULL); + char *message = (char*) malloc(strlen(query) + 50); + if (message) { + strcpy(message, ", while compiling: "); // less than 50 chars + strcat(message, query); + } + env->ReleaseStringUTFChars(sqlString, query); + throw_sqlite3_exception(env, connection->db, message); + free(message); + return 0; + } + + ALOGV("Prepared statement %p on connection %p", statement, connection->db); + return reinterpret_cast<jint>(statement); +} + +static void nativeFinalizeStatement(JNIEnv* env, jclass clazz, jint connectionPtr, + jint statementPtr) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + + ALOGV("Finalized statement %p on connection %p", statement, connection->db); + int err = sqlite3_finalize(statement); + if (err != SQLITE_OK) { + throw_sqlite3_exception(env, connection->db, NULL); + } +} + +static jint nativeGetParameterCount(JNIEnv* env, jclass clazz, jint connectionPtr, + jint statementPtr) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + + return sqlite3_bind_parameter_count(statement); +} + +static jboolean nativeIsReadOnly(JNIEnv* env, jclass clazz, jint connectionPtr, + jint statementPtr) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + + return sqlite3_stmt_readonly(statement) != 0; +} + +static jint nativeGetColumnCount(JNIEnv* env, jclass clazz, jint connectionPtr, + jint statementPtr) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + + return sqlite3_column_count(statement); +} + +static jstring nativeGetColumnName(JNIEnv* env, jclass clazz, jint connectionPtr, + jint statementPtr, jint index) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + + const jchar* name = static_cast<const jchar*>(sqlite3_column_name16(statement, index)); + if (name) { + size_t length = 0; + while (name[length]) { + length += 1; + } + return env->NewString(name, length); + } + return NULL; +} + +static void nativeBindNull(JNIEnv* env, jclass clazz, jint connectionPtr, + jint statementPtr, jint index) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + + int err = sqlite3_bind_null(statement, index); + if (err != SQLITE_OK) { + throw_sqlite3_exception(env, connection->db, NULL); + } +} + +static void nativeBindLong(JNIEnv* env, jclass clazz, jint connectionPtr, + jint statementPtr, jint index, jlong value) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + + int err = sqlite3_bind_int64(statement, index, value); + if (err != SQLITE_OK) { + throw_sqlite3_exception(env, connection->db, NULL); + } +} + +static void nativeBindDouble(JNIEnv* env, jclass clazz, jint connectionPtr, + jint statementPtr, jint index, jdouble value) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + + int err = sqlite3_bind_double(statement, index, value); + if (err != SQLITE_OK) { + throw_sqlite3_exception(env, connection->db, NULL); + } +} + +static void nativeBindString(JNIEnv* env, jclass clazz, jint connectionPtr, + jint statementPtr, jint index, jstring valueString) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + + jsize valueLength = env->GetStringLength(valueString); + const jchar* value = env->GetStringCritical(valueString, NULL); + int err = sqlite3_bind_text16(statement, index, value, valueLength * sizeof(jchar), + SQLITE_TRANSIENT); + env->ReleaseStringCritical(valueString, value); + if (err != SQLITE_OK) { + throw_sqlite3_exception(env, connection->db, NULL); + } +} + +static void nativeBindBlob(JNIEnv* env, jclass clazz, jint connectionPtr, + jint statementPtr, jint index, jbyteArray valueArray) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + + jsize valueLength = env->GetArrayLength(valueArray); + jbyte* value = static_cast<jbyte*>(env->GetPrimitiveArrayCritical(valueArray, NULL)); + int err = sqlite3_bind_blob(statement, index, value, valueLength, SQLITE_TRANSIENT); + env->ReleasePrimitiveArrayCritical(valueArray, value, JNI_ABORT); + if (err != SQLITE_OK) { + throw_sqlite3_exception(env, connection->db, NULL); + } +} + +static void nativeResetStatementAndClearBindings(JNIEnv* env, jclass clazz, jint connectionPtr, + jint statementPtr) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + + int err = sqlite3_reset(statement); + if (err == SQLITE_OK) { + err = sqlite3_clear_bindings(statement); + } + if (err != SQLITE_OK) { + throw_sqlite3_exception(env, connection->db, NULL); + } +} + +static int executeNonQuery(JNIEnv* env, SQLiteConnection* connection, sqlite3_stmt* statement) { + int err = sqlite3_step(statement); + if (err == SQLITE_ROW) { + throw_sqlite3_exception(env, + "Queries can be performed using SQLiteDatabase query or rawQuery methods only."); + } else if (err != SQLITE_DONE) { + throw_sqlite3_exception_errcode(env, err, sqlite3_errmsg(connection->db)); + } + return err; +} + +static void nativeExecute(JNIEnv* env, jclass clazz, jint connectionPtr, + jint statementPtr) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + + executeNonQuery(env, connection, statement); +} + +static jint nativeExecuteForChangedRowCount(JNIEnv* env, jclass clazz, + jint connectionPtr, jint statementPtr) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + + int err = executeNonQuery(env, connection, statement); + return err == SQLITE_DONE ? sqlite3_changes(connection->db) : -1; +} + +static jlong nativeExecuteForLastInsertedRowId(JNIEnv* env, jclass clazz, + jint connectionPtr, jint statementPtr) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + + int err = executeNonQuery(env, connection, statement); + return err == SQLITE_DONE && sqlite3_changes(connection->db) > 0 + ? sqlite3_last_insert_rowid(connection->db) : -1; +} + +static int executeOneRowQuery(JNIEnv* env, SQLiteConnection* connection, sqlite3_stmt* statement) { + int err = sqlite3_step(statement); + if (err != SQLITE_ROW) { + throw_sqlite3_exception_errcode(env, err, sqlite3_errmsg(connection->db)); + } + return err; +} + +static jlong nativeExecuteForLong(JNIEnv* env, jclass clazz, + jint connectionPtr, jint statementPtr) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + + int err = executeOneRowQuery(env, connection, statement); + if (err == SQLITE_ROW && sqlite3_column_count(statement) >= 1) { + return sqlite3_column_int64(statement, 0); + } + return -1; +} + +static jstring nativeExecuteForString(JNIEnv* env, jclass clazz, + jint connectionPtr, jint statementPtr) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + + int err = executeOneRowQuery(env, connection, statement); + if (err == SQLITE_ROW && sqlite3_column_count(statement) >= 1) { + const jchar* text = static_cast<const jchar*>(sqlite3_column_text16(statement, 0)); + if (text) { + size_t length = sqlite3_column_bytes16(statement, 0) / sizeof(jchar); + return env->NewString(text, length); + } + } + return NULL; +} + +static int createAshmemRegionWithData(JNIEnv* env, const void* data, size_t length) { + int error = 0; + int fd = ashmem_create_region(NULL, length); + if (fd < 0) { + error = errno; + ALOGE("ashmem_create_region failed: %s", strerror(error)); + } else { + if (length > 0) { + void* ptr = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (ptr == MAP_FAILED) { + error = errno; + ALOGE("mmap failed: %s", strerror(error)); + } else { + memcpy(ptr, data, length); + munmap(ptr, length); + } + } + + if (!error) { + if (ashmem_set_prot_region(fd, PROT_READ) < 0) { + error = errno; + ALOGE("ashmem_set_prot_region failed: %s", strerror(errno)); + } else { + return fd; + } + } + + close(fd); + } + + jniThrowIOException(env, error); + return -1; +} + +static jint nativeExecuteForBlobFileDescriptor(JNIEnv* env, jclass clazz, + jint connectionPtr, jint statementPtr) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + + int err = executeOneRowQuery(env, connection, statement); + if (err == SQLITE_ROW && sqlite3_column_count(statement) >= 1) { + const void* blob = sqlite3_column_blob(statement, 0); + if (blob) { + int length = sqlite3_column_bytes(statement, 0); + if (length >= 0) { + return createAshmemRegionWithData(env, blob, length); + } + } + } + return -1; +} + +enum CopyRowResult { + CPR_OK, + CPR_FULL, + CPR_ERROR, +}; + +static CopyRowResult copyRow(JNIEnv* env, CursorWindow* window, + sqlite3_stmt* statement, int numColumns, int startPos, int addedRows) { + // Allocate a new field directory for the row. + status_t status = window->allocRow(); + if (status) { + LOG_WINDOW("Failed allocating fieldDir at startPos %d row %d, error=%d", + startPos, addedRows, status); + return CPR_FULL; + } + + // Pack the row into the window. + CopyRowResult result = CPR_OK; + for (int i = 0; i < numColumns; i++) { + int type = sqlite3_column_type(statement, i); + if (type == SQLITE_TEXT) { + // TEXT data + const char* text = reinterpret_cast<const char*>( + sqlite3_column_text(statement, i)); + // SQLite does not include the NULL terminator in size, but does + // ensure all strings are NULL terminated, so increase size by + // one to make sure we store the terminator. + size_t sizeIncludingNull = sqlite3_column_bytes(statement, i) + 1; + status = window->putString(addedRows, i, text, sizeIncludingNull); + if (status) { + LOG_WINDOW("Failed allocating %u bytes for text at %d,%d, error=%d", + sizeIncludingNull, startPos + addedRows, i, status); + result = CPR_FULL; + break; + } + LOG_WINDOW("%d,%d is TEXT with %u bytes", + startPos + addedRows, i, sizeIncludingNull); + } else if (type == SQLITE_INTEGER) { + // INTEGER data + int64_t value = sqlite3_column_int64(statement, i); + status = window->putLong(addedRows, i, value); + if (status) { + LOG_WINDOW("Failed allocating space for a long in column %d, error=%d", + i, status); + result = CPR_FULL; + break; + } + LOG_WINDOW("%d,%d is INTEGER 0x%016llx", startPos + addedRows, i, value); + } else if (type == SQLITE_FLOAT) { + // FLOAT data + double value = sqlite3_column_double(statement, i); + status = window->putDouble(addedRows, i, value); + if (status) { + LOG_WINDOW("Failed allocating space for a double in column %d, error=%d", + i, status); + result = CPR_FULL; + break; + } + LOG_WINDOW("%d,%d is FLOAT %lf", startPos + addedRows, i, value); + } else if (type == SQLITE_BLOB) { + // BLOB data + const void* blob = sqlite3_column_blob(statement, i); + size_t size = sqlite3_column_bytes(statement, i); + status = window->putBlob(addedRows, i, blob, size); + if (status) { + LOG_WINDOW("Failed allocating %u bytes for blob at %d,%d, error=%d", + size, startPos + addedRows, i, status); + result = CPR_FULL; + break; + } + LOG_WINDOW("%d,%d is Blob with %u bytes", + startPos + addedRows, i, size); + } else if (type == SQLITE_NULL) { + // NULL field + status = window->putNull(addedRows, i); + if (status) { + LOG_WINDOW("Failed allocating space for a null in column %d, error=%d", + i, status); + result = CPR_FULL; + break; + } + + LOG_WINDOW("%d,%d is NULL", startPos + addedRows, i); + } else { + // Unknown data + ALOGE("Unknown column type when filling database window"); + throw_sqlite3_exception(env, "Unknown column type when filling window"); + result = CPR_ERROR; + break; + } + } + + // Free the last row if if was not successfully copied. + if (result != CPR_OK) { + window->freeLastRow(); + } + return result; +} + +static jlong nativeExecuteForCursorWindow(JNIEnv* env, jclass clazz, + jint connectionPtr, jint statementPtr, jint windowPtr, + jint startPos, jint requiredPos, jboolean countAllRows) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); + CursorWindow* window = reinterpret_cast<CursorWindow*>(windowPtr); + + status_t status = window->clear(); + if (status) { + String8 msg; + msg.appendFormat("Failed to clear the cursor window, status=%d", status); + throw_sqlite3_exception(env, connection->db, msg.string()); + return 0; + } + + int numColumns = sqlite3_column_count(statement); + status = window->setNumColumns(numColumns); + if (status) { + String8 msg; + msg.appendFormat("Failed to set the cursor window column count to %d, status=%d", + numColumns, status); + throw_sqlite3_exception(env, connection->db, msg.string()); + return 0; + } + + int retryCount = 0; + int totalRows = 0; + int addedRows = 0; + bool windowFull = false; + bool gotException = false; + while (!gotException && (!windowFull || countAllRows)) { + int err = sqlite3_step(statement); + if (err == SQLITE_ROW) { + LOG_WINDOW("Stepped statement %p to row %d", statement, totalRows); + retryCount = 0; + totalRows += 1; + + // Skip the row if the window is full or we haven't reached the start position yet. + if (startPos >= totalRows || windowFull) { + continue; + } + + CopyRowResult cpr = copyRow(env, window, statement, numColumns, startPos, addedRows); + if (cpr == CPR_FULL && addedRows && startPos + addedRows < requiredPos) { + // We filled the window before we got to the one row that we really wanted. + // Clear the window and start filling it again from here. + // TODO: Would be nicer if we could progressively replace earlier rows. + window->clear(); + window->setNumColumns(numColumns); + startPos += addedRows; + addedRows = 0; + cpr = copyRow(env, window, statement, numColumns, startPos, addedRows); + } + + if (cpr == CPR_OK) { + addedRows += 1; + } else if (cpr == CPR_FULL) { + windowFull = true; + } else { + gotException = true; + } + } else if (err == SQLITE_DONE) { + // All rows processed, bail + LOG_WINDOW("Processed all rows"); + break; + } else if (err == SQLITE_LOCKED || err == SQLITE_BUSY) { + // The table is locked, retry + LOG_WINDOW("Database locked, retrying"); + if (retryCount > 50) { + ALOGE("Bailing on database busy retry"); + throw_sqlite3_exception(env, connection->db, "retrycount exceeded"); + gotException = true; + } else { + // Sleep to give the thread holding the lock a chance to finish + usleep(1000); + retryCount++; + } + } else { + throw_sqlite3_exception(env, connection->db); + gotException = true; + } + } + + LOG_WINDOW("Resetting statement %p after fetching %d rows and adding %d rows" + "to the window in %d bytes", + statement, totalRows, addedRows, window->size() - window->freeSpace()); + sqlite3_reset(statement); + + // Report the total number of rows on request. + if (startPos > totalRows) { + ALOGE("startPos %d > actual rows %d", startPos, totalRows); + } + jlong result = jlong(startPos) << 32 | jlong(totalRows); + return result; +} + +static jint nativeGetDbLookaside(JNIEnv* env, jobject clazz, jint connectionPtr) { + SQLiteConnection* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr); + + int cur = -1; + int unused; + sqlite3_db_status(connection->db, SQLITE_DBSTATUS_LOOKASIDE_USED, &cur, &unused, 0); + return cur; +} + + +static JNINativeMethod sMethods[] = +{ + /* name, signature, funcPtr */ + { "nativeOpen", "(Ljava/lang/String;ILjava/lang/String;ZZ)I", + (void*)nativeOpen }, + { "nativeClose", "(I)V", + (void*)nativeClose }, + { "nativeRegisterCustomFunction", "(ILandroid/database/sqlite/SQLiteCustomFunction;)V", + (void*)nativeRegisterCustomFunction }, + { "nativeSetLocale", "(ILjava/lang/String;)V", + (void*)nativeSetLocale }, + { "nativePrepareStatement", "(ILjava/lang/String;)I", + (void*)nativePrepareStatement }, + { "nativeFinalizeStatement", "(II)V", + (void*)nativeFinalizeStatement }, + { "nativeGetParameterCount", "(II)I", + (void*)nativeGetParameterCount }, + { "nativeIsReadOnly", "(II)Z", + (void*)nativeIsReadOnly }, + { "nativeGetColumnCount", "(II)I", + (void*)nativeGetColumnCount }, + { "nativeGetColumnName", "(III)Ljava/lang/String;", + (void*)nativeGetColumnName }, + { "nativeBindNull", "(III)V", + (void*)nativeBindNull }, + { "nativeBindLong", "(IIIJ)V", + (void*)nativeBindLong }, + { "nativeBindDouble", "(IIID)V", + (void*)nativeBindDouble }, + { "nativeBindString", "(IIILjava/lang/String;)V", + (void*)nativeBindString }, + { "nativeBindBlob", "(III[B)V", + (void*)nativeBindBlob }, + { "nativeResetStatementAndClearBindings", "(II)V", + (void*)nativeResetStatementAndClearBindings }, + { "nativeExecute", "(II)V", + (void*)nativeExecute }, + { "nativeExecuteForLong", "(II)J", + (void*)nativeExecuteForLong }, + { "nativeExecuteForString", "(II)Ljava/lang/String;", + (void*)nativeExecuteForString }, + { "nativeExecuteForBlobFileDescriptor", "(II)I", + (void*)nativeExecuteForBlobFileDescriptor }, + { "nativeExecuteForChangedRowCount", "(II)I", + (void*)nativeExecuteForChangedRowCount }, + { "nativeExecuteForLastInsertedRowId", "(II)J", + (void*)nativeExecuteForLastInsertedRowId }, + { "nativeExecuteForCursorWindow", "(IIIIIZ)J", + (void*)nativeExecuteForCursorWindow }, + { "nativeGetDbLookaside", "(I)I", + (void*)nativeGetDbLookaside }, +}; + +#define FIND_CLASS(var, className) \ + var = env->FindClass(className); \ + LOG_FATAL_IF(! var, "Unable to find class " className); + +#define GET_METHOD_ID(var, clazz, methodName, fieldDescriptor) \ + var = env->GetMethodID(clazz, methodName, fieldDescriptor); \ + LOG_FATAL_IF(! var, "Unable to find method" methodName); + +#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ + var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ + LOG_FATAL_IF(! var, "Unable to find field " fieldName); + +int register_android_database_SQLiteConnection(JNIEnv *env) +{ + jclass clazz; + FIND_CLASS(clazz, "android/database/sqlite/SQLiteCustomFunction"); + + GET_FIELD_ID(gSQLiteCustomFunctionClassInfo.name, clazz, + "name", "Ljava/lang/String;"); + GET_FIELD_ID(gSQLiteCustomFunctionClassInfo.numArgs, clazz, + "numArgs", "I"); + GET_METHOD_ID(gSQLiteCustomFunctionClassInfo.dispatchCallback, + clazz, "dispatchCallback", "([Ljava/lang/String;)V"); + + FIND_CLASS(clazz, "java/lang/String"); + gStringClassInfo.clazz = jclass(env->NewGlobalRef(clazz)); + + return AndroidRuntime::registerNativeMethods(env, "android/database/sqlite/SQLiteConnection", + sMethods, NELEM(sMethods)); +} + +} // namespace android diff --git a/core/jni/android_database_SQLiteDatabase.cpp b/core/jni/android_database_SQLiteDatabase.cpp deleted file mode 100644 index 28c421de6768..000000000000 --- a/core/jni/android_database_SQLiteDatabase.cpp +++ /dev/null @@ -1,636 +0,0 @@ -/* - * Copyright (C) 2006-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. - */ - -#undef LOG_TAG -#define LOG_TAG "SqliteDatabaseCpp" - -#include <utils/Log.h> -#include <utils/String8.h> -#include <utils/String16.h> - -#include <jni.h> -#include <JNIHelp.h> -#include <android_runtime/AndroidRuntime.h> - -#include <sqlite3.h> -#include <sqlite3_android.h> -#include <string.h> -#include <utils/Log.h> -#include <utils/threads.h> -#include <utils/List.h> -#include <utils/Errors.h> -#include <ctype.h> - -#include <stdio.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <string.h> -#include <netdb.h> -#include <sys/ioctl.h> - -#include "sqlite3_exception.h" - -#define UTF16_STORAGE 0 -#define INVALID_VERSION -1 -#define ANDROID_TABLE "android_metadata" -/* uncomment the next line to force-enable logging of all statements */ -// #define DB_LOG_STATEMENTS - -#define DEBUG_JNI 0 - -namespace android { - -enum { - OPEN_READWRITE = 0x00000000, - OPEN_READONLY = 0x00000001, - OPEN_READ_MASK = 0x00000001, - NO_LOCALIZED_COLLATORS = 0x00000010, - CREATE_IF_NECESSARY = 0x10000000 -}; - -static jfieldID offset_db_handle; -static jmethodID method_custom_function_callback; -static jclass string_class; -static jint sSqliteSoftHeapLimit = 0; - -static char *createStr(const char *path, short extra) { - int len = strlen(path) + extra; - char *str = (char *)malloc(len + 1); - strncpy(str, path, len); - str[len] = NULL; - return str; -} - -static void sqlLogger(void *databaseName, int iErrCode, const char *zMsg) { - // skip printing this message if it is due to certain types of errors - if (iErrCode == 0 || iErrCode == SQLITE_CONSTRAINT) return; - // print databasename, errorcode and msg - ALOGI("sqlite returned: error code = %d, msg = %s, db=%s\n", iErrCode, zMsg, databaseName); -} - -// register the logging func on sqlite. needs to be done BEFORE any sqlite3 func is called. -static void registerLoggingFunc(const char *path) { - static bool loggingFuncSet = false; - if (loggingFuncSet) { - return; - } - - ALOGV("Registering sqlite logging func \n"); - int err = sqlite3_config(SQLITE_CONFIG_LOG, &sqlLogger, (void *)createStr(path, 0)); - if (err != SQLITE_OK) { - ALOGW("sqlite returned error = %d when trying to register logging func.\n", err); - return; - } - loggingFuncSet = true; -} - -/* public native void dbopen(String path, int flags, String locale); */ -static void dbopen(JNIEnv* env, jobject object, jstring pathString, jint flags) -{ - int err; - sqlite3 * handle = NULL; - sqlite3_stmt * statement = NULL; - char const * path8 = env->GetStringUTFChars(pathString, NULL); - int sqliteFlags; - - // register the logging func on sqlite. needs to be done BEFORE any sqlite3 func is called. - registerLoggingFunc(path8); - - // convert our flags into the sqlite flags - if (flags & CREATE_IF_NECESSARY) { - sqliteFlags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; - } else if (flags & OPEN_READONLY) { - sqliteFlags = SQLITE_OPEN_READONLY; - } else { - sqliteFlags = SQLITE_OPEN_READWRITE; - } - - err = sqlite3_open_v2(path8, &handle, sqliteFlags, NULL); - if (err != SQLITE_OK) { - ALOGE("sqlite3_open_v2(\"%s\", &handle, %d, NULL) failed\n", path8, sqliteFlags); - throw_sqlite3_exception(env, handle); - goto done; - } - - // The soft heap limit prevents the page cache allocations from growing - // beyond the given limit, no matter what the max page cache sizes are - // set to. The limit does not, as of 3.5.0, affect any other allocations. - sqlite3_soft_heap_limit(sSqliteSoftHeapLimit); - - // Set the default busy handler to retry for 1000ms and then return SQLITE_BUSY - err = sqlite3_busy_timeout(handle, 1000 /* ms */); - if (err != SQLITE_OK) { - ALOGE("sqlite3_busy_timeout(handle, 1000) failed for \"%s\"\n", path8); - throw_sqlite3_exception(env, handle); - goto done; - } - -#ifdef DB_INTEGRITY_CHECK - static const char* integritySql = "pragma integrity_check(1);"; - err = sqlite3_prepare_v2(handle, integritySql, -1, &statement, NULL); - if (err != SQLITE_OK) { - ALOGE("sqlite_prepare_v2(handle, \"%s\") failed for \"%s\"\n", integritySql, path8); - throw_sqlite3_exception(env, handle); - goto done; - } - - // first is OK or error message - err = sqlite3_step(statement); - if (err != SQLITE_ROW) { - ALOGE("integrity check failed for \"%s\"\n", integritySql, path8); - throw_sqlite3_exception(env, handle); - goto done; - } else { - const char *text = (const char*)sqlite3_column_text(statement, 0); - if (strcmp(text, "ok") != 0) { - ALOGE("integrity check failed for \"%s\": %s\n", integritySql, path8, text); - jniThrowException(env, "android/database/sqlite/SQLiteDatabaseCorruptException", text); - goto done; - } - } -#endif - - err = register_android_functions(handle, UTF16_STORAGE); - if (err) { - throw_sqlite3_exception(env, handle); - goto done; - } - - ALOGV("Opened '%s' - %p\n", path8, handle); - env->SetIntField(object, offset_db_handle, (int) handle); - handle = NULL; // The caller owns the handle now. - -done: - // Release allocated resources - if (path8 != NULL) env->ReleaseStringUTFChars(pathString, path8); - if (statement != NULL) sqlite3_finalize(statement); - if (handle != NULL) sqlite3_close(handle); -} - -static char *getDatabaseName(JNIEnv* env, sqlite3 * handle, jstring databaseName, short connNum) { - char const *path = env->GetStringUTFChars(databaseName, NULL); - if (path == NULL) { - ALOGE("Failure in getDatabaseName(). VM ran out of memory?\n"); - return NULL; // VM would have thrown OutOfMemoryError - } - char *dbNameStr = createStr(path, 4); - if (connNum > 999) { // TODO: if number of pooled connections > 999, fix this line. - connNum = -1; - } - sprintf(dbNameStr + strlen(path), "|%03d", connNum); - env->ReleaseStringUTFChars(databaseName, path); - return dbNameStr; -} - -static void sqlTrace(void *databaseName, const char *sql) { - ALOGI("sql_statement|%s|%s\n", (char *)databaseName, sql); -} - -/* public native void enableSqlTracing(); */ -static void enableSqlTracing(JNIEnv* env, jobject object, jstring databaseName, jshort connType) -{ - sqlite3 * handle = (sqlite3 *)env->GetIntField(object, offset_db_handle); - sqlite3_trace(handle, &sqlTrace, (void *)getDatabaseName(env, handle, databaseName, connType)); -} - -static void sqlProfile(void *databaseName, const char *sql, sqlite3_uint64 tm) { - double d = tm/1000000.0; - ALOGI("elapsedTime4Sql|%s|%.3f ms|%s\n", (char *)databaseName, d, sql); -} - -/* public native void enableSqlProfiling(); */ -static void enableSqlProfiling(JNIEnv* env, jobject object, jstring databaseName, jshort connType) -{ - sqlite3 * handle = (sqlite3 *)env->GetIntField(object, offset_db_handle); - sqlite3_profile(handle, &sqlProfile, (void *)getDatabaseName(env, handle, databaseName, - connType)); -} - -/* public native void close(); */ -static void dbclose(JNIEnv* env, jobject object) -{ - sqlite3 * handle = (sqlite3 *)env->GetIntField(object, offset_db_handle); - - if (handle != NULL) { - // release the memory associated with the traceFuncArg in enableSqlTracing function - void *traceFuncArg = sqlite3_trace(handle, &sqlTrace, NULL); - if (traceFuncArg != NULL) { - free(traceFuncArg); - } - // release the memory associated with the traceFuncArg in enableSqlProfiling function - traceFuncArg = sqlite3_profile(handle, &sqlProfile, NULL); - if (traceFuncArg != NULL) { - free(traceFuncArg); - } - ALOGV("Closing database: handle=%p\n", handle); - int result = sqlite3_close(handle); - if (result == SQLITE_OK) { - ALOGV("Closed %p\n", handle); - env->SetIntField(object, offset_db_handle, 0); - } else { - // This can happen if sub-objects aren't closed first. Make sure the caller knows. - throw_sqlite3_exception(env, handle); - ALOGE("sqlite3_close(%p) failed: %d\n", handle, result); - } - } -} - -/* native int native_getDbLookaside(); */ -static jint native_getDbLookaside(JNIEnv* env, jobject object) -{ - sqlite3 * handle = (sqlite3 *)env->GetIntField(object, offset_db_handle); - int pCur = -1; - int unused; - sqlite3_db_status(handle, SQLITE_DBSTATUS_LOOKASIDE_USED, &pCur, &unused, 0); - return pCur; -} - -/* set locale in the android_metadata table, install localized collators, and rebuild indexes */ -static void native_setLocale(JNIEnv* env, jobject object, jstring localeString, jint flags) -{ - if ((flags & NO_LOCALIZED_COLLATORS)) return; - - int err; - char const* locale8 = env->GetStringUTFChars(localeString, NULL); - sqlite3 * handle = (sqlite3 *)env->GetIntField(object, offset_db_handle); - sqlite3_stmt* stmt = NULL; - char** meta = NULL; - int rowCount, colCount; - char* dbLocale = NULL; - - // create the table, if necessary and possible - if (!(flags & OPEN_READONLY)) { - static const char *createSql ="CREATE TABLE IF NOT EXISTS " ANDROID_TABLE " (locale TEXT)"; - err = sqlite3_exec(handle, createSql, NULL, NULL, NULL); - if (err != SQLITE_OK) { - ALOGE("CREATE TABLE " ANDROID_TABLE " failed\n"); - throw_sqlite3_exception(env, handle); - goto done; - } - } - - // try to read from the table - static const char *selectSql = "SELECT locale FROM " ANDROID_TABLE " LIMIT 1"; - err = sqlite3_get_table(handle, selectSql, &meta, &rowCount, &colCount, NULL); - if (err != SQLITE_OK) { - ALOGE("SELECT locale FROM " ANDROID_TABLE " failed\n"); - throw_sqlite3_exception(env, handle); - goto done; - } - - dbLocale = (rowCount >= 1) ? meta[colCount] : NULL; - - if (dbLocale != NULL && !strcmp(dbLocale, locale8)) { - // database locale is the same as the desired locale; set up the collators and go - err = register_localized_collators(handle, locale8, UTF16_STORAGE); - if (err != SQLITE_OK) throw_sqlite3_exception(env, handle); - goto done; // no database changes needed - } - - if ((flags & OPEN_READONLY)) { - // read-only database, so we're going to have to put up with whatever we got - // For registering new index. Not for modifing the read-only database. - err = register_localized_collators(handle, locale8, UTF16_STORAGE); - if (err != SQLITE_OK) throw_sqlite3_exception(env, handle); - goto done; - } - - // need to update android_metadata and indexes atomically, so use a transaction... - err = sqlite3_exec(handle, "BEGIN TRANSACTION", NULL, NULL, NULL); - if (err != SQLITE_OK) { - ALOGE("BEGIN TRANSACTION failed setting locale\n"); - throw_sqlite3_exception(env, handle); - goto done; - } - - err = register_localized_collators(handle, locale8, UTF16_STORAGE); - if (err != SQLITE_OK) { - ALOGE("register_localized_collators() failed setting locale\n"); - throw_sqlite3_exception(env, handle); - goto rollback; - } - - err = sqlite3_exec(handle, "DELETE FROM " ANDROID_TABLE, NULL, NULL, NULL); - if (err != SQLITE_OK) { - ALOGE("DELETE failed setting locale\n"); - throw_sqlite3_exception(env, handle); - goto rollback; - } - - static const char *sql = "INSERT INTO " ANDROID_TABLE " (locale) VALUES(?);"; - err = sqlite3_prepare_v2(handle, sql, -1, &stmt, NULL); - if (err != SQLITE_OK) { - ALOGE("sqlite3_prepare_v2(\"%s\") failed\n", sql); - throw_sqlite3_exception(env, handle); - goto rollback; - } - - err = sqlite3_bind_text(stmt, 1, locale8, -1, SQLITE_TRANSIENT); - if (err != SQLITE_OK) { - ALOGE("sqlite3_bind_text() failed setting locale\n"); - throw_sqlite3_exception(env, handle); - goto rollback; - } - - err = sqlite3_step(stmt); - if (err != SQLITE_OK && err != SQLITE_DONE) { - ALOGE("sqlite3_step(\"%s\") failed setting locale\n", sql); - throw_sqlite3_exception(env, handle); - goto rollback; - } - - err = sqlite3_exec(handle, "REINDEX LOCALIZED", NULL, NULL, NULL); - if (err != SQLITE_OK) { - ALOGE("REINDEX LOCALIZED failed\n"); - throw_sqlite3_exception(env, handle); - goto rollback; - } - - // all done, yay! - err = sqlite3_exec(handle, "COMMIT TRANSACTION", NULL, NULL, NULL); - if (err != SQLITE_OK) { - ALOGE("COMMIT TRANSACTION failed setting locale\n"); - throw_sqlite3_exception(env, handle); - goto done; - } - -rollback: - if (err != SQLITE_OK) { - sqlite3_exec(handle, "ROLLBACK TRANSACTION", NULL, NULL, NULL); - } - -done: - if (locale8 != NULL) env->ReleaseStringUTFChars(localeString, locale8); - if (stmt != NULL) sqlite3_finalize(stmt); - if (meta != NULL) sqlite3_free_table(meta); -} - -static void native_setSqliteSoftHeapLimit(JNIEnv* env, jobject clazz, jint limit) { - sSqliteSoftHeapLimit = limit; -} - -static jint native_releaseMemory(JNIEnv *env, jobject clazz) -{ - // Attempt to release as much memory from the - return sqlite3_release_memory(sSqliteSoftHeapLimit); -} - -static void native_finalize(JNIEnv* env, jobject object, jint statementId) -{ - if (statementId > 0) { - sqlite3_finalize((sqlite3_stmt *)statementId); - } -} - -static void custom_function_callback(sqlite3_context * context, int argc, sqlite3_value ** argv) { - JNIEnv* env = AndroidRuntime::getJNIEnv(); - if (!env) { - ALOGE("custom_function_callback cannot call into Java on this thread"); - return; - } - // get global ref to CustomFunction object from our user data - jobject function = (jobject)sqlite3_user_data(context); - - // pack up the arguments into a string array - jobjectArray strArray = env->NewObjectArray(argc, string_class, NULL); - if (!strArray) - goto done; - for (int i = 0; i < argc; i++) { - char* arg = (char *)sqlite3_value_text(argv[i]); - if (!arg) { - ALOGE("NULL argument in custom_function_callback. This should not happen."); - return; - } - jobject obj = env->NewStringUTF(arg); - if (!obj) - goto done; - env->SetObjectArrayElement(strArray, i, obj); - env->DeleteLocalRef(obj); - } - - env->CallVoidMethod(function, method_custom_function_callback, strArray); - env->DeleteLocalRef(strArray); - -done: - if (env->ExceptionCheck()) { - ALOGE("An exception was thrown by custom sqlite3 function."); - LOGE_EX(env); - env->ExceptionClear(); - } -} - -static jint native_addCustomFunction(JNIEnv* env, jobject object, - jstring name, jint numArgs, jobject function) -{ - sqlite3 * handle = (sqlite3 *)env->GetIntField(object, offset_db_handle); - char const *nameStr = env->GetStringUTFChars(name, NULL); - jobject ref = env->NewGlobalRef(function); - ALOGD_IF(DEBUG_JNI, "native_addCustomFunction %s ref: %p", nameStr, ref); - int err = sqlite3_create_function(handle, nameStr, numArgs, SQLITE_UTF8, - (void *)ref, custom_function_callback, NULL, NULL); - env->ReleaseStringUTFChars(name, nameStr); - - if (err == SQLITE_OK) - return (int)ref; - else { - ALOGE("sqlite3_create_function returned %d", err); - env->DeleteGlobalRef(ref); - throw_sqlite3_exception(env, handle); - return 0; - } -} - -static void native_releaseCustomFunction(JNIEnv* env, jobject object, jint ref) -{ - ALOGD_IF(DEBUG_JNI, "native_releaseCustomFunction %d", ref); - env->DeleteGlobalRef((jobject)ref); -} - -static JNINativeMethod sMethods[] = -{ - /* name, signature, funcPtr */ - {"dbopen", "(Ljava/lang/String;I)V", (void *)dbopen}, - {"dbclose", "()V", (void *)dbclose}, - {"enableSqlTracing", "(Ljava/lang/String;S)V", (void *)enableSqlTracing}, - {"enableSqlProfiling", "(Ljava/lang/String;S)V", (void *)enableSqlProfiling}, - {"native_setLocale", "(Ljava/lang/String;I)V", (void *)native_setLocale}, - {"native_getDbLookaside", "()I", (void *)native_getDbLookaside}, - {"native_setSqliteSoftHeapLimit", "(I)V", (void *)native_setSqliteSoftHeapLimit}, - {"releaseMemory", "()I", (void *)native_releaseMemory}, - {"native_finalize", "(I)V", (void *)native_finalize}, - {"native_addCustomFunction", - "(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CustomFunction;)I", - (void *)native_addCustomFunction}, - {"native_releaseCustomFunction", "(I)V", (void *)native_releaseCustomFunction}, -}; - -int register_android_database_SQLiteDatabase(JNIEnv *env) -{ - jclass clazz; - - clazz = env->FindClass("android/database/sqlite/SQLiteDatabase"); - if (clazz == NULL) { - ALOGE("Can't find android/database/sqlite/SQLiteDatabase\n"); - return -1; - } - - string_class = (jclass)env->NewGlobalRef(env->FindClass("java/lang/String")); - if (string_class == NULL) { - ALOGE("Can't find java/lang/String\n"); - return -1; - } - - offset_db_handle = env->GetFieldID(clazz, "mNativeHandle", "I"); - if (offset_db_handle == NULL) { - ALOGE("Can't find SQLiteDatabase.mNativeHandle\n"); - return -1; - } - - clazz = env->FindClass("android/database/sqlite/SQLiteDatabase$CustomFunction"); - if (clazz == NULL) { - ALOGE("Can't find android/database/sqlite/SQLiteDatabase$CustomFunction\n"); - return -1; - } - method_custom_function_callback = env->GetMethodID(clazz, "callback", "([Ljava/lang/String;)V"); - if (method_custom_function_callback == NULL) { - ALOGE("Can't find method SQLiteDatabase.CustomFunction.callback\n"); - return -1; - } - - return AndroidRuntime::registerNativeMethods(env, "android/database/sqlite/SQLiteDatabase", - sMethods, NELEM(sMethods)); -} - -/* throw a SQLiteException with a message appropriate for the error in handle */ -void throw_sqlite3_exception(JNIEnv* env, sqlite3* handle) { - throw_sqlite3_exception(env, handle, NULL); -} - -/* throw a SQLiteException with the given message */ -void throw_sqlite3_exception(JNIEnv* env, const char* message) { - throw_sqlite3_exception(env, NULL, message); -} - -/* throw a SQLiteException with a message appropriate for the error in handle - concatenated with the given message - */ -void throw_sqlite3_exception(JNIEnv* env, sqlite3* handle, const char* message) { - if (handle) { - throw_sqlite3_exception(env, sqlite3_errcode(handle), - sqlite3_errmsg(handle), message); - } else { - // we use SQLITE_OK so that a generic SQLiteException is thrown; - // any code not specified in the switch statement below would do. - throw_sqlite3_exception(env, SQLITE_OK, "unknown error", message); - } -} - -/* throw a SQLiteException for a given error code */ -void throw_sqlite3_exception_errcode(JNIEnv* env, int errcode, const char* message) { - if (errcode == SQLITE_DONE) { - throw_sqlite3_exception(env, errcode, NULL, message); - } else { - char temp[21]; - sprintf(temp, "error code %d", errcode); - throw_sqlite3_exception(env, errcode, temp, message); - } -} - -/* throw a SQLiteException for a given error code, sqlite3message, and - user message - */ -void throw_sqlite3_exception(JNIEnv* env, int errcode, - const char* sqlite3Message, const char* message) { - const char* exceptionClass; - switch (errcode) { - case SQLITE_IOERR: - exceptionClass = "android/database/sqlite/SQLiteDiskIOException"; - break; - case SQLITE_CORRUPT: - case SQLITE_NOTADB: // treat "unsupported file format" error as corruption also - exceptionClass = "android/database/sqlite/SQLiteDatabaseCorruptException"; - break; - case SQLITE_CONSTRAINT: - exceptionClass = "android/database/sqlite/SQLiteConstraintException"; - break; - case SQLITE_ABORT: - exceptionClass = "android/database/sqlite/SQLiteAbortException"; - break; - case SQLITE_DONE: - exceptionClass = "android/database/sqlite/SQLiteDoneException"; - break; - case SQLITE_FULL: - exceptionClass = "android/database/sqlite/SQLiteFullException"; - break; - case SQLITE_MISUSE: - exceptionClass = "android/database/sqlite/SQLiteMisuseException"; - break; - case SQLITE_PERM: - exceptionClass = "android/database/sqlite/SQLiteAccessPermException"; - break; - case SQLITE_BUSY: - exceptionClass = "android/database/sqlite/SQLiteDatabaseLockedException"; - break; - case SQLITE_LOCKED: - exceptionClass = "android/database/sqlite/SQLiteTableLockedException"; - break; - case SQLITE_READONLY: - exceptionClass = "android/database/sqlite/SQLiteReadOnlyDatabaseException"; - break; - case SQLITE_CANTOPEN: - exceptionClass = "android/database/sqlite/SQLiteCantOpenDatabaseException"; - break; - case SQLITE_TOOBIG: - exceptionClass = "android/database/sqlite/SQLiteBlobTooBigException"; - break; - case SQLITE_RANGE: - exceptionClass = "android/database/sqlite/SQLiteBindOrColumnIndexOutOfRangeException"; - break; - case SQLITE_NOMEM: - exceptionClass = "android/database/sqlite/SQLiteOutOfMemoryException"; - break; - case SQLITE_MISMATCH: - exceptionClass = "android/database/sqlite/SQLiteDatatypeMismatchException"; - break; - case SQLITE_UNCLOSED: - exceptionClass = "android/database/sqlite/SQLiteUnfinalizedObjectsException"; - break; - default: - exceptionClass = "android/database/sqlite/SQLiteException"; - break; - } - - if (sqlite3Message != NULL && message != NULL) { - char* fullMessage = (char *)malloc(strlen(sqlite3Message) + strlen(message) + 3); - if (fullMessage != NULL) { - strcpy(fullMessage, sqlite3Message); - strcat(fullMessage, ": "); - strcat(fullMessage, message); - jniThrowException(env, exceptionClass, fullMessage); - free(fullMessage); - } else { - jniThrowException(env, exceptionClass, sqlite3Message); - } - } else if (sqlite3Message != NULL) { - jniThrowException(env, exceptionClass, sqlite3Message); - } else { - jniThrowException(env, exceptionClass, message); - } -} - - -} // namespace android diff --git a/core/jni/android_database_SQLiteGlobal.cpp b/core/jni/android_database_SQLiteGlobal.cpp new file mode 100644 index 000000000000..82cae5aa7502 --- /dev/null +++ b/core/jni/android_database_SQLiteGlobal.cpp @@ -0,0 +1,78 @@ +/* + * 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_TAG "SQLiteGlobal" + +#include <jni.h> +#include <JNIHelp.h> +#include <android_runtime/AndroidRuntime.h> + +#include <sqlite3.h> +#include <sqlite3_android.h> + +#include "android_database_SQLiteCommon.h" + +namespace android { + +// Called each time a message is logged. +static void sqliteLogCallback(void* data, int iErrCode, const char* zMsg) { + bool verboseLog = !!data; + if (iErrCode == 0 || iErrCode == SQLITE_CONSTRAINT) { + if (verboseLog) { + ALOGV(LOG_VERBOSE, SQLITE_LOG_TAG, "(%d) %s\n", iErrCode, zMsg); + } + } else { + ALOG(LOG_ERROR, SQLITE_LOG_TAG, "(%d) %s\n", iErrCode, zMsg); + } +} + +// Sets the global SQLite configuration. +// This must be called before any other SQLite functions are called. */ +static void nativeConfig(JNIEnv* env, jclass clazz, jboolean verboseLog, jint softHeapLimit) { + // Enable multi-threaded mode. In this mode, SQLite is safe to use by multiple + // threads as long as no two threads use the same database connection at the same + // time (which we guarantee in the SQLite database wrappers). + sqlite3_config(SQLITE_CONFIG_MULTITHREAD); + + // Redirect SQLite log messages to the Android log. + sqlite3_config(SQLITE_CONFIG_LOG, &sqliteLogCallback, verboseLog ? (void*)1 : NULL); + + // The soft heap limit prevents the page cache allocations from growing + // beyond the given limit, no matter what the max page cache sizes are + // set to. The limit does not, as of 3.5.0, affect any other allocations. + sqlite3_soft_heap_limit(softHeapLimit); +} + +static jint nativeReleaseMemory(JNIEnv* env, jclass clazz, jint bytesToFree) { + return sqlite3_release_memory(bytesToFree); +} + +static JNINativeMethod sMethods[] = +{ + /* name, signature, funcPtr */ + { "nativeConfig", "(ZI)V", + (void*)nativeConfig }, + { "nativeReleaseMemory", "(I)I", + (void*)nativeReleaseMemory }, +}; + +int register_android_database_SQLiteGlobal(JNIEnv *env) +{ + return AndroidRuntime::registerNativeMethods(env, "android/database/sqlite/SQLiteGlobal", + sMethods, NELEM(sMethods)); +} + +} // namespace android diff --git a/core/jni/android_database_SQLiteProgram.cpp b/core/jni/android_database_SQLiteProgram.cpp deleted file mode 100644 index 2e34c0030df9..000000000000 --- a/core/jni/android_database_SQLiteProgram.cpp +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (C) 2006-2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#undef LOG_TAG -#define LOG_TAG "Cursor" - -#include <jni.h> -#include <JNIHelp.h> -#include <android_runtime/AndroidRuntime.h> - -#include <sqlite3.h> - -#include <utils/Log.h> - -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -#include "sqlite3_exception.h" - - -namespace android { - -static jfieldID gHandleField; -static jfieldID gStatementField; - - -#define GET_STATEMENT(env, object) \ - (sqlite3_stmt *)env->GetIntField(object, gStatementField) -#define GET_HANDLE(env, object) \ - (sqlite3 *)env->GetIntField(object, gHandleField) - -static void native_compile(JNIEnv* env, jobject object, jstring sqlString) -{ - char buf[65]; - strcpy(buf, "android_database_SQLiteProgram->native_compile() not implemented"); - throw_sqlite3_exception(env, GET_HANDLE(env, object), buf); - return; -} - -static void native_bind_null(JNIEnv* env, jobject object, - jint index) -{ - int err; - sqlite3_stmt * statement = GET_STATEMENT(env, object); - - err = sqlite3_bind_null(statement, index); - if (err != SQLITE_OK) { - char buf[32]; - sprintf(buf, "handle %p", statement); - throw_sqlite3_exception(env, GET_HANDLE(env, object), buf); - return; - } -} - -static void native_bind_long(JNIEnv* env, jobject object, - jint index, jlong value) -{ - int err; - sqlite3_stmt * statement = GET_STATEMENT(env, object); - - err = sqlite3_bind_int64(statement, index, value); - if (err != SQLITE_OK) { - char buf[32]; - sprintf(buf, "handle %p", statement); - throw_sqlite3_exception(env, GET_HANDLE(env, object), buf); - return; - } -} - -static void native_bind_double(JNIEnv* env, jobject object, - jint index, jdouble value) -{ - int err; - sqlite3_stmt * statement = GET_STATEMENT(env, object); - - err = sqlite3_bind_double(statement, index, value); - if (err != SQLITE_OK) { - char buf[32]; - sprintf(buf, "handle %p", statement); - throw_sqlite3_exception(env, GET_HANDLE(env, object), buf); - return; - } -} - -static void native_bind_string(JNIEnv* env, jobject object, - jint index, jstring sqlString) -{ - int err; - jchar const * sql; - jsize sqlLen; - sqlite3_stmt * statement= GET_STATEMENT(env, object); - - sql = env->GetStringChars(sqlString, NULL); - sqlLen = env->GetStringLength(sqlString); - err = sqlite3_bind_text16(statement, index, sql, sqlLen * 2, SQLITE_TRANSIENT); - env->ReleaseStringChars(sqlString, sql); - if (err != SQLITE_OK) { - char buf[32]; - sprintf(buf, "handle %p", statement); - throw_sqlite3_exception(env, GET_HANDLE(env, object), buf); - return; - } -} - -static void native_bind_blob(JNIEnv* env, jobject object, - jint index, jbyteArray value) -{ - int err; - jchar const * sql; - jsize sqlLen; - sqlite3_stmt * statement= GET_STATEMENT(env, object); - - jint len = env->GetArrayLength(value); - jbyte * bytes = env->GetByteArrayElements(value, NULL); - - err = sqlite3_bind_blob(statement, index, bytes, len, SQLITE_TRANSIENT); - env->ReleaseByteArrayElements(value, bytes, JNI_ABORT); - - if (err != SQLITE_OK) { - char buf[32]; - sprintf(buf, "statement %p", statement); - throw_sqlite3_exception(env, GET_HANDLE(env, object), buf); - return; - } -} - -static void native_clear_bindings(JNIEnv* env, jobject object) -{ - int err; - sqlite3_stmt * statement = GET_STATEMENT(env, object); - - err = sqlite3_clear_bindings(statement); - if (err != SQLITE_OK) { - throw_sqlite3_exception(env, GET_HANDLE(env, object)); - return; - } -} - -static void native_finalize(JNIEnv* env, jobject object) -{ - char buf[66]; - strcpy(buf, "android_database_SQLiteProgram->native_finalize() not implemented"); - throw_sqlite3_exception(env, GET_HANDLE(env, object), buf); - return; -} - - -static JNINativeMethod sMethods[] = -{ - /* name, signature, funcPtr */ - {"native_bind_null", "(I)V", (void *)native_bind_null}, - {"native_bind_long", "(IJ)V", (void *)native_bind_long}, - {"native_bind_double", "(ID)V", (void *)native_bind_double}, - {"native_bind_string", "(ILjava/lang/String;)V", (void *)native_bind_string}, - {"native_bind_blob", "(I[B)V", (void *)native_bind_blob}, - {"native_clear_bindings", "()V", (void *)native_clear_bindings}, -}; - -int register_android_database_SQLiteProgram(JNIEnv * env) -{ - jclass clazz; - - clazz = env->FindClass("android/database/sqlite/SQLiteProgram"); - if (clazz == NULL) { - ALOGE("Can't find android/database/sqlite/SQLiteProgram"); - return -1; - } - - gHandleField = env->GetFieldID(clazz, "nHandle", "I"); - gStatementField = env->GetFieldID(clazz, "nStatement", "I"); - - if (gHandleField == NULL || gStatementField == NULL) { - ALOGE("Error locating fields"); - return -1; - } - - return AndroidRuntime::registerNativeMethods(env, - "android/database/sqlite/SQLiteProgram", sMethods, NELEM(sMethods)); -} - -} // namespace android diff --git a/core/jni/android_database_SQLiteQuery.cpp b/core/jni/android_database_SQLiteQuery.cpp deleted file mode 100644 index da7ccf02907e..000000000000 --- a/core/jni/android_database_SQLiteQuery.cpp +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#undef LOG_TAG -#define LOG_TAG "SqliteCursor.cpp" - -#include <jni.h> -#include <JNIHelp.h> -#include <android_runtime/AndroidRuntime.h> - -#include <sqlite3.h> - -#include <utils/Log.h> - -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -#include "binder/CursorWindow.h" -#include "sqlite3_exception.h" - - -namespace android { - -enum CopyRowResult { - CPR_OK, - CPR_FULL, - CPR_ERROR, -}; - -static CopyRowResult copyRow(JNIEnv* env, CursorWindow* window, - sqlite3_stmt* statement, int numColumns, int startPos, int addedRows) { - // Allocate a new field directory for the row. This pointer is not reused - // since it may be possible for it to be relocated on a call to alloc() when - // the field data is being allocated. - status_t status = window->allocRow(); - if (status) { - LOG_WINDOW("Failed allocating fieldDir at startPos %d row %d, error=%d", - startPos, addedRows, status); - return CPR_FULL; - } - - // Pack the row into the window. - CopyRowResult result = CPR_OK; - for (int i = 0; i < numColumns; i++) { - int type = sqlite3_column_type(statement, i); - if (type == SQLITE_TEXT) { - // TEXT data - const char* text = reinterpret_cast<const char*>( - sqlite3_column_text(statement, i)); - // SQLite does not include the NULL terminator in size, but does - // ensure all strings are NULL terminated, so increase size by - // one to make sure we store the terminator. - size_t sizeIncludingNull = sqlite3_column_bytes(statement, i) + 1; - status = window->putString(addedRows, i, text, sizeIncludingNull); - if (status) { - LOG_WINDOW("Failed allocating %u bytes for text at %d,%d, error=%d", - sizeIncludingNull, startPos + addedRows, i, status); - result = CPR_FULL; - break; - } - LOG_WINDOW("%d,%d is TEXT with %u bytes", - startPos + addedRows, i, sizeIncludingNull); - } else if (type == SQLITE_INTEGER) { - // INTEGER data - int64_t value = sqlite3_column_int64(statement, i); - status = window->putLong(addedRows, i, value); - if (status) { - LOG_WINDOW("Failed allocating space for a long in column %d, error=%d", - i, status); - result = CPR_FULL; - break; - } - LOG_WINDOW("%d,%d is INTEGER 0x%016llx", startPos + addedRows, i, value); - } else if (type == SQLITE_FLOAT) { - // FLOAT data - double value = sqlite3_column_double(statement, i); - status = window->putDouble(addedRows, i, value); - if (status) { - LOG_WINDOW("Failed allocating space for a double in column %d, error=%d", - i, status); - result = CPR_FULL; - break; - } - LOG_WINDOW("%d,%d is FLOAT %lf", startPos + addedRows, i, value); - } else if (type == SQLITE_BLOB) { - // BLOB data - const void* blob = sqlite3_column_blob(statement, i); - size_t size = sqlite3_column_bytes(statement, i); - status = window->putBlob(addedRows, i, blob, size); - if (status) { - LOG_WINDOW("Failed allocating %u bytes for blob at %d,%d, error=%d", - size, startPos + addedRows, i, status); - result = CPR_FULL; - break; - } - LOG_WINDOW("%d,%d is Blob with %u bytes", - startPos + addedRows, i, size); - } else if (type == SQLITE_NULL) { - // NULL field - status = window->putNull(addedRows, i); - if (status) { - LOG_WINDOW("Failed allocating space for a null in column %d, error=%d", - i, status); - result = CPR_FULL; - break; - } - - LOG_WINDOW("%d,%d is NULL", startPos + addedRows, i); - } else { - // Unknown data - ALOGE("Unknown column type when filling database window"); - throw_sqlite3_exception(env, "Unknown column type when filling window"); - result = CPR_ERROR; - break; - } - } - - // Free the last row if if was not successfully copied. - if (result != CPR_OK) { - window->freeLastRow(); - } - return result; -} - -static jlong nativeFillWindow(JNIEnv* env, jclass clazz, jint databasePtr, - jint statementPtr, jint windowPtr, jint offsetParam, - jint startPos, jint requiredPos, jboolean countAllRows) { - sqlite3* database = reinterpret_cast<sqlite3*>(databasePtr); - sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); - CursorWindow* window = reinterpret_cast<CursorWindow*>(windowPtr); - - // Only do the binding if there is a valid offsetParam. If no binding needs to be done - // offsetParam will be set to 0, an invalid value. - if (offsetParam > 0) { - // Bind the offset parameter, telling the program which row to start with - // If an offset parameter is used, we cannot simply clear the window if it - // turns out that the requiredPos won't fit because the result set may - // depend on startPos, so we set startPos to requiredPos. - startPos = requiredPos; - int err = sqlite3_bind_int(statement, offsetParam, startPos); - if (err != SQLITE_OK) { - ALOGE("Unable to bind offset position, offsetParam = %d", offsetParam); - throw_sqlite3_exception(env, database); - return 0; - } - LOG_WINDOW("Bound offset position to startPos %d", startPos); - } - - // We assume numRows is initially 0. - LOG_WINDOW("Window: numRows = %d, size = %d, freeSpace = %d", - window->getNumRows(), window->size(), window->freeSpace()); - - int numColumns = sqlite3_column_count(statement); - status_t status = window->setNumColumns(numColumns); - if (status) { - ALOGE("Failed to change column count from %d to %d", window->getNumColumns(), numColumns); - jniThrowException(env, "java/lang/IllegalStateException", "numColumns mismatch"); - return 0; - } - - int retryCount = 0; - int totalRows = 0; - int addedRows = 0; - bool windowFull = false; - bool gotException = false; - while (!gotException && (!windowFull || countAllRows)) { - int err = sqlite3_step(statement); - if (err == SQLITE_ROW) { - LOG_WINDOW("Stepped statement %p to row %d", statement, totalRows); - retryCount = 0; - totalRows += 1; - - // Skip the row if the window is full or we haven't reached the start position yet. - if (startPos >= totalRows || windowFull) { - continue; - } - - CopyRowResult cpr = copyRow(env, window, statement, numColumns, startPos, addedRows); - if (cpr == CPR_FULL && addedRows && startPos + addedRows < requiredPos) { - // We filled the window before we got to the one row that we really wanted. - // Clear the window and start filling it again from here. - // TODO: Would be nicer if we could progressively replace earlier rows. - window->clear(); - window->setNumColumns(numColumns); - startPos += addedRows; - addedRows = 0; - cpr = copyRow(env, window, statement, numColumns, startPos, addedRows); - } - - if (cpr == CPR_OK) { - addedRows += 1; - } else if (cpr == CPR_FULL) { - windowFull = true; - } else { - gotException = true; - } - } else if (err == SQLITE_DONE) { - // All rows processed, bail - LOG_WINDOW("Processed all rows"); - break; - } else if (err == SQLITE_LOCKED || err == SQLITE_BUSY) { - // The table is locked, retry - LOG_WINDOW("Database locked, retrying"); - if (retryCount > 50) { - ALOGE("Bailing on database busy retry"); - throw_sqlite3_exception(env, database, "retrycount exceeded"); - gotException = true; - } else { - // Sleep to give the thread holding the lock a chance to finish - usleep(1000); - retryCount++; - } - } else { - throw_sqlite3_exception(env, database); - gotException = true; - } - } - - LOG_WINDOW("Resetting statement %p after fetching %d rows and adding %d rows" - "to the window in %d bytes", - statement, totalRows, addedRows, window->size() - window->freeSpace()); - sqlite3_reset(statement); - - // Report the total number of rows on request. - if (startPos > totalRows) { - ALOGE("startPos %d > actual rows %d", startPos, totalRows); - } - jlong result = jlong(startPos) << 32 | jlong(totalRows); - return result; -} - -static jint nativeColumnCount(JNIEnv* env, jclass clazz, jint statementPtr) { - sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); - return sqlite3_column_count(statement); -} - -static jstring nativeColumnName(JNIEnv* env, jclass clazz, jint statementPtr, - jint columnIndex) { - sqlite3_stmt* statement = reinterpret_cast<sqlite3_stmt*>(statementPtr); - const char* name = sqlite3_column_name(statement, columnIndex); - return env->NewStringUTF(name); -} - - -static JNINativeMethod sMethods[] = -{ - /* name, signature, funcPtr */ - { "nativeFillWindow", "(IIIIIIZ)J", - (void*)nativeFillWindow }, - { "nativeColumnCount", "(I)I", - (void*)nativeColumnCount}, - { "nativeColumnName", "(II)Ljava/lang/String;", - (void*)nativeColumnName}, -}; - -int register_android_database_SQLiteQuery(JNIEnv * env) -{ - return AndroidRuntime::registerNativeMethods(env, - "android/database/sqlite/SQLiteQuery", sMethods, NELEM(sMethods)); -} - -} // namespace android diff --git a/core/jni/android_database_SQLiteStatement.cpp b/core/jni/android_database_SQLiteStatement.cpp deleted file mode 100644 index e376258f52d1..000000000000 --- a/core/jni/android_database_SQLiteStatement.cpp +++ /dev/null @@ -1,286 +0,0 @@ -/* //device/libs/android_runtime/android_database_SQLiteCursor.cpp -** -** Copyright 2006, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - -#undef LOG_TAG -#define LOG_TAG "SQLiteStatementCpp" - -#include "android_util_Binder.h" - -#include <jni.h> -#include <JNIHelp.h> -#include <android_runtime/AndroidRuntime.h> - -#include <sqlite3.h> - -#include <cutils/ashmem.h> -#include <utils/Log.h> - -#include <fcntl.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/types.h> -#include <sys/stat.h> - -#include "sqlite3_exception.h" - -namespace android { - - -sqlite3_stmt * compile(JNIEnv* env, jobject object, - sqlite3 * handle, jstring sqlString); - -static jfieldID gHandleField; -static jfieldID gStatementField; - - -#define GET_STATEMENT(env, object) \ - (sqlite3_stmt *)env->GetIntField(object, gStatementField) -#define GET_HANDLE(env, object) \ - (sqlite3 *)env->GetIntField(object, gHandleField) - - -static jint native_execute(JNIEnv* env, jobject object) -{ - int err; - sqlite3 * handle = GET_HANDLE(env, object); - sqlite3_stmt * statement = GET_STATEMENT(env, object); - int numChanges = -1; - - // Execute the statement - err = sqlite3_step(statement); - - // Throw an exception if an error occurred - if (err == SQLITE_ROW) { - throw_sqlite3_exception(env, - "Queries can be performed using SQLiteDatabase query or rawQuery methods only."); - } else if (err != SQLITE_DONE) { - throw_sqlite3_exception_errcode(env, err, sqlite3_errmsg(handle)); - } else { - numChanges = sqlite3_changes(handle); - } - - // Reset the statement so it's ready to use again - sqlite3_reset(statement); - return numChanges; -} - -static jlong native_executeInsert(JNIEnv* env, jobject object) -{ - sqlite3 * handle = GET_HANDLE(env, object); - jint numChanges = native_execute(env, object); - if (numChanges > 0) { - return sqlite3_last_insert_rowid(handle); - } else { - return -1; - } -} - -static jlong native_1x1_long(JNIEnv* env, jobject object) -{ - int err; - sqlite3 * handle = GET_HANDLE(env, object); - sqlite3_stmt * statement = GET_STATEMENT(env, object); - jlong value = -1; - - // Execute the statement - err = sqlite3_step(statement); - - // Handle the result - if (err == SQLITE_ROW) { - // No errors, read the data and return it - value = sqlite3_column_int64(statement, 0); - } else { - throw_sqlite3_exception_errcode(env, err, sqlite3_errmsg(handle)); - } - - // Reset the statment so it's ready to use again - sqlite3_reset(statement); - - return value; -} - -static jstring native_1x1_string(JNIEnv* env, jobject object) -{ - int err; - sqlite3 * handle = GET_HANDLE(env, object); - sqlite3_stmt * statement = GET_STATEMENT(env, object); - jstring value = NULL; - - // Execute the statement - err = sqlite3_step(statement); - - // Handle the result - if (err == SQLITE_ROW) { - // No errors, read the data and return it - char const * text = (char const *)sqlite3_column_text(statement, 0); - value = env->NewStringUTF(text); - } else { - throw_sqlite3_exception_errcode(env, err, sqlite3_errmsg(handle)); - } - - // Reset the statment so it's ready to use again - sqlite3_reset(statement); - - return value; -} - -static jobject createParcelFileDescriptor(JNIEnv * env, int fd) -{ - // Create FileDescriptor object - jobject fileDesc = jniCreateFileDescriptor(env, fd); - if (fileDesc == NULL) { - // FileDescriptor constructor has thrown an exception - close(fd); - return NULL; - } - - // Wrap it in a ParcelFileDescriptor - jobject parcelFileDesc = newParcelFileDescriptor(env, fileDesc); - if (parcelFileDesc == NULL) { - // ParcelFileDescriptor constructor has thrown an exception - close(fd); - return NULL; - } - - return parcelFileDesc; -} - -// Creates an ashmem area, copies some data into it, and returns -// a ParcelFileDescriptor for the ashmem area. -static jobject create_ashmem_region_with_data(JNIEnv * env, - const void * data, int length) -{ - // Create ashmem area - int fd = ashmem_create_region(NULL, length); - if (fd < 0) { - ALOGE("ashmem_create_region failed: %s", strerror(errno)); - jniThrowIOException(env, errno); - return NULL; - } - - if (length > 0) { - // mmap the ashmem area - void * ashmem_ptr = - mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (ashmem_ptr == MAP_FAILED) { - ALOGE("mmap failed: %s", strerror(errno)); - jniThrowIOException(env, errno); - close(fd); - return NULL; - } - - // Copy data to ashmem area - memcpy(ashmem_ptr, data, length); - - // munmap ashmem area - if (munmap(ashmem_ptr, length) < 0) { - ALOGE("munmap failed: %s", strerror(errno)); - jniThrowIOException(env, errno); - close(fd); - return NULL; - } - } - - // Make ashmem area read-only - if (ashmem_set_prot_region(fd, PROT_READ) < 0) { - ALOGE("ashmem_set_prot_region failed: %s", strerror(errno)); - jniThrowIOException(env, errno); - close(fd); - return NULL; - } - - // Wrap it in a ParcelFileDescriptor - return createParcelFileDescriptor(env, fd); -} - -static jobject native_1x1_blob_ashmem(JNIEnv* env, jobject object) -{ - int err; - sqlite3 * handle = GET_HANDLE(env, object); - sqlite3_stmt * statement = GET_STATEMENT(env, object); - jobject value = NULL; - - // Execute the statement - err = sqlite3_step(statement); - - // Handle the result - if (err == SQLITE_ROW) { - // No errors, read the data and return it - const void * blob = sqlite3_column_blob(statement, 0); - if (blob != NULL) { - int len = sqlite3_column_bytes(statement, 0); - if (len >= 0) { - value = create_ashmem_region_with_data(env, blob, len); - } - } - } else { - throw_sqlite3_exception_errcode(env, err, sqlite3_errmsg(handle)); - } - - // Reset the statment so it's ready to use again - sqlite3_reset(statement); - - return value; -} - -static void native_executeSql(JNIEnv* env, jobject object, jstring sql) -{ - char const* sqlString = env->GetStringUTFChars(sql, NULL); - sqlite3 * handle = GET_HANDLE(env, object); - int err = sqlite3_exec(handle, sqlString, NULL, NULL, NULL); - if (err != SQLITE_OK) { - throw_sqlite3_exception(env, handle); - } - env->ReleaseStringUTFChars(sql, sqlString); -} - -static JNINativeMethod sMethods[] = -{ - /* name, signature, funcPtr */ - {"native_execute", "()I", (void *)native_execute}, - {"native_executeInsert", "()J", (void *)native_executeInsert}, - {"native_1x1_long", "()J", (void *)native_1x1_long}, - {"native_1x1_string", "()Ljava/lang/String;", (void *)native_1x1_string}, - {"native_1x1_blob_ashmem", "()Landroid/os/ParcelFileDescriptor;", (void *)native_1x1_blob_ashmem}, - {"native_executeSql", "(Ljava/lang/String;)V", (void *)native_executeSql}, -}; - -int register_android_database_SQLiteStatement(JNIEnv * env) -{ - jclass clazz; - - clazz = env->FindClass("android/database/sqlite/SQLiteStatement"); - if (clazz == NULL) { - ALOGE("Can't find android/database/sqlite/SQLiteStatement"); - return -1; - } - - gHandleField = env->GetFieldID(clazz, "nHandle", "I"); - gStatementField = env->GetFieldID(clazz, "nStatement", "I"); - - if (gHandleField == NULL || gStatementField == NULL) { - ALOGE("Error locating fields"); - return -1; - } - - return AndroidRuntime::registerNativeMethods(env, - "android/database/sqlite/SQLiteStatement", sMethods, NELEM(sMethods)); -} - -} // namespace android diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 0c5101f73700..29f9d5440d99 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -72,7 +72,7 @@ static jboolean android_media_AudioSystem_isStreamActive(JNIEnv *env, jobject thiz, jint stream, jint inPastMs) { bool state = false; - AudioSystem::isStreamActive(stream, &state, inPastMs); + AudioSystem::isStreamActive((audio_stream_type_t) stream, &state, inPastMs); return state; } diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp index d9216856ac9b..4aa49f491cc1 100644 --- a/core/jni/android_media_AudioTrack.cpp +++ b/core/jni/android_media_AudioTrack.cpp @@ -75,7 +75,7 @@ class AudioTrackJniStorage { sp<MemoryHeapBase> mMemHeap; sp<MemoryBase> mMemBase; audiotrack_callback_cookie mCallbackData; - int mStreamType; + audio_stream_type_t mStreamType; AudioTrackJniStorage() { mCallbackData.audioTrack_class = 0; @@ -175,11 +175,11 @@ android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_th int afSampleRate; int afFrameCount; - if (AudioSystem::getOutputFrameCount(&afFrameCount, streamType) != NO_ERROR) { + if (AudioSystem::getOutputFrameCount(&afFrameCount, (audio_stream_type_t) streamType) != NO_ERROR) { ALOGE("Error creating AudioTrack: Could not get AudioSystem frame count."); return AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM; } - if (AudioSystem::getOutputSamplingRate(&afSampleRate, streamType) != NO_ERROR) { + if (AudioSystem::getOutputSamplingRate(&afSampleRate, (audio_stream_type_t) streamType) != NO_ERROR) { ALOGE("Error creating AudioTrack: Could not get AudioSystem sampling rate."); return AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM; } diff --git a/core/jni/android_media_ToneGenerator.cpp b/core/jni/android_media_ToneGenerator.cpp index 49be1c71ffe0..53a05015785f 100644 --- a/core/jni/android_media_ToneGenerator.cpp +++ b/core/jni/android_media_ToneGenerator.cpp @@ -79,7 +79,7 @@ static void android_media_ToneGenerator_release(JNIEnv *env, jobject thiz) { static void android_media_ToneGenerator_native_setup(JNIEnv *env, jobject thiz, jint streamType, jint volume) { - ToneGenerator *lpToneGen = new ToneGenerator(streamType, AudioSystem::linearToLog(volume), true); + ToneGenerator *lpToneGen = new ToneGenerator((audio_stream_type_t) streamType, AudioSystem::linearToLog(volume), true); env->SetIntField(thiz, fields.context, 0); diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index 8234f1bf6973..07a7f22d85cc 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -50,7 +50,7 @@ Mutex gKeyCreateMutex; static pthread_key_t gBgKey = -1; #endif -static void signalExceptionForPriorityError(JNIEnv* env, jobject obj, int err) +static void signalExceptionForPriorityError(JNIEnv* env, int err) { switch (err) { case EINVAL: @@ -71,7 +71,7 @@ static void signalExceptionForPriorityError(JNIEnv* env, jobject obj, int err) } } -static void signalExceptionForGroupError(JNIEnv* env, jobject obj, int err) +static void signalExceptionForGroupError(JNIEnv* env, int err) { switch (err) { case EINVAL: @@ -173,7 +173,7 @@ void android_os_Process_setThreadGroup(JNIEnv* env, jobject clazz, int pid, jint { int res = androidSetThreadSchedulingGroup(pid, grp); if (res != NO_ERROR) { - signalExceptionForGroupError(env, clazz, res == BAD_VALUE ? EINVAL : errno); + signalExceptionForGroupError(env, res == BAD_VALUE ? EINVAL : errno); return; } } @@ -186,7 +186,7 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin struct dirent *de; if (grp > ANDROID_TGROUP_MAX || grp < 0) { - signalExceptionForGroupError(env, clazz, EINVAL); + signalExceptionForGroupError(env, EINVAL); return; } @@ -214,7 +214,7 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin if (!(d = opendir(proc_path))) { // If the process exited on us, don't generate an exception if (errno != ENOENT) - signalExceptionForGroupError(env, clazz, errno); + signalExceptionForGroupError(env, errno); return; } @@ -240,7 +240,7 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin } if (androidSetThreadSchedulingGroup(t_pid, grp) != NO_ERROR) { - signalExceptionForGroupError(env, clazz, errno); + signalExceptionForGroupError(env, errno); break; } } @@ -264,6 +264,21 @@ static void android_os_Process_setCanSelfBackground(JNIEnv* env, jobject clazz, #endif } +void android_os_Process_setThreadScheduler(JNIEnv* env, jclass clazz, + jint tid, jint policy, jint pri) +{ +#ifdef HAVE_SCHED_SETSCHEDULER + struct sched_param param; + param.sched_priority = pri; + int rc = sched_setscheduler(tid, policy, ¶m); + if (rc) { + signalExceptionForPriorityError(env, errno); + } +#else + signalExceptionForPriorityError(env, ENOSYS); +#endif +} + void android_os_Process_setThreadPriority(JNIEnv* env, jobject clazz, jint pid, jint pri) { @@ -285,9 +300,9 @@ void android_os_Process_setThreadPriority(JNIEnv* env, jobject clazz, int rc = androidSetThreadPriority(pid, pri); if (rc != 0) { if (rc == INVALID_OPERATION) { - signalExceptionForPriorityError(env, clazz, errno); + signalExceptionForPriorityError(env, errno); } else { - signalExceptionForGroupError(env, clazz, errno); + signalExceptionForGroupError(env, errno); } } @@ -308,7 +323,7 @@ jint android_os_Process_getThreadPriority(JNIEnv* env, jobject clazz, errno = 0; jint pri = getpriority(PRIO_PROCESS, pid); if (errno != 0) { - signalExceptionForPriorityError(env, clazz, errno); + signalExceptionForPriorityError(env, errno); } //ALOGI("Returning priority of %d: %d\n", pid, pri); return pri; @@ -852,6 +867,7 @@ static const JNINativeMethod methods[] = { {"getUidForName", "(Ljava/lang/String;)I", (void*)android_os_Process_getUidForName}, {"getGidForName", "(Ljava/lang/String;)I", (void*)android_os_Process_getGidForName}, {"setThreadPriority", "(II)V", (void*)android_os_Process_setThreadPriority}, + {"setThreadScheduler", "(III)V", (void*)android_os_Process_setThreadScheduler}, {"setCanSelfBackground", "(Z)V", (void*)android_os_Process_setCanSelfBackground}, {"setThreadPriority", "(I)V", (void*)android_os_Process_setCallingThreadPriority}, {"getThreadPriority", "(I)I", (void*)android_os_Process_getThreadPriority}, diff --git a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp index a5b85b4a4c48..b68c97a6cd5d 100644 --- a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp +++ b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp @@ -283,6 +283,7 @@ iterateOverNativeFiles(JNIEnv *env, jstring javaFilePath, jstring javaCpuAbi, js const int N = zipFile.getNumEntries(); char fileName[PATH_MAX]; + bool hasPrimaryAbi = false; for (int i = 0; i < N; i++) { const ZipEntryRO entry = zipFile.findEntryByIndex(i); @@ -318,11 +319,22 @@ iterateOverNativeFiles(JNIEnv *env, jstring javaFilePath, jstring javaCpuAbi, js if (cpuAbi.size() == cpuAbiRegionSize && *(cpuAbiOffset + cpuAbi.size()) == '/' && !strncmp(cpuAbiOffset, cpuAbi.c_str(), cpuAbiRegionSize)) { - ALOGV("Using ABI %s\n", cpuAbi.c_str()); + ALOGV("Using primary ABI %s\n", cpuAbi.c_str()); + hasPrimaryAbi = true; } else if (cpuAbi2.size() == cpuAbiRegionSize && *(cpuAbiOffset + cpuAbi2.size()) == '/' && !strncmp(cpuAbiOffset, cpuAbi2.c_str(), cpuAbiRegionSize)) { - ALOGV("Using ABI %s\n", cpuAbi2.c_str()); + + /* + * If this library matches both the primary and secondary ABIs, + * only use the primary ABI. + */ + if (hasPrimaryAbi) { + ALOGV("Already saw primary ABI, skipping secondary ABI %s\n", cpuAbi2.c_str()); + continue; + } else { + ALOGV("Using secondary ABI %s\n", cpuAbi2.c_str()); + } } else { ALOGV("abi didn't match anything: %s (end at %zd)\n", cpuAbiOffset, cpuAbiRegionSize); continue; diff --git a/core/jni/sqlite3_exception.h b/core/jni/sqlite3_exception.h deleted file mode 100644 index 13735a15e0e3..000000000000 --- a/core/jni/sqlite3_exception.h +++ /dev/null @@ -1,47 +0,0 @@ -/* //device/libs/include/android_runtime/sqlite3_exception.h -** -** 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 _SQLITE3_EXCEPTION_H -#define _SQLITE3_EXCEPTION_H 1 - -#include <jni.h> -#include <JNIHelp.h> -//#include <android_runtime/AndroidRuntime.h> - -#include <sqlite3.h> - -namespace android { - -/* throw a SQLiteException with a message appropriate for the error in handle */ -void throw_sqlite3_exception(JNIEnv* env, sqlite3* handle); - -/* throw a SQLiteException with the given message */ -void throw_sqlite3_exception(JNIEnv* env, const char* message); - -/* throw a SQLiteException with a message appropriate for the error in handle - concatenated with the given message - */ -void throw_sqlite3_exception(JNIEnv* env, sqlite3* handle, const char* message); - -/* throw a SQLiteException for a given error code */ -void throw_sqlite3_exception_errcode(JNIEnv* env, int errcode, const char* message); - -void throw_sqlite3_exception(JNIEnv* env, int errcode, - const char* sqlite3Message, const char* message); -} - -#endif // _SQLITE3_EXCEPTION_H diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index fea852382f08..545a55529a8a 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -1154,6 +1154,21 @@ <p>Corresponds to {@link android.view.inputmethod.EditorInfo#IME_FLAG_NO_ENTER_ACTION}. --> <flag name="flagNoEnterAction" value="0x40000000" /> + <!-- Used to request that the IME should be capable of inputting ASCII + characters. The intention of this flag is to ensure that the user + can type Roman alphabet characters in a {@link android.widget.TextView} + used for, typically, account ID or password input. It is expected that IMEs + normally are able to input ASCII even without being told so (such IMEs + already respect this flag in a sense), but there could be some cases they + aren't when, for instance, only non-ASCII input languagaes like Arabic, + Greek, Hebrew, Russian are enabled in the IME. Applications need to be + aware that the flag is not a guarantee, and not all IMEs will respect it. + However, it is strongly recommended for IME authors to respect this flag + especially when their IME could end up with a state that has only non-ASCII + input languages enabled. + <p>Corresponds to + {@link android.view.inputmethod.EditorInfo#IME_FLAG_FORCE_ASCII}. --> + <flag name="flagForceAscii" value="0x80000000" /> </attr> <!-- A coordinate in the X dimension. --> @@ -1816,11 +1831,10 @@ <attr name="scrollbarAlwaysDrawVerticalTrack" format="boolean" /> <!-- {@deprecated This attribute is deprecated and will be ignored as of - API level {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}. + API level 14 (<code>android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH</code>). Using fading edges may introduce noticeable performance degradations and should be used only when required by the application's - visual design. To request fading edges with API level - {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH} and above, + visual design. To request fading edges with API level 14 and above, use the <code>requiresFadingEdge</code> attribute instead.} --> <attr name="fadingEdge"> <!-- No edge is faded. --> diff --git a/core/tests/coretests/src/android/database/CursorWindowTest.java b/core/tests/coretests/src/android/database/CursorWindowTest.java index 8c8081cdc7a9..075f5b7f1d6a 100644 --- a/core/tests/coretests/src/android/database/CursorWindowTest.java +++ b/core/tests/coretests/src/android/database/CursorWindowTest.java @@ -35,15 +35,45 @@ public class CursorWindowTest extends TestCase implements PerformanceTestCase { } @SmallTest - public void testValuesLocalWindow() { - doTestValues(new CursorWindow(true)); + public void testConstructor_WithName() { + CursorWindow window = new CursorWindow("MyWindow"); + assertEquals("MyWindow", window.getName()); + assertEquals(0, window.getStartPosition()); + window.close(); } - + + @SmallTest + public void testConstructorWithEmptyName() { + CursorWindow window = new CursorWindow(""); + assertEquals("<unnamed>", window.getName()); + assertEquals(0, window.getStartPosition()); + window.close(); + } + @SmallTest - public void testValuesRemoteWindow() { - doTestValues(new CursorWindow(false)); + public void testConstructorWithNullName() { + CursorWindow window = new CursorWindow(null); + assertEquals("<unnamed>", window.getName()); + assertEquals(0, window.getStartPosition()); + window.close(); } - + + @SmallTest + public void testDeprecatedConstructor() { + @SuppressWarnings("deprecation") + CursorWindow window = new CursorWindow(true /*this argument is ignored*/); + assertEquals("<unnamed>", window.getName()); + assertEquals(0, window.getStartPosition()); + window.close(); + } + + @SmallTest + public void testValues() { + CursorWindow window = new CursorWindow("MyWindow"); + doTestValues(window); + window.close(); + } + private void doTestValues(CursorWindow window) { assertTrue(window.setNumColumns(7)); assertTrue(window.allocRow()); diff --git a/core/tests/coretests/src/android/database/DatabaseCursorTest.java b/core/tests/coretests/src/android/database/DatabaseCursorTest.java index 179338dde3bd..36f0f4bb8643 100644 --- a/core/tests/coretests/src/android/database/DatabaseCursorTest.java +++ b/core/tests/coretests/src/android/database/DatabaseCursorTest.java @@ -16,7 +16,6 @@ package android.database; -import dalvik.annotation.BrokenTest; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; @@ -27,13 +26,11 @@ import android.database.sqlite.SQLiteCursor; import android.database.sqlite.SQLiteCursorDriver; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQuery; -import android.database.sqlite.SQLiteStatement; import android.os.Looper; import android.test.AndroidTestCase; import android.test.PerformanceTestCase; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; import android.util.Log; import java.io.File; diff --git a/core/tests/coretests/src/android/database/DatabaseErrorHandlerTest.java b/core/tests/coretests/src/android/database/DatabaseErrorHandlerTest.java index 1cfd96003275..91c7687176d4 100644 --- a/core/tests/coretests/src/android/database/DatabaseErrorHandlerTest.java +++ b/core/tests/coretests/src/android/database/DatabaseErrorHandlerTest.java @@ -21,7 +21,6 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDiskIOException; import android.database.sqlite.SQLiteException; import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.Suppress; import android.util.Log; import java.io.BufferedWriter; diff --git a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java index 6786700d3228..c7cb43d3dbc0 100644 --- a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java +++ b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java @@ -410,40 +410,6 @@ public class DatabaseGeneralTest extends AndroidTestCase implements PerformanceT } } - private class ChangeObserver extends ContentObserver { - private int mCursorNotificationCount = 0; - private int mNotificationCount = 0; - - public int getCursorNotificationCount() { - return mCursorNotificationCount; - } - - public int getNotificationCount() { - return mNotificationCount; - } - - public ChangeObserver(boolean cursor) { - super(new Handler()); - mCursor = cursor; - } - - @Override - public boolean deliverSelfNotifications() { - return true; - } - - @Override - public void onChange(boolean selfChange) { - if (mCursor) { - mCursorNotificationCount++; - } else { - mNotificationCount++; - } - } - - boolean mCursor; - } - @MediumTest public void testSelectionArgs() throws Exception { mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);"); diff --git a/core/tests/coretests/src/android/database/DatabaseLockTest.java b/core/tests/coretests/src/android/database/DatabaseLockTest.java index f7a9f8af3801..8d3cf5a13124 100644 --- a/core/tests/coretests/src/android/database/DatabaseLockTest.java +++ b/core/tests/coretests/src/android/database/DatabaseLockTest.java @@ -16,18 +16,13 @@ package android.database; -import android.app.Activity; -import android.content.Context; import android.database.sqlite.SQLiteDatabase; -import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.Suppress; import android.util.Log; import java.io.File; import java.util.concurrent.atomic.AtomicInteger; import android.test.AndroidTestCase; -import junit.framework.TestCase; - /* * This is a series of unit tests for database locks. * @@ -104,9 +99,9 @@ public class DatabaseLockTest extends AndroidTestCase { public void run() { for (int i = 0; i < NUM_ITERATIONS; i++) { mDatabase.beginTransaction(); - int val = mCounter.incrementAndGet(); + mCounter.incrementAndGet(); try { - Thread.currentThread().sleep(SLEEP_TIME); + Thread.sleep(SLEEP_TIME); } catch (InterruptedException e) { // ignore } @@ -124,7 +119,6 @@ public class DatabaseLockTest extends AndroidTestCase { @Suppress public void testLockLatency() { startDatabaseLatencyThread(); - int previous = 0; long sumTime = 0; long maxTime = 0; for (int i = 0; i < NUM_ITERATIONS; i++) { @@ -137,7 +131,7 @@ public class DatabaseLockTest extends AndroidTestCase { } sumTime += elapsedTime; try { - Thread.currentThread().sleep(SLEEP_TIME); + Thread.sleep(SLEEP_TIME); } catch (InterruptedException e) { // ignore } @@ -164,7 +158,7 @@ public class DatabaseLockTest extends AndroidTestCase { { mDatabase.beginTransaction(); try { - Thread.currentThread().sleep(SLEEP_TIME); + Thread.sleep(SLEEP_TIME); } catch (InterruptedException e) { // ignore } diff --git a/core/tests/coretests/src/android/database/DatabasePerformanceTests.java b/core/tests/coretests/src/android/database/DatabasePerformanceTests.java index b8ebcc4a025e..d0e739b4310a 100644 --- a/core/tests/coretests/src/android/database/DatabasePerformanceTests.java +++ b/core/tests/coretests/src/android/database/DatabasePerformanceTests.java @@ -35,6 +35,7 @@ import java.util.Random; * */ +@SuppressWarnings("deprecation") public class DatabasePerformanceTests { public static String[] children() { diff --git a/core/tests/coretests/src/android/database/DatabaseStatementTest.java b/core/tests/coretests/src/android/database/DatabaseStatementTest.java index 71dc3ae08439..512d5cd77b2b 100644 --- a/core/tests/coretests/src/android/database/DatabaseStatementTest.java +++ b/core/tests/coretests/src/android/database/DatabaseStatementTest.java @@ -25,8 +25,6 @@ import android.database.sqlite.SQLiteStatement; import android.test.AndroidTestCase; import android.test.PerformanceTestCase; import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; -import junit.framework.TestCase; import java.io.File; diff --git a/core/tests/coretests/src/android/database/NewDatabasePerformanceTests.java b/core/tests/coretests/src/android/database/NewDatabasePerformanceTests.java index 0dca90b06438..adf88d2e5304 100644 --- a/core/tests/coretests/src/android/database/NewDatabasePerformanceTests.java +++ b/core/tests/coretests/src/android/database/NewDatabasePerformanceTests.java @@ -20,7 +20,6 @@ import android.content.ContentValues; import android.database.sqlite.SQLiteDatabase; import android.test.PerformanceTestCase; -import junit.framework.Assert; import junit.framework.TestCase; import java.io.File; @@ -33,1202 +32,1196 @@ import java.util.Random; public class NewDatabasePerformanceTests { - // Edit this to change the test run times. The original is 100. - final static int kMultiplier = 1; - - public static class PerformanceBase extends TestCase - implements PerformanceTestCase { - protected static final int CURRENT_DATABASE_VERSION = 42; - protected SQLiteDatabase mDatabase; - protected File mDatabaseFile; - - public void setUp() { - mDatabaseFile = new File("/sdcard", "perf_database_test.db"); - if (mDatabaseFile.exists()) { - mDatabaseFile.delete(); - } - mDatabase = - SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), - null); - assertTrue(mDatabase != null); - mDatabase.setVersion(CURRENT_DATABASE_VERSION); + // Edit this to change the test run times. The original is 100. + final static int kMultiplier = 1; + + public static class PerformanceBase extends TestCase + implements PerformanceTestCase { + protected static final int CURRENT_DATABASE_VERSION = 42; + protected SQLiteDatabase mDatabase; + protected File mDatabaseFile; + + public void setUp() { + mDatabaseFile = new File("/sdcard", "perf_database_test.db"); + if (mDatabaseFile.exists()) { + mDatabaseFile.delete(); + } + mDatabase = + SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), + null); + assertTrue(mDatabase != null); + mDatabase.setVersion(CURRENT_DATABASE_VERSION); + } + + public void tearDown() { + mDatabase.close(); + mDatabaseFile.delete(); + } + + public boolean isPerformanceOnly() { + return true; + } + + // These tests can only be run once. + public int startPerformance(Intermediates intermediates) { + return 0; + } + + public String numberName(int number) { + String result = ""; + + if (number >= 1000) { + result += numberName((number / 1000)) + " thousand"; + number = (number % 1000); + + if (number > 0) result += " "; + } + + if (number >= 100) { + result += ONES[(number / 100)] + " hundred"; + number = (number % 100); + + if (number > 0) result += " "; + } + + if (number >= 20) { + result += TENS[(number / 10)]; + number = (number % 10); + + if (number > 0) result += " "; + } + + if (number > 0) { + result += ONES[number]; + } + + return result; + } } - public void tearDown() { - mDatabase.close(); - mDatabaseFile.delete(); - } - - public boolean isPerformanceOnly() { - return true; - } - - // These tests can only be run once. - public int startPerformance(Intermediates intermediates) { - return 0; - } + /** + * Test 1000 inserts. + */ - public String numberName(int number) { - String result = ""; + public static class Insert1000 extends PerformanceBase { + private static final int SIZE = 10 * kMultiplier; - if (number >= 1000) { - result += numberName((number / 1000)) + " thousand"; - number = (number % 1000); + private String[] statements = new String[SIZE]; - if (number > 0) result += " "; - } + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); - if (number >= 100) { - result += ONES[(number / 100)] + " hundred"; - number = (number % 100); + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + statements[i] = + "INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"; + } - if (number > 0) result += " "; - } + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + } - if (number >= 20) { - result += TENS[(number / 10)]; - number = (number % 10); - - if (number > 0) result += " "; - } - - if (number > 0) { - result += ONES[number]; - } - - return result; + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.execSQL(statements[i]); + } + } } - } - - /** - * Test 1000 inserts. - */ - public static class Insert1000 extends PerformanceBase { - private static final int SIZE = 10 * kMultiplier; - - private String[] statements = new String[SIZE]; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - statements[i] = - "INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"; - } - - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + /** + * Test 1000 inserts into an indexed table. + */ + + public static class InsertIndexed1000 extends PerformanceBase { + private static final int SIZE = 10 * kMultiplier; + + private String[] statements = new String[SIZE]; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + statements[i] = + "INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"; + } + + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + mDatabase.execSQL("CREATE INDEX i1c ON t1(c)"); + } + + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.execSQL(statements[i]); + } + } } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.execSQL(statements[i]); - } + /** + * 100 SELECTs without an index + */ + + public static class Select100 extends PerformanceBase { + private static final int SIZE = 1 * kMultiplier; + private static final String[] COLUMNS = {"count(*)", "avg(b)"}; + + private String[] where = new String[SIZE]; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } + + for (int i = 0; i < SIZE; i++) { + int lower = i * 100; + int upper = (i + 10) * 100; + where[i] = "b >= " + lower + " AND b < " + upper; + } + } + + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase + .query("t1", COLUMNS, where[i], null, null, null, null); + } + } } - } - - /** - * Test 1000 inserts into an indexed table. - */ - - public static class InsertIndexed1000 extends PerformanceBase { - private static final int SIZE = 10 * kMultiplier; - - private String[] statements = new String[SIZE]; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - statements[i] = - "INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"; - } - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - mDatabase.execSQL("CREATE INDEX i1c ON t1(c)"); + /** + * 100 SELECTs on a string comparison + */ + + public static class SelectStringComparison100 extends PerformanceBase { + private static final int SIZE = 1 * kMultiplier; + private static final String[] COLUMNS = {"count(*)", "avg(b)"}; + + private String[] where = new String[SIZE]; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } + + for (int i = 0; i < SIZE; i++) { + where[i] = "c LIKE '" + numberName(i) + "'"; + } + } + + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase + .query("t1", COLUMNS, where[i], null, null, null, null); + } + } } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.execSQL(statements[i]); - } + /** + * 100 SELECTs with an index + */ + + public static class SelectIndex100 extends PerformanceBase { + private static final int SIZE = 1 * kMultiplier; + private static final String[] COLUMNS = {"count(*)", "avg(b)"}; + + private String[] where = new String[SIZE]; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } + + for (int i = 0; i < SIZE; i++) { + int lower = i * 100; + int upper = (i + 10) * 100; + where[i] = "b >= " + lower + " AND b < " + upper; + } + } + + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase + .query("t1", COLUMNS, where[i], null, null, null, null); + } + } } - } - /** - * 100 SELECTs without an index - */ - - public static class Select100 extends PerformanceBase { - private static final int SIZE = 1 * kMultiplier; - private static final String[] COLUMNS = {"count(*)", "avg(b)"}; - - private String[] where = new String[SIZE]; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } - - for (int i = 0; i < SIZE; i++) { - int lower = i * 100; - int upper = (i + 10) * 100; - where[i] = "b >= " + lower + " AND b < " + upper; - } + /** + * INNER JOIN without an index + */ + + public static class InnerJoin100 extends PerformanceBase { + private static final int SIZE = 1 * kMultiplier; + private static final String[] COLUMNS = {"t1.a"}; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + mDatabase + .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } + } + + public void testRun() { + mDatabase.query("t1 INNER JOIN t2 ON t1.b = t2.b", COLUMNS, null, + null, null, null, null); + } } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase - .query("t1", COLUMNS, where[i], null, null, null, null); - } + /** + * INNER JOIN without an index on one side + */ + + public static class InnerJoinOneSide100 extends PerformanceBase { + private static final int SIZE = 1 * kMultiplier; + private static final String[] COLUMNS = {"t1.a"}; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + mDatabase + .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))"); + + mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } + } + + public void testRun() { + mDatabase.query("t1 INNER JOIN t2 ON t1.b = t2.b", COLUMNS, null, + null, null, null, null); + } } - } - - /** - * 100 SELECTs on a string comparison - */ - - public static class SelectStringComparison100 extends PerformanceBase { - private static final int SIZE = 1 * kMultiplier; - private static final String[] COLUMNS = {"count(*)", "avg(b)"}; - - private String[] where = new String[SIZE]; - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } - - for (int i = 0; i < SIZE; i++) { - where[i] = "c LIKE '" + numberName(i) + "'"; - } + /** + * INNER JOIN without an index on one side + */ + + public static class InnerJoinNoIndex100 extends PerformanceBase { + private static final int SIZE = 1 * kMultiplier; + private static final String[] COLUMNS = {"t1.a"}; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + mDatabase + .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))"); + + mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } + } + + public void testRun() { + mDatabase.query("t1 INNER JOIN t2 ON t1.c = t2.c", COLUMNS, null, + null, null, null, null); + } } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase - .query("t1", COLUMNS, where[i], null, null, null, null); - } - } - } - - /** - * 100 SELECTs with an index - */ - - public static class SelectIndex100 extends PerformanceBase { - private static final int SIZE = 1 * kMultiplier; - private static final String[] COLUMNS = {"count(*)", "avg(b)"}; - - private String[] where = new String[SIZE]; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } - - for (int i = 0; i < SIZE; i++) { - int lower = i * 100; - int upper = (i + 10) * 100; - where[i] = "b >= " + lower + " AND b < " + upper; - } + /** + * 100 SELECTs with subqueries. Subquery is using an index + */ + + public static class SelectSubQIndex100 extends PerformanceBase { + private static final int SIZE = 1 * kMultiplier; + private static final String[] COLUMNS = {"t1.a"}; + + private String[] where = new String[SIZE]; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + mDatabase + .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))"); + + mDatabase.execSQL("CREATE INDEX i2b ON t2(b)"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } + + for (int i = 0; i < SIZE; i++) { + int lower = i * 100; + int upper = (i + 10) * 100; + where[i] = + "t1.b IN (SELECT t2.b FROM t2 WHERE t2.b >= " + lower + + " AND t2.b < " + upper + ")"; + } + } + + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase + .query("t1", COLUMNS, where[i], null, null, null, null); + } + } } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase - .query("t1", COLUMNS, where[i], null, null, null, null); - } - } - } - - /** - * INNER JOIN without an index - */ - - public static class InnerJoin100 extends PerformanceBase { - private static final int SIZE = 1 * kMultiplier; - private static final String[] COLUMNS = {"t1.a"}; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - mDatabase - .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } + /** + * 100 SELECTs on string comparison with Index + */ + + public static class SelectIndexStringComparison100 extends PerformanceBase { + private static final int SIZE = 1 * kMultiplier; + private static final String[] COLUMNS = {"count(*)", "avg(b)"}; + + private String[] where = new String[SIZE]; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + mDatabase.execSQL("CREATE INDEX i3c ON t1(c)"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } + + for (int i = 0; i < SIZE; i++) { + where[i] = "c LIKE '" + numberName(i) + "'"; + } + } + + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase + .query("t1", COLUMNS, where[i], null, null, null, null); + } + } } - public void testRun() { - mDatabase.query("t1 INNER JOIN t2 ON t1.b = t2.b", COLUMNS, null, - null, null, null, null); - } - } - - /** - * INNER JOIN without an index on one side - */ - - public static class InnerJoinOneSide100 extends PerformanceBase { - private static final int SIZE = 1 * kMultiplier; - private static final String[] COLUMNS = {"t1.a"}; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - mDatabase - .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))"); - - mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } - } + /** + * 100 SELECTs on integer + */ - public void testRun() { - mDatabase.query("t1 INNER JOIN t2 ON t1.b = t2.b", COLUMNS, null, - null, null, null, null); - } - } - - /** - * INNER JOIN without an index on one side - */ - - public static class InnerJoinNoIndex100 extends PerformanceBase { - private static final int SIZE = 1 * kMultiplier; - private static final String[] COLUMNS = {"t1.a"}; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - mDatabase - .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))"); - - mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } - } + public static class SelectInteger100 extends PerformanceBase { + private static final int SIZE = 1 * kMultiplier; + private static final String[] COLUMNS = {"b"}; - public void testRun() { - mDatabase.query("t1 INNER JOIN t2 ON t1.c = t2.c", COLUMNS, null, - null, null, null, null); - } - } - - /** - * 100 SELECTs with subqueries. Subquery is using an index - */ - - public static class SelectSubQIndex100 extends PerformanceBase { - private static final int SIZE = 1 * kMultiplier; - private static final String[] COLUMNS = {"t1.a"}; - - private String[] where = new String[SIZE]; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - mDatabase - .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))"); - - mDatabase.execSQL("CREATE INDEX i2b ON t2(b)"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } - - for (int i = 0; i < SIZE; i++) { - int lower = i * 100; - int upper = (i + 10) * 100; - where[i] = - "t1.b IN (SELECT t2.b FROM t2 WHERE t2.b >= " + lower - + " AND t2.b < " + upper + ")"; - } - } - - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase - .query("t1", COLUMNS, where[i], null, null, null, null); - } - } - } + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); - /** - * 100 SELECTs on string comparison with Index - */ + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - public static class SelectIndexStringComparison100 extends PerformanceBase { - private static final int SIZE = 1 * kMultiplier; - private static final String[] COLUMNS = {"count(*)", "avg(b)"}; + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } - private String[] where = new String[SIZE]; + } - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - mDatabase.execSQL("CREATE INDEX i3c ON t1(c)"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } - - for (int i = 0; i < SIZE; i++) { - where[i] = "c LIKE '" + numberName(i) + "'"; - } + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.query("t1", COLUMNS, null, null, null, null, null); + } + } } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase - .query("t1", COLUMNS, where[i], null, null, null, null); - } - } - } + /** + * 100 SELECTs on String + */ - /** - * 100 SELECTs on integer - */ + public static class SelectString100 extends PerformanceBase { + private static final int SIZE = 1 * kMultiplier; + private static final String[] COLUMNS = {"c"}; - public static class SelectInteger100 extends PerformanceBase { - private static final int SIZE = 1 * kMultiplier; - private static final String[] COLUMNS = {"b"}; + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); - private String[] where = new String[SIZE]; + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + } - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } - - } - - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.query("t1", COLUMNS, null, null, null, null, null); - } + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.query("t1", COLUMNS, null, null, null, null, null); + } + } } - } - /** - * 100 SELECTs on String - */ + /** + * 100 SELECTs on integer with index + */ - public static class SelectString100 extends PerformanceBase { - private static final int SIZE = 1 * kMultiplier; - private static final String[] COLUMNS = {"c"}; + public static class SelectIntegerIndex100 extends PerformanceBase { + private static final int SIZE = 1 * kMultiplier; + private static final String[] COLUMNS = {"b"}; - private String[] where = new String[SIZE]; + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + mDatabase.execSQL("CREATE INDEX i1b on t1(b)"); - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } + } + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.query("t1", COLUMNS, null, null, null, null, null); + } + } } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.query("t1", COLUMNS, null, null, null, null, null); - } - } - } + /** + * 100 SELECTs on String with index + */ - /** - * 100 SELECTs on integer with index - */ + public static class SelectIndexString100 extends PerformanceBase { + private static final int SIZE = 1 * kMultiplier; + private static final String[] COLUMNS = {"c"}; - public static class SelectIntegerIndex100 extends PerformanceBase { - private static final int SIZE = 1 * kMultiplier; - private static final String[] COLUMNS = {"b"}; + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + mDatabase.execSQL("CREATE INDEX i1c ON t1(c)"); - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - mDatabase.execSQL("CREATE INDEX i1b on t1(b)"); + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } + } + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.query("t1", COLUMNS, null, null, null, null, null); + } + } } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.query("t1", COLUMNS, null, null, null, null, null); - } - } - } + /** + * 100 SELECTs on String with starts with + */ - /** - * 100 SELECTs on String with index - */ + public static class SelectStringStartsWith100 extends PerformanceBase { + private static final int SIZE = 1 * kMultiplier; + private static final String[] COLUMNS = {"c"}; + private String[] where = new String[SIZE]; - public static class SelectIndexString100 extends PerformanceBase { - private static final int SIZE = 1 * kMultiplier; - private static final String[] COLUMNS = {"c"}; + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + mDatabase.execSQL("CREATE INDEX i1c ON t1(c)"); - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - mDatabase.execSQL("CREATE INDEX i1c ON t1(c)"); + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + where[i] = "c LIKE '" + numberName(r).substring(0, 1) + "*'"; - } + } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.query("t1", COLUMNS, null, null, null, null, null); - } - } - } + } - /** - * 100 SELECTs on String with starts with - */ + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase + .query("t1", COLUMNS, where[i], null, null, null, null); + } + } + } - public static class SelectStringStartsWith100 extends PerformanceBase { - private static final int SIZE = 1 * kMultiplier; - private static final String[] COLUMNS = {"c"}; - private String[] where = new String[SIZE]; + /** + * 1000 Deletes on an indexed table + */ - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); + public static class DeleteIndexed1000 extends PerformanceBase { + private static final int SIZE = 10 * kMultiplier; - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - mDatabase.execSQL("CREATE INDEX i1c ON t1(c)"); + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + mDatabase.execSQL("CREATE INDEX i3c ON t1(c)"); - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - where[i] = "c LIKE '" + numberName(r).substring(0, 1) + "*'"; + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } - } + } + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.delete("t1", null, null); + } + } } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase - .query("t1", COLUMNS, where[i], null, null, null, null); - } - } - } + /** + * 1000 Deletes + */ - /** - * 1000 Deletes on an indexed table - */ + public static class Delete1000 extends PerformanceBase { + private static final int SIZE = 10 * kMultiplier; - public static class DeleteIndexed1000 extends PerformanceBase { - private static final int SIZE = 10 * kMultiplier; - private static final String[] COLUMNS = {"c"}; + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - mDatabase.execSQL("CREATE INDEX i3c ON t1(c)"); + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } + } + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.delete("t1", null, null); + } + } } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.delete("t1", null, null); - } + /** + * 1000 DELETE's without an index with where clause + */ + + public static class DeleteWhere1000 extends PerformanceBase { + private static final int SIZE = 10 * kMultiplier; + private String[] where = new String[SIZE]; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } + + for (int i = 0; i < SIZE; i++) { + int lower = i * 100; + int upper = (i + 10) * 100; + where[i] = "b >= " + lower + " AND b < " + upper; + } + } + + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.delete("t1", where[i], null); + } + } } - } - - /** - * 1000 Deletes - */ - - public static class Delete1000 extends PerformanceBase { - private static final int SIZE = 10 * kMultiplier; - private static final String[] COLUMNS = {"c"}; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } + /** + * 1000 DELETE's with an index with where clause + */ + + public static class DeleteIndexWhere1000 extends PerformanceBase { + private static final int SIZE = 10 * kMultiplier; + private String[] where = new String[SIZE]; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } + + for (int i = 0; i < SIZE; i++) { + int lower = i * 100; + int upper = (i + 10) * 100; + where[i] = "b >= " + lower + " AND b < " + upper; + } + } + + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.delete("t1", where[i], null); + } + } } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.delete("t1", null, null); - } - } - } - - /** - * 1000 DELETE's without an index with where clause - */ - - public static class DeleteWhere1000 extends PerformanceBase { - private static final int SIZE = 10 * kMultiplier; - private String[] where = new String[SIZE]; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } - - for (int i = 0; i < SIZE; i++) { - int lower = i * 100; - int upper = (i + 10) * 100; - where[i] = "b >= " + lower + " AND b < " + upper; - } + /** + * 1000 update's with an index with where clause + */ + + public static class UpdateIndexWhere1000 extends PerformanceBase { + private static final int SIZE = 10 * kMultiplier; + private String[] where = new String[SIZE]; + ContentValues[] mValues = new ContentValues[SIZE]; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } + + for (int i = 0; i < SIZE; i++) { + + int lower = i * 100; + int upper = (i + 10) * 100; + where[i] = "b >= " + lower + " AND b < " + upper; + ContentValues b = new ContentValues(1); + b.put("b", upper); + mValues[i] = b; + + } + } + + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.update("t1", mValues[i], where[i], null); + } + } } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.delete("t1", where[i], null); - } - } - } - - /** - * 1000 DELETE's with an index with where clause - */ - - public static class DeleteIndexWhere1000 extends PerformanceBase { - private static final int SIZE = 10 * kMultiplier; - private String[] where = new String[SIZE]; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } - - for (int i = 0; i < SIZE; i++) { - int lower = i * 100; - int upper = (i + 10) * 100; - where[i] = "b >= " + lower + " AND b < " + upper; - } + /** + * 1000 update's without an index with where clause + */ + + public static class UpdateWhere1000 extends PerformanceBase { + private static final int SIZE = 10 * kMultiplier; + private String[] where = new String[SIZE]; + ContentValues[] mValues = new ContentValues[SIZE]; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" + + numberName(r) + "')"); + } + + for (int i = 0; i < SIZE; i++) { + + int lower = i * 100; + int upper = (i + 10) * 100; + where[i] = "b >= " + lower + " AND b < " + upper; + ContentValues b = new ContentValues(1); + b.put("b", upper); + mValues[i] = b; + } + } + + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.update("t1", mValues[i], where[i], null); + } + } } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.delete("t1", where[i], null); - } - } - } - - /** - * 1000 update's with an index with where clause - */ - - public static class UpdateIndexWhere1000 extends PerformanceBase { - private static final int SIZE = 10 * kMultiplier; - private String[] where = new String[SIZE]; - ContentValues[] mValues = new ContentValues[SIZE]; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - mDatabase.execSQL("CREATE INDEX i1b ON t1(b)"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } - - for (int i = 0; i < SIZE; i++) { - - int lower = i * 100; - int upper = (i + 10) * 100; - where[i] = "b >= " + lower + " AND b < " + upper; - ContentValues b = new ContentValues(1); - b.put("b", upper); - mValues[i] = b; - - } + /** + * 10000 inserts for an integer + */ + + public static class InsertInteger10000 extends PerformanceBase { + private static final int SIZE = 100 * kMultiplier; + ContentValues[] mValues = new ContentValues[SIZE]; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER)"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + ContentValues b = new ContentValues(1); + b.put("a", r); + mValues[i] = b; + } + } + + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.insert("t1", null, mValues[i]); + } + } } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.update("t1", mValues[i], where[i], null); - } - } - } - - /** - * 1000 update's without an index with where clause - */ - - public static class UpdateWhere1000 extends PerformanceBase { - private static final int SIZE = 10 * kMultiplier; - private String[] where = new String[SIZE]; - ContentValues[] mValues = new ContentValues[SIZE]; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'" - + numberName(r) + "')"); - } - - for (int i = 0; i < SIZE; i++) { - - int lower = i * 100; - int upper = (i + 10) * 100; - where[i] = "b >= " + lower + " AND b < " + upper; - ContentValues b = new ContentValues(1); - b.put("b", upper); - mValues[i] = b; - } + /** + * 10000 inserts for an integer -indexed table + */ + + public static class InsertIntegerIndex10000 extends PerformanceBase { + private static final int SIZE = 100 * kMultiplier; + ContentValues[] mValues = new ContentValues[SIZE]; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t1(a INTEGER)"); + mDatabase.execSQL("CREATE INDEX i1a ON t1(a)"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + ContentValues b = new ContentValues(1); + b.put("a", r); + mValues[i] = b; + } + } + + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.insert("t1", null, mValues[i]); + } + } } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.update("t1", mValues[i], where[i], null); - } - } - } - - /** - * 10000 inserts for an integer - */ - - public static class InsertInteger10000 extends PerformanceBase { - private static final int SIZE = 100 * kMultiplier; - ContentValues[] mValues = new ContentValues[SIZE]; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER)"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - ContentValues b = new ContentValues(1); - b.put("a", r); - mValues[i] = b; - } - } - - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.insert("t1", null, mValues[i]); - } - } - } - - /** - * 10000 inserts for an integer -indexed table - */ - - public static class InsertIntegerIndex10000 extends PerformanceBase { - private static final int SIZE = 100 * kMultiplier; - ContentValues[] mValues = new ContentValues[SIZE]; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t1(a INTEGER)"); - mDatabase.execSQL("CREATE INDEX i1a ON t1(a)"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - ContentValues b = new ContentValues(1); - b.put("a", r); - mValues[i] = b; - } - } - - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.insert("t1", null, mValues[i]); - } - } - } - - /** - * 10000 inserts for a String - */ - - public static class InsertString10000 extends PerformanceBase { - private static final int SIZE = 100 * kMultiplier; - ContentValues[] mValues = new ContentValues[SIZE]; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t1(a VARCHAR(100))"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - ContentValues b = new ContentValues(1); - b.put("a", numberName(r)); - mValues[i] = b; - } - } - - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.insert("t1", null, mValues[i]); - } - } - } - - /** - * 10000 inserts for a String - indexed table - */ - - public static class InsertStringIndexed10000 extends PerformanceBase { - private static final int SIZE = 100 * kMultiplier; - ContentValues[] mValues = new ContentValues[SIZE]; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t1(a VARCHAR(100))"); - mDatabase.execSQL("CREATE INDEX i1a ON t1(a)"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - ContentValues b = new ContentValues(1); - b.put("a", numberName(r)); - mValues[i] = b; - } + /** + * 10000 inserts for a String + */ + + public static class InsertString10000 extends PerformanceBase { + private static final int SIZE = 100 * kMultiplier; + ContentValues[] mValues = new ContentValues[SIZE]; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t1(a VARCHAR(100))"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + ContentValues b = new ContentValues(1); + b.put("a", numberName(r)); + mValues[i] = b; + } + } + + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.insert("t1", null, mValues[i]); + } + } } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.insert("t1", null, mValues[i]); - } + /** + * 10000 inserts for a String - indexed table + */ + + public static class InsertStringIndexed10000 extends PerformanceBase { + private static final int SIZE = 100 * kMultiplier; + ContentValues[] mValues = new ContentValues[SIZE]; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t1(a VARCHAR(100))"); + mDatabase.execSQL("CREATE INDEX i1a ON t1(a)"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + ContentValues b = new ContentValues(1); + b.put("a", numberName(r)); + mValues[i] = b; + } + } + + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.insert("t1", null, mValues[i]); + } + } } - } - /** - * 10000 selects for a String -starts with - */ + /** + * 10000 selects for a String -starts with + */ - public static class SelectStringStartsWith10000 extends PerformanceBase { - private static final int SIZE = 100 * kMultiplier; - private static final String[] COLUMNS = {"t3.a"}; - private String[] where = new String[SIZE]; + public static class SelectStringStartsWith10000 extends PerformanceBase { + private static final int SIZE = 100 * kMultiplier; + private static final String[] COLUMNS = {"t3.a"}; + private String[] where = new String[SIZE]; - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); - mDatabase - .execSQL("CREATE TABLE t3(a VARCHAR(100))"); + mDatabase + .execSQL("CREATE TABLE t3(a VARCHAR(100))"); - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t3 VALUES('" - + numberName(r) + "')"); - } + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t3 VALUES('" + + numberName(r) + "')"); + } - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - where[i] = "a LIKE '" + numberName(r).substring(0, 1) + "*'"; + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + where[i] = "a LIKE '" + numberName(r).substring(0, 1) + "*'"; - } - } + } + } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.query("t3", COLUMNS, where[i], null, null, null, null); - } + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.query("t3", COLUMNS, where[i], null, null, null, null); + } + } } - } - - /** - * 10000 selects for a String - indexed table -starts with - */ - - public static class SelectStringIndexedStartsWith10000 extends - PerformanceBase { - private static final int SIZE = 100 * kMultiplier; - private static final String[] COLUMNS = {"t3.a"}; - private String[] where = new String[SIZE]; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t3(a VARCHAR(100))"); - mDatabase.execSQL("CREATE INDEX i3a ON t3(a)"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t3 VALUES('" - + numberName(r) + "')"); - } - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - where[i] = "a LIKE '" + numberName(r).substring(0, 1) + "*'"; - - } - } - - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.query("t3", COLUMNS, where[i], null, null, null, null); - } + + /** + * 10000 selects for a String - indexed table -starts with + */ + + public static class SelectStringIndexedStartsWith10000 extends + PerformanceBase { + private static final int SIZE = 100 * kMultiplier; + private static final String[] COLUMNS = {"t3.a"}; + private String[] where = new String[SIZE]; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t3(a VARCHAR(100))"); + mDatabase.execSQL("CREATE INDEX i3a ON t3(a)"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t3 VALUES('" + + numberName(r) + "')"); + } + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + where[i] = "a LIKE '" + numberName(r).substring(0, 1) + "*'"; + + } + } + + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.query("t3", COLUMNS, where[i], null, null, null, null); + } + } } - } - - /** - * 10000 selects for an integer - - */ - - public static class SelectInteger10000 extends PerformanceBase { - private static final int SIZE = 100 * kMultiplier; - private static final String[] COLUMNS = {"t4.a"}; - private String[] where = new String[SIZE]; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t4(a INTEGER)"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t4 VALUES(" + r + ")"); - int lower = i * 100; - int upper = (i + 10) * 100; - where[i] = "a >= " + lower + " AND a < " + upper; - } - } - - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.query("t4", COLUMNS, where[i], null, null, null, null); - } + + /** + * 10000 selects for an integer - + */ + + public static class SelectInteger10000 extends PerformanceBase { + private static final int SIZE = 100 * kMultiplier; + private static final String[] COLUMNS = {"t4.a"}; + private String[] where = new String[SIZE]; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t4(a INTEGER)"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t4 VALUES(" + r + ")"); + int lower = i * 100; + int upper = (i + 10) * 100; + where[i] = "a >= " + lower + " AND a < " + upper; + } + } + + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.query("t4", COLUMNS, where[i], null, null, null, null); + } + } } - } - /** - * 10000 selects for an integer -indexed table - */ + /** + * 10000 selects for an integer -indexed table + */ - public static class SelectIntegerIndexed10000 extends PerformanceBase { - private static final int SIZE = 100 * kMultiplier; - private static final String[] COLUMNS = {"t4.a"}; - private String[] where = new String[SIZE]; + public static class SelectIntegerIndexed10000 extends PerformanceBase { + private static final int SIZE = 100 * kMultiplier; + private static final String[] COLUMNS = {"t4.a"}; + private String[] where = new String[SIZE]; - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); - mDatabase - .execSQL("CREATE TABLE t4(a INTEGER)"); - mDatabase.execSQL("CREATE INDEX i4a ON t4(a)"); + mDatabase + .execSQL("CREATE TABLE t4(a INTEGER)"); + mDatabase.execSQL("CREATE INDEX i4a ON t4(a)"); - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t4 VALUES(" + r + ")"); + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t4 VALUES(" + r + ")"); - int lower = i * 100; - int upper = (i + 10) * 100; - where[i] = "a >= " + lower + " AND a < " + upper; - } + int lower = i * 100; + int upper = (i + 10) * 100; + where[i] = "a >= " + lower + " AND a < " + upper; + } - } + } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.query("t4", COLUMNS, where[i], null, null, null, null); - } + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.query("t4", COLUMNS, where[i], null, null, null, null); + } + } } - } - /** - * 10000 selects for a String - contains 'e' - */ + /** + * 10000 selects for a String - contains 'e' + */ - public static class SelectStringContains10000 extends PerformanceBase { - private static final int SIZE = 100 * kMultiplier; - private static final String[] COLUMNS = {"t3.a"}; - private String[] where = new String[SIZE]; + public static class SelectStringContains10000 extends PerformanceBase { + private static final int SIZE = 100 * kMultiplier; + private static final String[] COLUMNS = {"t3.a"}; + private String[] where = new String[SIZE]; - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); - mDatabase - .execSQL("CREATE TABLE t3(a VARCHAR(100))"); + mDatabase + .execSQL("CREATE TABLE t3(a VARCHAR(100))"); - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t3 VALUES('" - + numberName(r) + "')"); - } + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t3 VALUES('" + + numberName(r) + "')"); + } - for (int i = 0; i < SIZE; i++) { - where[i] = "a LIKE '*e*'"; + for (int i = 0; i < SIZE; i++) { + where[i] = "a LIKE '*e*'"; - } - } + } + } - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.query("t3", COLUMNS, where[i], null, null, null, null); - } + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.query("t3", COLUMNS, where[i], null, null, null, null); + } + } } - } - - /** - * 10000 selects for a String - contains 'e'-indexed table - */ - - public static class SelectStringIndexedContains10000 extends - PerformanceBase { - private static final int SIZE = 100 * kMultiplier; - private static final String[] COLUMNS = {"t3.a"}; - private String[] where = new String[SIZE]; - - @Override - public void setUp() { - super.setUp(); - Random random = new Random(42); - - mDatabase - .execSQL("CREATE TABLE t3(a VARCHAR(100))"); - mDatabase.execSQL("CREATE INDEX i3a ON t3(a)"); - - for (int i = 0; i < SIZE; i++) { - int r = random.nextInt(100000); - mDatabase.execSQL("INSERT INTO t3 VALUES('" - + numberName(r) + "')"); - } - - for (int i = 0; i < SIZE; i++) { - where[i] = "a LIKE '*e*'"; - - } - } - - public void testRun() { - for (int i = 0; i < SIZE; i++) { - mDatabase.query("t3", COLUMNS, where[i], null, null, null, null); - } + + /** + * 10000 selects for a String - contains 'e'-indexed table + */ + + public static class SelectStringIndexedContains10000 extends + PerformanceBase { + private static final int SIZE = 100 * kMultiplier; + private static final String[] COLUMNS = {"t3.a"}; + private String[] where = new String[SIZE]; + + @Override + public void setUp() { + super.setUp(); + Random random = new Random(42); + + mDatabase + .execSQL("CREATE TABLE t3(a VARCHAR(100))"); + mDatabase.execSQL("CREATE INDEX i3a ON t3(a)"); + + for (int i = 0; i < SIZE; i++) { + int r = random.nextInt(100000); + mDatabase.execSQL("INSERT INTO t3 VALUES('" + + numberName(r) + "')"); + } + + for (int i = 0; i < SIZE; i++) { + where[i] = "a LIKE '*e*'"; + + } + } + + public void testRun() { + for (int i = 0; i < SIZE; i++) { + mDatabase.query("t3", COLUMNS, where[i], null, null, null, null); + } + } } - } - public static final String[] ONES = - {"zero", "one", "two", "three", "four", "five", "six", "seven", - "eight", "nine", "ten", "eleven", "twelve", "thirteen", - "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", - "nineteen"}; + public static final String[] ONES = + {"zero", "one", "two", "three", "four", "five", "six", "seven", + "eight", "nine", "ten", "eleven", "twelve", "thirteen", + "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", + "nineteen"}; - public static final String[] TENS = - {"", "ten", "twenty", "thirty", "forty", "fifty", "sixty", - "seventy", "eighty", "ninety"}; + public static final String[] TENS = + {"", "ten", "twenty", "thirty", "forty", "fifty", "sixty", + "seventy", "eighty", "ninety"}; } diff --git a/core/tests/coretests/src/android/database/sqlite/DatabaseConnectionPoolTest.java b/core/tests/coretests/src/android/database/sqlite/DatabaseConnectionPoolTest.java deleted file mode 100644 index 525dd2db0adc..000000000000 --- a/core/tests/coretests/src/android/database/sqlite/DatabaseConnectionPoolTest.java +++ /dev/null @@ -1,368 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT 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.database.sqlite; - -import android.content.Context; -import android.database.sqlite.SQLiteDatabaseTest.ClassToTestSqlCompilationAndCaching; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; -import android.util.Log; - -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; - -public class DatabaseConnectionPoolTest extends AndroidTestCase { - private static final String TAG = "DatabaseConnectionPoolTest"; - - private static final int MAX_CONN = 5; - private static final String TEST_SQL = "select * from test where i = ? AND j = 1"; - private static final String[] TEST_SQLS = new String[] { - TEST_SQL, TEST_SQL + 1, TEST_SQL + 2, TEST_SQL + 3, TEST_SQL + 4 - }; - - private SQLiteDatabase mDatabase; - private File mDatabaseFile; - private DatabaseConnectionPool mTestPool; - - @Override - protected void setUp() throws Exception { - super.setUp(); - - File dbDir = getContext().getDir(this.getClass().getName(), Context.MODE_PRIVATE); - mDatabaseFile = new File(dbDir, "database_test.db"); - if (mDatabaseFile.exists()) { - mDatabaseFile.delete(); - } - mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null); - assertNotNull(mDatabase); - mDatabase.execSQL("create table test (i int, j int);"); - mTestPool = new DatabaseConnectionPool(mDatabase); - assertNotNull(mTestPool); - } - - @Override - protected void tearDown() throws Exception { - mTestPool.close(); - mDatabase.close(); - mDatabaseFile.delete(); - super.tearDown(); - } - - @SmallTest - public void testGetAndRelease() { - mTestPool.setMaxPoolSize(MAX_CONN); - // connections should be lazily created. - assertEquals(0, mTestPool.getSize()); - // MAX pool size should be set to MAX_CONN - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - // get a connection - SQLiteDatabase db = mTestPool.get(TEST_SQL); - // pool size should be one - since only one should be allocated for the above get() - assertEquals(1, mTestPool.getSize()); - assertEquals(mDatabase, db.mParentConnObj); - // no free connections should be available - assertEquals(0, mTestPool.getFreePoolSize()); - assertFalse(mTestPool.isDatabaseObjFree(db)); - // release the connection - mTestPool.release(db); - assertEquals(1, mTestPool.getFreePoolSize()); - assertEquals(1, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - assertTrue(mTestPool.isDatabaseObjFree(db)); - // release the same object again and expect IllegalStateException - try { - mTestPool.release(db); - fail("illegalStateException expected"); - } catch (IllegalStateException e ) { - // expected. - } - } - - /** - * get all connections from the pool and ask for one more. - * should get one of the connections already got so far. - */ - @SmallTest - public void testGetAllConnAndOneMore() { - mTestPool.setMaxPoolSize(MAX_CONN); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - ArrayList<SQLiteDatabase> dbObjs = new ArrayList<SQLiteDatabase>(); - for (int i = 0; i < MAX_CONN; i++) { - SQLiteDatabase db = mTestPool.get(TEST_SQL); - assertFalse(dbObjs.contains(db)); - dbObjs.add(db); - assertEquals(mDatabase, db.mParentConnObj); - } - assertEquals(0, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - // pool is maxed out and no free connections. ask for one more connection - SQLiteDatabase db1 = mTestPool.get(TEST_SQL); - // make sure db1 is one of the existing ones - assertTrue(dbObjs.contains(db1)); - // pool size should remain at MAX_CONN - assertEquals(0, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - // release db1 but since it is allocated 2 times, it should still remain 'busy' - mTestPool.release(db1); - assertFalse(mTestPool.isDatabaseObjFree(db1)); - assertEquals(0, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - // release all connections - for (int i = 0; i < MAX_CONN; i++) { - mTestPool.release(dbObjs.get(i)); - } - // all objects in the pool should be freed now - assertEquals(MAX_CONN, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - } - - /** - * same as above except that each connection has different SQL statement associated with it. - */ - @SmallTest - public void testConnRetrievalForPreviouslySeenSql() { - mTestPool.setMaxPoolSize(MAX_CONN); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - - HashMap<String, SQLiteDatabase> dbObjs = new HashMap<String, SQLiteDatabase>(); - for (int i = 0; i < MAX_CONN; i++) { - SQLiteDatabase db = mTestPool.get(TEST_SQLS[i]); - executeSqlOnDatabaseConn(db, TEST_SQLS[i]); - assertFalse(dbObjs.values().contains(db)); - dbObjs.put(TEST_SQLS[i], db); - } - assertEquals(0, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - // pool is maxed out and no free connections. ask for one more connection - // use a previously seen SQL statement - String testSql = TEST_SQLS[MAX_CONN - 1]; - SQLiteDatabase db1 = mTestPool.get(testSql); - assertEquals(0, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - // make sure db1 is one of the existing ones - assertTrue(dbObjs.values().contains(db1)); - assertEquals(db1, dbObjs.get(testSql)); - // do the same again - SQLiteDatabase db2 = mTestPool.get(testSql); - // make sure db1 is one of the existing ones - assertEquals(db2, dbObjs.get(testSql)); - - // pool size should remain at MAX_CONN - assertEquals(0, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - - // release db1 but since the same connection is allocated 3 times, - // it should still remain 'busy' - mTestPool.release(db1); - assertFalse(mTestPool.isDatabaseObjFree(dbObjs.get(testSql))); - assertEquals(0, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - - // release db2 but since the same connection is allocated 2 times, - // it should still remain 'busy' - mTestPool.release(db2); - assertFalse(mTestPool.isDatabaseObjFree(dbObjs.get(testSql))); - assertEquals(0, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - - // release all connections - for (int i = 0; i < MAX_CONN; i++) { - mTestPool.release(dbObjs.get(TEST_SQLS[i])); - } - // all objects in the pool should be freed now - assertEquals(MAX_CONN, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - } - - private void executeSqlOnDatabaseConn(SQLiteDatabase db, String sql) { - // get the given sql be compiled on the given database connection. - // this will help DatabaseConenctionPool figure out if a given SQL statement - // is already cached by a database connection. - ClassToTestSqlCompilationAndCaching c = - ClassToTestSqlCompilationAndCaching.create(db, sql); - c.close(); - } - - /** - * get a connection for a SQL statement 'blah'. (connection_s) - * make sure the pool has at least one free connection even after this get(). - * and get a connection for the same SQL again. - * this connection should be different from connection_s. - * even though there is a connection with the given SQL pre-compiled, since is it not free - * AND since the pool has free connections available, should get a new connection. - */ - @SmallTest - public void testGetConnForTheSameSql() { - mTestPool.setMaxPoolSize(MAX_CONN); - - SQLiteDatabase db = mTestPool.get(TEST_SQL); - executeSqlOnDatabaseConn(db, TEST_SQL); - assertEquals(0, mTestPool.getFreePoolSize()); - assertEquals(1, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - - assertFalse(mTestPool.isDatabaseObjFree(db)); - - SQLiteDatabase db1 = mTestPool.get(TEST_SQL); - assertEquals(0, mTestPool.getFreePoolSize()); - assertEquals(2, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - - assertFalse(mTestPool.isDatabaseObjFree(db1)); - assertFalse(db1.equals(db)); - - mTestPool.release(db); - assertEquals(1, mTestPool.getFreePoolSize()); - assertEquals(2, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - - mTestPool.release(db1); - assertEquals(2, mTestPool.getFreePoolSize()); - assertEquals(2, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - } - - /** - * get the same connection N times and release it N times. - * this tests DatabaseConnectionPool.PoolObj.mNumHolders - */ - @SmallTest - public void testGetSameConnNtimesAndReleaseItNtimes() { - mTestPool.setMaxPoolSize(MAX_CONN); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - - HashMap<String, SQLiteDatabase> dbObjs = new HashMap<String, SQLiteDatabase>(); - for (int i = 0; i < MAX_CONN; i++) { - SQLiteDatabase db = mTestPool.get(TEST_SQLS[i]); - executeSqlOnDatabaseConn(db, TEST_SQLS[i]); - assertFalse(dbObjs.values().contains(db)); - dbObjs.put(TEST_SQLS[i], db); - } - assertEquals(0, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - // every connection in the pool should have numHolders = 1 - for (int i = 0; i < MAX_CONN; i ++) { - assertEquals(1, mTestPool.getPool().get(i).getNumHolders()); - } - // pool is maxed out and no free connections. ask for one more connection - // use a previously seen SQL statement - String testSql = TEST_SQLS[MAX_CONN - 1]; - SQLiteDatabase db1 = mTestPool.get(testSql); - assertEquals(0, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - // make sure db1 is one of the existing ones - assertTrue(dbObjs.values().contains(db1)); - assertEquals(db1, dbObjs.get(testSql)); - assertFalse(mTestPool.isDatabaseObjFree(db1)); - DatabaseConnectionPool.PoolObj poolObj = mTestPool.getPool().get(db1.mConnectionNum - 1); - int numHolders = poolObj.getNumHolders(); - assertEquals(2, numHolders); - assertEquals(0, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - // get the same connection N times more - int N = 100; - for (int i = 0; i < N; i++) { - SQLiteDatabase db2 = mTestPool.get(testSql); - assertEquals(db1, db2); - assertFalse(mTestPool.isDatabaseObjFree(db2)); - // numHolders for this object should be now up by 1 - int prev = numHolders; - numHolders = poolObj.getNumHolders(); - assertEquals(prev + 1, numHolders); - } - // release it N times - for (int i = 0; i < N; i++) { - mTestPool.release(db1); - int prev = numHolders; - numHolders = poolObj.getNumHolders(); - assertEquals(prev - 1, numHolders); - assertFalse(mTestPool.isDatabaseObjFree(db1)); - } - // the connection should still have 2 more holders - assertFalse(mTestPool.isDatabaseObjFree(db1)); - assertEquals(2, poolObj.getNumHolders()); - assertEquals(0, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - // release 2 more times - mTestPool.release(db1); - mTestPool.release(db1); - assertEquals(0, poolObj.getNumHolders()); - assertEquals(1, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - assertTrue(mTestPool.isDatabaseObjFree(db1)); - } - - @SmallTest - public void testStressTest() { - mTestPool.setMaxPoolSize(MAX_CONN); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - - HashMap<SQLiteDatabase, Integer> dbMap = new HashMap<SQLiteDatabase, Integer>(); - for (int i = 0; i < MAX_CONN; i++) { - SQLiteDatabase db = mTestPool.get(TEST_SQLS[i]); - assertFalse(dbMap.containsKey(db)); - dbMap.put(db, 1); - executeSqlOnDatabaseConn(db, TEST_SQLS[i]); - } - assertEquals(0, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - // ask for lot more connections but since the pool is maxed out, we should start receiving - // connections that we already got so far - for (int i = MAX_CONN; i < 1000; i++) { - SQLiteDatabase db = mTestPool.get(TEST_SQL + i); - assertTrue(dbMap.containsKey(db)); - int k = dbMap.get(db); - dbMap.put(db, ++k); - } - assertEquals(0, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - // print the distribution of the database connection handles received, should be uniform. - for (SQLiteDatabase d : dbMap.keySet()) { - Log.i(TAG, "connection # " + d.mConnectionNum + ", numHolders: " + dbMap.get(d)); - } - // print the pool info - Log.i(TAG, mTestPool.toString()); - // release all - for (SQLiteDatabase d : dbMap.keySet()) { - int num = dbMap.get(d); - for (int i = 0; i < num; i++) { - mTestPool.release(d); - } - } - assertEquals(MAX_CONN, mTestPool.getFreePoolSize()); - assertEquals(MAX_CONN, mTestPool.getSize()); - assertEquals(MAX_CONN, mTestPool.getMaxPoolSize()); - } -} diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteCursorTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteCursorTest.java index f6b1d04c8487..9ccc6e8185df 100644 --- a/core/tests/coretests/src/android/database/sqlite/SQLiteCursorTest.java +++ b/core/tests/coretests/src/android/database/sqlite/SQLiteCursorTest.java @@ -21,8 +21,6 @@ import android.content.Context; import android.database.Cursor; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.SmallTest; -import android.util.Log; import java.io.File; import java.util.HashSet; @@ -54,52 +52,8 @@ public class SQLiteCursorTest extends AndroidTestCase { super.tearDown(); } - @SmallTest - public void testQueryObjReassignment() { - mDatabase.enableWriteAheadLogging(); - // have a few connections in the database connection pool - DatabaseConnectionPool pool = mDatabase.mConnectionPool; - pool.setMaxPoolSize(5); - SQLiteCursor cursor = - (SQLiteCursor) mDatabase.rawQuery("select * from " + TABLE_NAME, null); - assertNotNull(cursor); - // it should use a pooled database connection - SQLiteDatabase db = cursor.getDatabase(); - assertTrue(db.mConnectionNum > 0); - assertFalse(mDatabase.equals(db)); - assertEquals(mDatabase, db.mParentConnObj); - assertTrue(pool.getConnectionList().contains(db)); - assertTrue(db.isOpen()); - // do a requery. cursor should continue to use the above pooled connection - cursor.requery(); - SQLiteDatabase dbAgain = cursor.getDatabase(); - assertEquals(db, dbAgain); - // disable WAL so that the pooled connection held by the above cursor is closed - mDatabase.disableWriteAheadLogging(); - assertFalse(db.isOpen()); - assertNull(mDatabase.mConnectionPool); - // requery - which should make the cursor use mDatabase connection since the pooled - // connection is no longer available - cursor.requery(); - SQLiteDatabase db1 = cursor.getDatabase(); - assertTrue(db1.mConnectionNum == 0); - assertEquals(mDatabase, db1); - assertNull(mDatabase.mConnectionPool); - assertTrue(db1.isOpen()); - assertFalse(mDatabase.equals(db)); - // enable WAL and requery - this time a pooled connection should be used - mDatabase.enableWriteAheadLogging(); - cursor.requery(); - db = cursor.getDatabase(); - assertTrue(db.mConnectionNum > 0); - assertFalse(mDatabase.equals(db)); - assertEquals(mDatabase, db.mParentConnObj); - assertTrue(mDatabase.mConnectionPool.getConnectionList().contains(db)); - assertTrue(db.isOpen()); - } - /** - * this test could take a while to execute. so, designate it as LargetTest + * this test could take a while to execute. so, designate it as LargeTest */ @LargeTest public void testFillWindow() { diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java deleted file mode 100644 index 5ef8d11c7374..000000000000 --- a/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java +++ /dev/null @@ -1,971 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT 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.database.sqlite; - -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.database.DatabaseErrorHandler; -import android.database.DatabaseUtils; -import android.database.DefaultDatabaseErrorHandler; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteDatabase.CursorFactory; -import android.database.sqlite.SQLiteStatement; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; -import android.test.suitebuilder.annotation.Suppress; -import android.util.Log; -import android.util.Pair; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -public class SQLiteDatabaseTest extends AndroidTestCase { - private static final String TAG = "DatabaseGeneralTest"; - private static final String TEST_TABLE = "test"; - private static final int CURRENT_DATABASE_VERSION = 42; - private SQLiteDatabase mDatabase; - private File mDatabaseFile; - private static final int INSERT = 1; - private static final int UPDATE = 2; - private static final int DELETE = 3; - private static final String DB_NAME = "database_test.db"; - - @Override - protected void setUp() throws Exception { - super.setUp(); - dbSetUp(); - } - - @Override - protected void tearDown() throws Exception { - dbTeardown(); - super.tearDown(); - } - - private void dbTeardown() throws Exception { - mDatabase.close(); - mDatabaseFile.delete(); - } - - private void dbSetUp() throws Exception { - File dbDir = getContext().getDir(this.getClass().getName(), Context.MODE_PRIVATE); - mDatabaseFile = new File(dbDir, DB_NAME); - if (mDatabaseFile.exists()) { - mDatabaseFile.delete(); - } - mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null, null); - assertNotNull(mDatabase); - mDatabase.setVersion(CURRENT_DATABASE_VERSION); - } - - @SmallTest - public void testEnableWriteAheadLogging() { - mDatabase.disableWriteAheadLogging(); - assertNull(mDatabase.mConnectionPool); - mDatabase.enableWriteAheadLogging(); - DatabaseConnectionPool pool = mDatabase.mConnectionPool; - assertNotNull(pool); - // make the same call again and make sure the pool already setup is not re-created - mDatabase.enableWriteAheadLogging(); - assertEquals(pool, mDatabase.mConnectionPool); - } - - @SmallTest - public void testDisableWriteAheadLogging() { - mDatabase.execSQL("create table test (i int);"); - mDatabase.enableWriteAheadLogging(); - assertNotNull(mDatabase.mConnectionPool); - // get a pooled database connection - SQLiteDatabase db = mDatabase.getDbConnection("select * from test"); - assertNotNull(db); - assertFalse(mDatabase.equals(db)); - assertTrue(db.isOpen()); - // disable WAL - which should close connection pool and all pooled connections - mDatabase.disableWriteAheadLogging(); - assertNull(mDatabase.mConnectionPool); - assertFalse(db.isOpen()); - } - - @SmallTest - public void testCursorsWithClosedDbConnAfterDisableWriteAheadLogging() { - mDatabase.disableWriteAheadLogging(); - mDatabase.beginTransactionNonExclusive(); - mDatabase.execSQL("create table test (i int);"); - mDatabase.execSQL("insert into test values(1);"); - mDatabase.setTransactionSuccessful(); - mDatabase.endTransaction(); - mDatabase.enableWriteAheadLogging(); - assertNotNull(mDatabase.mConnectionPool); - assertEquals(0, mDatabase.mConnectionPool.getSize()); - assertEquals(0, mDatabase.mConnectionPool.getFreePoolSize()); - // get a cursor which should use pooled database connection - Cursor c = mDatabase.rawQuery("select * from test", null); - assertEquals(1, c.getCount()); - assertEquals(1, mDatabase.mConnectionPool.getSize()); - assertEquals(1, mDatabase.mConnectionPool.getFreePoolSize()); - SQLiteDatabase db = mDatabase.mConnectionPool.getConnectionList().get(0); - assertTrue(mDatabase.mConnectionPool.isDatabaseObjFree(db)); - // disable WAL - which should close connection pool and all pooled connections - mDatabase.disableWriteAheadLogging(); - assertNull(mDatabase.mConnectionPool); - assertFalse(db.isOpen()); - // cursor data should still be accessible because it is fetching data from CursorWindow - c.moveToNext(); - assertEquals(1, c.getInt(0)); - c.requery(); - assertEquals(1, c.getCount()); - c.moveToNext(); - assertEquals(1, c.getInt(0)); - c.close(); - } - - /** - * a transaction should be started before a standalone-update/insert/delete statement - */ - @SmallTest - public void testStartXactBeforeUpdateSql() throws InterruptedException { - runTestForStartXactBeforeUpdateSql(INSERT); - runTestForStartXactBeforeUpdateSql(UPDATE); - runTestForStartXactBeforeUpdateSql(DELETE); - } - private void runTestForStartXactBeforeUpdateSql(int stmtType) throws InterruptedException { - createTableAndClearCache(); - - ContentValues values = new ContentValues(); - // make some changes to data in TEST_TABLE - for (int i = 0; i < 5; i++) { - values.put("i", i); - values.put("j", "i" + System.currentTimeMillis()); - mDatabase.insert(TEST_TABLE, null, values); - switch (stmtType) { - case UPDATE: - values.put("j", "u" + System.currentTimeMillis()); - mDatabase.update(TEST_TABLE, values, "i = " + i, null); - break; - case DELETE: - mDatabase.delete(TEST_TABLE, "i = 1", null); - break; - } - } - // do a query. even though query uses a different database connection, - // it should still see the above changes to data because the above standalone - // insert/update/deletes are done in transactions automatically. - String sql = "select count(*) from " + TEST_TABLE; - SQLiteStatement stmt = mDatabase.compileStatement(sql); - final int expectedValue = (stmtType == DELETE) ? 4 : 5; - assertEquals(expectedValue, stmt.simpleQueryForLong()); - stmt.close(); - Cursor c = mDatabase.rawQuery(sql, null); - assertEquals(1, c.getCount()); - c.moveToFirst(); - assertEquals(expectedValue, c.getLong(0)); - c.close(); - - // do 5 more changes in a transaction but do a query before and after the commit - mDatabase.beginTransaction(); - for (int i = 10; i < 15; i++) { - values.put("i", i); - values.put("j", "i" + System.currentTimeMillis()); - mDatabase.insert(TEST_TABLE, null, values); - switch (stmtType) { - case UPDATE: - values.put("j", "u" + System.currentTimeMillis()); - mDatabase.update(TEST_TABLE, values, "i = " + i, null); - break; - case DELETE: - mDatabase.delete(TEST_TABLE, "i = 1", null); - break; - } - } - mDatabase.setTransactionSuccessful(); - // do a query before commit - should still have 5 rows - // this query should run in a different thread to force it to use a different database - // connection - Thread t = new Thread() { - @Override public void run() { - String sql = "select count(*) from " + TEST_TABLE; - SQLiteStatement stmt = getDb().compileStatement(sql); - assertEquals(expectedValue, stmt.simpleQueryForLong()); - stmt.close(); - Cursor c = getDb().rawQuery(sql, null); - assertEquals(1, c.getCount()); - c.moveToFirst(); - assertEquals(expectedValue, c.getLong(0)); - c.close(); - } - }; - t.start(); - // wait until the above thread is done - t.join(); - // commit and then query. should see changes from the transaction - mDatabase.endTransaction(); - stmt = mDatabase.compileStatement(sql); - final int expectedValue2 = (stmtType == DELETE) ? 9 : 10; - assertEquals(expectedValue2, stmt.simpleQueryForLong()); - stmt.close(); - c = mDatabase.rawQuery(sql, null); - assertEquals(1, c.getCount()); - c.moveToFirst(); - assertEquals(expectedValue2, c.getLong(0)); - c.close(); - } - private synchronized SQLiteDatabase getDb() { - return mDatabase; - } - - /** - * Test to ensure that readers are able to read the database data (old versions) - * EVEN WHEN the writer is in a transaction on the same database. - *<p> - * This test starts 1 Writer and 2 Readers and sets up connection pool for readers - * by calling the method {@link SQLiteDatabase#enableWriteAheadLogging()}. - * <p> - * Writer does the following in a tight loop - * <pre> - * begin transaction - * insert into table_1 - * insert into table_2 - * commit - * </pre> - * <p> - * As long a the writer is alive, Readers do the following in a tight loop at the same time - * <pre> - * Reader_K does "select count(*) from table_K" where K = 1 or 2 - * </pre> - * <p> - * The test is run for TIME_TO_RUN_WAL_TEST_FOR sec. - * <p> - * The test is repeated for different connection-pool-sizes (1..3) - * <p> - * And at the end of of each test, the following statistics are printed - * <ul> - * <li>connection-pool-size</li> - * <li>number-of-transactions by writer</li> - * <li>number of reads by reader_K while the writer is IN or NOT-IN xaction</li> - * </ul> - */ - @LargeTest - @Suppress // run this test only if you need to collect the numbers from this test - public void testConcurrencyEffectsOfConnPool() throws Exception { - // run the test with sqlite WAL enable - runConnectionPoolTest(true); - - // run the same test WITHOUT sqlite WAL enabled - runConnectionPoolTest(false); - } - - private void runConnectionPoolTest(boolean useWal) throws Exception { - int M = 3; - StringBuilder[] buff = new StringBuilder[M]; - for (int i = 0; i < M; i++) { - if (useWal) { - // set up connection pool - mDatabase.enableWriteAheadLogging(); - mDatabase.mConnectionPool.setMaxPoolSize(i + 1); - } else { - mDatabase.disableWriteAheadLogging(); - } - mDatabase.execSQL("CREATE TABLE t1 (i int, j int);"); - mDatabase.execSQL("CREATE TABLE t2 (i int, j int);"); - mDatabase.beginTransaction(); - for (int k = 0; k < 5; k++) { - mDatabase.execSQL("insert into t1 values(?,?);", new String[] {k+"", k+""}); - mDatabase.execSQL("insert into t2 values(?,?);", new String[] {k+"", k+""}); - } - mDatabase.setTransactionSuccessful(); - mDatabase.endTransaction(); - - // start a writer - Writer w = new Writer(mDatabase); - - // initialize an array of counters to be passed to the readers - Reader r1 = new Reader(mDatabase, "t1", w, 0); - Reader r2 = new Reader(mDatabase, "t2", w, 1); - w.start(); - r1.start(); - r2.start(); - - // wait for all threads to die - w.join(); - r1.join(); - r2.join(); - - // print the stats - int[][] counts = getCounts(); - buff[i] = new StringBuilder(); - buff[i].append("connpool-size = "); - buff[i].append(i + 1); - buff[i].append(", num xacts by writer = "); - buff[i].append(getNumXacts()); - buff[i].append(", num-reads-in-xact/NOT-in-xact by reader1 = "); - buff[i].append(counts[0][1] + "/" + counts[0][0]); - buff[i].append(", by reader2 = "); - buff[i].append(counts[1][1] + "/" + counts[1][0]); - - Log.i(TAG, "done testing for conn-pool-size of " + (i+1)); - - dbTeardown(); - dbSetUp(); - } - Log.i(TAG, "duration of test " + TIME_TO_RUN_WAL_TEST_FOR + " sec"); - for (int i = 0; i < M; i++) { - Log.i(TAG, buff[i].toString()); - } - } - - private boolean inXact = false; - private int numXacts; - private static final int TIME_TO_RUN_WAL_TEST_FOR = 15; // num sec this test should run - private int[][] counts = new int[2][2]; - - private synchronized boolean inXact() { - return inXact; - } - - private synchronized void setInXactFlag(boolean flag) { - inXact = flag; - } - - private synchronized void setCounts(int readerNum, int[] numReads) { - counts[readerNum][0] = numReads[0]; - counts[readerNum][1] = numReads[1]; - } - - private synchronized int[][] getCounts() { - return counts; - } - - private synchronized void setNumXacts(int num) { - numXacts = num; - } - - private synchronized int getNumXacts() { - return numXacts; - } - - private class Writer extends Thread { - private SQLiteDatabase db = null; - public Writer(SQLiteDatabase db) { - this.db = db; - } - @Override public void run() { - // in a loop, for N sec, do the following - // BEGIN transaction - // insert into table t1, t2 - // Commit - long now = System.currentTimeMillis(); - int k; - for (k = 0;(System.currentTimeMillis() - now) / 1000 < TIME_TO_RUN_WAL_TEST_FOR; k++) { - db.beginTransactionNonExclusive(); - setInXactFlag(true); - for (int i = 0; i < 10; i++) { - db.execSQL("insert into t1 values(?,?);", new String[] {i+"", i+""}); - db.execSQL("insert into t2 values(?,?);", new String[] {i+"", i+""}); - } - db.setTransactionSuccessful(); - setInXactFlag(false); - db.endTransaction(); - } - setNumXacts(k); - } - } - - private class Reader extends Thread { - private SQLiteDatabase db = null; - private String table = null; - private Writer w = null; - private int readerNum; - private int[] numReads = new int[2]; - public Reader(SQLiteDatabase db, String table, Writer w, int readerNum) { - this.db = db; - this.table = table; - this.w = w; - this.readerNum = readerNum; - } - @Override public void run() { - // while the write is alive, in a loop do the query on a table - while (w.isAlive()) { - for (int i = 0; i < 10; i++) { - DatabaseUtils.longForQuery(db, "select count(*) from " + this.table, null); - // update count of reads - numReads[inXact() ? 1 : 0] += 1; - } - } - setCounts(readerNum, numReads); - } - } - - public static class ClassToTestSqlCompilationAndCaching extends SQLiteProgram { - private ClassToTestSqlCompilationAndCaching(SQLiteDatabase db, String sql) { - super(db, sql); - } - public static ClassToTestSqlCompilationAndCaching create(SQLiteDatabase db, String sql) { - db.lock(); - try { - return new ClassToTestSqlCompilationAndCaching(db, sql); - } finally { - db.unlock(); - } - } - } - - @SmallTest - public void testLruCachingOfSqliteCompiledSqlObjs() { - createTableAndClearCache(); - // set cache size - int N = SQLiteDatabase.MAX_SQL_CACHE_SIZE; - mDatabase.setMaxSqlCacheSize(N); - - // do N+1 queries - and when the 0th entry is removed from LRU cache due to the - // insertion of (N+1)th entry, make sure 0th entry is closed - ArrayList<Integer> stmtObjs = new ArrayList<Integer>(); - ArrayList<String> sqlStrings = new ArrayList<String>(); - int stmt0 = 0; - for (int i = 0; i < N+1; i++) { - String s = "insert into test values(" + i + ",?);"; - sqlStrings.add(s); - ClassToTestSqlCompilationAndCaching c = - ClassToTestSqlCompilationAndCaching.create(mDatabase, s); - int n = c.getSqlStatementId(); - stmtObjs.add(i, n); - if (i == 0) { - // save the statementId of this obj. we want to make sure it is thrown out of - // the cache at the end of this test. - stmt0 = n; - } - c.close(); - } - // is 0'th entry out of the cache? it should be in the list of statementIds - // corresponding to the pre-compiled sql statements to be finalized. - assertTrue(mDatabase.getQueuedUpStmtList().contains(stmt0)); - for (int i = 1; i < N+1; i++) { - SQLiteCompiledSql compSql = mDatabase.getCompiledStatementForSql(sqlStrings.get(i)); - assertNotNull(compSql); - assertTrue(stmtObjs.contains(compSql.nStatement)); - } - } - - @MediumTest - public void testDbCloseReleasingAllCachedSql() { - mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, text1 TEXT, text2 TEXT, " + - "num1 INTEGER, num2 INTEGER, image BLOB);"); - final String statement = "DELETE FROM test WHERE _id=?;"; - SQLiteStatement statementDoNotClose = mDatabase.compileStatement(statement); - statementDoNotClose.bindLong(1, 1); - /* do not close statementDoNotClose object. - * That should leave it in SQLiteDatabase.mPrograms. - * mDatabase.close() in tearDown() should release it. - */ - } - - private void createTableAndClearCache() { - mDatabase.disableWriteAheadLogging(); - mDatabase.execSQL("DROP TABLE IF EXISTS " + TEST_TABLE); - mDatabase.execSQL("CREATE TABLE " + TEST_TABLE + " (i int, j int);"); - mDatabase.enableWriteAheadLogging(); - mDatabase.lock(); - // flush the above statement from cache and close all the pending statements to be released - mDatabase.deallocCachedSqlStatements(); - mDatabase.closePendingStatements(); - mDatabase.unlock(); - assertEquals(0, mDatabase.getQueuedUpStmtList().size()); - } - - /** - * test to make sure the statement finalizations are not done right away but - * piggy-backed onto the next sql statement execution on the same database. - */ - @SmallTest - public void testStatementClose() { - createTableAndClearCache(); - // fill up statement cache in mDatabase - int N = SQLiteDatabase.MAX_SQL_CACHE_SIZE; - mDatabase.setMaxSqlCacheSize(N); - SQLiteStatement stmt; - int stmt0Id = 0; - for (int i = 0; i < N; i ++) { - ClassToTestSqlCompilationAndCaching c = - ClassToTestSqlCompilationAndCaching.create(mDatabase, - "insert into test values(" + i + ", ?);"); - // keep track of 0th entry - if (i == 0) { - stmt0Id = c.getSqlStatementId(); - } - c.close(); - } - - // add one more to the cache - and the above 'stmt0Id' should fall out of cache - ClassToTestSqlCompilationAndCaching stmt1 = - ClassToTestSqlCompilationAndCaching.create(mDatabase, - "insert into test values(100, ?);"); - stmt1.close(); - - // the above close() should have queuedUp the statement for finalization - ArrayList<Integer> statementIds = mDatabase.getQueuedUpStmtList(); - assertTrue(statementIds.contains(stmt0Id)); - - // execute something to see if this statement gets finalized - mDatabase.execSQL("delete from test where i = 10;"); - statementIds = mDatabase.getQueuedUpStmtList(); - assertFalse(statementIds.contains(stmt0Id)); - } - - /** - * same as above - except that the statement to be finalized is from Thread # 1. - * and it is eventually finalized in Thread # 2 when it executes a SQL statement. - * @throws InterruptedException - */ - @LargeTest - public void testStatementCloseDiffThread() throws InterruptedException { - createTableAndClearCache(); - final int N = SQLiteDatabase.MAX_SQL_CACHE_SIZE; - mDatabase.setMaxSqlCacheSize(N); - // fill up statement cache in mDatabase in a thread - Thread t1 = new Thread() { - @Override public void run() { - SQLiteStatement stmt; - for (int i = 0; i < N; i++) { - ClassToTestSqlCompilationAndCaching c = - ClassToTestSqlCompilationAndCaching.create(getDb(), - "insert into test values(" + i + ", ?);"); - // keep track of 0th entry - if (i == 0) { - stmt0Id = c.getSqlStatementId(); - } - c.close(); - } - } - }; - t1.start(); - // wait for the thread to finish - t1.join(); - // mDatabase shouldn't have any statements to be released - assertEquals(0, mDatabase.getQueuedUpStmtList().size()); - - // add one more to the cache - and the above 'stmt0Id' should fall out of cache - // just for the heck of it, do it in a separate thread - Thread t2 = new Thread() { - @Override public void run() { - ClassToTestSqlCompilationAndCaching stmt1 = - ClassToTestSqlCompilationAndCaching.create(getDb(), - "insert into test values(100, ?);"); - stmt1.bindLong(1, 1); - stmt1.close(); - } - }; - t2.start(); - t2.join(); - - // close() in the above thread should have queuedUp the stmt0Id for finalization - ArrayList<Integer> statementIds = getDb().getQueuedUpStmtList(); - assertTrue(statementIds.contains(getStmt0Id())); - assertEquals(1, statementIds.size()); - - // execute something to see if this statement gets finalized - // again do it in a separate thread - Thread t3 = new Thread() { - @Override public void run() { - getDb().execSQL("delete from test where i = 10;"); - } - }; - t3.start(); - t3.join(); - - // is the statement finalized? - statementIds = getDb().getQueuedUpStmtList(); - assertFalse(statementIds.contains(getStmt0Id())); - } - - private volatile int stmt0Id = 0; - private synchronized int getStmt0Id() { - return this.stmt0Id; - } - - /** - * same as above - except that the queue of statements to be finalized are finalized - * by database close() operation. - */ - @LargeTest - public void testStatementCloseByDbClose() throws InterruptedException { - createTableAndClearCache(); - // fill up statement cache in mDatabase in a thread - Thread t1 = new Thread() { - @Override public void run() { - int N = SQLiteDatabase.MAX_SQL_CACHE_SIZE; - getDb().setMaxSqlCacheSize(N); - SQLiteStatement stmt; - for (int i = 0; i < N; i ++) { - ClassToTestSqlCompilationAndCaching c = - ClassToTestSqlCompilationAndCaching.create(getDb(), - "insert into test values(" + i + ", ?);"); - // keep track of 0th entry - if (i == 0) { - stmt0Id = c.getSqlStatementId(); - } - c.close(); - } - } - }; - t1.start(); - // wait for the thread to finish - t1.join(); - - // add one more to the cache - and the above 'stmt0Id' should fall out of cache - // just for the heck of it, do it in a separate thread - Thread t2 = new Thread() { - @Override public void run() { - ClassToTestSqlCompilationAndCaching stmt1 = - ClassToTestSqlCompilationAndCaching.create(getDb(), - "insert into test values(100, ?);"); - stmt1.bindLong(1, 1); - stmt1.close(); - } - }; - t2.start(); - t2.join(); - - // close() in the above thread should have queuedUp the statement for finalization - ArrayList<Integer> statementIds = getDb().getQueuedUpStmtList(); - assertTrue(getStmt0Id() > 0); - assertTrue(statementIds.contains(stmt0Id)); - assertEquals(1, statementIds.size()); - - // close the database. everything from mClosedStatementIds in mDatabase - // should be finalized and cleared from the list - // again do it in a separate thread - Thread t3 = new Thread() { - @Override public void run() { - getDb().close(); - } - }; - t3.start(); - t3.join(); - - // check mClosedStatementIds in mDatabase. it should be empty - statementIds = getDb().getQueuedUpStmtList(); - assertEquals(0, statementIds.size()); - } - - /** - * This test tests usage execSQL() to begin transaction works in the following way - * Thread #1 does - * execSQL("begin transaction"); - * insert() - * Thread # 2 - * query() - * Thread#1 ("end transaction") - * Thread # 2 query will execute - because java layer will not have locked the SQLiteDatabase - * object and sqlite will consider this query to be part of the transaction. - * - * but if thread # 1 uses beginTransaction() instead of execSQL() to start transaction, - * then Thread # 2's query will have been blocked by java layer - * until Thread#1 ends transaction. - * - * @throws InterruptedException - */ - @SmallTest - public void testExecSqlToStartAndEndTransaction() throws InterruptedException { - runExecSqlToStartAndEndTransaction("END"); - // same as above, instead now do "COMMIT" or "ROLLBACK" instead of "END" transaction - runExecSqlToStartAndEndTransaction("COMMIT"); - runExecSqlToStartAndEndTransaction("ROLLBACK"); - } - private void runExecSqlToStartAndEndTransaction(String str) throws InterruptedException { - createTableAndClearCache(); - // disable WAL just so queries and updates use the same database connection - mDatabase.disableWriteAheadLogging(); - mDatabase.execSQL("BEGIN transaction"); - // even though mDatabase.beginTransaction() is not called to start transaction, - // mDatabase connection should now be in transaction as a result of - // mDatabase.execSQL("BEGIN transaction") - // but mDatabase.mLock should not be held by any thread - assertTrue(mDatabase.inTransaction()); - assertFalse(mDatabase.isDbLockedByCurrentThread()); - assertFalse(mDatabase.isDbLockedByOtherThreads()); - assertTrue(mDatabase.amIInTransaction()); - mDatabase.execSQL("INSERT into " + TEST_TABLE + " values(10, 999);"); - assertTrue(mDatabase.inTransaction()); - assertFalse(mDatabase.isDbLockedByCurrentThread()); - assertFalse(mDatabase.isDbLockedByOtherThreads()); - assertTrue(mDatabase.amIInTransaction()); - Thread t = new Thread() { - @Override public void run() { - assertTrue(mDatabase.amIInTransaction()); - assertEquals(999, DatabaseUtils.longForQuery(getDb(), - "select j from " + TEST_TABLE + " WHERE i = 10", null)); - assertTrue(getDb().inTransaction()); - assertFalse(getDb().isDbLockedByCurrentThread()); - assertFalse(getDb().isDbLockedByOtherThreads()); - assertTrue(mDatabase.amIInTransaction()); - } - }; - t.start(); - t.join(); - assertTrue(mDatabase.amIInTransaction()); - assertTrue(mDatabase.inTransaction()); - assertFalse(mDatabase.isDbLockedByCurrentThread()); - assertFalse(mDatabase.isDbLockedByOtherThreads()); - mDatabase.execSQL(str); - assertFalse(mDatabase.amIInTransaction()); - assertFalse(mDatabase.inTransaction()); - assertFalse(mDatabase.isDbLockedByCurrentThread()); - assertFalse(mDatabase.isDbLockedByOtherThreads()); - } - - /** - * test the following - * http://b/issue?id=2871037 - * Cursor cursor = db.query(...); - * // with WAL enabled, the above uses a pooled database connection - * db.beginTransaction() - * try { - * db.insert(......); - * cursor.requery(); - * // since the cursor uses pooled database connection, the above requery - * // will not return the results that were inserted above since the insert is - * // done using main database connection AND the transaction is not committed yet. - * // fix is to make the above cursor use the main database connection - and NOT - * // the pooled database connection - * db.setTransactionSuccessful() - * } finally { - * db.endTransaction() - * } - * - * @throws InterruptedException - */ - @SmallTest - public void testTransactionAndWalInterplay1() throws InterruptedException { - createTableAndClearCache(); - mDatabase.execSQL("INSERT into " + TEST_TABLE + " values(10, 999);"); - String sql = "select * from " + TEST_TABLE; - Cursor c = mDatabase.rawQuery(sql, null); - // should have 1 row in the table - assertEquals(1, c.getCount()); - mDatabase.beginTransactionNonExclusive(); - try { - mDatabase.execSQL("INSERT into " + TEST_TABLE + " values(100, 9909);"); - assertEquals(2, DatabaseUtils.longForQuery(mDatabase, - "select count(*) from " + TEST_TABLE, null)); - // requery on the previously opened cursor - // cursor should now use the main database connection and see 2 rows - c.requery(); - assertEquals(2, c.getCount()); - mDatabase.setTransactionSuccessful(); - } finally { - mDatabase.endTransaction(); - } - c.close(); - - // do the same test but now do the requery in a separate thread. - createTableAndClearCache(); - mDatabase.execSQL("INSERT into " + TEST_TABLE + " values(10, 999);"); - final Cursor c1 = mDatabase.rawQuery("select count(*) from " + TEST_TABLE, null); - // should have 1 row in the table - assertEquals(1, c1.getCount()); - mDatabase.beginTransactionNonExclusive(); - try { - mDatabase.execSQL("INSERT into " + TEST_TABLE + " values(100, 9909);"); - assertEquals(2, DatabaseUtils.longForQuery(mDatabase, - "select count(*) from " + TEST_TABLE, null)); - // query in a different thread. that causes the cursor to use a pooled connection - // and since this thread hasn't committed its changes, the cursor should still see only - // 1 row - Thread t = new Thread() { - @Override public void run() { - c1.requery(); - assertEquals(1, c1.getCount()); - } - }; - t.start(); - t.join(); - // should be 2 rows now - including the the row inserted above - mDatabase.setTransactionSuccessful(); - } finally { - mDatabase.endTransaction(); - } - c1.close(); - } - - /** - * This test is same as {@link #testTransactionAndWalInterplay1()} except the following: - * instead of mDatabase.beginTransactionNonExclusive(), use execSQL("BEGIN transaction") - * and instead of mDatabase.endTransaction(), use execSQL("END"); - */ - @SmallTest - public void testTransactionAndWalInterplay2() throws InterruptedException { - createTableAndClearCache(); - mDatabase.execSQL("INSERT into " + TEST_TABLE + " values(10, 999);"); - String sql = "select * from " + TEST_TABLE; - Cursor c = mDatabase.rawQuery(sql, null); - // should have 1 row in the table - assertEquals(1, c.getCount()); - mDatabase.execSQL("BEGIN transaction"); - try { - mDatabase.execSQL("INSERT into " + TEST_TABLE + " values(100, 9909);"); - assertEquals(2, DatabaseUtils.longForQuery(mDatabase, - "select count(*) from " + TEST_TABLE, null)); - // requery on the previously opened cursor - // cursor should now use the main database connection and see 2 rows - c.requery(); - assertEquals(2, c.getCount()); - } finally { - mDatabase.execSQL("commit;"); - } - c.close(); - - // do the same test but now do the requery in a separate thread. - createTableAndClearCache(); - mDatabase.execSQL("INSERT into " + TEST_TABLE + " values(10, 999);"); - final Cursor c1 = mDatabase.rawQuery("select count(*) from " + TEST_TABLE, null); - // should have 1 row in the table - assertEquals(1, c1.getCount()); - mDatabase.execSQL("BEGIN transaction"); - try { - mDatabase.execSQL("INSERT into " + TEST_TABLE + " values(100, 9909);"); - assertEquals(2, DatabaseUtils.longForQuery(mDatabase, - "select count(*) from " + TEST_TABLE, null)); - // query in a different thread. but since the transaction is started using - // execSQ() instead of beginTransaction(), cursor's query is considered part of - // the same transaction - and hence it should see the above inserted row - Thread t = new Thread() { - @Override public void run() { - c1.requery(); - assertEquals(1, c1.getCount()); - } - }; - t.start(); - t.join(); - // should be 2 rows now - including the the row inserted above - } finally { - mDatabase.execSQL("commit"); - } - c1.close(); - } - - /** - * This test is same as {@link #testTransactionAndWalInterplay2()} except the following: - * instead of committing the data, do rollback and make sure the data seen by the query - * within the transaction is now gone. - */ - @SmallTest - public void testTransactionAndWalInterplay3() { - createTableAndClearCache(); - mDatabase.execSQL("INSERT into " + TEST_TABLE + " values(10, 999);"); - String sql = "select * from " + TEST_TABLE; - Cursor c = mDatabase.rawQuery(sql, null); - // should have 1 row in the table - assertEquals(1, c.getCount()); - mDatabase.execSQL("BEGIN transaction"); - try { - mDatabase.execSQL("INSERT into " + TEST_TABLE + " values(100, 9909);"); - assertEquals(2, DatabaseUtils.longForQuery(mDatabase, - "select count(*) from " + TEST_TABLE, null)); - // requery on the previously opened cursor - // cursor should now use the main database connection and see 2 rows - c.requery(); - assertEquals(2, c.getCount()); - } finally { - // rollback the change - mDatabase.execSQL("rollback;"); - } - // since the change is rolled back, do the same query again and should now find only 1 row - c.requery(); - assertEquals(1, c.getCount()); - assertEquals(1, DatabaseUtils.longForQuery(mDatabase, - "select count(*) from " + TEST_TABLE, null)); - c.close(); - } - - @SmallTest - public void testAttachDb() { - String newDb = "/sdcard/mydata.db"; - File f = new File(newDb); - if (f.exists()) { - f.delete(); - } - assertFalse(f.exists()); - SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(newDb, null); - db.execSQL("create table test1 (i int);"); - db.execSQL("insert into test1 values(1);"); - db.execSQL("insert into test1 values(11);"); - Cursor c = null; - try { - c = db.rawQuery("select * from test1", null); - int count = c.getCount(); - Log.i(TAG, "count: " + count); - assertEquals(2, count); - } finally { - c.close(); - db.close(); - c = null; - } - - mDatabase.execSQL("attach database ? as newDb" , new String[]{newDb}); - Cursor c1 = null; - try { - c1 = mDatabase.rawQuery("select * from newDb.test1", null); - assertEquals(2, c1.getCount()); - } catch (Exception e) { - fail("unexpected exception: " + e.getMessage()); - } finally { - if (c1 != null) { - c1.close(); - } - } - List<Pair<String, String>> dbs = mDatabase.getAttachedDbs(); - for (Pair<String, String> p: dbs) { - Log.i(TAG, "attached dbs: " + p.first + " : " + p.second); - } - assertEquals(2, dbs.size()); - } - - /** - * http://b/issue?id=2943028 - * SQLiteOpenHelper maintains a Singleton even if it is in bad state. - */ - @SmallTest - public void testCloseAndReopen() { - mDatabase.close(); - TestOpenHelper helper = new TestOpenHelper(getContext(), DB_NAME, null, - CURRENT_DATABASE_VERSION, new DefaultDatabaseErrorHandler()); - mDatabase = helper.getWritableDatabase(); - createTableAndClearCache(); - mDatabase.execSQL("INSERT into " + TEST_TABLE + " values(10, 999);"); - Cursor c = mDatabase.query(TEST_TABLE, new String[]{"i", "j"}, null, null, null, null, null); - assertEquals(1, c.getCount()); - c.close(); - mDatabase.close(); - assertFalse(mDatabase.isOpen()); - mDatabase = helper.getReadableDatabase(); - assertTrue(mDatabase.isOpen()); - c = mDatabase.query(TEST_TABLE, new String[]{"i", "j"}, null, null, null, null, null); - assertEquals(1, c.getCount()); - c.close(); - } - private class TestOpenHelper extends SQLiteOpenHelper { - public TestOpenHelper(Context context, String name, CursorFactory factory, int version, - DatabaseErrorHandler errorHandler) { - super(context, name, factory, version, errorHandler); - } - @Override public void onCreate(SQLiteDatabase db) {} - @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} - } -} diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteStatementTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteStatementTest.java deleted file mode 100644 index 955336af19aa..000000000000 --- a/core/tests/coretests/src/android/database/sqlite/SQLiteStatementTest.java +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT 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.database.sqlite; - -import android.content.Context; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.SmallTest; - -import java.io.File; -import java.util.Random; -import java.util.concurrent.locks.ReentrantLock; - -public class SQLiteStatementTest extends AndroidTestCase { - private SQLiteDatabase mDatabase; - private File mDatabaseFile; - - @Override - protected void setUp() throws Exception { - super.setUp(); - - File dbDir = getContext().getDir(this.getClass().getName(), Context.MODE_PRIVATE); - mDatabaseFile = new File(dbDir, "database_test.db"); - if (mDatabaseFile.exists()) { - mDatabaseFile.delete(); - } - mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null); - assertNotNull(mDatabase); - } - - @Override - protected void tearDown() throws Exception { - mDatabase.close(); - mDatabaseFile.delete(); - super.tearDown(); - } - - /** - * Start 2 threads to repeatedly execute the above SQL statement. - * Even though 2 threads are executing the same SQL, they each should get their own copy of - * prepared SQL statement id and there SHOULD NOT be an error from sqlite or android. - * @throws InterruptedException thrown if the test threads started by this test are interrupted - */ - @LargeTest - public void testUseOfSameSqlStatementBy2Threads() throws InterruptedException { - mDatabase.execSQL("CREATE TABLE test_pstmt (i INTEGER PRIMARY KEY, j text);"); - final String stmt = "SELECT * FROM test_pstmt WHERE i = ?"; - class RunStmtThread extends Thread { - @Override public void run() { - // do it enough times to make sure there are no corner cases going untested - for (int i = 0; i < 1000; i++) { - SQLiteStatement s1 = mDatabase.compileStatement(stmt); - s1.bindLong(1, i); - s1.execute(); - s1.close(); - } - } - } - RunStmtThread t1 = new RunStmtThread(); - t1.start(); - RunStmtThread t2 = new RunStmtThread(); - t2.start(); - while (t1.isAlive() || t2.isAlive()) { - Thread.sleep(10); - } - } - - /** - * A simple test: start 2 threads to repeatedly execute the same {@link SQLiteStatement}. - * The 2 threads take turns to use the {@link SQLiteStatement}; i.e., it is NOT in use - * by both the threads at the same time. - * - * @throws InterruptedException thrown if the test threads started by this test are interrupted - */ - @LargeTest - public void testUseOfSameSqliteStatementBy2Threads() throws InterruptedException { - mDatabase.execSQL("CREATE TABLE test_pstmt (i INTEGER PRIMARY KEY, j text);"); - final String stmt = "SELECT * FROM test_pstmt WHERE i = ?"; - final SQLiteStatement s1 = mDatabase.compileStatement(stmt); - class RunStmtThread extends Thread { - @Override public void run() { - // do it enough times to make sure there are no corner cases going untested - for (int i = 0; i < 1000; i++) { - lock(); - try { - s1.bindLong(1, i); - s1.execute(); - } finally { - unlock(); - } - Thread.yield(); - } - } - } - RunStmtThread t1 = new RunStmtThread(); - t1.start(); - RunStmtThread t2 = new RunStmtThread(); - t2.start(); - while (t1.isAlive() || t2.isAlive()) { - Thread.sleep(10); - } - } - /** Synchronize on this when accessing the SqliteStatemet in the above */ - private final ReentrantLock mLock = new ReentrantLock(true); - private void lock() { - mLock.lock(); - } - private void unlock() { - mLock.unlock(); - } - - /** - * Tests the following: a {@link SQLiteStatement} object should not refer to a - * pre-compiled SQL statement id except in during the period of binding the arguments - * and executing the SQL statement. - */ - @LargeTest - public void testReferenceToPrecompiledStatementId() { - mDatabase.execSQL("create table t (i int, j text);"); - verifyReferenceToPrecompiledStatementId(false); - verifyReferenceToPrecompiledStatementId(true); - - // a small stress test to make sure there are no side effects of - // the acquire & release of pre-compiled statement id by SQLiteStatement object. - for (int i = 0; i < 100; i++) { - verifyReferenceToPrecompiledStatementId(false); - verifyReferenceToPrecompiledStatementId(true); - } - } - - @SuppressWarnings("deprecation") - private void verifyReferenceToPrecompiledStatementId(boolean wal) { - if (wal) { - mDatabase.enableWriteAheadLogging(); - } else { - mDatabase.disableWriteAheadLogging(); - } - // test with INSERT statement - doesn't use connection pool, if WAL is set - SQLiteStatement stmt = mDatabase.compileStatement("insert into t values(?,?);"); - assertEquals(mDatabase.mNativeHandle, stmt.nHandle); - assertEquals(mDatabase, stmt.mDatabase); - // sql statement should not be compiled yet - assertEquals(0, stmt.nStatement); - assertEquals(0, stmt.getSqlStatementId()); - int colValue = new Random().nextInt(); - stmt.bindLong(1, colValue); - // verify that the sql statement is still not compiled - assertEquals(0, stmt.getSqlStatementId()); - // should still be using the mDatabase connection - verify - assertEquals(mDatabase.mNativeHandle, stmt.nHandle); - assertEquals(mDatabase, stmt.mDatabase); - stmt.bindString(2, "blah" + colValue); - // verify that the sql statement is still not compiled - assertEquals(0, stmt.getSqlStatementId()); - assertEquals(mDatabase.mNativeHandle, stmt.nHandle); - assertEquals(mDatabase, stmt.mDatabase); - stmt.executeInsert(); - // now that the statement is executed, pre-compiled statement should be released - assertEquals(0, stmt.nStatement); - assertEquals(0, stmt.getSqlStatementId()); - assertEquals(mDatabase.mNativeHandle, stmt.nHandle); - assertEquals(mDatabase, stmt.mDatabase); - stmt.close(); - // pre-compiled SQL statement should still remain released from this object - assertEquals(0, stmt.nStatement); - assertEquals(0, stmt.getSqlStatementId()); - // but the database handle should still be the same - assertEquals(mDatabase, stmt.mDatabase); - - // test with a SELECT statement - uses connection pool if WAL is set - stmt = mDatabase.compileStatement("select i from t where j=?;"); - // sql statement should not be compiled yet - assertEquals(0, stmt.nStatement); - assertEquals(0, stmt.getSqlStatementId()); - assertEquals(mDatabase.mNativeHandle, stmt.nHandle); - assertEquals(mDatabase, stmt.mDatabase); - stmt.bindString(1, "blah" + colValue); - // verify that the sql statement is still not compiled - assertEquals(0, stmt.nStatement); - assertEquals(0, stmt.getSqlStatementId()); - assertEquals(mDatabase.mNativeHandle, stmt.nHandle); - assertEquals(mDatabase, stmt.mDatabase); - // execute the statement - Long l = stmt.simpleQueryForLong(); - assertEquals(colValue, l.intValue()); - // now that the statement is executed, pre-compiled statement should be released - assertEquals(0, stmt.nStatement); - assertEquals(0, stmt.getSqlStatementId()); - assertEquals(mDatabase.mNativeHandle, stmt.nHandle); - assertEquals(mDatabase, stmt.mDatabase); - stmt.close(); - // pre-compiled SQL statement should still remain released from this object - assertEquals(0, stmt.nStatement); - assertEquals(0, stmt.getSqlStatementId()); - // but the database handle should still remain attached to the statement - assertEquals(mDatabase.mNativeHandle, stmt.nHandle); - assertEquals(mDatabase, stmt.mDatabase); - } -} diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteUnfinalizedExceptionTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteUnfinalizedExceptionTest.java deleted file mode 100644 index cd2005dd16ff..000000000000 --- a/core/tests/coretests/src/android/database/sqlite/SQLiteUnfinalizedExceptionTest.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * 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.database.sqlite; - -import android.content.Context; -import android.database.sqlite.SQLiteDatabaseTest.ClassToTestSqlCompilationAndCaching; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; - -import java.io.File; - -public class SQLiteUnfinalizedExceptionTest extends AndroidTestCase { - private SQLiteDatabase mDatabase; - private File mDatabaseFile; - private static final String TABLE_NAME = "testCursor"; - @Override - protected void setUp() throws Exception { - super.setUp(); - - File dbDir = getContext().getDir(this.getClass().getName(), Context.MODE_PRIVATE); - mDatabaseFile = new File(dbDir, "UnfinalizedExceptionTest.db"); - if (mDatabaseFile.exists()) { - mDatabaseFile.delete(); - } - mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null); - assertNotNull(mDatabase); - } - - @Override - protected void tearDown() throws Exception { - mDatabase.close(); - mDatabaseFile.delete(); - super.tearDown(); - } - - @SmallTest - public void testUnfinalizedExceptionNotExcpected() { - mDatabase.execSQL("CREATE TABLE " + TABLE_NAME + " (i int, j int);"); - // the above statement should be in SQLiteDatabase.mPrograms - // and should automatically be finalized when database is closed - mDatabase.lock(); - try { - mDatabase.closeDatabase(); - } finally { - mDatabase.unlock(); - } - } - - @SmallTest - public void testUnfinalizedException() { - mDatabase.execSQL("CREATE TABLE " + TABLE_NAME + " (i int, j int);"); - mDatabase.lock(); - mDatabase.closePendingStatements(); // clears the above from finalizer queue in mdatabase - mDatabase.unlock(); - ClassToTestSqlCompilationAndCaching.create(mDatabase, "select * from " + TABLE_NAME); - // since the above is NOT closed, closing database should fail - mDatabase.lock(); - try { - mDatabase.closeDatabase(); - fail("exception expected"); - } catch (SQLiteUnfinalizedObjectsException e) { - // expected - } finally { - mDatabase.unlock(); - } - } -} diff --git a/core/tests/coretests/src/com/android/internal/util/FileRotatorTest.java b/core/tests/coretests/src/com/android/internal/util/FileRotatorTest.java new file mode 100644 index 000000000000..94d1cb6b5b89 --- /dev/null +++ b/core/tests/coretests/src/com/android/internal/util/FileRotatorTest.java @@ -0,0 +1,428 @@ +/* + * Copyright (C) 2012 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.util; + +import static android.text.format.DateUtils.DAY_IN_MILLIS; +import static android.text.format.DateUtils.HOUR_IN_MILLIS; +import static android.text.format.DateUtils.MINUTE_IN_MILLIS; +import static android.text.format.DateUtils.SECOND_IN_MILLIS; +import static android.text.format.DateUtils.WEEK_IN_MILLIS; +import static android.text.format.DateUtils.YEAR_IN_MILLIS; + +import android.test.AndroidTestCase; +import android.test.suitebuilder.annotation.Suppress; +import android.util.Log; + +import com.android.internal.util.FileRotator.Reader; +import com.android.internal.util.FileRotator.Writer; +import com.google.android.collect.Lists; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.ProtocolException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Random; + +import libcore.io.IoUtils; + +/** + * Tests for {@link FileRotator}. + */ +public class FileRotatorTest extends AndroidTestCase { + private static final String TAG = "FileRotatorTest"; + + private File mBasePath; + + private static final String PREFIX = "rotator"; + private static final String ANOTHER_PREFIX = "another_rotator"; + + private static final long TEST_TIME = 1300000000000L; + + // TODO: test throwing rolls back correctly + + @Override + protected void setUp() throws Exception { + super.setUp(); + + mBasePath = getContext().getFilesDir(); + IoUtils.deleteContents(mBasePath); + } + + public void testEmpty() throws Exception { + final FileRotator rotate1 = new FileRotator( + mBasePath, PREFIX, DAY_IN_MILLIS, WEEK_IN_MILLIS); + final FileRotator rotate2 = new FileRotator( + mBasePath, ANOTHER_PREFIX, DAY_IN_MILLIS, WEEK_IN_MILLIS); + + final RecordingReader reader = new RecordingReader(); + long currentTime = TEST_TIME; + + // write single new value + rotate1.combineActive(reader, writer("foo"), currentTime); + reader.assertRead(); + + // assert that one rotator doesn't leak into another + assertReadAll(rotate1, "foo"); + assertReadAll(rotate2); + } + + public void testCombine() throws Exception { + final FileRotator rotate = new FileRotator( + mBasePath, PREFIX, DAY_IN_MILLIS, WEEK_IN_MILLIS); + + final RecordingReader reader = new RecordingReader(); + long currentTime = TEST_TIME; + + // first combine should have empty read, but still write data. + rotate.combineActive(reader, writer("foo"), currentTime); + reader.assertRead(); + assertReadAll(rotate, "foo"); + + // second combine should replace contents; should read existing data, + // and write final data to disk. + currentTime += SECOND_IN_MILLIS; + reader.reset(); + rotate.combineActive(reader, writer("bar"), currentTime); + reader.assertRead("foo"); + assertReadAll(rotate, "bar"); + } + + public void testRotate() throws Exception { + final FileRotator rotate = new FileRotator( + mBasePath, PREFIX, DAY_IN_MILLIS, WEEK_IN_MILLIS); + + final RecordingReader reader = new RecordingReader(); + long currentTime = TEST_TIME; + + // combine first record into file + rotate.combineActive(reader, writer("foo"), currentTime); + reader.assertRead(); + assertReadAll(rotate, "foo"); + + // push time a few minutes forward; shouldn't rotate file + reader.reset(); + currentTime += MINUTE_IN_MILLIS; + rotate.combineActive(reader, writer("bar"), currentTime); + reader.assertRead("foo"); + assertReadAll(rotate, "bar"); + + // push time forward enough to rotate file; should still have same data + currentTime += DAY_IN_MILLIS + SECOND_IN_MILLIS; + rotate.maybeRotate(currentTime); + assertReadAll(rotate, "bar"); + + // combine a second time, should leave rotated value untouched, and + // active file should be empty. + reader.reset(); + rotate.combineActive(reader, writer("baz"), currentTime); + reader.assertRead(); + assertReadAll(rotate, "bar", "baz"); + } + + public void testDelete() throws Exception { + final FileRotator rotate = new FileRotator( + mBasePath, PREFIX, MINUTE_IN_MILLIS, DAY_IN_MILLIS); + + final RecordingReader reader = new RecordingReader(); + long currentTime = TEST_TIME; + + // create first record and trigger rotating it + rotate.combineActive(reader, writer("foo"), currentTime); + reader.assertRead(); + currentTime += MINUTE_IN_MILLIS + SECOND_IN_MILLIS; + rotate.maybeRotate(currentTime); + + // create second record + reader.reset(); + rotate.combineActive(reader, writer("bar"), currentTime); + reader.assertRead(); + assertReadAll(rotate, "foo", "bar"); + + // push time far enough to expire first record + currentTime = TEST_TIME + DAY_IN_MILLIS + (2 * MINUTE_IN_MILLIS); + rotate.maybeRotate(currentTime); + assertReadAll(rotate, "bar"); + + // push further to delete second record + currentTime += WEEK_IN_MILLIS; + rotate.maybeRotate(currentTime); + assertReadAll(rotate); + } + + public void testThrowRestoresBackup() throws Exception { + final FileRotator rotate = new FileRotator( + mBasePath, PREFIX, MINUTE_IN_MILLIS, DAY_IN_MILLIS); + + final RecordingReader reader = new RecordingReader(); + long currentTime = TEST_TIME; + + // first, write some valid data + rotate.combineActive(reader, writer("foo"), currentTime); + reader.assertRead(); + assertReadAll(rotate, "foo"); + + try { + // now, try writing which will throw + reader.reset(); + rotate.combineActive(reader, new Writer() { + public void write(OutputStream out) throws IOException { + new DataOutputStream(out).writeUTF("bar"); + throw new ProtocolException("yikes"); + } + }, currentTime); + + fail("woah, somehow able to write exception"); + } catch (ProtocolException e) { + // expected from above + } + + // assert that we read original data, and that it's still intact after + // the failed write above. + reader.assertRead("foo"); + assertReadAll(rotate, "foo"); + } + + public void testOtherFilesAndMalformed() throws Exception { + final FileRotator rotate = new FileRotator( + mBasePath, PREFIX, SECOND_IN_MILLIS, SECOND_IN_MILLIS); + + // should ignore another prefix + touch("another_rotator.1024"); + touch("another_rotator.1024-2048"); + assertReadAll(rotate); + + // verify that broken filenames don't crash + touch("rotator"); + touch("rotator..."); + touch("rotator.-"); + touch("rotator.---"); + touch("rotator.a-b"); + touch("rotator_but_not_actually"); + assertReadAll(rotate); + + // and make sure that we can read something from a legit file + write("rotator.100-200", "meow"); + assertReadAll(rotate, "meow"); + } + + private static final String RED = "red"; + private static final String GREEN = "green"; + private static final String BLUE = "blue"; + private static final String YELLOW = "yellow"; + + public void testQueryMatch() throws Exception { + final FileRotator rotate = new FileRotator( + mBasePath, PREFIX, HOUR_IN_MILLIS, YEAR_IN_MILLIS); + + final RecordingReader reader = new RecordingReader(); + long currentTime = TEST_TIME; + + // rotate a bunch of historical data + rotate.maybeRotate(currentTime); + rotate.combineActive(reader, writer(RED), currentTime); + + currentTime += DAY_IN_MILLIS; + rotate.maybeRotate(currentTime); + rotate.combineActive(reader, writer(GREEN), currentTime); + + currentTime += DAY_IN_MILLIS; + rotate.maybeRotate(currentTime); + rotate.combineActive(reader, writer(BLUE), currentTime); + + currentTime += DAY_IN_MILLIS; + rotate.maybeRotate(currentTime); + rotate.combineActive(reader, writer(YELLOW), currentTime); + + final String[] FULL_SET = { RED, GREEN, BLUE, YELLOW }; + + assertReadAll(rotate, FULL_SET); + assertReadMatching(rotate, Long.MIN_VALUE, Long.MAX_VALUE, FULL_SET); + assertReadMatching(rotate, Long.MIN_VALUE, currentTime, FULL_SET); + assertReadMatching(rotate, TEST_TIME + SECOND_IN_MILLIS, currentTime, FULL_SET); + + // should omit last value, since it only touches at currentTime + assertReadMatching(rotate, TEST_TIME + SECOND_IN_MILLIS, currentTime - SECOND_IN_MILLIS, + RED, GREEN, BLUE); + + // check boundary condition + assertReadMatching(rotate, TEST_TIME + DAY_IN_MILLIS, Long.MAX_VALUE, FULL_SET); + assertReadMatching(rotate, TEST_TIME + DAY_IN_MILLIS + SECOND_IN_MILLIS, Long.MAX_VALUE, + GREEN, BLUE, YELLOW); + + // test range smaller than file + final long blueStart = TEST_TIME + (DAY_IN_MILLIS * 2); + final long blueEnd = TEST_TIME + (DAY_IN_MILLIS * 3); + assertReadMatching(rotate, blueStart + SECOND_IN_MILLIS, blueEnd - SECOND_IN_MILLIS, BLUE); + + // outside range should return nothing + assertReadMatching(rotate, Long.MIN_VALUE, TEST_TIME - DAY_IN_MILLIS); + } + + public void testClockRollingBackwards() throws Exception { + final FileRotator rotate = new FileRotator( + mBasePath, PREFIX, DAY_IN_MILLIS, YEAR_IN_MILLIS); + + final RecordingReader reader = new RecordingReader(); + long currentTime = TEST_TIME; + + // create record at current time + // --> foo + rotate.combineActive(reader, writer("foo"), currentTime); + reader.assertRead(); + assertReadAll(rotate, "foo"); + + // record a day in past; should create a new active file + // --> bar + currentTime -= DAY_IN_MILLIS; + reader.reset(); + rotate.combineActive(reader, writer("bar"), currentTime); + reader.assertRead(); + assertReadAll(rotate, "bar", "foo"); + + // verify that we rewrite current active file + // bar --> baz + currentTime += SECOND_IN_MILLIS; + reader.reset(); + rotate.combineActive(reader, writer("baz"), currentTime); + reader.assertRead("bar"); + assertReadAll(rotate, "baz", "foo"); + + // return to present and verify we write oldest active file + // baz --> meow + currentTime = TEST_TIME + SECOND_IN_MILLIS; + reader.reset(); + rotate.combineActive(reader, writer("meow"), currentTime); + reader.assertRead("baz"); + assertReadAll(rotate, "meow", "foo"); + + // current time should trigger rotate of older active file + rotate.maybeRotate(currentTime); + + // write active file, verify this time we touch original + // foo --> yay + reader.reset(); + rotate.combineActive(reader, writer("yay"), currentTime); + reader.assertRead("foo"); + assertReadAll(rotate, "meow", "yay"); + } + + @Suppress + public void testFuzz() throws Exception { + final FileRotator rotate = new FileRotator( + mBasePath, PREFIX, HOUR_IN_MILLIS, DAY_IN_MILLIS); + + final RecordingReader reader = new RecordingReader(); + long currentTime = TEST_TIME; + + // walk forward through time, ensuring that files are cleaned properly + final Random random = new Random(); + for (int i = 0; i < 1024; i++) { + currentTime += Math.abs(random.nextLong()) % DAY_IN_MILLIS; + + reader.reset(); + rotate.combineActive(reader, writer("meow"), currentTime); + + if (random.nextBoolean()) { + rotate.maybeRotate(currentTime); + } + } + + rotate.maybeRotate(currentTime); + + Log.d(TAG, "currentTime=" + currentTime); + Log.d(TAG, Arrays.toString(mBasePath.list())); + } + + public void testRecoverAtomic() throws Exception { + write("rotator.1024-2048", "foo"); + write("rotator.1024-2048.backup", "bar"); + write("rotator.2048-4096", "baz"); + write("rotator.2048-4096.no_backup", ""); + + final FileRotator rotate = new FileRotator( + mBasePath, PREFIX, SECOND_IN_MILLIS, SECOND_IN_MILLIS); + + // verify backup value was recovered; no_backup indicates that + // corresponding file had no backup and should be discarded. + assertReadAll(rotate, "bar"); + } + + private void touch(String... names) throws IOException { + for (String name : names) { + final OutputStream out = new FileOutputStream(new File(mBasePath, name)); + out.close(); + } + } + + private void write(String name, String value) throws IOException { + final DataOutputStream out = new DataOutputStream( + new FileOutputStream(new File(mBasePath, name))); + out.writeUTF(value); + out.close(); + } + + private static Writer writer(final String value) { + return new Writer() { + public void write(OutputStream out) throws IOException { + new DataOutputStream(out).writeUTF(value); + } + }; + } + + private static void assertReadAll(FileRotator rotate, String... expected) throws IOException { + assertReadMatching(rotate, Long.MIN_VALUE, Long.MAX_VALUE, expected); + } + + private static void assertReadMatching( + FileRotator rotate, long matchStartMillis, long matchEndMillis, String... expected) + throws IOException { + final RecordingReader reader = new RecordingReader(); + rotate.readMatching(reader, matchStartMillis, matchEndMillis); + reader.assertRead(expected); + } + + private static class RecordingReader implements Reader { + private ArrayList<String> mActual = Lists.newArrayList(); + + public void read(InputStream in) throws IOException { + mActual.add(new DataInputStream(in).readUTF()); + } + + public void reset() { + mActual.clear(); + } + + public void assertRead(String... expected) { + assertEquals(expected.length, mActual.size()); + + final ArrayList<String> actualCopy = new ArrayList<String>(mActual); + for (String value : expected) { + if (!actualCopy.remove(value)) { + final String expectedString = Arrays.toString(expected); + final String actualString = Arrays.toString(mActual.toArray()); + fail("expected: " + expectedString + " but was: " + actualString); + } + } + } + } +} diff --git a/data/fonts/DroidSansFallback.ttf b/data/fonts/DroidSansFallback.ttf Binary files differindex 391755e8a969..2379b2d758a1 100644 --- a/data/fonts/DroidSansFallback.ttf +++ b/data/fonts/DroidSansFallback.ttf diff --git a/data/fonts/DroidSansFallbackFull.ttf b/data/fonts/DroidSansFallbackFull.ttf Binary files differindex 8bd5e6333216..41b015d5a052 100644 --- a/data/fonts/DroidSansFallbackFull.ttf +++ b/data/fonts/DroidSansFallbackFull.ttf diff --git a/data/fonts/Roboto-Bold.ttf b/data/fonts/Roboto-Bold.ttf Binary files differindex 6d32fba7eef3..40ecd14e9162 100644 --- a/data/fonts/Roboto-Bold.ttf +++ b/data/fonts/Roboto-Bold.ttf diff --git a/data/fonts/Roboto-BoldItalic.ttf b/data/fonts/Roboto-BoldItalic.ttf Binary files differindex fc2da4c4039a..d9067c54aa72 100644 --- a/data/fonts/Roboto-BoldItalic.ttf +++ b/data/fonts/Roboto-BoldItalic.ttf diff --git a/data/fonts/Roboto-Italic.ttf b/data/fonts/Roboto-Italic.ttf Binary files differindex ce2e0724c445..88e4a5b9ab3c 100644 --- a/data/fonts/Roboto-Italic.ttf +++ b/data/fonts/Roboto-Italic.ttf diff --git a/data/fonts/Roboto-Regular.ttf b/data/fonts/Roboto-Regular.ttf Binary files differindex 465dfc19dd25..f592adf3d12c 100644 --- a/data/fonts/Roboto-Regular.ttf +++ b/data/fonts/Roboto-Regular.ttf diff --git a/docs/html/design/static/default.css b/docs/html/design/static/default.css index 20fefad3bd11..42ab52734862 100644 --- a/docs/html/design/static/default.css +++ b/docs/html/design/static/default.css @@ -279,8 +279,7 @@ video.with-shadow { background: rgba(0, 0, 0, 0.03); } #nav #back-dac-section { padding: 10px; - border-top: 1px solid #ddd; - background: transparent url(open_new_page.png) no-repeat scroll 139px 9px; } + border-top: 1px solid #ddd; } #nav #back-dac-section a { color: #333333; font-weight: 500; @@ -569,4 +568,4 @@ li.no-bullet { height: 12px; margin-right: 8px; } .video-instructions:after { - content: 'Click or move mouse over screenshot to replay movie.'; } + content: 'Click to replay movie.'; } diff --git a/docs/html/design/static/default.js b/docs/html/design/static/default.js index 26848e64d78c..6721ab81e3a9 100644 --- a/docs/html/design/static/default.js +++ b/docs/html/design/static/default.js @@ -125,7 +125,8 @@ $(document).ready(function() { }); // Set up play-on-hover <video> tags. - $('video.play-on-hover').bind('mouseenter click', function(){ + $('video.play-on-hover').bind('click', function(){ + $(this).get(0).load(); // in case the video isn't seekable $(this).get(0).play(); }); diff --git a/docs/html/guide/appendix/market-filters.jd b/docs/html/guide/appendix/market-filters.jd index 6610f5fe0949..07b9370d6740 100644 --- a/docs/html/guide/appendix/market-filters.jd +++ b/docs/html/guide/appendix/market-filters.jd @@ -398,8 +398,8 @@ country (as determined by SIM carrier) in which paid apps are available.</p></td the device's SIM (for GSM devices), not the current roaming carrier.</p></li></ul> </td> </tr> <tr> <td valign="top">Native Platform</td> <td valign="top"><p>An application that includes native - libraries that target a specific platform (ARM EABI v7, for example) will only be - visible on devices that support that platform. For details about the NDK and using + libraries that target a specific platform (ARM EABI v7 or x86, for example) are + visible only on devices that support that platform. For details about the NDK and using native libraries, see <a href="{@docRoot}sdk/ndk/index.html#overview">What is the Android NDK?</a></p> </tr> <tr> <td valign="top">Copy-Protected Applications</td> <td valign="top"><p>To diff --git a/docs/html/guide/practices/ui_guidelines/activity_task_design.jd b/docs/html/guide/practices/ui_guidelines/activity_task_design.jd index 31ad466dc0b3..5faa7ece8502 100644 --- a/docs/html/guide/practices/ui_guidelines/activity_task_design.jd +++ b/docs/html/guide/practices/ui_guidelines/activity_task_design.jd @@ -40,7 +40,7 @@ parent.link=index.html <li><a href=#reusing_tip>Handle case where no activity matches</a></li> <li><a href=#activity_launching_tip>Consider how to launch your activities</a></li> <li><a href=#activities_added_to_task_tip>Allow activities to add to current task</a></li> - <li><a href=#notifications_get_back_tip>Notifications should let user easily get back</li> + <li><a href=#notifications_get_back_tip>Notifications and App Widgets should provide consistent back behavior</li> <li><a href=#use_notification_tip>Use the notification system</a></li> <li><a href=#taking_over_back_key>Don't take over BACK key unless you absolutely need to</a></li> </ol> @@ -1063,110 +1063,23 @@ MAIN and </p> -<h3 id="notifications_get_back_tip">Notifications should let the user easily get back to the previous activity</h3> +<h3 id="notifications_get_back_tip">Notifications and App Widgets should provide consistent back behavior</h3> <p> - Applications that are in the background or not running can have - services that send out notifications to the user letting them know about - events of interest. Two examples are Calendar, which can send out notifications of - upcoming events, and Email, which can send out notifications when new - messages arrive. One of the user interface guidelines is that when the - user is in activity A, gets a notification for activity B and - picks that notification, when they press the BACK key, they should - go back to activity A. + Notifications and app widgets are two common ways that a user can launch + your app through something besides its main icon in Launcher. You must + take care when implementing these so that the user has a consistent experience + with the back button, not causing surprises in where they return to or the + state the application ends up in. </p> <p> - The following scenario shows how the activity stack should work - when the user responds to a notification. -</p> - -<ol> - <li> - User is creating a new event in Calendar. They realize they - need to copy part of an email message into this event - </li> - <li> - The user chooses Home > Gmail - </li> - <li> - While in Gmail, they receive a notification from Calendar for an upcoming meeting - </li> - <li> - So they choose that notification, which takes them to a - dedicated Calendar activity that displays brief details of the - upcoming meeting - </li> - <li> - The user chooses this short notice to view further details - </li> - <li> - When done viewing the event, the user presses the BACK - key. They should be taken to Gmail, which is where they were - when they took the notification - </li> -</ol> - -<p> -This behavior doesn't necessarily happen by default. -</p> - -<p> -Notifications generally happen primarily in one of two ways: -</p> - - <ul> - <li> - <b>The chosen activity is dedicated for notification only</b> - - For example, when the user receives a - Calendar notification, choosing that - notification starts a special activity that displays a list - of upcoming calendar events — this view is available only - from the notification, not through the Calendar's own user - interface. After viewing this upcoming event, to ensure that - the user pressing the BACK key will return to the activity - the user was in when they picked the notification, you would - make sure this dedicated activity does not have the same - task affinity as the Calendar or any other activity. (You do - this by setting task affinity to the empty string, which - means it has no affinity to anything.) The explanation for - this follows. - - <p> - Because of the way tasks work, if the taskAffinity of the - dedicated activity is kept as its default, then pressing the - BACK key (in step 6, above) would go to Calendar, rather - than Gmail. The reason is that, by default, all activities - in a given application have the same task - affinity. Therefore, the task affinity of the dedicated - activity matches the Calendar task, which is already running - in step 1. This means in step 4, choosing the notification - brings the existing Calendar event (in step 1) forward and - starts the dedicated activity on top of it. This is not - what you want to have happen. Setting the dedicated - activity's taskAffinity to empty string fixes this. - </p> - </li> - - <li> - <b>The chosen activity is not dedicated, but always comes to - the foreground in its initial state</b> - For example, in - response to a notification, when the Gmail application comes - to the foreground, it always presents the list of conversations. - You can ensure this happens by setting a "clear top" flag in the - intent that the notification triggers. This ensures that when the - activity is launched, it displays its initial activity, preventing - Gmail from coming to the foreground in whatever state the user last - happened to be viewing it. (To do this, you put {@link - android.content.Intent#FLAG_ACTIVITY_CLEAR_TOP - FLAG_ACTIVITY_CLEAR_TOP} in the intent you pass to startActivity()). - </li> - </ul> - -<p> - There are other ways to handle notifications, such as bringing the - activity to the foreground, set to display specific data, such as - displaying the text message thread for the person who just sent a - new text message. + The + <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#HandlingNotifications">Handling + Notifications</a> section of the developer guide's + <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Status Bar Notifications</a> + documentation provides an overview of how to write code to correctly handle + notification. This dicussion applies equally to handling interactions with + app widgets. </p> <p> diff --git a/docs/html/guide/topics/resources/providing-resources.jd b/docs/html/guide/topics/resources/providing-resources.jd index 3a176e63de28..380791a08999 100644 --- a/docs/html/guide/topics/resources/providing-resources.jd +++ b/docs/html/guide/topics/resources/providing-resources.jd @@ -231,6 +231,9 @@ for which these resources are to be used (defined in table 2).</li> </ul> <p>You can append more than one <em>{@code <qualifier>}</em>. Separate each one with a dash.</p> + <p class="caution"><strong>Caution:</strong> When appending multiple qualifiers, you must +place them in the same order in which they are listed in table 2. If the qualifiers are ordered +wrong, the resources are ignored.</p> </li> <li>Save the respective alternative resources in this new directory. The resource files must be named exactly the same as the default resource files.</li> @@ -254,20 +257,14 @@ screen density, but the filenames are exactly the same. This way, the resource ID that you use to reference the {@code icon.png} or {@code background.png} image is always the same, but Android selects the version of each resource that best matches the current device, by comparing the device -configuration information with the qualifiers in the alternative resource directory name.</p> +configuration information with the qualifiers in the resource directory name.</p> <p>Android supports several configuration qualifiers and you can add multiple qualifiers to one directory name, by separating each qualifier with a dash. Table 2 lists the valid configuration qualifiers, in order of precedence—if you use multiple -qualifiers for one resource directory, they must be added to the directory name in the order they +qualifiers for a resource directory, you must add them to the directory name in the order they are listed in the table.</p> -<p class="note"><strong>Note:</strong> Some configuration qualifiers were added after Android 1.0, -so not -all versions of Android support all the qualifiers listed in table 2. New qualifiers -indicate the version in which they were added. To avoid any issues, always include a set of default -resources for resources that your application uses. For more information, see the section about <a -href="#Compatibility">Providing the Best Device Compatibility with Resources</a>.</p> <p class="table-caption" id="table2"><strong>Table 2.</strong> Configuration qualifier names.</p> @@ -752,6 +749,17 @@ href="#KnownIssues">Known Issues</a> for more information.</p> </table> +<p class="note"><strong>Note:</strong> Some configuration qualifiers have been added since Android +1.0, so not all versions of Android support all the qualifiers. Using a new qualifier implicitly +adds the platform version qualifier so that older devices are sure to ignore it. For example, using +a <code>w600dp</code> qualifier will automatically include the <code>v13</code> qualifier, because +the available-width qualifier was new in API level 13. To avoid any issues, always include a set of +default resources (a set of resources with <em>no qualifiers</em>). For more information, see the +section about <a href="#Compatibility">Providing the Best Device Compatibility with +Resources</a>.</p> + + + <h3 id="QualifierRules">Qualifier name rules</h3> <p>Here are some rules about using configuration qualifier names:</p> diff --git a/docs/html/guide/topics/ui/notifiers/notifications.jd b/docs/html/guide/topics/ui/notifiers/notifications.jd index 71aa2fecd2d8..33b0fecc9ed5 100644 --- a/docs/html/guide/topics/ui/notifiers/notifications.jd +++ b/docs/html/guide/topics/ui/notifiers/notifications.jd @@ -16,6 +16,7 @@ user clicks it</li> <h2>In this document</h2> <ol> <li><a href="#Basics">The Basics</a></li> + <li><a href="#HandlingNotifications">Responding to Notifications</a></li> <li><a href="#ManageYourNotifications">Managing your Notifications</a></li> <li><a href="#CreateANotification">Creating a Notification</a> <ol> @@ -137,6 +138,138 @@ mNotificationManager.notify(HELLO_ID, notification); </ol> +<h2 id="HandlingNotifications">Responding to Notifications</h2> + +<p>A central part of the user's experience with a notification revolves around +how it interacts with the application's UI flow. You must implement +this correctly to provide a consistent user experience within your app.</p> + +<p>Two typical examples of notifications are provided by Calendar, which can send out +notifications of upcoming events, and Email, which can send out notifications +when new messages arrive. These represent the two recommended patterns for handling +notifications: either launching into an activity that is separate from the +main application, or launching an entirely new instance of the application +showing the appropriate point for the notification.</p> + +<p>The following scenario shows how the activity stack should work +in these two typical notification flows, first handling a Calendar notification: +</p> + +<ol> + <li>User is creating a new event in Calendar. They realize they + need to copy part of an email message into this event. + </li> + <li> + The user chooses Home > Email. + </li> + <li> + While in Email, they receive a notification from Calendar for an upcoming + meeting. + </li> + <li> + So they choose that notification, which takes them to a + dedicated Calendar activity that displays brief details of the + upcoming meeting. + </li> + <li> + The user has seen enough to know they have a meeting coming up, + so they press the BACK button. They are now returned to Email, which + is where they were when they took the notification. + </li> +</ol> + +<p>Handling an Email notification:</p> + +<ol> + <li> + The user is currently in Email composing a message, and needs to + check a date in their calendar. + </li> + <li> + The user chooses Home > Calendar. + </li> + <li> + While in Calendar, they receive a notification from Email about a new + message. + </li> + <li> + They select the notification, which brings them to Email with the message + details displayed. This has replaced what they were previously doing + (writing an e-mail), but that message is still saved in their drafts. + </li> + <li> + The user presses BACK once to go to the message list (the typical flow in the + Email app), and press BACK again to return to Calendar as they left it. + </li> +</ol> + +<p>In an Email style of notification, the UI launched by the notification +shows the main application in a state representing that notification. +For example, when the Email application comes to the foreground from its +notification, it displays either the conversion list or a specific +conversation depending on whether there are multiple or only one new +email. To achieve this, we want to completely replace whatever current +state the application is in with a new activity stack representing the +new notification state.</p> + +<p>The following code illustrates how to show this kind of notification. Of +most interest is the <code>makeMessageIntentStack()</code> method, which constructs +an array of intents representing the app's new activity stack for this state. +(If you are using fragments, you may need to initialize your fragment and +app state so that pressing BACK will switch the UI back to its parent state.) +The core of this is the {@link android.content.Intent#makeRestartActivityTask +Intent.makeRestartActivityTask()} method, which constructs the root activity +of the stack with the appropriate flags, such as +{@link android.content.Intent#FLAG_ACTIVITY_CLEAR_TASK Intent.FLAG_ACTIVITY_CLEAR_TASK}.</p> + +{@sample development/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessage.java + app_notification} + +<p>In a Calendar style of notification, the UI launched by the notification +is a dedicated activity that is not part of the normal application flow. +For example, when the user receives a Calendar notification, choosing that +notification starts a special activity that displays a list +of upcoming calendar events — this view is available only +from the notification, not through the Calendar's normal user +interface.</p> + +<p>The code for posting this type of notification is very straight-forward; it +is like the above, but the {@link android.app.PendingIntent} is for just a single +activity, our dedicated notification activity.</p> + +{@sample development/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessage.java + interstitial_notification} + +<p>This is not enough, however. Normally Android considers all activities within +an application to be part of that application's UI flow, so simply launching the +activity like this can cause it to be mixed with your normal application back stack +in undesired ways. To make it behave correctly, in the manifest declaration +for the activity the attributes +<code>android:launchMode="singleInstance"</code> and +<code>android:excludeFromRecents="true"</code> +must be set. The full activity declaration for this sample is:</p> + +{@sample development/samples/ApiDemos/AndroidManifest.xml interstitial_affinity} + +<p>Because of the use of <code>singleInstance</code>, you must be careful about launching +any other activities from this one. These activities will be launched +in their own task, and care must be taken to make sure this interacts +well with the current state of your application's task. This is essentially +the same as switching to the main application as described for the Email style +notification shown before. Given the <code>makeMessageIntentStack()</code> +method previously shown, handling a click here would look something like this:</p> + +{@sample development/samples/ApiDemos/src/com/example/android/apis/app/IncomingMessageInterstitial.java + app_launch} + +<p>If you don't want to use the <code>singleInstance</code> launch mode for +this activity, an alternative approach is to use <code>android:taskAffinity=""</code>. +This tells Android that the activity should not be treated as part of the +main application flow, so it will not get mixed together with that. All of the +other issues discussed here do still apply, though this would allow you to start +additional activities that are part of this notification task instead of switching +to and replacing the main application task.</p> + <h2 id="ManageYourNotifications">Managing your Notifications</h2> <p>The {@link android.app.NotificationManager} is a system service that manages all diff --git a/docs/html/guide/topics/usb/adk.jd b/docs/html/guide/topics/usb/adk.jd index 99c5f928ad82..4d5fbfa548f4 100644 --- a/docs/html/guide/topics/usb/adk.jd +++ b/docs/html/guide/topics/usb/adk.jd @@ -281,16 +281,17 @@ page.title=Android Open Accessory Development Kit <p>On Mac:</p> <ol type="a"> - <li>Right-click on the Arduino application in Finder and select <strong>Show Package - Contents</strong>.</li> + <li>Create, if it does not already exist, an <code>Arduino</code> + directory inside your user account's <code>Documents</code> directory, and within + that, a <code>libraries</code> directory.</li> <li>Copy the <code>firmware/arduino_libs/AndroidAccessory</code> and - <code>firmware/arduino_libs/USB_Host_Shield</code> directories (the complete directories, - not just the files within) to the <code>Contents/Resources/Java/libraries</code> directory - inside the Arduino application.</li> + <code>firmware/arduino_libs/USB_Host_Shield</code> directories (the + complete directories, not just the files within) to your + <code>Documents/Arduino/libraries/</code> directory.</li> - <li>Create a <code>CapSense</code> directory in the - <code>Contents/Resources/Java/libraries</code> directory.</li> + <li>Create a <code>CapSense</code> directory in your + <code>Documents/Arduino/libraries/</code> directory.</li> <li>Copy <code>CapSense.cpp</code> and <code>CapSense.h</code> from the unzipped CapSense download to the <code>CapSense</code> directory.</li> diff --git a/docs/html/index.jd b/docs/html/index.jd index 53c59e736376..9197b5d202a3 100644 --- a/docs/html/index.jd +++ b/docs/html/index.jd @@ -11,8 +11,10 @@ home=true </div><!-- end homeTitle --> <div id="announcement-block"> <!-- total max width is 520px --> + <a href="{@docRoot}design/index.html"> <img src="{@docRoot}images/home/android-design.png" alt="Android Design" width="160px" style="padding:10px 33px 5px"/> + </a> <div id="announcement" style="width:275px"> <p>Introducing <b>Android Design</b>: The place to learn about principles, building blocks, and patterns for creating world-class Android user interfaces. Whether you're a UI professional or a developer diff --git a/drm/common/DrmEngineBase.cpp b/drm/common/DrmEngineBase.cpp index 9b16c3685442..1c345a2a2d61 100644 --- a/drm/common/DrmEngineBase.cpp +++ b/drm/common/DrmEngineBase.cpp @@ -120,13 +120,23 @@ DrmSupportInfo* DrmEngineBase::getSupportInfo(int uniqueId) { } status_t DrmEngineBase::openDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, int fd, off64_t offset, off64_t length) { - return onOpenDecryptSession(uniqueId, decryptHandle, fd, offset, length); + int uniqueId, DecryptHandle* decryptHandle, + int fd, off64_t offset, off64_t length, const char* mime) { + + if (!mime || mime[0] == '\0') { + return onOpenDecryptSession(uniqueId, decryptHandle, fd, offset, length); + } + + return onOpenDecryptSession(uniqueId, decryptHandle, fd, offset, length, mime); } status_t DrmEngineBase::openDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, const char* uri) { - return onOpenDecryptSession(uniqueId, decryptHandle, uri); + int uniqueId, DecryptHandle* decryptHandle, + const char* uri, const char* mime) { + if (!mime || mime[0] == '\0') { + return onOpenDecryptSession(uniqueId, decryptHandle, uri); + } + return onOpenDecryptSession(uniqueId, decryptHandle, uri, mime); } status_t DrmEngineBase::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { diff --git a/drm/common/IDrmManagerService.cpp b/drm/common/IDrmManagerService.cpp index 3ed8ade720ba..43f64f22e319 100644 --- a/drm/common/IDrmManagerService.cpp +++ b/drm/common/IDrmManagerService.cpp @@ -600,7 +600,7 @@ status_t BpDrmManagerService::getAllSupportInfo( } DecryptHandle* BpDrmManagerService::openDecryptSession( - int uniqueId, int fd, off64_t offset, off64_t length) { + int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) { ALOGV("Entering BpDrmManagerService::openDecryptSession"); Parcel data, reply; @@ -609,6 +609,11 @@ DecryptHandle* BpDrmManagerService::openDecryptSession( data.writeFileDescriptor(fd); data.writeInt64(offset); data.writeInt64(length); + String8 mimeType; + if (mime) { + mimeType = mime; + } + data.writeString8(mimeType); remote()->transact(OPEN_DECRYPT_SESSION, data, &reply); @@ -620,13 +625,20 @@ DecryptHandle* BpDrmManagerService::openDecryptSession( return handle; } -DecryptHandle* BpDrmManagerService::openDecryptSession(int uniqueId, const char* uri) { - ALOGV("Entering BpDrmManagerService::openDecryptSession"); +DecryptHandle* BpDrmManagerService::openDecryptSession( + int uniqueId, const char* uri, const char* mime) { + + ALOGV("Entering BpDrmManagerService::openDecryptSession: mime=%s", mime? mime: "NULL"); Parcel data, reply; data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); data.writeInt32(uniqueId); data.writeString8(String8(uri)); + String8 mimeType; + if (mime) { + mimeType = mime; + } + data.writeString8(mimeType); remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply); @@ -1265,8 +1277,10 @@ status_t BnDrmManagerService::onTransact( const off64_t offset = data.readInt64(); const off64_t length = data.readInt64(); + const String8 mime = data.readString8(); + DecryptHandle* handle - = openDecryptSession(uniqueId, fd, offset, length); + = openDecryptSession(uniqueId, fd, offset, length, mime.string()); if (NULL != handle) { writeDecryptHandleToParcelData(handle, reply); @@ -1283,8 +1297,9 @@ status_t BnDrmManagerService::onTransact( const int uniqueId = data.readInt32(); const String8 uri = data.readString8(); + const String8 mime = data.readString8(); - DecryptHandle* handle = openDecryptSession(uniqueId, uri.string()); + DecryptHandle* handle = openDecryptSession(uniqueId, uri.string(), mime.string()); if (NULL != handle) { writeDecryptHandleToParcelData(handle, reply); diff --git a/drm/drmserver/DrmManager.cpp b/drm/drmserver/DrmManager.cpp index 3abf3d335290..999295acb734 100644 --- a/drm/drmserver/DrmManager.cpp +++ b/drm/drmserver/DrmManager.cpp @@ -426,7 +426,9 @@ status_t DrmManager::getAllSupportInfo( return DRM_NO_ERROR; } -DecryptHandle* DrmManager::openDecryptSession(int uniqueId, int fd, off64_t offset, off64_t length) { +DecryptHandle* DrmManager::openDecryptSession( + int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) { + Mutex::Autolock _l(mDecryptLock); status_t result = DRM_ERROR_CANNOT_HANDLE; Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); @@ -438,7 +440,7 @@ DecryptHandle* DrmManager::openDecryptSession(int uniqueId, int fd, off64_t offs for (unsigned int index = 0; index < plugInIdList.size(); index++) { String8 plugInId = plugInIdList.itemAt(index); IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); - result = rDrmEngine.openDecryptSession(uniqueId, handle, fd, offset, length); + result = rDrmEngine.openDecryptSession(uniqueId, handle, fd, offset, length, mime); if (DRM_NO_ERROR == result) { ++mDecryptSessionId; @@ -453,7 +455,8 @@ DecryptHandle* DrmManager::openDecryptSession(int uniqueId, int fd, off64_t offs return handle; } -DecryptHandle* DrmManager::openDecryptSession(int uniqueId, const char* uri) { +DecryptHandle* DrmManager::openDecryptSession( + int uniqueId, const char* uri, const char* mime) { Mutex::Autolock _l(mDecryptLock); status_t result = DRM_ERROR_CANNOT_HANDLE; Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); @@ -465,7 +468,7 @@ DecryptHandle* DrmManager::openDecryptSession(int uniqueId, const char* uri) { for (unsigned int index = 0; index < plugInIdList.size(); index++) { String8 plugInId = plugInIdList.itemAt(index); IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); - result = rDrmEngine.openDecryptSession(uniqueId, handle, uri); + result = rDrmEngine.openDecryptSession(uniqueId, handle, uri, mime); if (DRM_NO_ERROR == result) { ++mDecryptSessionId; diff --git a/drm/drmserver/DrmManagerService.cpp b/drm/drmserver/DrmManagerService.cpp index df17ac5d134d..caeb026ce8fc 100644 --- a/drm/drmserver/DrmManagerService.cpp +++ b/drm/drmserver/DrmManagerService.cpp @@ -208,20 +208,20 @@ status_t DrmManagerService::getAllSupportInfo( } DecryptHandle* DrmManagerService::openDecryptSession( - int uniqueId, int fd, off64_t offset, off64_t length) { + int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) { ALOGV("Entering DrmManagerService::openDecryptSession"); if (isProtectedCallAllowed()) { - return mDrmManager->openDecryptSession(uniqueId, fd, offset, length); + return mDrmManager->openDecryptSession(uniqueId, fd, offset, length, mime); } return NULL; } DecryptHandle* DrmManagerService::openDecryptSession( - int uniqueId, const char* uri) { + int uniqueId, const char* uri, const char* mime) { ALOGV("Entering DrmManagerService::openDecryptSession with uri"); if (isProtectedCallAllowed()) { - return mDrmManager->openDecryptSession(uniqueId, uri); + return mDrmManager->openDecryptSession(uniqueId, uri, mime); } return NULL; diff --git a/drm/libdrmframework/DrmManagerClient.cpp b/drm/libdrmframework/DrmManagerClient.cpp index c9c0d57961b9..8768c0834f60 100644 --- a/drm/libdrmframework/DrmManagerClient.cpp +++ b/drm/libdrmframework/DrmManagerClient.cpp @@ -116,12 +116,18 @@ status_t DrmManagerClient::getAllSupportInfo(int* length, DrmSupportInfo** drmSu return mDrmManagerClientImpl->getAllSupportInfo(mUniqueId, length, drmSupportInfoArray); } -sp<DecryptHandle> DrmManagerClient::openDecryptSession(int fd, off64_t offset, off64_t length) { - return mDrmManagerClientImpl->openDecryptSession(mUniqueId, fd, offset, length); +sp<DecryptHandle> DrmManagerClient::openDecryptSession( + int fd, off64_t offset, off64_t length, const char* mime) { + + return mDrmManagerClientImpl->openDecryptSession( + mUniqueId, fd, offset, length, mime); } -sp<DecryptHandle> DrmManagerClient::openDecryptSession(const char* uri) { - return mDrmManagerClientImpl->openDecryptSession(mUniqueId, uri); +sp<DecryptHandle> DrmManagerClient::openDecryptSession( + const char* uri, const char* mime) { + + return mDrmManagerClientImpl->openDecryptSession( + mUniqueId, uri, mime); } status_t DrmManagerClient::closeDecryptSession(sp<DecryptHandle> &decryptHandle) { diff --git a/drm/libdrmframework/DrmManagerClientImpl.cpp b/drm/libdrmframework/DrmManagerClientImpl.cpp index b222b8f03a97..fb0439ebf6fe 100644 --- a/drm/libdrmframework/DrmManagerClientImpl.cpp +++ b/drm/libdrmframework/DrmManagerClientImpl.cpp @@ -255,15 +255,19 @@ status_t DrmManagerClientImpl::getAllSupportInfo( } sp<DecryptHandle> DrmManagerClientImpl::openDecryptSession( - int uniqueId, int fd, off64_t offset, off64_t length) { - return getDrmManagerService()->openDecryptSession(uniqueId, fd, offset, length); + int uniqueId, int fd, off64_t offset, + off64_t length, const char* mime) { + + return getDrmManagerService()->openDecryptSession( + uniqueId, fd, offset, length, mime); } sp<DecryptHandle> DrmManagerClientImpl::openDecryptSession( - int uniqueId, const char* uri) { + int uniqueId, const char* uri, const char* mime) { + DecryptHandle* handle = NULL; if (NULL != uri) { - handle = getDrmManagerService()->openDecryptSession(uniqueId, uri); + handle = getDrmManagerService()->openDecryptSession(uniqueId, uri, mime); } return handle; } diff --git a/drm/libdrmframework/include/DrmManager.h b/drm/libdrmframework/include/DrmManager.h index ac2b94606576..c9167d4708f2 100644 --- a/drm/libdrmframework/include/DrmManager.h +++ b/drm/libdrmframework/include/DrmManager.h @@ -111,9 +111,10 @@ public: status_t getAllSupportInfo(int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray); - DecryptHandle* openDecryptSession(int uniqueId, int fd, off64_t offset, off64_t length); + DecryptHandle* openDecryptSession( + int uniqueId, int fd, off64_t offset, off64_t length, const char* mime); - DecryptHandle* openDecryptSession(int uniqueId, const char* uri); + DecryptHandle* openDecryptSession(int uniqueId, const char* uri, const char* mime); status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); diff --git a/drm/libdrmframework/include/DrmManagerClientImpl.h b/drm/libdrmframework/include/DrmManagerClientImpl.h index e3338d9e8679..2aa493f4ebe1 100644 --- a/drm/libdrmframework/include/DrmManagerClientImpl.h +++ b/drm/libdrmframework/include/DrmManagerClientImpl.h @@ -300,20 +300,24 @@ public: * @param[in] fd File descriptor of the protected content to be decrypted * @param[in] offset Start position of the content * @param[in] length The length of the protected content + * @param[in] mime The mime type of the protected content if it is not NULL or empty * @return * Handle for the decryption session */ - sp<DecryptHandle> openDecryptSession(int uniqueId, int fd, off64_t offset, off64_t length); + sp<DecryptHandle> openDecryptSession( + int uniqueId, int fd, off64_t offset, off64_t length, const char* mime); /** * Open the decrypt session to decrypt the given protected content * * @param[in] uniqueId Unique identifier for a session * @param[in] uri Path of the protected content to be decrypted + * @param[in] mime The mime type of the protected content if it is not NULL or empty * @return * Handle for the decryption session */ - sp<DecryptHandle> openDecryptSession(int uniqueId, const char* uri); + sp<DecryptHandle> openDecryptSession( + int uniqueId, const char* uri, const char* mime); /** * Close the decrypt session for the given handle diff --git a/drm/libdrmframework/include/DrmManagerService.h b/drm/libdrmframework/include/DrmManagerService.h index 9cb5804e6915..1a8c2ae5c994 100644 --- a/drm/libdrmframework/include/DrmManagerService.h +++ b/drm/libdrmframework/include/DrmManagerService.h @@ -98,9 +98,11 @@ public: status_t getAllSupportInfo(int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray); - DecryptHandle* openDecryptSession(int uniqueId, int fd, off64_t offset, off64_t length); + DecryptHandle* openDecryptSession( + int uniqueId, int fd, off64_t offset, off64_t length, const char *mime); - DecryptHandle* openDecryptSession(int uniqueId, const char* uri); + DecryptHandle* openDecryptSession( + int uniqueId, const char* uri, const char* mime); status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); diff --git a/drm/libdrmframework/include/IDrmManagerService.h b/drm/libdrmframework/include/IDrmManagerService.h index b9618bbc27aa..a7d21c5a6181 100644 --- a/drm/libdrmframework/include/IDrmManagerService.h +++ b/drm/libdrmframework/include/IDrmManagerService.h @@ -139,9 +139,12 @@ public: virtual status_t getAllSupportInfo( int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) = 0; - virtual DecryptHandle* openDecryptSession(int uniqueId, int fd, off64_t offset, off64_t length) = 0; + virtual DecryptHandle* openDecryptSession( + int uniqueId, int fd, off64_t offset, + off64_t length, const char* mime) = 0; - virtual DecryptHandle* openDecryptSession(int uniqueId, const char* uri) = 0; + virtual DecryptHandle* openDecryptSession( + int uniqueId, const char* uri, const char* mime) = 0; virtual status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) = 0; @@ -222,9 +225,12 @@ public: virtual status_t getAllSupportInfo( int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray); - virtual DecryptHandle* openDecryptSession(int uniqueId, int fd, off64_t offset, off64_t length); + virtual DecryptHandle* openDecryptSession( + int uniqueId, int fd, off64_t offset, off64_t length, + const char* mime); - virtual DecryptHandle* openDecryptSession(int uniqueId, const char* uri); + virtual DecryptHandle* openDecryptSession( + int uniqueId, const char* uri, const char* mime); virtual status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); diff --git a/drm/libdrmframework/plugins/common/include/DrmEngineBase.h b/drm/libdrmframework/plugins/common/include/DrmEngineBase.h index 4a5afcf42c6b..08f6e6d2ad5c 100644 --- a/drm/libdrmframework/plugins/common/include/DrmEngineBase.h +++ b/drm/libdrmframework/plugins/common/include/DrmEngineBase.h @@ -80,10 +80,12 @@ public: DrmSupportInfo* getSupportInfo(int uniqueId); status_t openDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, int fd, off64_t offset, off64_t length); + int uniqueId, DecryptHandle* decryptHandle, + int fd, off64_t offset, off64_t length, const char* mime); status_t openDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, const char* uri); + int uniqueId, DecryptHandle* decryptHandle, + const char* uri, const char* mime); status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); @@ -375,7 +377,29 @@ protected: * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success */ virtual status_t onOpenDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, int fd, off64_t offset, off64_t length) = 0; + int uniqueId, DecryptHandle* decryptHandle, + int fd, off64_t offset, off64_t length) = 0; + + /** + * Open the decrypt session to decrypt the given protected content + * + * @param[in] uniqueId Unique identifier for a session + * @param[in] decryptHandle Handle for the current decryption session + * @param[in] fd File descriptor of the protected content to be decrypted + * @param[in] offset Start position of the content + * @param[in] length The length of the protected content + * @param[in] mime Mime type of the protected content + * drm plugin may do some optimization since the mime type is known. + * @return + * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success + */ + virtual status_t onOpenDecryptSession( + int uniqueId, DecryptHandle* decryptHandle, + int fd, off64_t offset, off64_t length, + const char* mime) { + + return DRM_ERROR_CANNOT_HANDLE; + } /** * Open the decrypt session to decrypt the given protected content @@ -387,7 +411,26 @@ protected: * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success */ virtual status_t onOpenDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, const char* uri) = 0; + int uniqueId, DecryptHandle* decryptHandle, + const char* uri) = 0; + + /** + * Open the decrypt session to decrypt the given protected content + * + * @param[in] uniqueId Unique identifier for a session + * @param[in] decryptHandle Handle for the current decryption session + * @param[in] uri Path of the protected content to be decrypted + * @param[in] mime Mime type of the protected content. The corresponding + * drm plugin may do some optimization since the mime type is known. + * @return + * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success + */ + virtual status_t onOpenDecryptSession( + int uniqueId, DecryptHandle* decryptHandle, + const char* uri, const char* mime) { + + return DRM_ERROR_CANNOT_HANDLE; + } /** * Close the decrypt session for the given handle diff --git a/drm/libdrmframework/plugins/common/include/IDrmEngine.h b/drm/libdrmframework/plugins/common/include/IDrmEngine.h index 77460f6f1fba..dcf59775700b 100644 --- a/drm/libdrmframework/plugins/common/include/IDrmEngine.h +++ b/drm/libdrmframework/plugins/common/include/IDrmEngine.h @@ -320,11 +320,14 @@ public: * @param[in] fd File descriptor of the protected content to be decrypted * @param[in] offset Start position of the content * @param[in] length The length of the protected content + * @param[in] mime Mime type of the protected content if it is + * not NULL or empty * @return * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success */ virtual status_t openDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, int fd, off64_t offset, off64_t length) = 0; + int uniqueId, DecryptHandle* decryptHandle, + int fd, off64_t offset, off64_t length, const char* mime) = 0; /** * Open the decrypt session to decrypt the given protected content @@ -332,11 +335,14 @@ public: * @param[in] uniqueId Unique identifier for a session * @param[in] decryptHandle Handle for the current decryption session * @param[in] uri Path of the protected content to be decrypted + * @param[in] mime Mime type of the protected content if it is + * not NULL or empty * @return * DRM_ERROR_CANNOT_HANDLE for failure and DRM_NO_ERROR for success */ virtual status_t openDecryptSession( - int uniqueId, DecryptHandle* decryptHandle, const char* uri) = 0; + int uniqueId, DecryptHandle* decryptHandle, + const char* uri, const char* mime) = 0; /** * Close the decrypt session for the given handle diff --git a/include/drm/DrmManagerClient.h b/include/drm/DrmManagerClient.h index b8fe46d08e31..c47bbfbfdce6 100644 --- a/include/drm/DrmManagerClient.h +++ b/include/drm/DrmManagerClient.h @@ -66,19 +66,21 @@ public: * @param[in] fd File descriptor of the protected content to be decrypted * @param[in] offset Start position of the content * @param[in] length The length of the protected content + * @param[in] mime Mime type of the protected content if it is not NULL or empty * @return * Handle for the decryption session */ - sp<DecryptHandle> openDecryptSession(int fd, off64_t offset, off64_t length); + sp<DecryptHandle> openDecryptSession(int fd, off64_t offset, off64_t length, const char* mime); /** * Open the decrypt session to decrypt the given protected content * * @param[in] uri Path of the protected content to be decrypted + * @param[in] mime Mime type of the protected content if it is not NULL or empty * @return * Handle for the decryption session */ - sp<DecryptHandle> openDecryptSession(const char* uri); + sp<DecryptHandle> openDecryptSession(const char* uri, const char* mime); /** * Close the decrypt session for the given handle diff --git a/include/media/AudioRecord.h b/include/media/AudioRecord.h index 2fb69b6edf78..84a8f1c86944 100644 --- a/include/media/AudioRecord.h +++ b/include/media/AudioRecord.h @@ -206,7 +206,7 @@ public: int channelCount() const; int channels() const; uint32_t frameCount() const; - int frameSize() const; + size_t frameSize() const; int inputSource() const; diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h index 6a15f6ec90a6..e49d8f5d1ca8 100644 --- a/include/media/AudioSystem.h +++ b/include/media/AudioSystem.h @@ -55,19 +55,19 @@ public: static status_t getMasterMute(bool* mute); // set/get stream volume on specified output - static status_t setStreamVolume(int stream, float value, int output); - static status_t getStreamVolume(int stream, float* volume, int output); + static status_t setStreamVolume(audio_stream_type_t stream, float value, int output); + static status_t getStreamVolume(audio_stream_type_t stream, float* volume, int output); // mute/unmute stream - static status_t setStreamMute(int stream, bool mute); - static status_t getStreamMute(int stream, bool* mute); + static status_t setStreamMute(audio_stream_type_t stream, bool mute); + static status_t getStreamMute(audio_stream_type_t stream, bool* mute); // set audio mode in audio hardware (see audio_mode_t) static status_t setMode(int mode); // returns true in *state if tracks are active on the specified stream or has been active // in the past inPastMs milliseconds - static status_t isStreamActive(int stream, bool *state, uint32_t inPastMs = 0); + static status_t isStreamActive(audio_stream_type_t stream, bool *state, uint32_t inPastMs = 0); // set/get audio hardware parameters. The function accepts a list of parameters // key value pairs in the form: key1=value1;key2=value2;... @@ -83,11 +83,11 @@ public: static float linearToLog(int volume); static int logToLinear(float volume); - static status_t getOutputSamplingRate(int* samplingRate, int stream = AUDIO_STREAM_DEFAULT); - static status_t getOutputFrameCount(int* frameCount, int stream = AUDIO_STREAM_DEFAULT); - static status_t getOutputLatency(uint32_t* latency, int stream = AUDIO_STREAM_DEFAULT); + static status_t getOutputSamplingRate(int* samplingRate, audio_stream_type_t stream = AUDIO_STREAM_DEFAULT); + static status_t getOutputFrameCount(int* frameCount, audio_stream_type_t stream = AUDIO_STREAM_DEFAULT); + static status_t getOutputLatency(uint32_t* latency, audio_stream_type_t stream = AUDIO_STREAM_DEFAULT); - static bool routedToA2dpOutput(int streamType); + static bool routedToA2dpOutput(audio_stream_type_t streamType); static status_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount, size_t* buffSize); @@ -103,7 +103,7 @@ public: // - BAD_VALUE: invalid parameter // NOTE: this feature is not supported on all hardware platforms and it is // necessary to check returned status before using the returned values. - static status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int stream = AUDIO_STREAM_DEFAULT); + static status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, audio_stream_type_t stream = AUDIO_STREAM_DEFAULT); static unsigned int getInputFramesLost(audio_io_handle_t ioHandle); diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h index 60b052bd94ca..6e4a9f5388ad 100644 --- a/include/media/AudioTrack.h +++ b/include/media/AudioTrack.h @@ -110,7 +110,7 @@ public: */ static status_t getMinFrameCount(int* frameCount, - int streamType =-1, + audio_stream_type_t streamType = AUDIO_STREAM_DEFAULT, uint32_t sampleRate = 0); /* Constructs an uninitialized AudioTrack. No connection with @@ -142,7 +142,7 @@ public: * sessionId: Specific session ID, or zero to use default. */ - AudioTrack( int streamType, + AudioTrack( audio_stream_type_t streamType, uint32_t sampleRate = 0, audio_format_t format = AUDIO_FORMAT_DEFAULT, int channelMask = 0, @@ -162,7 +162,7 @@ public: * EVENT_UNDERRUN event. */ - AudioTrack( int streamType, + AudioTrack( audio_stream_type_t streamType, uint32_t sampleRate = 0, audio_format_t format = AUDIO_FORMAT_DEFAULT, int channelMask = 0, @@ -186,7 +186,7 @@ public: * - BAD_VALUE: invalid parameter (channels, format, sampleRate...) * - NO_INIT: audio server or audio hardware not initialized * */ - status_t set(int streamType =-1, + status_t set(audio_stream_type_t streamType = AUDIO_STREAM_DEFAULT, uint32_t sampleRate = 0, audio_format_t format = AUDIO_FORMAT_DEFAULT, int channelMask = 0, @@ -215,11 +215,16 @@ public: /* getters, see constructor */ - int streamType() const; + audio_stream_type_t streamType() const; audio_format_t format() const; int channelCount() const; uint32_t frameCount() const; - int frameSize() const; + + /* Return channelCount * (bit depth per channel / 8). + * channelCount is determined from channelMask, and bit depth comes from format. + */ + size_t frameSize() const; + sp<IMemory>& sharedBuffer(); @@ -433,7 +438,7 @@ private: }; bool processAudioBuffer(const sp<AudioTrackThread>& thread); - status_t createTrack_l(int streamType, + status_t createTrack_l(audio_stream_type_t streamType, uint32_t sampleRate, audio_format_t format, uint32_t channelMask, @@ -458,7 +463,7 @@ private: audio_track_cblk_t* mCblk; audio_format_t mFormat; - uint8_t mStreamType; + audio_stream_type_t mStreamType; uint8_t mChannelCount; uint8_t mMuted; uint8_t mReserved; diff --git a/include/media/IAudioFlinger.h b/include/media/IAudioFlinger.h index 9e3cb7f3c383..15d3ca90c17d 100644 --- a/include/media/IAudioFlinger.h +++ b/include/media/IAudioFlinger.h @@ -46,7 +46,7 @@ public: */ virtual sp<IAudioTrack> createTrack( pid_t pid, - int streamType, + audio_stream_type_t streamType, uint32_t sampleRate, uint32_t format, uint32_t channelMask, @@ -89,11 +89,11 @@ public: /* set/get stream type state. This will probably be used by * the preference panel, mostly. */ - virtual status_t setStreamVolume(int stream, float value, int output) = 0; - virtual status_t setStreamMute(int stream, bool muted) = 0; + virtual status_t setStreamVolume(audio_stream_type_t stream, float value, int output) = 0; + virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) = 0; - virtual float streamVolume(int stream, int output) const = 0; - virtual bool streamMute(int stream) const = 0; + virtual float streamVolume(audio_stream_type_t stream, int output) const = 0; + virtual bool streamMute(audio_stream_type_t stream) const = 0; // set audio mode virtual status_t setMode(int mode) = 0; @@ -129,7 +129,7 @@ public: uint32_t acoustics) = 0; virtual status_t closeInput(int input) = 0; - virtual status_t setStreamOutput(uint32_t stream, int output) = 0; + virtual status_t setStreamOutput(audio_stream_type_t stream, int output) = 0; virtual status_t setVoiceVolume(float volume) = 0; diff --git a/include/media/IAudioPolicyService.h b/include/media/IAudioPolicyService.h index 9807cbe56430..1ac0bbf36195 100644 --- a/include/media/IAudioPolicyService.h +++ b/include/media/IAudioPolicyService.h @@ -85,7 +85,7 @@ public: int id) = 0; virtual status_t unregisterEffect(int id) = 0; virtual status_t setEffectEnabled(int id, bool enabled) = 0; - virtual bool isStreamActive(int stream, uint32_t inPastMs = 0) const = 0; + virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs = 0) const = 0; virtual status_t queryDefaultPreProcessing(int audioSession, effect_descriptor_t *descriptors, uint32_t *count) = 0; diff --git a/include/media/IMediaPlayer.h b/include/media/IMediaPlayer.h index e9059031fbfa..64258864756d 100644 --- a/include/media/IMediaPlayer.h +++ b/include/media/IMediaPlayer.h @@ -21,6 +21,7 @@ #include <binder/IInterface.h> #include <binder/Parcel.h> #include <utils/KeyedVector.h> +#include <system/audio.h> namespace android { @@ -51,7 +52,7 @@ public: virtual status_t getCurrentPosition(int* msec) = 0; virtual status_t getDuration(int* msec) = 0; virtual status_t reset() = 0; - virtual status_t setAudioStreamType(int type) = 0; + virtual status_t setAudioStreamType(audio_stream_type_t type) = 0; virtual status_t setLooping(int loop) = 0; virtual status_t setVolume(float leftVolume, float rightVolume) = 0; virtual status_t setAuxEffectSendLevel(float level) = 0; diff --git a/include/media/MediaPlayerInterface.h b/include/media/MediaPlayerInterface.h index 1f6bddaf2a70..7beb1766d209 100644 --- a/include/media/MediaPlayerInterface.h +++ b/include/media/MediaPlayerInterface.h @@ -199,7 +199,7 @@ public: virtual ~MediaPlayerHWInterface() {} virtual bool hardwareOutput() { return true; } virtual status_t setVolume(float leftVolume, float rightVolume) = 0; - virtual status_t setAudioStreamType(int streamType) = 0; + virtual status_t setAudioStreamType(audio_stream_type_t streamType) = 0; }; }; // namespace android diff --git a/include/media/ToneGenerator.h b/include/media/ToneGenerator.h index 1ad1f26e108a..7d890bd541d6 100644 --- a/include/media/ToneGenerator.h +++ b/include/media/ToneGenerator.h @@ -151,7 +151,7 @@ public: NUM_SUP_TONES = LAST_SUP_TONE-FIRST_SUP_TONE+1 }; - ToneGenerator(int streamType, float volume, bool threadCanCallJava = false); + ToneGenerator(audio_stream_type_t streamType, float volume, bool threadCanCallJava = false); ~ToneGenerator(); bool startTone(int toneType, int durationMs = -1); @@ -266,7 +266,7 @@ private: Mutex mCbkCondLock; // Mutex associated to mWaitCbkCond Condition mWaitCbkCond; // condition enabling interface to wait for audio callback completion after a change is requested float mVolume; // Volume applied to audio track - int mStreamType; // Audio stream used for output + audio_stream_type_t mStreamType; // Audio stream used for output unsigned int mProcessSize; // Size of audio blocks generated at a time by audioCallback() (in PCM frames). bool initAudioTrack(); diff --git a/include/media/mediaplayer.h b/include/media/mediaplayer.h index 2dc055e66f06..00b7dd584135 100644 --- a/include/media/mediaplayer.h +++ b/include/media/mediaplayer.h @@ -185,7 +185,7 @@ public: status_t getCurrentPosition(int *msec); status_t getDuration(int *msec); status_t reset(); - status_t setAudioStreamType(int type); + status_t setAudioStreamType(audio_stream_type_t type); status_t setLooping(int loop); bool isLooping(); status_t setVolume(float leftVolume, float rightVolume); @@ -223,7 +223,7 @@ private: int mSeekPosition; bool mPrepareSync; status_t mPrepareStatus; - int mStreamType; + audio_stream_type_t mStreamType; bool mLoop; float mLeftVolume; float mRightVolume; diff --git a/include/media/stagefright/DataSource.h b/include/media/stagefright/DataSource.h index 713af92860ef..00d583e531fd 100644 --- a/include/media/stagefright/DataSource.h +++ b/include/media/stagefright/DataSource.h @@ -81,7 +81,7 @@ public: static void RegisterDefaultSniffers(); // for DRM - virtual sp<DecryptHandle> DrmInitialization() { + virtual sp<DecryptHandle> DrmInitialization(const char *mime = NULL) { return NULL; } virtual void getDrmInfo(sp<DecryptHandle> &handle, DrmManagerClient **client) {}; diff --git a/include/media/stagefright/FileSource.h b/include/media/stagefright/FileSource.h index 6cf86dc1323d..d994cb3fa721 100644 --- a/include/media/stagefright/FileSource.h +++ b/include/media/stagefright/FileSource.h @@ -38,7 +38,7 @@ public: virtual status_t getSize(off64_t *size); - virtual sp<DecryptHandle> DrmInitialization(); + virtual sp<DecryptHandle> DrmInitialization(const char *mime); virtual void getDrmInfo(sp<DecryptHandle> &handle, DrmManagerClient **client); diff --git a/include/media/stagefright/MediaExtractor.h b/include/media/stagefright/MediaExtractor.h index eb45237ca999..94090eef26a3 100644 --- a/include/media/stagefright/MediaExtractor.h +++ b/include/media/stagefright/MediaExtractor.h @@ -56,10 +56,10 @@ public: virtual uint32_t flags() const; // for DRM - virtual void setDrmFlag(bool flag) { + void setDrmFlag(bool flag) { mIsDrm = flag; }; - virtual bool getDrmFlag() { + bool getDrmFlag() { return mIsDrm; } virtual char* getDrmTrackInfo(size_t trackID, int *len) { diff --git a/include/private/media/AudioTrackShared.h b/include/private/media/AudioTrackShared.h index 046d5e97ee45..33a92cdc78bf 100644 --- a/include/private/media/AudioTrackShared.h +++ b/include/private/media/AudioTrackShared.h @@ -80,12 +80,14 @@ struct audio_track_cblk_t // 8 bit PCM data: in this case, mCblk->frameSize is based on a sample size of // 16 bit because data is converted to 16 bit before being stored in buffer - uint8_t frameSize; + uint8_t frameSize; // would normally be size_t, but 8 bits is plenty uint8_t pad1; uint16_t bufferTimeoutMs; // Maximum cumulated timeout before restarting audioflinger uint16_t waitTimeMs; // Cumulated wait time - uint16_t sendLevel; +private: + uint16_t mSendLevel; // Fixed point U4.12 so 0x1000 means 1.0 +public: volatile int32_t flags; // Cache line boundary (32 bytes) @@ -98,6 +100,19 @@ struct audio_track_cblk_t uint32_t framesAvailable_l(); uint32_t framesReady(); bool tryLock(); + + // No barriers on the following operations, so the ordering of loads/stores + // with respect to other parameters is UNPREDICTABLE. That's considered safe. + + // for AudioTrack client only, caller must limit to 0.0 <= sendLevel <= 1.0 + void setSendLevel(float sendLevel) { + mSendLevel = uint16_t(sendLevel * 0x1000); + } + + // for AudioFlinger only; the return value must be validated by the caller + uint16_t getSendLevel_U4_12() const { + return mSendLevel; + } }; diff --git a/include/utils/TypeHelpers.h b/include/utils/TypeHelpers.h index 7b4fb70ba641..1f2c2d5fda3c 100644 --- a/include/utils/TypeHelpers.h +++ b/include/utils/TypeHelpers.h @@ -233,19 +233,15 @@ struct key_value_pair_t { } }; -template<> template <typename K, typename V> struct trait_trivial_ctor< key_value_pair_t<K, V> > { enum { value = aggregate_traits<K,V>::has_trivial_ctor }; }; -template<> template <typename K, typename V> struct trait_trivial_dtor< key_value_pair_t<K, V> > { enum { value = aggregate_traits<K,V>::has_trivial_dtor }; }; -template<> template <typename K, typename V> struct trait_trivial_copy< key_value_pair_t<K, V> > { enum { value = aggregate_traits<K,V>::has_trivial_copy }; }; -template<> template <typename K, typename V> struct trait_trivial_move< key_value_pair_t<K, V> > { enum { value = aggregate_traits<K,V>::has_trivial_move }; }; diff --git a/libs/gui/ISurfaceComposerClient.cpp b/libs/gui/ISurfaceComposerClient.cpp index 5ebdbd95587b..8fe96b182ebf 100644 --- a/libs/gui/ISurfaceComposerClient.cpp +++ b/libs/gui/ISurfaceComposerClient.cpp @@ -35,15 +35,6 @@ // --------------------------------------------------------------------------- -/* ideally AID_GRAPHICS would be in a semi-public header - * or there would be a way to map a user/group name to its id - */ -#ifndef AID_GRAPHICS -#define AID_GRAPHICS 1003 -#endif - -// --------------------------------------------------------------------------- - namespace android { enum { diff --git a/libs/rs/driver/rsdBcc.cpp b/libs/rs/driver/rsdBcc.cpp index 24bb288c0fcf..bec6ffffce01 100644 --- a/libs/rs/driver/rsdBcc.cpp +++ b/libs/rs/driver/rsdBcc.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 The Android Open Source Project + * Copyright (C) 2011-2012 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. @@ -36,6 +36,7 @@ using namespace android::renderscript; struct DrvScript { int (*mRoot)(); + int (*mRootExpand)(); void (*mInit)(); void (*mFreeChildren)(); @@ -52,6 +53,10 @@ struct DrvScript { uint32_t mScriptTextLength; }; +typedef void (*outer_foreach_t)( + const android::renderscript::RsForEachStubParamStruct *, + uint32_t x1, uint32_t x2, + uint32_t instep, uint32_t outstep); static Script * setTLS(Script *sc) { ScriptTLSStruct * tls = (ScriptTLSStruct *)pthread_getspecific(rsdgThreadTLSKey); @@ -123,6 +128,7 @@ bool rsdScriptInit(const Context *rsc, } drv->mRoot = reinterpret_cast<int (*)()>(bccGetFuncAddr(drv->mBccScript, "root")); + drv->mRootExpand = reinterpret_cast<int (*)()>(bccGetFuncAddr(drv->mBccScript, "root.expand")); drv->mInit = reinterpret_cast<void (*)()>(bccGetFuncAddr(drv->mBccScript, "init")); drv->mFreeChildren = reinterpret_cast<void (*)()>(bccGetFuncAddr(drv->mBccScript, ".rs.dtor")); @@ -165,7 +171,12 @@ bool rsdScriptInit(const Context *rsc, script->mHal.info.exportedPragmaCount = drv->ME->getPragmaCount(); script->mHal.info.exportedPragmaKeyList = drv->ME->getPragmaKeyList(); script->mHal.info.exportedPragmaValueList = drv->ME->getPragmaValueList(); - script->mHal.info.root = drv->mRoot; + + if (drv->mRootExpand) { + script->mHal.info.root = drv->mRootExpand; + } else { + script->mHal.info.root = drv->mRoot; + } pthread_mutex_unlock(&rsdgInitMutex); return true; @@ -224,7 +235,7 @@ static void wc_xy(void *usr, uint32_t idx) { RsdHal * dc = (RsdHal *)mtls->rsc->mHal.drv; uint32_t sig = mtls->sig; - outer_foreach_t fn = dc->mForEachLaunch[sig]; + outer_foreach_t fn = (outer_foreach_t) mtls->script->mHal.info.root; while (1) { uint32_t slice = (uint32_t)android_atomic_inc(&mtls->mSliceNum); uint32_t yStart = mtls->yStart + slice * mtls->mSliceSize; @@ -240,8 +251,7 @@ static void wc_xy(void *usr, uint32_t idx) { uint32_t offset = mtls->dimX * p.y; p.out = mtls->ptrOut + (mtls->eStrideOut * offset); p.in = mtls->ptrIn + (mtls->eStrideIn * offset); - fn(&mtls->script->mHal.info.root, &p, mtls->xStart, mtls->xEnd, - mtls->eStrideIn, mtls->eStrideOut); + fn(&p, mtls->xStart, mtls->xEnd, mtls->eStrideIn, mtls->eStrideOut); } } } @@ -255,7 +265,7 @@ static void wc_x(void *usr, uint32_t idx) { RsdHal * dc = (RsdHal *)mtls->rsc->mHal.drv; uint32_t sig = mtls->sig; - outer_foreach_t fn = dc->mForEachLaunch[sig]; + outer_foreach_t fn = (outer_foreach_t) mtls->script->mHal.info.root; while (1) { uint32_t slice = (uint32_t)android_atomic_inc(&mtls->mSliceNum); uint32_t xStart = mtls->xStart + slice * mtls->mSliceSize; @@ -270,7 +280,7 @@ static void wc_x(void *usr, uint32_t idx) { p.out = mtls->ptrOut + (mtls->eStrideOut * xStart); p.in = mtls->ptrIn + (mtls->eStrideIn * xStart); - fn(&mtls->script->mHal.info.root, &p, xStart, xEnd, mtls->eStrideIn, mtls->eStrideOut); + fn(&p, xStart, xEnd, mtls->eStrideIn, mtls->eStrideOut); } } @@ -381,7 +391,7 @@ void rsdScriptInvokeForEach(const Context *rsc, uint32_t sig = mtls.sig; //ALOGE("launch 3"); - outer_foreach_t fn = dc->mForEachLaunch[sig]; + outer_foreach_t fn = (outer_foreach_t) mtls.script->mHal.info.root; for (p.ar[0] = mtls.arrayStart; p.ar[0] < mtls.arrayEnd; p.ar[0]++) { for (p.z = mtls.zStart; p.z < mtls.zEnd; p.z++) { for (p.y = mtls.yStart; p.y < mtls.yEnd; p.y++) { @@ -390,8 +400,8 @@ void rsdScriptInvokeForEach(const Context *rsc, mtls.dimX * p.y; p.out = mtls.ptrOut + (mtls.eStrideOut * offset); p.in = mtls.ptrIn + (mtls.eStrideIn * offset); - fn(&mtls.script->mHal.info.root, &p, mtls.xStart, mtls.xEnd, - mtls.eStrideIn, mtls.eStrideOut); + fn(&p, mtls.xStart, mtls.xEnd, mtls.eStrideIn, + mtls.eStrideOut); } } } diff --git a/libs/rs/driver/rsdCore.cpp b/libs/rs/driver/rsdCore.cpp index b514e2182883..1a535d0a97f1 100644 --- a/libs/rs/driver/rsdCore.cpp +++ b/libs/rs/driver/rsdCore.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 The Android Open Source Project + * Copyright (C) 2011-2012 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. @@ -43,7 +43,6 @@ using namespace android::renderscript; static void Shutdown(Context *rsc); static void SetPriority(const Context *rsc, int32_t priority); -static void initForEach(outer_foreach_t* forEachLaunch); static RsdHalFunctions FunctionTable = { rsdGLInit, @@ -208,8 +207,6 @@ bool rsdHalInit(Context *rsc, uint32_t version_major, uint32_t version_minor) { rsdgThreadTLSKeyCount++; pthread_mutex_unlock(&rsdgInitMutex); - initForEach(dc->mForEachLaunch); - dc->mTlsStruct.mContext = rsc; dc->mTlsStruct.mScript = NULL; int status = pthread_setspecific(rsdgThreadTLSKey, &dc->mTlsStruct); @@ -291,173 +288,3 @@ void Shutdown(Context *rsc) { } -static void rsdForEach17(const void *vRoot, - const android::renderscript::RsForEachStubParamStruct *p, - uint32_t x1, uint32_t x2, - uint32_t instep, uint32_t outstep) { - typedef void (*fe)(const void *, uint32_t); - (*(fe*)vRoot)(p->in, p->y); -} - -static void rsdForEach18(const void *vRoot, - const android::renderscript::RsForEachStubParamStruct *p, - uint32_t x1, uint32_t x2, - uint32_t instep, uint32_t outstep) { - typedef void (*fe)(void *, uint32_t); - (*(fe*)vRoot)(p->out, p->y); -} - -static void rsdForEach19(const void *vRoot, - const android::renderscript::RsForEachStubParamStruct *p, - uint32_t x1, uint32_t x2, - uint32_t instep, uint32_t outstep) { - typedef void (*fe)(const void *, void *, uint32_t); - (*(fe*)vRoot)(p->in, p->out, p->y); -} - -static void rsdForEach21(const void *vRoot, - const android::renderscript::RsForEachStubParamStruct *p, - uint32_t x1, uint32_t x2, - uint32_t instep, uint32_t outstep) { - typedef void (*fe)(const void *, const void *, uint32_t); - (*(fe*)vRoot)(p->in, p->usr, p->y); -} - -static void rsdForEach22(const void *vRoot, - const android::renderscript::RsForEachStubParamStruct *p, - uint32_t x1, uint32_t x2, - uint32_t instep, uint32_t outstep) { - typedef void (*fe)(void *, const void *, uint32_t); - (*(fe*)vRoot)(p->out, p->usr, p->y); -} - -static void rsdForEach23(const void *vRoot, - const android::renderscript::RsForEachStubParamStruct *p, - uint32_t x1, uint32_t x2, - uint32_t instep, uint32_t outstep) { - typedef void (*fe)(const void *, void *, const void *, uint32_t); - (*(fe*)vRoot)(p->in, p->out, p->usr, p->y); -} - -static void rsdForEach25(const void *vRoot, - const android::renderscript::RsForEachStubParamStruct *p, - uint32_t x1, uint32_t x2, - uint32_t instep, uint32_t outstep) { - typedef void (*fe)(const void *, uint32_t, uint32_t); - const uint8_t *pin = (const uint8_t *)p->in; - uint32_t y = p->y; - for (uint32_t x = x1; x < x2; x++) { - (*(fe*)vRoot)(pin, x, y); - pin += instep; - } -} - -static void rsdForEach26(const void *vRoot, - const android::renderscript::RsForEachStubParamStruct *p, - uint32_t x1, uint32_t x2, - uint32_t instep, uint32_t outstep) { - typedef void (*fe)(void *, uint32_t, uint32_t); - uint8_t *pout = (uint8_t *)p->out; - uint32_t y = p->y; - for (uint32_t x = x1; x < x2; x++) { - (*(fe*)vRoot)(pout, x, y); - pout += outstep; - } -} - -static void rsdForEach27(const void *vRoot, - const android::renderscript::RsForEachStubParamStruct *p, - uint32_t x1, uint32_t x2, - uint32_t instep, uint32_t outstep) { - typedef void (*fe)(const void *, void *, uint32_t, uint32_t); - uint8_t *pout = (uint8_t *)p->out; - const uint8_t *pin = (const uint8_t *)p->in; - uint32_t y = p->y; - for (uint32_t x = x1; x < x2; x++) { - (*(fe*)vRoot)(pin, pout, x, y); - pin += instep; - pout += outstep; - } -} - -static void rsdForEach29(const void *vRoot, - const android::renderscript::RsForEachStubParamStruct *p, - uint32_t x1, uint32_t x2, - uint32_t instep, uint32_t outstep) { - typedef void (*fe)(const void *, const void *, uint32_t, uint32_t); - const uint8_t *pin = (const uint8_t *)p->in; - const void *usr = p->usr; - const uint32_t y = p->y; - for (uint32_t x = x1; x < x2; x++) { - (*(fe*)vRoot)(pin, usr, x, y); - pin += instep; - } -} - -static void rsdForEach30(const void *vRoot, - const android::renderscript::RsForEachStubParamStruct *p, - uint32_t x1, uint32_t x2, - uint32_t instep, uint32_t outstep) { - typedef void (*fe)(void *, const void *, uint32_t, uint32_t); - uint8_t *pout = (uint8_t *)p->out; - const void *usr = p->usr; - const uint32_t y = p->y; - for (uint32_t x = x1; x < x2; x++) { - (*(fe*)vRoot)(pout, usr, x, y); - pout += outstep; - } -} - -static void rsdForEach31(const void *vRoot, - const android::renderscript::RsForEachStubParamStruct *p, - uint32_t x1, uint32_t x2, - uint32_t instep, uint32_t outstep) { - typedef void (*fe)(const void *, void *, const void *, uint32_t, uint32_t); - uint8_t *pout = (uint8_t *)p->out; - const uint8_t *pin = (const uint8_t *)p->in; - const void *usr = p->usr; - const uint32_t y = p->y; - for (uint32_t x = x1; x < x2; x++) { - (*(fe*)vRoot)(pin, pout, usr, x, y); - pin += instep; - pout += outstep; - } -} - - -static void initForEach(outer_foreach_t* forEachLaunch) { - rsAssert(forEachLaunch); - forEachLaunch[0x00] = NULL; - forEachLaunch[0x01] = rsdForEach31; // in - forEachLaunch[0x02] = rsdForEach30; // out - forEachLaunch[0x03] = rsdForEach31; // in, out - forEachLaunch[0x04] = NULL; - forEachLaunch[0x05] = rsdForEach29; // in, usr - forEachLaunch[0x06] = rsdForEach30; // out, usr - forEachLaunch[0x07] = rsdForEach31; // in, out, usr - forEachLaunch[0x08] = NULL; - forEachLaunch[0x09] = rsdForEach25; // in, x - forEachLaunch[0x0a] = rsdForEach26; // out, x - forEachLaunch[0x0b] = rsdForEach27; // in, out, x - forEachLaunch[0x0c] = NULL; - forEachLaunch[0x0d] = rsdForEach29; // in, usr, x - forEachLaunch[0x0e] = rsdForEach30; // out, usr, x - forEachLaunch[0x0f] = rsdForEach31; // in, out, usr, x - forEachLaunch[0x10] = NULL; - forEachLaunch[0x11] = rsdForEach17; // in y - forEachLaunch[0x12] = rsdForEach18; // out, y - forEachLaunch[0x13] = rsdForEach19; // in, out, y - forEachLaunch[0x14] = NULL; - forEachLaunch[0x15] = rsdForEach21; // in, usr, y - forEachLaunch[0x16] = rsdForEach22; // out, usr, y - forEachLaunch[0x17] = rsdForEach23; // in, out, usr, y - forEachLaunch[0x18] = NULL; - forEachLaunch[0x19] = rsdForEach25; // in, x, y - forEachLaunch[0x1a] = rsdForEach26; // out, x, y - forEachLaunch[0x1b] = rsdForEach27; // in, out, x, y - forEachLaunch[0x1c] = NULL; - forEachLaunch[0x1d] = rsdForEach29; // in, usr, x, y - forEachLaunch[0x1e] = rsdForEach30; // out, usr, x, y - forEachLaunch[0x1f] = rsdForEach31; // in, out, usr, x, y -} - diff --git a/libs/rs/driver/rsdCore.h b/libs/rs/driver/rsdCore.h index ce86d118a8cd..126c87a2f04f 100644 --- a/libs/rs/driver/rsdCore.h +++ b/libs/rs/driver/rsdCore.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 The Android Open Source Project + * Copyright (C) 2011-2012 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. @@ -27,11 +27,6 @@ typedef void (* InvokeFunc_t)(void); typedef void (*WorkerCallback_t)(void *usr, uint32_t idx); -typedef void (*outer_foreach_t)(const void *, - const android::renderscript::RsForEachStubParamStruct *, - uint32_t x1, uint32_t x2, - uint32_t instep, uint32_t outstep); - typedef struct RsdSymbolTableRec { const char * mName; void * mPtr; @@ -62,8 +57,6 @@ typedef struct RsdHalRec { Workers mWorkers; bool mExit; - outer_foreach_t mForEachLaunch[32]; - ScriptTLSStruct mTlsStruct; RsdGL gl; diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp index 39fd9a948531..8ff9dd3fdc02 100644 --- a/media/jni/android_media_MediaPlayer.cpp +++ b/media/jni/android_media_MediaPlayer.cpp @@ -479,7 +479,7 @@ android_media_MediaPlayer_setAudioStreamType(JNIEnv *env, jobject thiz, int stre jniThrowException(env, "java/lang/IllegalStateException", NULL); return; } - process_media_player_call( env, thiz, mp->setAudioStreamType(streamtype) , NULL, NULL ); + process_media_player_call( env, thiz, mp->setAudioStreamType((audio_stream_type_t) streamtype) , NULL, NULL ); } static void diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp index b5303ef344a6..0d51def5a254 100644 --- a/media/jni/soundpool/SoundPool.cpp +++ b/media/jni/soundpool/SoundPool.cpp @@ -39,7 +39,7 @@ uint32_t kMaxSampleRate = 48000; uint32_t kDefaultSampleRate = 44100; uint32_t kDefaultFrameCount = 1200; -SoundPool::SoundPool(int maxChannels, int streamType, int srcQuality) +SoundPool::SoundPool(int maxChannels, audio_stream_type_t streamType, int srcQuality) { ALOGV("SoundPool constructor: maxChannels=%d, streamType=%d, srcQuality=%d", maxChannels, streamType, srcQuality); @@ -570,7 +570,7 @@ void SoundChannel::play(const sp<Sample>& sample, int nextChannelID, float leftV // initialize track int afFrameCount; int afSampleRate; - int streamType = mSoundPool->streamType(); + audio_stream_type_t streamType = mSoundPool->streamType(); if (AudioSystem::getOutputFrameCount(&afFrameCount, streamType) != NO_ERROR) { afFrameCount = kDefaultFrameCount; } diff --git a/media/jni/soundpool/SoundPool.h b/media/jni/soundpool/SoundPool.h index 1b91b3b0c9e4..6b11c289e69d 100644 --- a/media/jni/soundpool/SoundPool.h +++ b/media/jni/soundpool/SoundPool.h @@ -162,7 +162,7 @@ class SoundPool { friend class SoundPoolThread; friend class SoundChannel; public: - SoundPool(int maxChannels, int streamType, int srcQuality); + SoundPool(int maxChannels, audio_stream_type_t streamType, int srcQuality); ~SoundPool(); int load(const char* url, int priority); int load(int fd, int64_t offset, int64_t length, int priority); @@ -178,7 +178,7 @@ public: void setPriority(int channelID, int priority); void setLoop(int channelID, int loop); void setRate(int channelID, float rate); - int streamType() const { return mStreamType; } + audio_stream_type_t streamType() const { return mStreamType; } int srcQuality() const { return mSrcQuality; } // called from SoundPoolThread @@ -220,7 +220,7 @@ private: List<SoundChannel*> mStop; DefaultKeyedVector< int, sp<Sample> > mSamples; int mMaxChannels; - int mStreamType; + audio_stream_type_t mStreamType; int mSrcQuality; int mAllocated; int mNextSampleID; diff --git a/media/jni/soundpool/android_media_SoundPool.cpp b/media/jni/soundpool/android_media_SoundPool.cpp index fe1c20a93f9c..da3af9d657ba 100644 --- a/media/jni/soundpool/android_media_SoundPool.cpp +++ b/media/jni/soundpool/android_media_SoundPool.cpp @@ -179,7 +179,7 @@ static jint android_media_SoundPool_native_setup(JNIEnv *env, jobject thiz, jobject weakRef, jint maxChannels, jint streamType, jint srcQuality) { ALOGV("android_media_SoundPool_native_setup"); - SoundPool *ap = new SoundPool(maxChannels, streamType, srcQuality); + SoundPool *ap = new SoundPool(maxChannels, (audio_stream_type_t) streamType, srcQuality); if (ap == NULL) { return -1; } diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp index 8e4a9d6c48eb..32b5bac619d8 100644 --- a/media/libmedia/AudioRecord.cpp +++ b/media/libmedia/AudioRecord.cpp @@ -263,7 +263,7 @@ uint32_t AudioRecord::frameCount() const return mFrameCount; } -int AudioRecord::frameSize() const +size_t AudioRecord::frameSize() const { if (audio_is_linear_pcm(mFormat)) { return channelCount()*audio_bytes_per_sample(mFormat); diff --git a/media/libmedia/AudioSystem.cpp b/media/libmedia/AudioSystem.cpp index 9d4137e9714f..5193848091a8 100644 --- a/media/libmedia/AudioSystem.cpp +++ b/media/libmedia/AudioSystem.cpp @@ -120,7 +120,7 @@ status_t AudioSystem::getMasterMute(bool* mute) return NO_ERROR; } -status_t AudioSystem::setStreamVolume(int stream, float value, int output) +status_t AudioSystem::setStreamVolume(audio_stream_type_t stream, float value, int output) { if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); @@ -129,7 +129,7 @@ status_t AudioSystem::setStreamVolume(int stream, float value, int output) return NO_ERROR; } -status_t AudioSystem::setStreamMute(int stream, bool mute) +status_t AudioSystem::setStreamMute(audio_stream_type_t stream, bool mute) { if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); @@ -138,7 +138,7 @@ status_t AudioSystem::setStreamMute(int stream, bool mute) return NO_ERROR; } -status_t AudioSystem::getStreamVolume(int stream, float* volume, int output) +status_t AudioSystem::getStreamVolume(audio_stream_type_t stream, float* volume, int output) { if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); @@ -147,7 +147,7 @@ status_t AudioSystem::getStreamVolume(int stream, float* volume, int output) return NO_ERROR; } -status_t AudioSystem::getStreamMute(int stream, bool* mute) +status_t AudioSystem::getStreamMute(audio_stream_type_t stream, bool* mute) { if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE; const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); @@ -203,7 +203,7 @@ int AudioSystem::logToLinear(float volume) return volume ? 100 - int(dBConvertInverse * log(volume) + 0.5) : 0; } -status_t AudioSystem::getOutputSamplingRate(int* samplingRate, int streamType) +status_t AudioSystem::getOutputSamplingRate(int* samplingRate, audio_stream_type_t streamType) { OutputDescriptor *outputDesc; audio_io_handle_t output; @@ -212,7 +212,7 @@ status_t AudioSystem::getOutputSamplingRate(int* samplingRate, int streamType) streamType = AUDIO_STREAM_MUSIC; } - output = getOutput((audio_stream_type_t)streamType); + output = getOutput(streamType); if (output == 0) { return PERMISSION_DENIED; } @@ -236,7 +236,7 @@ status_t AudioSystem::getOutputSamplingRate(int* samplingRate, int streamType) return NO_ERROR; } -status_t AudioSystem::getOutputFrameCount(int* frameCount, int streamType) +status_t AudioSystem::getOutputFrameCount(int* frameCount, audio_stream_type_t streamType) { OutputDescriptor *outputDesc; audio_io_handle_t output; @@ -245,7 +245,7 @@ status_t AudioSystem::getOutputFrameCount(int* frameCount, int streamType) streamType = AUDIO_STREAM_MUSIC; } - output = getOutput((audio_stream_type_t)streamType); + output = getOutput(streamType); if (output == 0) { return PERMISSION_DENIED; } @@ -267,7 +267,7 @@ status_t AudioSystem::getOutputFrameCount(int* frameCount, int streamType) return NO_ERROR; } -status_t AudioSystem::getOutputLatency(uint32_t* latency, int streamType) +status_t AudioSystem::getOutputLatency(uint32_t* latency, audio_stream_type_t streamType) { OutputDescriptor *outputDesc; audio_io_handle_t output; @@ -276,7 +276,7 @@ status_t AudioSystem::getOutputLatency(uint32_t* latency, int streamType) streamType = AUDIO_STREAM_MUSIC; } - output = getOutput((audio_stream_type_t)streamType); + output = getOutput(streamType); if (output == 0) { return PERMISSION_DENIED; } @@ -333,7 +333,7 @@ status_t AudioSystem::setVoiceVolume(float value) return af->setVoiceVolume(value); } -status_t AudioSystem::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int stream) +status_t AudioSystem::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, audio_stream_type_t stream) { const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); if (af == 0) return PERMISSION_DENIED; @@ -342,7 +342,7 @@ status_t AudioSystem::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames stream = AUDIO_STREAM_MUSIC; } - return af->getRenderPosition(halFrames, dspFrames, getOutput((audio_stream_type_t)stream)); + return af->getRenderPosition(halFrames, dspFrames, getOutput(stream)); } unsigned int AudioSystem::getInputFramesLost(audio_io_handle_t ioHandle) { @@ -467,7 +467,7 @@ void AudioSystem::setErrorCallback(audio_error_callback cb) { gAudioErrorCallback = cb; } -bool AudioSystem::routedToA2dpOutput(int streamType) { +bool AudioSystem::routedToA2dpOutput(audio_stream_type_t streamType) { switch(streamType) { case AUDIO_STREAM_MUSIC: case AUDIO_STREAM_VOICE_CALL: @@ -728,7 +728,7 @@ status_t AudioSystem::setEffectEnabled(int id, bool enabled) return aps->setEffectEnabled(id, enabled); } -status_t AudioSystem::isStreamActive(int stream, bool* state, uint32_t inPastMs) +status_t AudioSystem::isStreamActive(audio_stream_type_t stream, bool* state, uint32_t inPastMs) { const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) return PERMISSION_DENIED; diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index 9c650adf1357..97b231200934 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -49,7 +49,7 @@ namespace android { // static status_t AudioTrack::getMinFrameCount( int* frameCount, - int streamType, + audio_stream_type_t streamType, uint32_t sampleRate) { int afSampleRate; @@ -83,7 +83,7 @@ AudioTrack::AudioTrack() } AudioTrack::AudioTrack( - int streamType, + audio_stream_type_t streamType, uint32_t sampleRate, audio_format_t format, int channelMask, @@ -102,7 +102,7 @@ AudioTrack::AudioTrack( } AudioTrack::AudioTrack( - int streamType, + audio_stream_type_t streamType, uint32_t sampleRate, audio_format_t format, int channelMask, @@ -140,7 +140,7 @@ AudioTrack::~AudioTrack() } status_t AudioTrack::set( - int streamType, + audio_stream_type_t streamType, uint32_t sampleRate, audio_format_t format, int channelMask, @@ -204,7 +204,7 @@ status_t AudioTrack::set( uint32_t channelCount = popcount(channelMask); audio_io_handle_t output = AudioSystem::getOutput( - (audio_stream_type_t)streamType, + streamType, sampleRate, format, channelMask, (audio_policy_output_flags_t)flags); @@ -215,7 +215,7 @@ status_t AudioTrack::set( mVolume[LEFT] = 1.0f; mVolume[RIGHT] = 1.0f; - mSendLevel = 0; + mSendLevel = 0.0f; mFrameCount = frameCount; mNotificationFramesReq = notificationFrames; mSessionId = sessionId; @@ -275,7 +275,7 @@ uint32_t AudioTrack::latency() const return mLatency; } -int AudioTrack::streamType() const +audio_stream_type_t AudioTrack::streamType() const { return mStreamType; } @@ -295,7 +295,7 @@ uint32_t AudioTrack::frameCount() const return mCblk->frameCount; } -int AudioTrack::frameSize() const +size_t AudioTrack::frameSize() const { if (audio_is_linear_pcm(mFormat)) { return channelCount()*audio_bytes_per_sample(mFormat); @@ -499,14 +499,14 @@ void AudioTrack::getVolume(float* left, float* right) status_t AudioTrack::setAuxEffectSendLevel(float level) { ALOGV("setAuxEffectSendLevel(%f)", level); - if (level > 1.0f) { + if (level < 0.0f || level > 1.0f) { return BAD_VALUE; } AutoMutex lock(mLock); mSendLevel = level; - mCblk->sendLevel = uint16_t(level * 0x1000); + mCblk->setSendLevel(level); return NO_ERROR; } @@ -688,7 +688,7 @@ audio_io_handle_t AudioTrack::getOutput() // must be called with mLock held audio_io_handle_t AudioTrack::getOutput_l() { - return AudioSystem::getOutput((audio_stream_type_t)mStreamType, + return AudioSystem::getOutput(mStreamType, mCblk->sampleRate, mFormat, mChannelMask, (audio_policy_output_flags_t)mFlags); } @@ -711,7 +711,7 @@ status_t AudioTrack::attachAuxEffect(int effectId) // must be called with mLock held status_t AudioTrack::createTrack_l( - int streamType, + audio_stream_type_t streamType, uint32_t sampleRate, audio_format_t format, uint32_t channelMask, @@ -818,7 +818,7 @@ status_t AudioTrack::createTrack_l( } mCblk->volumeLR = (uint32_t(uint16_t(mVolume[RIGHT] * 0x1000)) << 16) | uint16_t(mVolume[LEFT] * 0x1000); - mCblk->sendLevel = uint16_t(mSendLevel * 0x1000); + mCblk->setSendLevel(mSendLevel); mAudioTrack->attachAuxEffect(mAuxEffectId); mCblk->bufferTimeoutMs = MAX_STARTUP_TIMEOUT_MS; mCblk->waitTimeMs = 0; @@ -979,7 +979,7 @@ ssize_t AudioTrack::write(const void* buffer, size_t userSize) ssize_t written = 0; const int8_t *src = (const int8_t *)buffer; Buffer audioBuffer; - size_t frameSz = (size_t)frameSize(); + size_t frameSz = frameSize(); do { audioBuffer.frameCount = userSize/frameSz; @@ -1137,7 +1137,7 @@ bool AudioTrack::processAudioBuffer(const sp<AudioTrackThread>& thread) audioBuffer.size = writtenSize; // NOTE: mCblk->frameSize is not equal to AudioTrack::frameSize() for - // 8 bit PCM data: in this case, mCblk->frameSize is based on a sampel size of + // 8 bit PCM data: in this case, mCblk->frameSize is based on a sample size of // 16 bit. audioBuffer.frameCount = writtenSize/mCblk->frameSize; @@ -1311,7 +1311,7 @@ audio_track_cblk_t::audio_track_cblk_t() : lock(Mutex::SHARED), cv(Condition::SHARED), user(0), server(0), userBase(0), serverBase(0), buffers(0), frameCount(0), loopStart(UINT_MAX), loopEnd(UINT_MAX), loopCount(0), volumeLR(0), - sendLevel(0), flags(0) + mSendLevel(0), flags(0) { } diff --git a/media/libmedia/IAudioFlinger.cpp b/media/libmedia/IAudioFlinger.cpp index abd491f62534..9ed1a2a76674 100644 --- a/media/libmedia/IAudioFlinger.cpp +++ b/media/libmedia/IAudioFlinger.cpp @@ -82,7 +82,7 @@ public: virtual sp<IAudioTrack> createTrack( pid_t pid, - int streamType, + audio_stream_type_t streamType, uint32_t sampleRate, uint32_t format, uint32_t channelMask, @@ -97,7 +97,7 @@ public: sp<IAudioTrack> track; data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); data.writeInt32(pid); - data.writeInt32(streamType); + data.writeInt32((int32_t) streamType); data.writeInt32(sampleRate); data.writeInt32(format); data.writeInt32(channelMask); @@ -249,42 +249,42 @@ public: return reply.readInt32(); } - virtual status_t setStreamVolume(int stream, float value, int output) + virtual status_t setStreamVolume(audio_stream_type_t stream, float value, int output) { Parcel data, reply; data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); - data.writeInt32(stream); + data.writeInt32((int32_t) stream); data.writeFloat(value); data.writeInt32(output); remote()->transact(SET_STREAM_VOLUME, data, &reply); return reply.readInt32(); } - virtual status_t setStreamMute(int stream, bool muted) + virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) { Parcel data, reply; data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); - data.writeInt32(stream); + data.writeInt32((int32_t) stream); data.writeInt32(muted); remote()->transact(SET_STREAM_MUTE, data, &reply); return reply.readInt32(); } - virtual float streamVolume(int stream, int output) const + virtual float streamVolume(audio_stream_type_t stream, int output) const { Parcel data, reply; data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); - data.writeInt32(stream); + data.writeInt32((int32_t) stream); data.writeInt32(output); remote()->transact(STREAM_VOLUME, data, &reply); return reply.readFloat(); } - virtual bool streamMute(int stream) const + virtual bool streamMute(audio_stream_type_t stream) const { Parcel data, reply; data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); - data.writeInt32(stream); + data.writeInt32((int32_t) stream); remote()->transact(STREAM_MUTE, data, &reply); return reply.readInt32(); } @@ -468,11 +468,11 @@ public: return reply.readInt32(); } - virtual status_t setStreamOutput(uint32_t stream, int output) + virtual status_t setStreamOutput(audio_stream_type_t stream, int output) { Parcel data, reply; data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); - data.writeInt32(stream); + data.writeInt32((int32_t) stream); data.writeInt32(output); remote()->transact(SET_STREAM_OUTPUT, data, &reply); return reply.readInt32(); @@ -687,7 +687,7 @@ status_t BnAudioFlinger::onTransact( int sessionId = data.readInt32(); status_t status; sp<IAudioTrack> track = createTrack(pid, - streamType, sampleRate, format, + (audio_stream_type_t) streamType, sampleRate, format, channelCount, bufferCount, flags, buffer, output, &sessionId, &status); reply->writeInt32(sessionId); reply->writeInt32(status); @@ -762,26 +762,26 @@ status_t BnAudioFlinger::onTransact( int stream = data.readInt32(); float volume = data.readFloat(); int output = data.readInt32(); - reply->writeInt32( setStreamVolume(stream, volume, output) ); + reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) ); return NO_ERROR; } break; case SET_STREAM_MUTE: { CHECK_INTERFACE(IAudioFlinger, data, reply); int stream = data.readInt32(); - reply->writeInt32( setStreamMute(stream, data.readInt32()) ); + reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) ); return NO_ERROR; } break; case STREAM_VOLUME: { CHECK_INTERFACE(IAudioFlinger, data, reply); int stream = data.readInt32(); int output = data.readInt32(); - reply->writeFloat( streamVolume(stream, output) ); + reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) ); return NO_ERROR; } break; case STREAM_MUTE: { CHECK_INTERFACE(IAudioFlinger, data, reply); int stream = data.readInt32(); - reply->writeInt32( streamMute(stream) ); + reply->writeInt32( streamMute((audio_stream_type_t) stream) ); return NO_ERROR; } break; case SET_MODE: { @@ -904,7 +904,7 @@ status_t BnAudioFlinger::onTransact( CHECK_INTERFACE(IAudioFlinger, data, reply); uint32_t stream = data.readInt32(); int output = data.readInt32(); - reply->writeInt32(setStreamOutput(stream, output)); + reply->writeInt32(setStreamOutput((audio_stream_type_t) stream, output)); return NO_ERROR; } break; case SET_VOICE_VOLUME: { diff --git a/media/libmedia/IAudioPolicyService.cpp b/media/libmedia/IAudioPolicyService.cpp index 50b4855a8e8d..67d9c458b18f 100644 --- a/media/libmedia/IAudioPolicyService.cpp +++ b/media/libmedia/IAudioPolicyService.cpp @@ -154,7 +154,7 @@ public: Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); data.writeInt32(output); - data.writeInt32(stream); + data.writeInt32((int32_t) stream); data.writeInt32(session); remote()->transact(START_OUTPUT, data, &reply); return static_cast <status_t> (reply.readInt32()); @@ -167,7 +167,7 @@ public: Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); data.writeInt32(output); - data.writeInt32(stream); + data.writeInt32((int32_t) stream); data.writeInt32(session); remote()->transact(STOP_OUTPUT, data, &reply); return static_cast <status_t> (reply.readInt32()); @@ -324,11 +324,11 @@ public: return static_cast <status_t> (reply.readInt32()); } - virtual bool isStreamActive(int stream, uint32_t inPastMs) const + virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const { Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); - data.writeInt32(stream); + data.writeInt32((int32_t) stream); data.writeInt32(inPastMs); remote()->transact(IS_STREAM_ACTIVE, data, &reply); return reply.readInt32(); @@ -598,9 +598,9 @@ status_t BnAudioPolicyService::onTransact( case IS_STREAM_ACTIVE: { CHECK_INTERFACE(IAudioPolicyService, data, reply); - int stream = data.readInt32(); + audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); uint32_t inPastMs = (uint32_t)data.readInt32(); - reply->writeInt32( isStreamActive(stream, inPastMs) ); + reply->writeInt32( isStreamActive((audio_stream_type_t) stream, inPastMs) ); return NO_ERROR; } break; diff --git a/media/libmedia/IMediaPlayer.cpp b/media/libmedia/IMediaPlayer.cpp index 9c1e6b727b38..64cc91972357 100644 --- a/media/libmedia/IMediaPlayer.cpp +++ b/media/libmedia/IMediaPlayer.cpp @@ -198,11 +198,11 @@ public: return reply.readInt32(); } - status_t setAudioStreamType(int type) + status_t setAudioStreamType(audio_stream_type_t stream) { Parcel data, reply; data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor()); - data.writeInt32(type); + data.writeInt32((int32_t) stream); remote()->transact(SET_AUDIO_STREAM_TYPE, data, &reply); return reply.readInt32(); } @@ -397,7 +397,7 @@ status_t BnMediaPlayer::onTransact( } break; case SET_AUDIO_STREAM_TYPE: { CHECK_INTERFACE(IMediaPlayer, data, reply); - reply->writeInt32(setAudioStreamType(data.readInt32())); + reply->writeInt32(setAudioStreamType((audio_stream_type_t) data.readInt32())); return NO_ERROR; } break; case SET_LOOPING: { diff --git a/media/libmedia/ToneGenerator.cpp b/media/libmedia/ToneGenerator.cpp index 9d3246000c19..5ceb912503ad 100644 --- a/media/libmedia/ToneGenerator.cpp +++ b/media/libmedia/ToneGenerator.cpp @@ -798,7 +798,7 @@ const unsigned char ToneGenerator::sToneMappingTable[NUM_REGIONS-1][NUM_SUP_TONE // none // //////////////////////////////////////////////////////////////////////////////// -ToneGenerator::ToneGenerator(int streamType, float volume, bool threadCanCallJava) { +ToneGenerator::ToneGenerator(audio_stream_type_t streamType, float volume, bool threadCanCallJava) { ALOGV("ToneGenerator constructor: streamType=%d, volume=%f\n", streamType, volume); diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp index 4be960c67c5c..acf97a67a8c6 100644 --- a/media/libmedia/mediaplayer.cpp +++ b/media/libmedia/mediaplayer.cpp @@ -478,7 +478,7 @@ status_t MediaPlayer::reset() return reset_l(); } -status_t MediaPlayer::setAudioStreamType(int type) +status_t MediaPlayer::setAudioStreamType(audio_stream_type_t type) { ALOGV("MediaPlayer::setAudioStreamType"); Mutex::Autolock _l(mLock); diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index af58cacb2deb..a0c20ae4a947 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -1010,7 +1010,7 @@ status_t MediaPlayerService::Client::reset() return p->reset(); } -status_t MediaPlayerService::Client::setAudioStreamType(int type) +status_t MediaPlayerService::Client::setAudioStreamType(audio_stream_type_t type) { ALOGV("[%d] setAudioStreamType(%d)", mConnId, type); // TODO: for hardware output, call player instead diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index 66f245dcada0..6b68b87ae028 100644 --- a/media/libmediaplayerservice/MediaPlayerService.h +++ b/media/libmediaplayerservice/MediaPlayerService.h @@ -92,7 +92,7 @@ class MediaPlayerService : public BnMediaPlayerService virtual void flush(); virtual void pause(); virtual void close(); - void setAudioStreamType(int streamType) { mStreamType = streamType; } + void setAudioStreamType(audio_stream_type_t streamType) { mStreamType = streamType; } void setVolume(float left, float right); status_t setAuxEffectSendLevel(float level); status_t attachAuxEffect(int effectId); @@ -108,7 +108,7 @@ class MediaPlayerService : public BnMediaPlayerService AudioTrack* mTrack; AudioCallback mCallback; void * mCallbackCookie; - int mStreamType; + audio_stream_type_t mStreamType; float mLeftVolume; float mRightVolume; float mMsecsPerFrame; @@ -149,7 +149,7 @@ class MediaPlayerService : public BnMediaPlayerService virtual void flush() {} virtual void pause() {} virtual void close() {} - void setAudioStreamType(int streamType) {} + void setAudioStreamType(audio_stream_type_t streamType) {} void setVolume(float left, float right) {} uint32_t sampleRate() const { return mSampleRate; } audio_format_t format() const { return mFormat; } @@ -259,7 +259,7 @@ private: virtual status_t getCurrentPosition(int* msec); virtual status_t getDuration(int* msec); virtual status_t reset(); - virtual status_t setAudioStreamType(int type); + virtual status_t setAudioStreamType(audio_stream_type_t type); virtual status_t setLooping(int loop); virtual status_t setVolume(float leftVolume, float rightVolume); virtual status_t invoke(const Parcel& request, Parcel *reply); diff --git a/media/libmediaplayerservice/MidiFile.h b/media/libmediaplayerservice/MidiFile.h index 2a0dcf9d17a2..dfe431814ec6 100644 --- a/media/libmediaplayerservice/MidiFile.h +++ b/media/libmediaplayerservice/MidiFile.h @@ -78,7 +78,7 @@ private: EAS_I32 mDuration; EAS_STATE mState; EAS_FILE mFileLocator; - int mStreamType; + audio_stream_type_t mStreamType; bool mLoop; volatile bool mExit; bool mPaused; diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index d0cb7ff6f7cb..8480b6d7466f 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -335,6 +335,14 @@ status_t AwesomePlayer::setDataSource_l( return UNKNOWN_ERROR; } + if (extractor->getDrmFlag()) { + checkDrmStatus(dataSource); + } + + return setDataSource_l(extractor); +} + +void AwesomePlayer::checkDrmStatus(const sp<DataSource>& dataSource) { dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient); if (mDecryptHandle != NULL) { CHECK(mDrmManagerClient); @@ -342,8 +350,6 @@ status_t AwesomePlayer::setDataSource_l( notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE); } } - - return setDataSource_l(extractor); } status_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) { @@ -2095,7 +2101,7 @@ status_t AwesomePlayer::finishSetDataSource_l() { String8 mimeType; float confidence; sp<AMessage> dummy; - bool success = SniffDRM(dataSource, &mimeType, &confidence, &dummy); + bool success = SniffWVM(dataSource, &mimeType, &confidence, &dummy); if (!success || strcasecmp( @@ -2115,13 +2121,8 @@ status_t AwesomePlayer::finishSetDataSource_l() { } } - dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient); - - if (mDecryptHandle != NULL) { - CHECK(mDrmManagerClient); - if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) { - notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE); - } + if (extractor->getDrmFlag()) { + checkDrmStatus(dataSource); } status_t err = setDataSource_l(extractor); diff --git a/media/libstagefright/DRMExtractor.cpp b/media/libstagefright/DRMExtractor.cpp index 9452ab17180a..afc4a803518d 100644 --- a/media/libstagefright/DRMExtractor.cpp +++ b/media/libstagefright/DRMExtractor.cpp @@ -282,13 +282,13 @@ bool SniffDRM( if (decryptHandle != NULL) { if (decryptHandle->decryptApiType == DecryptApiType::CONTAINER_BASED) { *mimeType = String8("drm+container_based+") + decryptHandle->mimeType; + *confidence = 10.0f; } else if (decryptHandle->decryptApiType == DecryptApiType::ELEMENTARY_STREAM_BASED) { *mimeType = String8("drm+es_based+") + decryptHandle->mimeType; - } else if (decryptHandle->decryptApiType == DecryptApiType::WV_BASED) { - *mimeType = MEDIA_MIMETYPE_CONTAINER_WVM; - ALOGW("SniffWVM: found match\n"); + *confidence = 10.0f; + } else { + return false; } - *confidence = 10.0f; return true; } diff --git a/media/libstagefright/DataSource.cpp b/media/libstagefright/DataSource.cpp index e471f73da59b..d0a788088301 100644 --- a/media/libstagefright/DataSource.cpp +++ b/media/libstagefright/DataSource.cpp @@ -32,6 +32,7 @@ #include "include/DRMExtractor.h" #include "include/FLACExtractor.h" #include "include/AACExtractor.h" +#include "include/WVMExtractor.h" #include "matroska/MatroskaExtractor.h" @@ -120,6 +121,7 @@ void DataSource::RegisterDefaultSniffers() { RegisterSniffer(SniffAAC); RegisterSniffer(SniffAVI); RegisterSniffer(SniffMPEG2PS); + RegisterSniffer(SniffWVM); char value[PROPERTY_VALUE_MAX]; if (property_get("drm.service.enabled", value, NULL) diff --git a/media/libstagefright/FileSource.cpp b/media/libstagefright/FileSource.cpp index 73cb48c74248..01f53e4b6eb6 100644 --- a/media/libstagefright/FileSource.cpp +++ b/media/libstagefright/FileSource.cpp @@ -127,7 +127,7 @@ status_t FileSource::getSize(off64_t *size) { return OK; } -sp<DecryptHandle> FileSource::DrmInitialization() { +sp<DecryptHandle> FileSource::DrmInitialization(const char *mime) { if (mDrmManagerClient == NULL) { mDrmManagerClient = new DrmManagerClient(); } @@ -138,7 +138,7 @@ sp<DecryptHandle> FileSource::DrmInitialization() { if (mDecryptHandle == NULL) { mDecryptHandle = mDrmManagerClient->openDecryptSession( - mFd, mOffset, mLength); + mFd, mOffset, mLength, mime); } if (mDecryptHandle == NULL) { diff --git a/media/libstagefright/NuCachedSource2.cpp b/media/libstagefright/NuCachedSource2.cpp index 249c29854a03..693c506879e4 100644 --- a/media/libstagefright/NuCachedSource2.cpp +++ b/media/libstagefright/NuCachedSource2.cpp @@ -603,8 +603,8 @@ void NuCachedSource2::resumeFetchingIfNecessary() { restartPrefetcherIfNecessary_l(true /* ignore low water threshold */); } -sp<DecryptHandle> NuCachedSource2::DrmInitialization() { - return mSource->DrmInitialization(); +sp<DecryptHandle> NuCachedSource2::DrmInitialization(const char* mime) { + return mSource->DrmInitialization(mime); } void NuCachedSource2::getDrmInfo(sp<DecryptHandle> &handle, DrmManagerClient **client) { diff --git a/media/libstagefright/WVMExtractor.cpp b/media/libstagefright/WVMExtractor.cpp index 2092cb6d55af..1e4e049edb7f 100644 --- a/media/libstagefright/WVMExtractor.cpp +++ b/media/libstagefright/WVMExtractor.cpp @@ -45,17 +45,12 @@ namespace android { static Mutex gWVMutex; WVMExtractor::WVMExtractor(const sp<DataSource> &source) - : mDataSource(source) { - { - Mutex::Autolock autoLock(gWVMutex); - if (gVendorLibHandle == NULL) { - gVendorLibHandle = dlopen("libwvm.so", RTLD_NOW); - } + : mDataSource(source) +{ + Mutex::Autolock autoLock(gWVMutex); - if (gVendorLibHandle == NULL) { - ALOGE("Failed to open libwvm.so"); - return; - } + if (!getVendorLibHandle()) { + return; } typedef WVMLoadableExtractor *(*GetInstanceFunc)(sp<DataSource>); @@ -64,13 +59,28 @@ WVMExtractor::WVMExtractor(const sp<DataSource> &source) "_ZN7android11GetInstanceENS_2spINS_10DataSourceEEE"); if (getInstanceFunc) { + CHECK(source->DrmInitialization(MEDIA_MIMETYPE_CONTAINER_WVM) != NULL); mImpl = (*getInstanceFunc)(source); CHECK(mImpl != NULL); + setDrmFlag(true); } else { ALOGE("Failed to locate GetInstance in libwvm.so"); } } +bool WVMExtractor::getVendorLibHandle() +{ + if (gVendorLibHandle == NULL) { + gVendorLibHandle = dlopen("libwvm.so", RTLD_NOW); + } + + if (gVendorLibHandle == NULL) { + ALOGE("Failed to open libwvm.so"); + } + + return gVendorLibHandle != NULL; +} + WVMExtractor::~WVMExtractor() { } @@ -113,5 +123,33 @@ void WVMExtractor::setAdaptiveStreamingMode(bool adaptive) { } } +bool SniffWVM( + const sp<DataSource> &source, String8 *mimeType, float *confidence, + sp<AMessage> *) { + + Mutex::Autolock autoLock(gWVMutex); + + if (!WVMExtractor::getVendorLibHandle()) { + return false; + } + + typedef WVMLoadableExtractor *(*SnifferFunc)(const sp<DataSource>&); + SnifferFunc snifferFunc = + (SnifferFunc) dlsym(gVendorLibHandle, + "_ZN7android15IsWidevineMediaERKNS_2spINS_10DataSourceEEE"); + + if (snifferFunc) { + if ((*snifferFunc)(source)) { + *mimeType = MEDIA_MIMETYPE_CONTAINER_WVM; + *confidence = 10.0f; + return true; + } + } else { + ALOGE("IsWidevineMedia not found in libwvm.so"); + } + + return false; +} + } //namespace android diff --git a/media/libstagefright/chromium_http/ChromiumHTTPDataSource.cpp b/media/libstagefright/chromium_http/ChromiumHTTPDataSource.cpp index 180460b5e33d..76f7946229e9 100644 --- a/media/libstagefright/chromium_http/ChromiumHTTPDataSource.cpp +++ b/media/libstagefright/chromium_http/ChromiumHTTPDataSource.cpp @@ -259,7 +259,7 @@ void ChromiumHTTPDataSource::onDisconnectComplete() { mCondition.broadcast(); } -sp<DecryptHandle> ChromiumHTTPDataSource::DrmInitialization() { +sp<DecryptHandle> ChromiumHTTPDataSource::DrmInitialization(const char* mime) { Mutex::Autolock autoLock(mLock); if (mDrmManagerClient == NULL) { @@ -275,7 +275,7 @@ sp<DecryptHandle> ChromiumHTTPDataSource::DrmInitialization() { * original one */ mDecryptHandle = mDrmManagerClient->openDecryptSession( - String8(mURI.c_str())); + String8(mURI.c_str()), mime); } if (mDecryptHandle == NULL) { diff --git a/media/libstagefright/codecs/aacenc/Android.mk b/media/libstagefright/codecs/aacenc/Android.mk index f9cc6a3fb879..8318ba4479fb 100644 --- a/media/libstagefright/codecs/aacenc/Android.mk +++ b/media/libstagefright/codecs/aacenc/Android.mk @@ -59,7 +59,7 @@ LOCAL_MODULE := libstagefright_aacenc LOCAL_ARM_MODE := arm -LOCAL_STATIC_LIBRARIES := +LOCAL_STATIC_LIBRARIES := LOCAL_SHARED_LIBRARIES := diff --git a/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c b/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c index 2ea944931872..2f31de4aed72 100644 --- a/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c +++ b/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c @@ -29,11 +29,11 @@ #include "cmnMemory.h" #define VO_AAC_E_OUTPUT 1 -#define READ_SIZE (1024*8) +#define READ_SIZE (1024*8) unsigned char outBuf[1024*8]; unsigned char inBuf[READ_SIZE]; -const char* HelpString = +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" @@ -49,7 +49,7 @@ static int parsecmdline(int argc, char **argv,char **input_filename, char **ou { // notice that: // bitRate/nChannels > 8000 - // bitRate/nChannels < 160000 + // bitRate/nChannels < 160000 // bitRate/nChannels < sampleRate*6 param->adtsUsed = 1; param->bitRate = 0; @@ -69,7 +69,7 @@ static int parsecmdline(int argc, char **argv,char **input_filename, char **ou { argv++; argc--; - *input_filename = *argv; + *input_filename = *argv; } else if (!strcmp(*argv, "-of")) { diff --git a/media/libstagefright/codecs/aacenc/basic_op/basic_op.h b/media/libstagefright/codecs/aacenc/basic_op/basic_op.h index 8291684a0fd8..ef3c31bad98e 100644 --- a/media/libstagefright/codecs/aacenc/basic_op/basic_op.h +++ b/media/libstagefright/codecs/aacenc/basic_op/basic_op.h @@ -91,7 +91,7 @@ __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); @@ -119,7 +119,7 @@ __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); @@ -227,48 +227,48 @@ Word32 L_shr_r (Word32 L_var1, Word16 var2); #if ARMV4_INASM __inline Word32 ASM_L_shr(Word32 L_var1, Word16 var2) { - Word32 result; - asm volatile( - "MOV %[result], %[L_var1], ASR %[var2] \n" + Word32 result; + asm volatile( + "MOV %[result], %[L_var1], ASR %[var2] \n" :[result]"=r"(result) :[L_var1]"r"(L_var1), [var2]"r"(var2) - ); - return result; + ); + return result; } - + __inline Word32 ASM_L_shl(Word32 L_var1, Word16 var2) { - Word32 result; - asm volatile( + Word32 result; + asm volatile( "MOV r2, %[L_var1] \n" "MOV r3, #0x7fffffff\n" - "MOV %[result], %[L_var1], ASL %[var2] \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; + ); + return result; } __inline Word32 ASM_shr(Word32 L_var1, Word16 var2) { - Word32 result; - asm volatile( + 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; -} + :[L_var1]"r"(L_var1), [var2]"r"(var2) + ); + return result; +} __inline Word32 ASM_shl(Word32 L_var1, Word16 var2) { - Word32 result; - asm volatile( + Word32 result; + asm volatile( "CMP %[var2], #16\n" "MOVGE %[var2], #16\n" "MOV %[result], %[L_var1], ASL %[var2]\n" @@ -280,9 +280,9 @@ __inline Word32 ASM_shl(Word32 L_var1, Word16 var2) :[result]"+r"(result) :[L_var1]"r"(L_var1), [var2]"r"(var2) :"r2", "r3" - ); - return result; -} + ); + return result; +} #endif /*___________________________________________________________________________ @@ -300,17 +300,17 @@ __inline Word16 saturate(Word32 L_var1) "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" + "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" + :"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) @@ -419,13 +419,13 @@ __inline Word16 shr (Word16 var1, Word16 var2) __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" + 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; @@ -449,14 +449,14 @@ __inline Word32 L_mult(Word16 var1, Word16 var2) __inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2) { #if ARMV5TE_L_MSU - Word32 result; - asm volatile( - "SMULBB %[result], %[var1], %[var2] \n" + 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; @@ -473,12 +473,12 @@ __inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2) __inline Word32 L_sub(Word32 L_var1, Word32 L_var2) { #if ARMV5TE_L_SUB - Word32 result; - asm volatile( + 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; @@ -588,9 +588,9 @@ __inline Word32 L_shr (Word32 L_var1, Word16 var2) __inline Word16 add (Word16 var1, Word16 var2) { #if ARMV5TE_ADD - Word32 result; - asm volatile( - "ADD %[result], %[var1], %[var2] \n" + 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" @@ -599,7 +599,7 @@ __inline Word16 add (Word16 var1, Word16 var2) :[result]"+r"(result) :[var1]"r"(var1), [var2]"r"(var2) :"r2", "r3" - ); + ); return result; #else Word16 var_out; @@ -618,18 +618,18 @@ __inline Word16 add (Word16 var1, Word16 var2) __inline Word16 sub(Word16 var1, Word16 var2) { #if ARMV5TE_SUB - Word32 result; - asm volatile( + Word32 result; + asm volatile( "MOV r3, #1\n" - "SUB %[result], %[var1], %[var2] \n" + "SUB %[result], %[var1], %[var2] \n" "RSB r3,r3,r3,LSL#15\n" - "MOV r2, %[var1], ASR #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; @@ -637,7 +637,7 @@ __inline Word16 sub(Word16 var1, Word16 var2) L_diff = (Word32) var1 - var2; var_out = saturate(L_diff); - + return (var_out); #endif } @@ -657,16 +657,16 @@ __inline Word16 div_s (Word16 var1, Word16 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; @@ -683,8 +683,8 @@ __inline Word16 div_s (Word16 var1, Word16 var2) __inline Word16 mult (Word16 var1, Word16 var2) { #if ARMV5TE_MULT - Word32 result; - asm volatile( + Word32 result; + asm volatile( "SMULBB r2, %[var1], %[var2] \n" "MOV r3, #1\n" "MOV %[result], r2, ASR #15\n" @@ -695,7 +695,7 @@ __inline Word16 mult (Word16 var1, Word16 var2) :[result]"+r"(result) :[var1]"r"(var1), [var2]"r"(var2) :"r2", "r3" - ); + ); return result; #else Word16 var_out; @@ -718,8 +718,8 @@ __inline Word16 mult (Word16 var1, Word16 var2) __inline Word16 norm_s (Word16 var1) { #if ARMV5TE_NORM_S - Word16 result; - asm volatile( + Word16 result; + asm volatile( "MOV r2,%[var1] \n" "CMP r2, #0\n" "RSBLT %[var1], %[var1], #0 \n" @@ -727,11 +727,11 @@ __inline Word16 norm_s (Word16 var1) "SUBNE %[result], %[result], #17\n" "MOVEQ %[result], #0\n" "CMP r2, #-1\n" - "MOVEQ %[result], #15\n" + "MOVEQ %[result], #15\n" :[result]"+r"(result) :[var1]"r"(var1) :"r2" - ); + ); return result; #else Word16 var_out; @@ -768,15 +768,15 @@ __inline Word16 norm_s (Word16 var1) __inline Word16 norm_l (Word32 L_var1) { #if ARMV5TE_NORM_L - Word16 result; - asm volatile( + Word16 result; + asm volatile( "CMP %[L_var1], #0\n" "CLZNE %[result], %[L_var1]\n" - "SUBNE %[result], %[result], #1\n" + "SUBNE %[result], %[result], #1\n" "MOVEQ %[result], #0\n" :[result]"+r"(result) :[L_var1]"r"(L_var1) - ); + ); return result; #else //Word16 var_out; @@ -805,84 +805,84 @@ __inline Word16 norm_l (Word32 L_var1) //} //return (var_out); Word16 a16; - Word16 r = 0 ; + Word16 r = 0 ; + - if ( L_var1 < 0 ) { - L_var1 = ~L_var1; + 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 { - + } + 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; } @@ -892,38 +892,38 @@ __inline Word16 norm_l (Word32 L_var1) } 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; } @@ -931,35 +931,35 @@ __inline Word16 norm_l (Word32 L_var1) } } 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; } @@ -967,7 +967,7 @@ __inline Word16 norm_l (Word32 L_var1) } } } - + return r ; #endif } @@ -978,17 +978,17 @@ __inline Word16 norm_l (Word32 L_var1) __inline Word16 round16(Word32 L_var1) { #if ARMV5TE_ROUND - Word16 result; - asm volatile( + Word16 result; + asm volatile( "MOV r1,#0x00008000\n" "QADD %[result], %[L_var1], r1\n" - "MOV %[result], %[result], ASR #16 \n" + "MOV %[result], %[result], ASR #16 \n" :[result]"+r"(result) :[L_var1]"r"(L_var1) :"r1" - ); + ); return result; -#else +#else Word16 var_out; Word32 L_rounded; @@ -1004,14 +1004,14 @@ __inline Word16 round16(Word32 L_var1) __inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2) { #if ARMV5TE_L_MAC - Word32 result; - asm volatile( + 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; @@ -1028,12 +1028,12 @@ __inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2) __inline Word32 L_add (Word32 L_var1, Word32 L_var2) { #if ARMV5TE_L_ADD - Word32 result; - asm volatile( + 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; @@ -1114,7 +1114,7 @@ __inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2) L_var3 = L_msu (L_var3, var1, var2); var_out = (Word16)((L_var3 + 0x8000L) >> 16); - + return (var_out); } #endif diff --git a/media/libstagefright/codecs/aacenc/basic_op/basicop2.c b/media/libstagefright/codecs/aacenc/basic_op/basicop2.c index 82d3f38fe45d..d43bbd99eb50 100644 --- a/media/libstagefright/codecs/aacenc/basic_op/basicop2.c +++ b/media/libstagefright/codecs/aacenc/basic_op/basicop2.c @@ -16,7 +16,7 @@ /******************************************************************************* File: basicop2.c - Content: Basic arithmetic operators. + Content: Basic arithmetic operators. *******************************************************************************/ @@ -462,7 +462,7 @@ Word32 L_mult(Word16 var1, Word16 var2) { L_var_out = MAX_32; } - + return (L_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 0ad82f0b5322..e48af9d51f77 100644 --- a/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c +++ b/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c @@ -17,7 +17,7 @@ File: oper_32b.c Content: This file contains operations in double precision. - + *******************************************************************************/ #include "typedef.h" @@ -200,12 +200,12 @@ Word32 Div_32 (Word32 L_num, Word32 denom) } /*! - - \brief calculates the log dualis times 4 of argument + + \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) { @@ -225,7 +225,7 @@ Word16 iLog4(Word32 value) iLog4 = (-(iLog4 << 2) - norm_s(tmp16)) - 1; } else { - iLog4 = -128; /* -(INT_BITS*4); */ + iLog4 = -128; /* -(INT_BITS*4); */ } return iLog4; @@ -268,79 +268,79 @@ Word32 rsqrt(Word32 value, /*!< Operand to square root (0.0 ... 1) */ } 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 +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 - + + \brief calculates 2 ^ (x/y) for x<=0, y > 0, x <= 32768 * y + avoids integer division - - \return + + \return */ Word32 pow2_xy(Word32 x, Word32 y) { @@ -355,7 +355,7 @@ Word32 pow2_xy(Word32 x, Word32 y) fPart = tmp2 - iPart*y; iPart = min(iPart,INT_BITS-1); - res = pow2Table[(POW2_TABLE_SIZE*fPart)/y] >> iPart; - + 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 1d35e5e90ac8..9ebd1c29d774 100644 --- a/media/libstagefright/codecs/aacenc/basic_op/oper_32b.h +++ b/media/libstagefright/codecs/aacenc/basic_op/oper_32b.h @@ -51,21 +51,21 @@ __inline Word32 L_mpy_ls(Word32 L_var2, Word16 var1) 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" + 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; @@ -75,9 +75,9 @@ __inline Word32 L_mpy_wx(Word32 L_var2, Word16 var1) swLow1 = (unsigned short)(L_var2); swHigh1 = (Word16)(L_var2 >> 16); - l_var_out = (long)swLow1 * (long)var1 >> 16; + l_var_out = (long)swLow1 * (long)var1 >> 16; l_var_out += swHigh1 * var1; - + return(l_var_out); #endif } diff --git a/media/libstagefright/codecs/aacenc/basic_op/typedef.h b/media/libstagefright/codecs/aacenc/basic_op/typedef.h index 103080371583..b1f8225e4631 100644 --- a/media/libstagefright/codecs/aacenc/basic_op/typedef.h +++ b/media/libstagefright/codecs/aacenc/basic_op/typedef.h @@ -30,7 +30,7 @@ /* * 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; diff --git a/media/libstagefright/codecs/aacenc/basic_op/typedefs.h b/media/libstagefright/codecs/aacenc/basic_op/typedefs.h index c7e774b75f25..c924e2c2b165 100644 --- a/media/libstagefright/codecs/aacenc/basic_op/typedefs.h +++ b/media/libstagefright/codecs/aacenc/basic_op/typedefs.h @@ -55,7 +55,7 @@ #define INT_BITS 32 /* ******************************************************************************** -* DEFINITION OF CONSTANTS +* DEFINITION OF CONSTANTS ******************************************************************************** */ /* @@ -120,12 +120,12 @@ typedef unsigned __int64 UWord64; #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 @@ -149,7 +149,7 @@ typedef unsigned __int64 UWord64; #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_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 diff --git a/media/libstagefright/codecs/aacenc/inc/aac_rom.h b/media/libstagefright/codecs/aacenc/inc/aac_rom.h index 784bb709a196..8e206b7fb056 100644 --- a/media/libstagefright/codecs/aacenc/inc/aac_rom.h +++ b/media/libstagefright/codecs/aacenc/inc/aac_rom.h @@ -16,7 +16,7 @@ /******************************************************************************* File: aac_rom.h - Content: constant tables + Content: constant tables *******************************************************************************/ diff --git a/media/libstagefright/codecs/aacenc/inc/aacenc_core.h b/media/libstagefright/codecs/aacenc/inc/aacenc_core.h index 41ba75671683..1acdbbcb705d 100644 --- a/media/libstagefright/codecs/aacenc/inc/aacenc_core.h +++ b/media/libstagefright/codecs/aacenc/inc/aacenc_core.h @@ -47,7 +47,7 @@ typedef struct { typedef struct { - + AACENC_CONFIG config; /* Word16 size: 8 */ ELEMENT_INFO elInfo; /* Word16 size: 4 */ diff --git a/media/libstagefright/codecs/aacenc/inc/adj_thr.h b/media/libstagefright/codecs/aacenc/inc/adj_thr.h index f7cb88880bd5..0f4bb5e6ccd9 100644 --- a/media/libstagefright/codecs/aacenc/inc/adj_thr.h +++ b/media/libstagefright/codecs/aacenc/inc/adj_thr.h @@ -16,7 +16,7 @@ /******************************************************************************* File: adj_thr.h - Content: Threshold compensation function + Content: Threshold compensation function *******************************************************************************/ @@ -44,7 +44,7 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState, PSY_OUT_ELEMENT *psyOutElement, Word16 *chBitDistribution, Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB], - Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB], + Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB], QC_OUT_ELEMENT* qcOE, ELEMENT_BITS* elBits, const Word16 nChannels, diff --git a/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h b/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h index 9ac466417b03..30132d854c1d 100644 --- a/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h +++ b/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h @@ -16,7 +16,7 @@ /******************************************************************************* File: adj_thr_data.h - Content: Threshold compensation parameter + Content: Threshold compensation parameter *******************************************************************************/ diff --git a/media/libstagefright/codecs/aacenc/inc/bitenc.h b/media/libstagefright/codecs/aacenc/inc/bitenc.h index 6ded3c6c94c6..6a58aebe9390 100644 --- a/media/libstagefright/codecs/aacenc/inc/bitenc.h +++ b/media/libstagefright/codecs/aacenc/inc/bitenc.h @@ -26,7 +26,7 @@ #include "qc_data.h" #include "tns.h" #include "channel_map.h" -#include "interface.h" +#include "interface.h" struct BITSTREAMENCODER_INIT { diff --git a/media/libstagefright/codecs/aacenc/inc/interface.h b/media/libstagefright/codecs/aacenc/inc/interface.h index 966ac99f4724..a42e6a9cd742 100644 --- a/media/libstagefright/codecs/aacenc/inc/interface.h +++ b/media/libstagefright/codecs/aacenc/inc/interface.h @@ -55,11 +55,11 @@ typedef struct { Word16 windowShape; Word16 groupingMask; Word16 sfbOffsets[MAX_GROUPED_SFB+1]; - Word16 mdctScale; - Word32 *sfbEnergy; + Word16 mdctScale; + Word32 *sfbEnergy; Word32 *sfbSpreadedEnergy; - Word32 *sfbThreshold; - Word32 *mdctSpectrum; + Word32 *sfbThreshold; + Word32 *mdctSpectrum; Word32 sfbEnSumLR; Word32 sfbEnSumMS; Word32 sfbDist[MAX_GROUPED_SFB]; diff --git a/media/libstagefright/codecs/aacenc/inc/line_pe.h b/media/libstagefright/codecs/aacenc/inc/line_pe.h index 038d5a3b3e8e..116d5a8c4bc3 100644 --- a/media/libstagefright/codecs/aacenc/inc/line_pe.h +++ b/media/libstagefright/codecs/aacenc/inc/line_pe.h @@ -24,8 +24,8 @@ #define __LINE_PE_H -#include "psy_const.h" -#include "interface.h" +#include "psy_const.h" +#include "interface.h" typedef struct { @@ -72,4 +72,4 @@ void calcSfbPe(PE_DATA *peData, -#endif +#endif diff --git a/media/libstagefright/codecs/aacenc/inc/psy_const.h b/media/libstagefright/codecs/aacenc/inc/psy_const.h index b05d683b1753..19fb9b2e1eea 100644 --- a/media/libstagefright/codecs/aacenc/inc/psy_const.h +++ b/media/libstagefright/codecs/aacenc/inc/psy_const.h @@ -69,7 +69,7 @@ enum #define BLOCK_SWITCHING_OFFSET (1*1024+3*128+64+128) #define BLOCK_SWITCHING_DATA_SIZE FRAME_LEN_LONG - + #define TRANSFORM_OFFSET_LONG 0 #define TRANSFORM_OFFSET_SHORT 448 diff --git a/media/libstagefright/codecs/aacenc/inc/psy_main.h b/media/libstagefright/codecs/aacenc/inc/psy_main.h index 5fcbe1330796..2ccac60b37bf 100644 --- a/media/libstagefright/codecs/aacenc/inc/psy_main.h +++ b/media/libstagefright/codecs/aacenc/inc/psy_main.h @@ -54,9 +54,9 @@ Word16 psyMainInit( PSY_KERNEL *hPsy, Word16 bandwidth); -Word16 psyMain(Word16 nChannels, /*!< total number of channels */ +Word16 psyMain(Word16 nChannels, /*!< total number of channels */ ELEMENT_INFO *elemInfo, - Word16 *timeSignal, /*!< interleaved time signal */ + Word16 *timeSignal, /*!< interleaved time signal */ PSY_DATA psyData[MAX_CHANNELS], TNS_DATA tnsData[MAX_CHANNELS], PSY_CONFIGURATION_LONG* psyConfLong, diff --git a/media/libstagefright/codecs/aacenc/inc/qc_main.h b/media/libstagefright/codecs/aacenc/inc/qc_main.h index 924a06d9b78a..8f8397304da4 100644 --- a/media/libstagefright/codecs/aacenc/inc/qc_main.h +++ b/media/libstagefright/codecs/aacenc/inc/qc_main.h @@ -35,7 +35,7 @@ void QCOutDelete(QC_OUT *hQC, VO_MEM_OPERATOR *pMemOP); Word16 QCNew(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP); -Word16 QCInit(QC_STATE *hQC, +Word16 QCInit(QC_STATE *hQC, struct QC_INIT *init); void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP); diff --git a/media/libstagefright/codecs/aacenc/inc/quantize.h b/media/libstagefright/codecs/aacenc/inc/quantize.h index 7dac2bf20d3b..1cafef69c1bf 100644 --- a/media/libstagefright/codecs/aacenc/inc/quantize.h +++ b/media/libstagefright/codecs/aacenc/inc/quantize.h @@ -28,7 +28,7 @@ #define MAX_QUANT 8191 -void QuantizeSpectrum(Word16 sfbCnt, +void QuantizeSpectrum(Word16 sfbCnt, Word16 maxSfbPerGroup, Word16 sfbPerGroup, Word16 *sfbOffset, Word32 *mdctSpectrum, diff --git a/media/libstagefright/codecs/aacenc/inc/sf_estim.h b/media/libstagefright/codecs/aacenc/inc/sf_estim.h index 11436a219a43..9039f25481e0 100644 --- a/media/libstagefright/codecs/aacenc/inc/sf_estim.h +++ b/media/libstagefright/codecs/aacenc/inc/sf_estim.h @@ -23,7 +23,7 @@ #ifndef __SF_ESTIM_H__ #define __SF_ESTIM_H__ /* - Scale factor estimation + Scale factor estimation */ #include "psy_const.h" #include "interface.h" diff --git a/media/libstagefright/codecs/aacenc/inc/stat_bits.h b/media/libstagefright/codecs/aacenc/inc/stat_bits.h index fff3d148cd6c..9cddc1d54b8f 100644 --- a/media/libstagefright/codecs/aacenc/inc/stat_bits.h +++ b/media/libstagefright/codecs/aacenc/inc/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_param.h b/media/libstagefright/codecs/aacenc/inc/tns_param.h index 78265bbc1be1..0aa33c3531a9 100644 --- a/media/libstagefright/codecs/aacenc/inc/tns_param.h +++ b/media/libstagefright/codecs/aacenc/inc/tns_param.h @@ -44,7 +44,7 @@ typedef struct{ }TNS_INFO_TAB; -void GetTnsParam(TNS_CONFIG_TABULATED *tnsConfigTab, +void GetTnsParam(TNS_CONFIG_TABULATED *tnsConfigTab, Word32 bitRate, Word16 channels, Word16 blockType); void GetTnsMaxBands(Word32 samplingRate, Word16 blockType, Word16* tnsMaxSfb); diff --git a/media/libstagefright/codecs/aacenc/inc/transform.h b/media/libstagefright/codecs/aacenc/inc/transform.h index 93d5ffe22f3d..fbac7aa68796 100644 --- a/media/libstagefright/codecs/aacenc/inc/transform.h +++ b/media/libstagefright/codecs/aacenc/inc/transform.h @@ -24,7 +24,7 @@ #define __TRANSFORM_H__ #include "typedef.h" - + void Transform_Real(Word16 *mdctDelayBuffer, Word16 *timeSignal, Word16 chIncrement, /*! channel increment */ diff --git a/media/libstagefright/codecs/aacenc/src/aac_rom.c b/media/libstagefright/codecs/aacenc/src/aac_rom.c index 16b44e010500..08792e842b56 100644 --- a/media/libstagefright/codecs/aacenc/src/aac_rom.c +++ b/media/libstagefright/codecs/aacenc/src/aac_rom.c @@ -24,14 +24,14 @@ #if defined (ARMV5E) && !defined (ARMV7Neon) -/* - * Q30 for 128 and 1024 +/* + * 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); @@ -39,313 +39,313 @@ */ 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, + 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, + 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 + 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 + 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 +/* + * 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); @@ -353,313 +353,313 @@ const int twidTab64[(4*6 + 16*6)/2] = { */ 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, - 0x1fa39bac, 0x04cadefe, 0x055fc022, 0x1f8ba738, 0x1f830f4a, 0x059146a1, 0x062585ca, 0x1f677557, - 0x1f5da6ed, 0x0656d27a, 0x06ea58cd, 0x1f3e6bbc, 0x1f33685a, 0x071b6415, 0x07ae1ad2, 0x1f1090bd, - 0x1f045a15, 0x07dedd20, 0x0870ada7, 0x1eddeb6a, 0x1ed0835f, 0x08a11f78, 0x0931f34d, 0x1ea68394, - 0x1e97ec36, 0x09620d27, 0x09f1cdf5, 0x1e6a61c5, 0x1e5a9d55, 0x0a21886e, 0x0ab02009, 0x1e298f44, - 0x1e18a030, 0x0adf73c6, 0x0b6ccc32, 0x1de4160f, 0x1dd1fef4, 0x0b9bb1e5, 0x0c27b555, 0x1d9a00de, - 0x1d86c484, 0x0c5625c3, 0x0ce0bea2, 0x1d4b5b1b, 0x1d36fc7c, 0x0d0eb2a2, 0x0d97cb8f, 0x1cf830e9, - 0x1ce2b328, 0x0dc53c0a, 0x0e4cbfe2, 0x1ca08f1a, 0x1c89f587, 0x0e79a5d7, 0x0eff7fb3, 0x1c448331, - 0x1c2cd149, 0x0f2bd437, 0x0fafef73, 0x1be41b61, 0x1bcb54cb, 0x0fdbabae, 0x105df3ec, 0x1b7f6687, - 0x1b658f15, 0x10891120, 0x11097249, 0x1b16742a, 0x1afb8fd9, 0x1133e9d0, 0x11b25017, 0x1aa9547a, - 0x1a8d676e, 0x11dc1b65, 0x1258734d, 0x1a38184a, 0x1a1b26d3, 0x12818bef, 0x12fbc24b, 0x19c2d111, - 0x19a4dfa4, 0x132421ec, 0x139c23e4, 0x194990e4, 0x192aa420, 0x13c3c44a, 0x14397f5b, 0x18cc6a75, - 0x18ac871f, 0x14605a69, 0x14d3bc6d, 0x184b7112, 0x182a9c14, 0x14f9cc26, 0x156ac352, 0x17c6b89d, + 0x1ffff621, 0x001921f9, 0x00afea69, 0x1ffe1c68, 0x1ffce09d, 0x00e22a7a, 0x0178dbaa, 0x1ff753bb, + 0x1ff4dc55, 0x01ab101c, 0x024192cf, 0x1feb9d25, 0x1fe7ea85, 0x0273b3e2, 0x0309f0e2, 0x1fdafa75, + 0x1fd60d2e, 0x033bf6dd, 0x03d1d700, 0x1fc56e3b, 0x1fbf470f, 0x0403ba2b, 0x04992653, 0x1faafbcb, + 0x1fa39bac, 0x04cadefe, 0x055fc022, 0x1f8ba738, 0x1f830f4a, 0x059146a1, 0x062585ca, 0x1f677557, + 0x1f5da6ed, 0x0656d27a, 0x06ea58cd, 0x1f3e6bbc, 0x1f33685a, 0x071b6415, 0x07ae1ad2, 0x1f1090bd, + 0x1f045a15, 0x07dedd20, 0x0870ada7, 0x1eddeb6a, 0x1ed0835f, 0x08a11f78, 0x0931f34d, 0x1ea68394, + 0x1e97ec36, 0x09620d27, 0x09f1cdf5, 0x1e6a61c5, 0x1e5a9d55, 0x0a21886e, 0x0ab02009, 0x1e298f44, + 0x1e18a030, 0x0adf73c6, 0x0b6ccc32, 0x1de4160f, 0x1dd1fef4, 0x0b9bb1e5, 0x0c27b555, 0x1d9a00de, + 0x1d86c484, 0x0c5625c3, 0x0ce0bea2, 0x1d4b5b1b, 0x1d36fc7c, 0x0d0eb2a2, 0x0d97cb8f, 0x1cf830e9, + 0x1ce2b328, 0x0dc53c0a, 0x0e4cbfe2, 0x1ca08f1a, 0x1c89f587, 0x0e79a5d7, 0x0eff7fb3, 0x1c448331, + 0x1c2cd149, 0x0f2bd437, 0x0fafef73, 0x1be41b61, 0x1bcb54cb, 0x0fdbabae, 0x105df3ec, 0x1b7f6687, + 0x1b658f15, 0x10891120, 0x11097249, 0x1b16742a, 0x1afb8fd9, 0x1133e9d0, 0x11b25017, 0x1aa9547a, + 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, + 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, - 0x00000000, 0x20000000, 0xf3c10ead, 0x1d906bcf, 0xe95f619a, 0x16a09e66, 0xe26f9431, 0x0c3ef153, - 0x16a09e66, 0x16a09e66, 0x11c73b3a, 0x1a9b6629, 0x0c3ef153, 0x1d906bcf, 0x063e2e0f, 0x1f6297d0, - 0xe95f619a, 0x16a09e66, 0xe09d6830, 0x063e2e0f, 0xe26f9431, 0xf3c10ead, 0xee38c4c6, 0xe56499d7, - - 0x20000000, 0x00000000, 0x1fd88da4, 0x0322f4d8, 0x1f6297d0, 0x063e2e0f, 0x1e9f4157, 0x094a0317, - 0x20000000, 0x00000000, 0x1ff621e3, 0x0191f65f, 0x1fd88da4, 0x0322f4d8, 0x1fa7557f, 0x04b2041c, - 0x20000000, 0x00000000, 0x1fa7557f, 0x04b2041c, 0x1e9f4157, 0x094a0317, 0x1ced7af4, 0x0dae8805, - 0x1d906bcf, 0x0c3ef153, 0x1c38b2f2, 0x0f15ae9c, 0x1a9b6629, 0x11c73b3a, 0x18bc806b, 0x144cf325, - 0x1f6297d0, 0x063e2e0f, 0x1f0a7efc, 0x07c67e5f, 0x1e9f4157, 0x094a0317, 0x1e212105, 0x0ac7cd3b, - 0x1a9b6629, 0x11c73b3a, 0x17b5df22, 0x157d6935, 0x144cf325, 0x18bc806b, 0x10738799, 0x1b728345, - 0x16a09e66, 0x16a09e66, 0x144cf325, 0x18bc806b, 0x11c73b3a, 0x1a9b6629, 0x0f15ae9c, 0x1c38b2f2, - 0x1d906bcf, 0x0c3ef153, 0x1ced7af4, 0x0dae8805, 0x1c38b2f2, 0x0f15ae9c, 0x1b728345, 0x10738799, - 0x0c3ef153, 0x1d906bcf, 0x07c67e5f, 0x1f0a7efc, 0x0322f4d8, 0x1fd88da4, 0xfe6e09a1, 0x1ff621e3, - 0x0c3ef153, 0x1d906bcf, 0x094a0317, 0x1e9f4157, 0x063e2e0f, 0x1f6297d0, 0x0322f4d8, 0x1fd88da4, - 0x1a9b6629, 0x11c73b3a, 0x19b3e048, 0x130ff7fd, 0x18bc806b, 0x144cf325, 0x17b5df22, 0x157d6935, - 0xf9c1d1f1, 0x1f6297d0, 0xf53832c5, 0x1e212105, 0xf0ea5164, 0x1c38b2f2, 0xecf00803, 0x19b3e048, - 0x00000000, 0x20000000, 0xfcdd0b28, 0x1fd88da4, 0xf9c1d1f1, 0x1f6297d0, 0xf6b5fce9, 0x1e9f4157, - 0x16a09e66, 0x16a09e66, 0x157d6935, 0x17b5df22, 0x144cf325, 0x18bc806b, 0x130ff7fd, 0x19b3e048, - 0xe95f619a, 0x16a09e66, 0xe64c1fb8, 0x130ff7fd, 0xe3c74d0e, 0x0f15ae9c, 0xe1dedefb, 0x0ac7cd3b, - 0xf3c10ead, 0x1d906bcf, 0xf0ea5164, 0x1c38b2f2, 0xee38c4c6, 0x1a9b6629, 0xebb30cdb, 0x18bc806b, - 0x11c73b3a, 0x1a9b6629, 0x10738799, 0x1b728345, 0x0f15ae9c, 0x1c38b2f2, 0x0dae8805, 0x1ced7af4, - 0xe09d6830, 0x063e2e0f, 0xe009de1d, 0x0191f65f, 0xe027725c, 0xfcdd0b28, 0xe0f58104, 0xf83981a1, - 0xe95f619a, 0x16a09e66, 0xe7437f95, 0x144cf325, 0xe56499d7, 0x11c73b3a, 0xe3c74d0e, 0x0f15ae9c, - 0x0c3ef153, 0x1d906bcf, 0x0ac7cd3b, 0x1e212105, 0x094a0317, 0x1e9f4157, 0x07c67e5f, 0x1f0a7efc, - 0xe26f9431, 0xf3c10ead, 0xe48d7cbb, 0xef8c7867, 0xe7437f95, 0xebb30cdb, 0xea8296cb, 0xe84a20de, - 0xe26f9431, 0x0c3ef153, 0xe160bea9, 0x094a0317, 0xe09d6830, 0x063e2e0f, 0xe027725c, 0x0322f4d8, - 0x063e2e0f, 0x1f6297d0, 0x04b2041c, 0x1fa7557f, 0x0322f4d8, 0x1fd88da4, 0x0191f65f, 0x1ff621e3, - 0xee38c4c6, 0xe56499d7, 0xf25177fb, 0xe312850c, 0xf6b5fce9, 0xe160bea9, 0xfb4dfbe4, 0xe058aa81, - - 0x20000000, 0x00000000, 0x1ffd8861, 0x00c90ab0, 0x1ff621e3, 0x0191f65f, 0x1fe9cdad, 0x025aa412, - 0x20000000, 0x00000000, 0x1fff6217, 0x00648748, 0x1ffd8861, 0x00c90ab0, 0x1ffa72f0, 0x012d8657, - 0x20000000, 0x00000000, 0x1ffa72f0, 0x012d8657, 0x1fe9cdad, 0x025aa412, 0x1fce15fd, 0x0386f0b9, - 0x1fd88da4, 0x0322f4d8, 0x1fc26471, 0x03eac9cb, 0x1fa7557f, 0x04b2041c, 0x1f8764fa, 0x05788511, - 0x1ff621e3, 0x0191f65f, 0x1ff09566, 0x01f656e8, 0x1fe9cdad, 0x025aa412, 0x1fe1cafd, 0x02beda01, - 0x1fa7557f, 0x04b2041c, 0x1f7599a4, 0x05db7678, 0x1f38f3ac, 0x0702e09b, 0x1ef178a4, 0x0827dc07, - 0x1f6297d0, 0x063e2e0f, 0x1f38f3ac, 0x0702e09b, 0x1f0a7efc, 0x07c67e5f, 0x1ed740e7, 0x0888e931, - 0x1fd88da4, 0x0322f4d8, 0x1fce15fd, 0x0386f0b9, 0x1fc26471, 0x03eac9cb, 0x1fb57972, 0x044e7c34, - 0x1e9f4157, 0x094a0317, 0x1e426a4b, 0x0a68f121, 0x1ddb13b7, 0x0b844298, 0x1d696174, 0x0c9b9532, - 0x1e9f4157, 0x094a0317, 0x1e6288ec, 0x0a09ae4a, 0x1e212105, 0x0ac7cd3b, 0x1ddb13b7, 0x0b844298, - 0x1fa7557f, 0x04b2041c, 0x1f97f925, 0x05155dac, 0x1f8764fa, 0x05788511, 0x1f7599a4, 0x05db7678, - 0x1ced7af4, 0x0dae8805, 0x1c678b35, 0x0ebcbbae, 0x1bd7c0ac, 0x0fc5d26e, 0x1b3e4d3f, 0x10c9704d, - 0x1d906bcf, 0x0c3ef153, 0x1d4134d1, 0x0cf7bca2, 0x1ced7af4, 0x0dae8805, 0x1c954b21, 0x0e63374d, - 0x1f6297d0, 0x063e2e0f, 0x1f4e603b, 0x06a0a809, 0x1f38f3ac, 0x0702e09b, 0x1f2252f7, 0x0764d3f9, - 0x1a9b6629, 0x11c73b3a, 0x19ef43ef, 0x12bedb26, 0x193a224a, 0x13affa29, 0x187c4010, 0x149a449c, - 0x1c38b2f2, 0x0f15ae9c, 0x1bd7c0ac, 0x0fc5d26e, 0x1b728345, 0x10738799, 0x1b090a58, 0x111eb354, - 0x1f0a7efc, 0x07c67e5f, 0x1ef178a4, 0x0827dc07, 0x1ed740e7, 0x0888e931, 0x1ebbd8c9, 0x08e9a220, - 0x17b5df22, 0x157d6935, 0x16e74455, 0x16591926, 0x1610b755, 0x172d0838, 0x15328293, 0x17f8ece3, - 0x1a9b6629, 0x11c73b3a, 0x1a29a7a0, 0x126d054d, 0x19b3e048, 0x130ff7fd, 0x193a224a, 0x13affa29, - 0x1e9f4157, 0x094a0317, 0x1e817bab, 0x09aa0861, 0x1e6288ec, 0x0a09ae4a, 0x1e426a4b, 0x0a68f121, - 0x144cf325, 0x18bc806b, 0x136058b1, 0x19777ef5, 0x126d054d, 0x1a29a7a0, 0x11734d64, 0x1ad2bc9e, - 0x18bc806b, 0x144cf325, 0x183b0e0c, 0x14e6cabc, 0x17b5df22, 0x157d6935, 0x172d0838, 0x1610b755, - 0x1e212105, 0x0ac7cd3b, 0x1dfeae62, 0x0b263eef, 0x1ddb13b7, 0x0b844298, 0x1db65262, 0x0be1d499, - 0x10738799, 0x1b728345, 0x0f6e0ca9, 0x1c08c426, 0x0e63374d, 0x1c954b21, 0x0d536416, 0x1d17e774, - 0x16a09e66, 0x16a09e66, 0x1610b755, 0x172d0838, 0x157d6935, 0x17b5df22, 0x14e6cabc, 0x183b0e0c, - 0x1d906bcf, 0x0c3ef153, 0x1d696174, 0x0c9b9532, 0x1d4134d1, 0x0cf7bca2, 0x1d17e774, 0x0d536416, - 0x0c3ef153, 0x1d906bcf, 0x0b263eef, 0x1dfeae62, 0x0a09ae4a, 0x1e6288ec, 0x08e9a220, 0x1ebbd8c9, - 0x144cf325, 0x18bc806b, 0x13affa29, 0x193a224a, 0x130ff7fd, 0x19b3e048, 0x126d054d, 0x1a29a7a0, - 0x1ced7af4, 0x0dae8805, 0x1cc1f0f4, 0x0e0924ec, 0x1c954b21, 0x0e63374d, 0x1c678b35, 0x0ebcbbae, - 0x07c67e5f, 0x1f0a7efc, 0x06a0a809, 0x1f4e603b, 0x05788511, 0x1f8764fa, 0x044e7c34, 0x1fb57972, - 0x11c73b3a, 0x1a9b6629, 0x111eb354, 0x1b090a58, 0x10738799, 0x1b728345, 0x0fc5d26e, 0x1bd7c0ac, - 0x1c38b2f2, 0x0f15ae9c, 0x1c08c426, 0x0f6e0ca9, 0x1bd7c0ac, 0x0fc5d26e, 0x1ba5aa67, 0x101cfc87, - 0x0322f4d8, 0x1fd88da4, 0x01f656e8, 0x1ff09566, 0x00c90ab0, 0x1ffd8861, 0xff9b78b8, 0x1fff6217, - 0x0f15ae9c, 0x1c38b2f2, 0x0e63374d, 0x1c954b21, 0x0dae8805, 0x1ced7af4, 0x0cf7bca2, 0x1d4134d1, - 0x1b728345, 0x10738799, 0x1b3e4d3f, 0x10c9704d, 0x1b090a58, 0x111eb354, 0x1ad2bc9e, 0x11734d64, - 0xfe6e09a1, 0x1ff621e3, 0xfd4125ff, 0x1fe1cafd, 0xfc153635, 0x1fc26471, 0xfaeaa254, 0x1f97f925, - 0x0c3ef153, 0x1d906bcf, 0x0b844298, 0x1ddb13b7, 0x0ac7cd3b, 0x1e212105, 0x0a09ae4a, 0x1e6288ec, - 0x1a9b6629, 0x11c73b3a, 0x1a63091b, 0x121a7999, 0x1a29a7a0, 0x126d054d, 0x19ef43ef, 0x12bedb26, - 0xf9c1d1f1, 0x1f6297d0, 0xf89b2c07, 0x1f2252f7, 0xf77716cf, 0x1ed740e7, 0xf655f79f, 0x1e817bab, - 0x094a0317, 0x1e9f4157, 0x0888e931, 0x1ed740e7, 0x07c67e5f, 0x1f0a7efc, 0x0702e09b, 0x1f38f3ac, - 0x19b3e048, 0x130ff7fd, 0x19777ef5, 0x136058b1, 0x193a224a, 0x13affa29, 0x18fbcca4, 0x13fed953, - 0xf53832c5, 0x1e212105, 0xf41e2b67, 0x1db65262, 0xf308435e, 0x1d4134d1, 0xf1f6db14, 0x1cc1f0f4, - 0x063e2e0f, 0x1f6297d0, 0x05788511, 0x1f8764fa, 0x04b2041c, 0x1fa7557f, 0x03eac9cb, 0x1fc26471, - 0x18bc806b, 0x144cf325, 0x187c4010, 0x149a449c, 0x183b0e0c, 0x14e6cabc, 0x17f8ece3, 0x15328293, - 0xf0ea5164, 0x1c38b2f2, 0xefe30379, 0x1ba5aa67, 0xeee14cac, 0x1b090a58, 0xede58667, 0x1a63091b, - 0x0322f4d8, 0x1fd88da4, 0x025aa412, 0x1fe9cdad, 0x0191f65f, 0x1ff621e3, 0x00c90ab0, 0x1ffd8861, - 0x17b5df22, 0x157d6935, 0x1771e75f, 0x15c77bbe, 0x172d0838, 0x1610b755, 0x16e74455, 0x16591926, - 0xecf00803, 0x19b3e048, 0xec0126ad, 0x18fbcca4, 0xeb193544, 0x183b0e0c, 0xea388442, 0x1771e75f, - 0x00000000, 0x20000000, 0xff36f550, 0x1ffd8861, 0xfe6e09a1, 0x1ff621e3, 0xfda55bee, 0x1fe9cdad, - 0x16a09e66, 0x16a09e66, 0x16591926, 0x16e74455, 0x1610b755, 0x172d0838, 0x15c77bbe, 0x1771e75f, - 0xe95f619a, 0x16a09e66, 0xe88e18a1, 0x15c77bbe, 0xe7c4f1f4, 0x14e6cabc, 0xe704335c, 0x13fed953, - 0xfcdd0b28, 0x1fd88da4, 0xfc153635, 0x1fc26471, 0xfb4dfbe4, 0x1fa7557f, 0xfa877aef, 0x1f8764fa, - 0x157d6935, 0x17b5df22, 0x15328293, 0x17f8ece3, 0x14e6cabc, 0x183b0e0c, 0x149a449c, 0x187c4010, - 0xe64c1fb8, 0x130ff7fd, 0xe59cf6e5, 0x121a7999, 0xe4f6f5a8, 0x111eb354, 0xe45a5599, 0x101cfc87, - 0xf9c1d1f1, 0x1f6297d0, 0xf8fd1f65, 0x1f38f3ac, 0xf83981a1, 0x1f0a7efc, 0xf77716cf, 0x1ed740e7, - 0x144cf325, 0x18bc806b, 0x13fed953, 0x18fbcca4, 0x13affa29, 0x193a224a, 0x136058b1, 0x19777ef5, - 0xe3c74d0e, 0x0f15ae9c, 0xe33e0f0c, 0x0e0924ec, 0xe2becb2f, 0x0cf7bca2, 0xe249ad9e, 0x0be1d499, - 0xf6b5fce9, 0x1e9f4157, 0xf5f651b6, 0x1e6288ec, 0xf53832c5, 0x1e212105, 0xf47bbd68, 0x1ddb13b7, - 0x130ff7fd, 0x19b3e048, 0x12bedb26, 0x19ef43ef, 0x126d054d, 0x1a29a7a0, 0x121a7999, 0x1a63091b, - 0xe1dedefb, 0x0ac7cd3b, 0xe17e8455, 0x09aa0861, 0xe128bf19, 0x0888e931, 0xe0ddad09, 0x0764d3f9, - 0xf3c10ead, 0x1d906bcf, 0xf308435e, 0x1d4134d1, 0xf25177fb, 0x1ced7af4, 0xf19cc8b3, 0x1c954b21, - 0x11c73b3a, 0x1a9b6629, 0x11734d64, 0x1ad2bc9e, 0x111eb354, 0x1b090a58, 0x10c9704d, 0x1b3e4d3f, - 0xe09d6830, 0x063e2e0f, 0xe06806db, 0x05155dac, 0xe03d9b8f, 0x03eac9cb, 0xe01e3503, 0x02beda01, - 0xf0ea5164, 0x1c38b2f2, 0xf03a2d92, 0x1bd7c0ac, 0xef8c7867, 0x1b728345, 0xeee14cac, 0x1b090a58, - 0x10738799, 0x1b728345, 0x101cfc87, 0x1ba5aa67, 0x0fc5d26e, 0x1bd7c0ac, 0x0f6e0ca9, 0x1c08c426, - 0xe009de1d, 0x0191f65f, 0xe0009de9, 0x00648748, 0xe002779f, 0xff36f550, 0xe00f6a9a, 0xfe09a918, - 0xee38c4c6, 0x1a9b6629, 0xed92fab3, 0x1a29a7a0, 0xecf00803, 0x19b3e048, 0xec5005d7, 0x193a224a, - 0x0f15ae9c, 0x1c38b2f2, 0x0ebcbbae, 0x1c678b35, 0x0e63374d, 0x1c954b21, 0x0e0924ec, 0x1cc1f0f4, - 0xe027725c, 0xfcdd0b28, 0xe04a868e, 0xfbb183cc, 0xe0789b06, 0xfa877aef, 0xe0b19fc5, 0xf95f57f7, - 0xebb30cdb, 0x18bc806b, 0xeb193544, 0x183b0e0c, 0xea8296cb, 0x17b5df22, 0xe9ef48ab, 0x172d0838, - 0x0dae8805, 0x1ced7af4, 0x0d536416, 0x1d17e774, 0x0cf7bca2, 0x1d4134d1, 0x0c9b9532, 0x1d696174, - 0xe0f58104, 0xf83981a1, 0xe1442737, 0xf7165de0, 0xe19d7714, 0xf5f651b6, 0xe201519e, 0xf4d9c111, - 0xe95f619a, 0x16a09e66, 0xe8d2f7c8, 0x1610b755, 0xe84a20de, 0x157d6935, 0xe7c4f1f4, 0x14e6cabc, - 0x0c3ef153, 0x1d906bcf, 0x0be1d499, 0x1db65262, 0x0b844298, 0x1ddb13b7, 0x0b263eef, 0x1dfeae62, - 0xe26f9431, 0xf3c10ead, 0xe2e8188c, 0xf2ac9bea, 0xe36ab4df, 0xf19cc8b3, 0xe3f73bda, 0xf091f357, - 0xe7437f95, 0x144cf325, 0xe6c5ddb6, 0x13affa29, 0xe64c1fb8, 0x130ff7fd, 0xe5d65860, 0x126d054d, - 0x0ac7cd3b, 0x1e212105, 0x0a68f121, 0x1e426a4b, 0x0a09ae4a, 0x1e6288ec, 0x09aa0861, 0x1e817bab, - 0xe48d7cbb, 0xef8c7867, 0xe52d4362, 0xee8cb29c, 0xe5d65860, 0xed92fab3, 0xe688810b, 0xec9fa74f, - 0xe56499d7, 0x11c73b3a, 0xe4f6f5a8, 0x111eb354, 0xe48d7cbb, 0x10738799, 0xe4283f54, 0x0fc5d26e, - 0x094a0317, 0x1e9f4157, 0x08e9a220, 0x1ebbd8c9, 0x0888e931, 0x1ed740e7, 0x0827dc07, 0x1ef178a4, - 0xe7437f95, 0xebb30cdb, 0xe807131d, 0xeacd7d6d, 0xe8d2f7c8, 0xe9ef48ab, 0xe9a6e6da, 0xe918bbab, - 0xe3c74d0e, 0x0f15ae9c, 0xe36ab4df, 0x0e63374d, 0xe312850c, 0x0dae8805, 0xe2becb2f, 0x0cf7bca2, - 0x07c67e5f, 0x1f0a7efc, 0x0764d3f9, 0x1f2252f7, 0x0702e09b, 0x1f38f3ac, 0x06a0a809, 0x1f4e603b, - 0xea8296cb, 0xe84a20de, 0xeb65bb64, 0xe783bff0, 0xec5005d7, 0xe6c5ddb6, 0xed4124da, 0xe610bc11, - 0xe26f9431, 0x0c3ef153, 0xe224ec49, 0x0b844298, 0xe1dedefb, 0x0ac7cd3b, 0xe19d7714, 0x0a09ae4a, - 0x063e2e0f, 0x1f6297d0, 0x05db7678, 0x1f7599a4, 0x05788511, 0x1f8764fa, 0x05155dac, 0x1f97f925, - 0xee38c4c6, 0xe56499d7, 0xef368fb3, 0xe4c1b2c1, 0xf03a2d92, 0xe4283f54, 0xf1434452, 0xe39874cb, - 0xe160bea9, 0x094a0317, 0xe128bf19, 0x0888e931, 0xe0f58104, 0x07c67e5f, 0xe0c70c54, 0x0702e09b, - 0x04b2041c, 0x1fa7557f, 0x044e7c34, 0x1fb57972, 0x03eac9cb, 0x1fc26471, 0x0386f0b9, 0x1fce15fd, - 0xf25177fb, 0xe312850c, 0xf3646ace, 0xe2969e8c, 0xf47bbd68, 0xe224ec49, 0xf5970edf, 0xe1bd95b5, - 0xe09d6830, 0x063e2e0f, 0xe0789b06, 0x05788511, 0xe058aa81, 0x04b2041c, 0xe03d9b8f, 0x03eac9cb, - 0x0322f4d8, 0x1fd88da4, 0x02beda01, 0x1fe1cafd, 0x025aa412, 0x1fe9cdad, 0x01f656e8, 0x1ff09566, - 0xf6b5fce9, 0xe160bea9, 0xf7d823f9, 0xe10e875c, 0xf8fd1f65, 0xe0c70c54, 0xfa248988, 0xe08a665c, - 0xe027725c, 0x0322f4d8, 0xe0163253, 0x025aa412, 0xe009de1d, 0x0191f65f, 0xe002779f, 0x00c90ab0, - 0x0191f65f, 0x1ff621e3, 0x012d8657, 0x1ffa72f0, 0x00c90ab0, 0x1ffd8861, 0x00648748, 0x1fff6217, + 0x20000000, 0x00000000, 0x1d906bcf, 0x0c3ef153, 0x16a09e66, 0x16a09e66, 0x0c3ef153, 0x1d906bcf, + 0x20000000, 0x00000000, 0x1f6297d0, 0x063e2e0f, 0x1d906bcf, 0x0c3ef153, 0x1a9b6629, 0x11c73b3a, + 0x20000000, 0x00000000, 0x1a9b6629, 0x11c73b3a, 0x0c3ef153, 0x1d906bcf, 0xf9c1d1f1, 0x1f6297d0, + 0x00000000, 0x20000000, 0xf3c10ead, 0x1d906bcf, 0xe95f619a, 0x16a09e66, 0xe26f9431, 0x0c3ef153, + 0x16a09e66, 0x16a09e66, 0x11c73b3a, 0x1a9b6629, 0x0c3ef153, 0x1d906bcf, 0x063e2e0f, 0x1f6297d0, + 0xe95f619a, 0x16a09e66, 0xe09d6830, 0x063e2e0f, 0xe26f9431, 0xf3c10ead, 0xee38c4c6, 0xe56499d7, + + 0x20000000, 0x00000000, 0x1fd88da4, 0x0322f4d8, 0x1f6297d0, 0x063e2e0f, 0x1e9f4157, 0x094a0317, + 0x20000000, 0x00000000, 0x1ff621e3, 0x0191f65f, 0x1fd88da4, 0x0322f4d8, 0x1fa7557f, 0x04b2041c, + 0x20000000, 0x00000000, 0x1fa7557f, 0x04b2041c, 0x1e9f4157, 0x094a0317, 0x1ced7af4, 0x0dae8805, + 0x1d906bcf, 0x0c3ef153, 0x1c38b2f2, 0x0f15ae9c, 0x1a9b6629, 0x11c73b3a, 0x18bc806b, 0x144cf325, + 0x1f6297d0, 0x063e2e0f, 0x1f0a7efc, 0x07c67e5f, 0x1e9f4157, 0x094a0317, 0x1e212105, 0x0ac7cd3b, + 0x1a9b6629, 0x11c73b3a, 0x17b5df22, 0x157d6935, 0x144cf325, 0x18bc806b, 0x10738799, 0x1b728345, + 0x16a09e66, 0x16a09e66, 0x144cf325, 0x18bc806b, 0x11c73b3a, 0x1a9b6629, 0x0f15ae9c, 0x1c38b2f2, + 0x1d906bcf, 0x0c3ef153, 0x1ced7af4, 0x0dae8805, 0x1c38b2f2, 0x0f15ae9c, 0x1b728345, 0x10738799, + 0x0c3ef153, 0x1d906bcf, 0x07c67e5f, 0x1f0a7efc, 0x0322f4d8, 0x1fd88da4, 0xfe6e09a1, 0x1ff621e3, + 0x0c3ef153, 0x1d906bcf, 0x094a0317, 0x1e9f4157, 0x063e2e0f, 0x1f6297d0, 0x0322f4d8, 0x1fd88da4, + 0x1a9b6629, 0x11c73b3a, 0x19b3e048, 0x130ff7fd, 0x18bc806b, 0x144cf325, 0x17b5df22, 0x157d6935, + 0xf9c1d1f1, 0x1f6297d0, 0xf53832c5, 0x1e212105, 0xf0ea5164, 0x1c38b2f2, 0xecf00803, 0x19b3e048, + 0x00000000, 0x20000000, 0xfcdd0b28, 0x1fd88da4, 0xf9c1d1f1, 0x1f6297d0, 0xf6b5fce9, 0x1e9f4157, + 0x16a09e66, 0x16a09e66, 0x157d6935, 0x17b5df22, 0x144cf325, 0x18bc806b, 0x130ff7fd, 0x19b3e048, + 0xe95f619a, 0x16a09e66, 0xe64c1fb8, 0x130ff7fd, 0xe3c74d0e, 0x0f15ae9c, 0xe1dedefb, 0x0ac7cd3b, + 0xf3c10ead, 0x1d906bcf, 0xf0ea5164, 0x1c38b2f2, 0xee38c4c6, 0x1a9b6629, 0xebb30cdb, 0x18bc806b, + 0x11c73b3a, 0x1a9b6629, 0x10738799, 0x1b728345, 0x0f15ae9c, 0x1c38b2f2, 0x0dae8805, 0x1ced7af4, + 0xe09d6830, 0x063e2e0f, 0xe009de1d, 0x0191f65f, 0xe027725c, 0xfcdd0b28, 0xe0f58104, 0xf83981a1, + 0xe95f619a, 0x16a09e66, 0xe7437f95, 0x144cf325, 0xe56499d7, 0x11c73b3a, 0xe3c74d0e, 0x0f15ae9c, + 0x0c3ef153, 0x1d906bcf, 0x0ac7cd3b, 0x1e212105, 0x094a0317, 0x1e9f4157, 0x07c67e5f, 0x1f0a7efc, + 0xe26f9431, 0xf3c10ead, 0xe48d7cbb, 0xef8c7867, 0xe7437f95, 0xebb30cdb, 0xea8296cb, 0xe84a20de, + 0xe26f9431, 0x0c3ef153, 0xe160bea9, 0x094a0317, 0xe09d6830, 0x063e2e0f, 0xe027725c, 0x0322f4d8, + 0x063e2e0f, 0x1f6297d0, 0x04b2041c, 0x1fa7557f, 0x0322f4d8, 0x1fd88da4, 0x0191f65f, 0x1ff621e3, + 0xee38c4c6, 0xe56499d7, 0xf25177fb, 0xe312850c, 0xf6b5fce9, 0xe160bea9, 0xfb4dfbe4, 0xe058aa81, + + 0x20000000, 0x00000000, 0x1ffd8861, 0x00c90ab0, 0x1ff621e3, 0x0191f65f, 0x1fe9cdad, 0x025aa412, + 0x20000000, 0x00000000, 0x1fff6217, 0x00648748, 0x1ffd8861, 0x00c90ab0, 0x1ffa72f0, 0x012d8657, + 0x20000000, 0x00000000, 0x1ffa72f0, 0x012d8657, 0x1fe9cdad, 0x025aa412, 0x1fce15fd, 0x0386f0b9, + 0x1fd88da4, 0x0322f4d8, 0x1fc26471, 0x03eac9cb, 0x1fa7557f, 0x04b2041c, 0x1f8764fa, 0x05788511, + 0x1ff621e3, 0x0191f65f, 0x1ff09566, 0x01f656e8, 0x1fe9cdad, 0x025aa412, 0x1fe1cafd, 0x02beda01, + 0x1fa7557f, 0x04b2041c, 0x1f7599a4, 0x05db7678, 0x1f38f3ac, 0x0702e09b, 0x1ef178a4, 0x0827dc07, + 0x1f6297d0, 0x063e2e0f, 0x1f38f3ac, 0x0702e09b, 0x1f0a7efc, 0x07c67e5f, 0x1ed740e7, 0x0888e931, + 0x1fd88da4, 0x0322f4d8, 0x1fce15fd, 0x0386f0b9, 0x1fc26471, 0x03eac9cb, 0x1fb57972, 0x044e7c34, + 0x1e9f4157, 0x094a0317, 0x1e426a4b, 0x0a68f121, 0x1ddb13b7, 0x0b844298, 0x1d696174, 0x0c9b9532, + 0x1e9f4157, 0x094a0317, 0x1e6288ec, 0x0a09ae4a, 0x1e212105, 0x0ac7cd3b, 0x1ddb13b7, 0x0b844298, + 0x1fa7557f, 0x04b2041c, 0x1f97f925, 0x05155dac, 0x1f8764fa, 0x05788511, 0x1f7599a4, 0x05db7678, + 0x1ced7af4, 0x0dae8805, 0x1c678b35, 0x0ebcbbae, 0x1bd7c0ac, 0x0fc5d26e, 0x1b3e4d3f, 0x10c9704d, + 0x1d906bcf, 0x0c3ef153, 0x1d4134d1, 0x0cf7bca2, 0x1ced7af4, 0x0dae8805, 0x1c954b21, 0x0e63374d, + 0x1f6297d0, 0x063e2e0f, 0x1f4e603b, 0x06a0a809, 0x1f38f3ac, 0x0702e09b, 0x1f2252f7, 0x0764d3f9, + 0x1a9b6629, 0x11c73b3a, 0x19ef43ef, 0x12bedb26, 0x193a224a, 0x13affa29, 0x187c4010, 0x149a449c, + 0x1c38b2f2, 0x0f15ae9c, 0x1bd7c0ac, 0x0fc5d26e, 0x1b728345, 0x10738799, 0x1b090a58, 0x111eb354, + 0x1f0a7efc, 0x07c67e5f, 0x1ef178a4, 0x0827dc07, 0x1ed740e7, 0x0888e931, 0x1ebbd8c9, 0x08e9a220, + 0x17b5df22, 0x157d6935, 0x16e74455, 0x16591926, 0x1610b755, 0x172d0838, 0x15328293, 0x17f8ece3, + 0x1a9b6629, 0x11c73b3a, 0x1a29a7a0, 0x126d054d, 0x19b3e048, 0x130ff7fd, 0x193a224a, 0x13affa29, + 0x1e9f4157, 0x094a0317, 0x1e817bab, 0x09aa0861, 0x1e6288ec, 0x0a09ae4a, 0x1e426a4b, 0x0a68f121, + 0x144cf325, 0x18bc806b, 0x136058b1, 0x19777ef5, 0x126d054d, 0x1a29a7a0, 0x11734d64, 0x1ad2bc9e, + 0x18bc806b, 0x144cf325, 0x183b0e0c, 0x14e6cabc, 0x17b5df22, 0x157d6935, 0x172d0838, 0x1610b755, + 0x1e212105, 0x0ac7cd3b, 0x1dfeae62, 0x0b263eef, 0x1ddb13b7, 0x0b844298, 0x1db65262, 0x0be1d499, + 0x10738799, 0x1b728345, 0x0f6e0ca9, 0x1c08c426, 0x0e63374d, 0x1c954b21, 0x0d536416, 0x1d17e774, + 0x16a09e66, 0x16a09e66, 0x1610b755, 0x172d0838, 0x157d6935, 0x17b5df22, 0x14e6cabc, 0x183b0e0c, + 0x1d906bcf, 0x0c3ef153, 0x1d696174, 0x0c9b9532, 0x1d4134d1, 0x0cf7bca2, 0x1d17e774, 0x0d536416, + 0x0c3ef153, 0x1d906bcf, 0x0b263eef, 0x1dfeae62, 0x0a09ae4a, 0x1e6288ec, 0x08e9a220, 0x1ebbd8c9, + 0x144cf325, 0x18bc806b, 0x13affa29, 0x193a224a, 0x130ff7fd, 0x19b3e048, 0x126d054d, 0x1a29a7a0, + 0x1ced7af4, 0x0dae8805, 0x1cc1f0f4, 0x0e0924ec, 0x1c954b21, 0x0e63374d, 0x1c678b35, 0x0ebcbbae, + 0x07c67e5f, 0x1f0a7efc, 0x06a0a809, 0x1f4e603b, 0x05788511, 0x1f8764fa, 0x044e7c34, 0x1fb57972, + 0x11c73b3a, 0x1a9b6629, 0x111eb354, 0x1b090a58, 0x10738799, 0x1b728345, 0x0fc5d26e, 0x1bd7c0ac, + 0x1c38b2f2, 0x0f15ae9c, 0x1c08c426, 0x0f6e0ca9, 0x1bd7c0ac, 0x0fc5d26e, 0x1ba5aa67, 0x101cfc87, + 0x0322f4d8, 0x1fd88da4, 0x01f656e8, 0x1ff09566, 0x00c90ab0, 0x1ffd8861, 0xff9b78b8, 0x1fff6217, + 0x0f15ae9c, 0x1c38b2f2, 0x0e63374d, 0x1c954b21, 0x0dae8805, 0x1ced7af4, 0x0cf7bca2, 0x1d4134d1, + 0x1b728345, 0x10738799, 0x1b3e4d3f, 0x10c9704d, 0x1b090a58, 0x111eb354, 0x1ad2bc9e, 0x11734d64, + 0xfe6e09a1, 0x1ff621e3, 0xfd4125ff, 0x1fe1cafd, 0xfc153635, 0x1fc26471, 0xfaeaa254, 0x1f97f925, + 0x0c3ef153, 0x1d906bcf, 0x0b844298, 0x1ddb13b7, 0x0ac7cd3b, 0x1e212105, 0x0a09ae4a, 0x1e6288ec, + 0x1a9b6629, 0x11c73b3a, 0x1a63091b, 0x121a7999, 0x1a29a7a0, 0x126d054d, 0x19ef43ef, 0x12bedb26, + 0xf9c1d1f1, 0x1f6297d0, 0xf89b2c07, 0x1f2252f7, 0xf77716cf, 0x1ed740e7, 0xf655f79f, 0x1e817bab, + 0x094a0317, 0x1e9f4157, 0x0888e931, 0x1ed740e7, 0x07c67e5f, 0x1f0a7efc, 0x0702e09b, 0x1f38f3ac, + 0x19b3e048, 0x130ff7fd, 0x19777ef5, 0x136058b1, 0x193a224a, 0x13affa29, 0x18fbcca4, 0x13fed953, + 0xf53832c5, 0x1e212105, 0xf41e2b67, 0x1db65262, 0xf308435e, 0x1d4134d1, 0xf1f6db14, 0x1cc1f0f4, + 0x063e2e0f, 0x1f6297d0, 0x05788511, 0x1f8764fa, 0x04b2041c, 0x1fa7557f, 0x03eac9cb, 0x1fc26471, + 0x18bc806b, 0x144cf325, 0x187c4010, 0x149a449c, 0x183b0e0c, 0x14e6cabc, 0x17f8ece3, 0x15328293, + 0xf0ea5164, 0x1c38b2f2, 0xefe30379, 0x1ba5aa67, 0xeee14cac, 0x1b090a58, 0xede58667, 0x1a63091b, + 0x0322f4d8, 0x1fd88da4, 0x025aa412, 0x1fe9cdad, 0x0191f65f, 0x1ff621e3, 0x00c90ab0, 0x1ffd8861, + 0x17b5df22, 0x157d6935, 0x1771e75f, 0x15c77bbe, 0x172d0838, 0x1610b755, 0x16e74455, 0x16591926, + 0xecf00803, 0x19b3e048, 0xec0126ad, 0x18fbcca4, 0xeb193544, 0x183b0e0c, 0xea388442, 0x1771e75f, + 0x00000000, 0x20000000, 0xff36f550, 0x1ffd8861, 0xfe6e09a1, 0x1ff621e3, 0xfda55bee, 0x1fe9cdad, + 0x16a09e66, 0x16a09e66, 0x16591926, 0x16e74455, 0x1610b755, 0x172d0838, 0x15c77bbe, 0x1771e75f, + 0xe95f619a, 0x16a09e66, 0xe88e18a1, 0x15c77bbe, 0xe7c4f1f4, 0x14e6cabc, 0xe704335c, 0x13fed953, + 0xfcdd0b28, 0x1fd88da4, 0xfc153635, 0x1fc26471, 0xfb4dfbe4, 0x1fa7557f, 0xfa877aef, 0x1f8764fa, + 0x157d6935, 0x17b5df22, 0x15328293, 0x17f8ece3, 0x14e6cabc, 0x183b0e0c, 0x149a449c, 0x187c4010, + 0xe64c1fb8, 0x130ff7fd, 0xe59cf6e5, 0x121a7999, 0xe4f6f5a8, 0x111eb354, 0xe45a5599, 0x101cfc87, + 0xf9c1d1f1, 0x1f6297d0, 0xf8fd1f65, 0x1f38f3ac, 0xf83981a1, 0x1f0a7efc, 0xf77716cf, 0x1ed740e7, + 0x144cf325, 0x18bc806b, 0x13fed953, 0x18fbcca4, 0x13affa29, 0x193a224a, 0x136058b1, 0x19777ef5, + 0xe3c74d0e, 0x0f15ae9c, 0xe33e0f0c, 0x0e0924ec, 0xe2becb2f, 0x0cf7bca2, 0xe249ad9e, 0x0be1d499, + 0xf6b5fce9, 0x1e9f4157, 0xf5f651b6, 0x1e6288ec, 0xf53832c5, 0x1e212105, 0xf47bbd68, 0x1ddb13b7, + 0x130ff7fd, 0x19b3e048, 0x12bedb26, 0x19ef43ef, 0x126d054d, 0x1a29a7a0, 0x121a7999, 0x1a63091b, + 0xe1dedefb, 0x0ac7cd3b, 0xe17e8455, 0x09aa0861, 0xe128bf19, 0x0888e931, 0xe0ddad09, 0x0764d3f9, + 0xf3c10ead, 0x1d906bcf, 0xf308435e, 0x1d4134d1, 0xf25177fb, 0x1ced7af4, 0xf19cc8b3, 0x1c954b21, + 0x11c73b3a, 0x1a9b6629, 0x11734d64, 0x1ad2bc9e, 0x111eb354, 0x1b090a58, 0x10c9704d, 0x1b3e4d3f, + 0xe09d6830, 0x063e2e0f, 0xe06806db, 0x05155dac, 0xe03d9b8f, 0x03eac9cb, 0xe01e3503, 0x02beda01, + 0xf0ea5164, 0x1c38b2f2, 0xf03a2d92, 0x1bd7c0ac, 0xef8c7867, 0x1b728345, 0xeee14cac, 0x1b090a58, + 0x10738799, 0x1b728345, 0x101cfc87, 0x1ba5aa67, 0x0fc5d26e, 0x1bd7c0ac, 0x0f6e0ca9, 0x1c08c426, + 0xe009de1d, 0x0191f65f, 0xe0009de9, 0x00648748, 0xe002779f, 0xff36f550, 0xe00f6a9a, 0xfe09a918, + 0xee38c4c6, 0x1a9b6629, 0xed92fab3, 0x1a29a7a0, 0xecf00803, 0x19b3e048, 0xec5005d7, 0x193a224a, + 0x0f15ae9c, 0x1c38b2f2, 0x0ebcbbae, 0x1c678b35, 0x0e63374d, 0x1c954b21, 0x0e0924ec, 0x1cc1f0f4, + 0xe027725c, 0xfcdd0b28, 0xe04a868e, 0xfbb183cc, 0xe0789b06, 0xfa877aef, 0xe0b19fc5, 0xf95f57f7, + 0xebb30cdb, 0x18bc806b, 0xeb193544, 0x183b0e0c, 0xea8296cb, 0x17b5df22, 0xe9ef48ab, 0x172d0838, + 0x0dae8805, 0x1ced7af4, 0x0d536416, 0x1d17e774, 0x0cf7bca2, 0x1d4134d1, 0x0c9b9532, 0x1d696174, + 0xe0f58104, 0xf83981a1, 0xe1442737, 0xf7165de0, 0xe19d7714, 0xf5f651b6, 0xe201519e, 0xf4d9c111, + 0xe95f619a, 0x16a09e66, 0xe8d2f7c8, 0x1610b755, 0xe84a20de, 0x157d6935, 0xe7c4f1f4, 0x14e6cabc, + 0x0c3ef153, 0x1d906bcf, 0x0be1d499, 0x1db65262, 0x0b844298, 0x1ddb13b7, 0x0b263eef, 0x1dfeae62, + 0xe26f9431, 0xf3c10ead, 0xe2e8188c, 0xf2ac9bea, 0xe36ab4df, 0xf19cc8b3, 0xe3f73bda, 0xf091f357, + 0xe7437f95, 0x144cf325, 0xe6c5ddb6, 0x13affa29, 0xe64c1fb8, 0x130ff7fd, 0xe5d65860, 0x126d054d, + 0x0ac7cd3b, 0x1e212105, 0x0a68f121, 0x1e426a4b, 0x0a09ae4a, 0x1e6288ec, 0x09aa0861, 0x1e817bab, + 0xe48d7cbb, 0xef8c7867, 0xe52d4362, 0xee8cb29c, 0xe5d65860, 0xed92fab3, 0xe688810b, 0xec9fa74f, + 0xe56499d7, 0x11c73b3a, 0xe4f6f5a8, 0x111eb354, 0xe48d7cbb, 0x10738799, 0xe4283f54, 0x0fc5d26e, + 0x094a0317, 0x1e9f4157, 0x08e9a220, 0x1ebbd8c9, 0x0888e931, 0x1ed740e7, 0x0827dc07, 0x1ef178a4, + 0xe7437f95, 0xebb30cdb, 0xe807131d, 0xeacd7d6d, 0xe8d2f7c8, 0xe9ef48ab, 0xe9a6e6da, 0xe918bbab, + 0xe3c74d0e, 0x0f15ae9c, 0xe36ab4df, 0x0e63374d, 0xe312850c, 0x0dae8805, 0xe2becb2f, 0x0cf7bca2, + 0x07c67e5f, 0x1f0a7efc, 0x0764d3f9, 0x1f2252f7, 0x0702e09b, 0x1f38f3ac, 0x06a0a809, 0x1f4e603b, + 0xea8296cb, 0xe84a20de, 0xeb65bb64, 0xe783bff0, 0xec5005d7, 0xe6c5ddb6, 0xed4124da, 0xe610bc11, + 0xe26f9431, 0x0c3ef153, 0xe224ec49, 0x0b844298, 0xe1dedefb, 0x0ac7cd3b, 0xe19d7714, 0x0a09ae4a, + 0x063e2e0f, 0x1f6297d0, 0x05db7678, 0x1f7599a4, 0x05788511, 0x1f8764fa, 0x05155dac, 0x1f97f925, + 0xee38c4c6, 0xe56499d7, 0xef368fb3, 0xe4c1b2c1, 0xf03a2d92, 0xe4283f54, 0xf1434452, 0xe39874cb, + 0xe160bea9, 0x094a0317, 0xe128bf19, 0x0888e931, 0xe0f58104, 0x07c67e5f, 0xe0c70c54, 0x0702e09b, + 0x04b2041c, 0x1fa7557f, 0x044e7c34, 0x1fb57972, 0x03eac9cb, 0x1fc26471, 0x0386f0b9, 0x1fce15fd, + 0xf25177fb, 0xe312850c, 0xf3646ace, 0xe2969e8c, 0xf47bbd68, 0xe224ec49, 0xf5970edf, 0xe1bd95b5, + 0xe09d6830, 0x063e2e0f, 0xe0789b06, 0x05788511, 0xe058aa81, 0x04b2041c, 0xe03d9b8f, 0x03eac9cb, + 0x0322f4d8, 0x1fd88da4, 0x02beda01, 0x1fe1cafd, 0x025aa412, 0x1fe9cdad, 0x01f656e8, 0x1ff09566, + 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] = { - 0x20000000, 0x00000000, 0x16a09e66, 0x16a09e66, 0x00000000, 0x20000000, 0xe95f619a, 0x16a09e66, - 0x20000000, 0x00000000, 0x1d906bcf, 0x0c3ef153, 0x16a09e66, 0x16a09e66, 0x0c3ef153, 0x1d906bcf, - 0x20000000, 0x00000000, 0x0c3ef153, 0x1d906bcf, 0xe95f619a, 0x16a09e66, 0xe26f9431, 0xf3c10ead, - - 0x20000000, 0x00000000, 0x1f6297d0, 0x063e2e0f, 0x1d906bcf, 0x0c3ef153, 0x1a9b6629, 0x11c73b3a, - 0x20000000, 0x00000000, 0x1fd88da4, 0x0322f4d8, 0x1f6297d0, 0x063e2e0f, 0x1e9f4157, 0x094a0317, - 0x20000000, 0x00000000, 0x1e9f4157, 0x094a0317, 0x1a9b6629, 0x11c73b3a, 0x144cf325, 0x18bc806b, - 0x16a09e66, 0x16a09e66, 0x11c73b3a, 0x1a9b6629, 0x0c3ef153, 0x1d906bcf, 0x063e2e0f, 0x1f6297d0, - 0x1d906bcf, 0x0c3ef153, 0x1c38b2f2, 0x0f15ae9c, 0x1a9b6629, 0x11c73b3a, 0x18bc806b, 0x144cf325, - 0x0c3ef153, 0x1d906bcf, 0x0322f4d8, 0x1fd88da4, 0xf9c1d1f1, 0x1f6297d0, 0xf0ea5164, 0x1c38b2f2, - 0x00000000, 0x20000000, 0xf9c1d1f1, 0x1f6297d0, 0xf3c10ead, 0x1d906bcf, 0xee38c4c6, 0x1a9b6629, - 0x16a09e66, 0x16a09e66, 0x144cf325, 0x18bc806b, 0x11c73b3a, 0x1a9b6629, 0x0f15ae9c, 0x1c38b2f2, - 0xe95f619a, 0x16a09e66, 0xe3c74d0e, 0x0f15ae9c, 0xe09d6830, 0x063e2e0f, 0xe027725c, 0xfcdd0b28, - 0xe95f619a, 0x16a09e66, 0xe56499d7, 0x11c73b3a, 0xe26f9431, 0x0c3ef153, 0xe09d6830, 0x063e2e0f, - 0x0c3ef153, 0x1d906bcf, 0x094a0317, 0x1e9f4157, 0x063e2e0f, 0x1f6297d0, 0x0322f4d8, 0x1fd88da4, + 0x20000000, 0x00000000, 0x16a09e66, 0x16a09e66, 0x00000000, 0x20000000, 0xe95f619a, 0x16a09e66, + 0x20000000, 0x00000000, 0x1d906bcf, 0x0c3ef153, 0x16a09e66, 0x16a09e66, 0x0c3ef153, 0x1d906bcf, + 0x20000000, 0x00000000, 0x0c3ef153, 0x1d906bcf, 0xe95f619a, 0x16a09e66, 0xe26f9431, 0xf3c10ead, + + 0x20000000, 0x00000000, 0x1f6297d0, 0x063e2e0f, 0x1d906bcf, 0x0c3ef153, 0x1a9b6629, 0x11c73b3a, + 0x20000000, 0x00000000, 0x1fd88da4, 0x0322f4d8, 0x1f6297d0, 0x063e2e0f, 0x1e9f4157, 0x094a0317, + 0x20000000, 0x00000000, 0x1e9f4157, 0x094a0317, 0x1a9b6629, 0x11c73b3a, 0x144cf325, 0x18bc806b, + 0x16a09e66, 0x16a09e66, 0x11c73b3a, 0x1a9b6629, 0x0c3ef153, 0x1d906bcf, 0x063e2e0f, 0x1f6297d0, + 0x1d906bcf, 0x0c3ef153, 0x1c38b2f2, 0x0f15ae9c, 0x1a9b6629, 0x11c73b3a, 0x18bc806b, 0x144cf325, + 0x0c3ef153, 0x1d906bcf, 0x0322f4d8, 0x1fd88da4, 0xf9c1d1f1, 0x1f6297d0, 0xf0ea5164, 0x1c38b2f2, + 0x00000000, 0x20000000, 0xf9c1d1f1, 0x1f6297d0, 0xf3c10ead, 0x1d906bcf, 0xee38c4c6, 0x1a9b6629, + 0x16a09e66, 0x16a09e66, 0x144cf325, 0x18bc806b, 0x11c73b3a, 0x1a9b6629, 0x0f15ae9c, 0x1c38b2f2, + 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 +/* + * 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); @@ -667,379 +667,379 @@ const int twidTab64[4*6 + 16*6] = { */ 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, + 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, + 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, + 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 + 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, +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, +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, 0x58995c62, 0x58da5c23, 0x591c5be3, 0x595e5ba4, 0x599f5b64, 0x59e05b24, 0x5a215ae3, 0x5a625aa3 }; @@ -1070,277 +1070,277 @@ const Word32 formfac_sqrttable[96] = { \brief these tables are used for the non linear quantizer and inverse quantizer - + */ const Word32 mTab_3_4[512] = { - 0x4c1bf829, 0x4c3880de, 0x4c550603, 0x4c71879c, - 0x4c8e05aa, 0x4caa8030, 0x4cc6f72f, 0x4ce36aab, - 0x4cffdaa4, 0x4d1c471d, 0x4d38b019, 0x4d55159a, - 0x4d7177a1, 0x4d8dd631, 0x4daa314b, 0x4dc688f3, - 0x4de2dd2a, 0x4dff2df2, 0x4e1b7b4d, 0x4e37c53d, - 0x4e540bc5, 0x4e704ee6, 0x4e8c8ea3, 0x4ea8cafd, - 0x4ec503f7, 0x4ee13992, 0x4efd6bd0, 0x4f199ab4, - 0x4f35c640, 0x4f51ee75, 0x4f6e1356, 0x4f8a34e4, - 0x4fa65321, 0x4fc26e10, 0x4fde85b2, 0x4ffa9a0a, - 0x5016ab18, 0x5032b8e0, 0x504ec362, 0x506acaa1, - 0x5086cea0, 0x50a2cf5e, 0x50becce0, 0x50dac725, - 0x50f6be31, 0x5112b205, 0x512ea2a3, 0x514a900d, - 0x51667a45, 0x5182614c, 0x519e4524, 0x51ba25cf, - 0x51d60350, 0x51f1dda7, 0x520db4d6, 0x522988e0, - 0x524559c6, 0x52612789, 0x527cf22d, 0x5298b9b1, - 0x52b47e19, 0x52d03f65, 0x52ebfd98, 0x5307b8b4, - 0x532370b9, 0x533f25aa, 0x535ad789, 0x53768656, - 0x53923215, 0x53addac6, 0x53c9806b, 0x53e52306, - 0x5400c298, 0x541c5f24, 0x5437f8ab, 0x54538f2e, - 0x546f22af, 0x548ab330, 0x54a640b3, 0x54c1cb38, - 0x54dd52c2, 0x54f8d753, 0x551458eb, 0x552fd78d, - 0x554b5339, 0x5566cbf3, 0x558241bb, 0x559db492, - 0x55b9247b, 0x55d49177, 0x55effb87, 0x560b62ad, - 0x5626c6eb, 0x56422842, 0x565d86b4, 0x5678e242, - 0x56943aee, 0x56af90b9, 0x56cae3a4, 0x56e633b2, - 0x570180e4, 0x571ccb3b, 0x573812b8, 0x5753575e, - 0x576e992e, 0x5789d829, 0x57a51450, 0x57c04da6, - 0x57db842b, 0x57f6b7e1, 0x5811e8c9, 0x582d16e6, - 0x58484238, 0x58636ac0, 0x587e9081, 0x5899b37c, - 0x58b4d3b1, 0x58cff123, 0x58eb0bd3, 0x590623c2, - 0x592138f2, 0x593c4b63, 0x59575b19, 0x59726812, - 0x598d7253, 0x59a879da, 0x59c37eab, 0x59de80c6, - 0x59f9802d, 0x5a147ce0, 0x5a2f76e2, 0x5a4a6e34, - 0x5a6562d6, 0x5a8054cb, 0x5a9b4414, 0x5ab630b2, - 0x5ad11aa6, 0x5aec01f1, 0x5b06e696, 0x5b21c895, - 0x5b3ca7ef, 0x5b5784a6, 0x5b725ebc, 0x5b8d3631, - 0x5ba80b06, 0x5bc2dd3e, 0x5bddacd9, 0x5bf879d8, - 0x5c13443d, 0x5c2e0c09, 0x5c48d13e, 0x5c6393dc, - 0x5c7e53e5, 0x5c99115a, 0x5cb3cc3c, 0x5cce848d, - 0x5ce93a4e, 0x5d03ed80, 0x5d1e9e24, 0x5d394c3b, - 0x5d53f7c7, 0x5d6ea0c9, 0x5d894742, 0x5da3eb33, - 0x5dbe8c9e, 0x5dd92b84, 0x5df3c7e5, 0x5e0e61c3, - 0x5e28f920, 0x5e438dfc, 0x5e5e2059, 0x5e78b037, - 0x5e933d99, 0x5eadc87e, 0x5ec850e9, 0x5ee2d6da, - 0x5efd5a53, 0x5f17db54, 0x5f3259e0, 0x5f4cd5f6, - 0x5f674f99, 0x5f81c6c8, 0x5f9c3b87, 0x5fb6add4, - 0x5fd11db3, 0x5feb8b23, 0x6005f626, 0x60205ebd, - 0x603ac4e9, 0x605528ac, 0x606f8a05, 0x6089e8f7, - 0x60a44583, 0x60be9fa9, 0x60d8f76b, 0x60f34cca, - 0x610d9fc7, 0x6127f062, 0x61423e9e, 0x615c8a7a, - 0x6176d3f9, 0x61911b1b, 0x61ab5fe1, 0x61c5a24d, - 0x61dfe25f, 0x61fa2018, 0x62145b7a, 0x622e9485, - 0x6248cb3b, 0x6262ff9d, 0x627d31ab, 0x62976167, - 0x62b18ed1, 0x62cbb9eb, 0x62e5e2b6, 0x63000933, - 0x631a2d62, 0x63344f45, 0x634e6edd, 0x63688c2b, - 0x6382a730, 0x639cbfec, 0x63b6d661, 0x63d0ea90, - 0x63eafc7a, 0x64050c1f, 0x641f1982, 0x643924a2, - 0x64532d80, 0x646d341f, 0x6487387e, 0x64a13a9e, - 0x64bb3a81, 0x64d53828, 0x64ef3393, 0x65092cc4, - 0x652323bb, 0x653d1879, 0x65570b00, 0x6570fb50, - 0x658ae96b, 0x65a4d550, 0x65bebf01, 0x65d8a680, - 0x65f28bcc, 0x660c6ee8, 0x66264fd3, 0x66402e8f, - 0x665a0b1c, 0x6673e57d, 0x668dbdb0, 0x66a793b8, - 0x66c16795, 0x66db3949, 0x66f508d4, 0x670ed636, - 0x6728a172, 0x67426a87, 0x675c3177, 0x6775f643, - 0x678fb8eb, 0x67a97971, 0x67c337d5, 0x67dcf418, - 0x67f6ae3b, 0x6810663f, 0x682a1c25, 0x6843cfed, - 0x685d8199, 0x68773129, 0x6890de9f, 0x68aa89fa, - 0x68c4333d, 0x68ddda67, 0x68f77f7a, 0x69112277, - 0x692ac35e, 0x69446230, 0x695dfeee, 0x6977999a, - 0x69913232, 0x69aac8ba, 0x69c45d31, 0x69ddef98, - 0x69f77ff0, 0x6a110e3a, 0x6a2a9a77, 0x6a4424a8, - 0x6a5daccc, 0x6a7732e6, 0x6a90b6f6, 0x6aaa38fd, - 0x6ac3b8fb, 0x6add36f2, 0x6af6b2e2, 0x6b102ccd, - 0x6b29a4b2, 0x6b431a92, 0x6b5c8e6f, 0x6b76004a, - 0x6b8f7022, 0x6ba8ddf9, 0x6bc249d0, 0x6bdbb3a7, - 0x6bf51b80, 0x6c0e815a, 0x6c27e537, 0x6c414718, - 0x6c5aa6fd, 0x6c7404e7, 0x6c8d60d7, 0x6ca6bace, - 0x6cc012cc, 0x6cd968d2, 0x6cf2bce1, 0x6d0c0ef9, - 0x6d255f1d, 0x6d3ead4b, 0x6d57f985, 0x6d7143cc, - 0x6d8a8c21, 0x6da3d283, 0x6dbd16f5, 0x6dd65976, - 0x6def9a08, 0x6e08d8ab, 0x6e221560, 0x6e3b5027, - 0x6e548902, 0x6e6dbff1, 0x6e86f4f5, 0x6ea0280e, - 0x6eb9593e, 0x6ed28885, 0x6eebb5e3, 0x6f04e15a, - 0x6f1e0aea, 0x6f373294, 0x6f505859, 0x6f697c39, - 0x6f829e35, 0x6f9bbe4e, 0x6fb4dc85, 0x6fcdf8d9, - 0x6fe7134d, 0x70002be0, 0x70194293, 0x70325767, - 0x704b6a5d, 0x70647b76, 0x707d8ab1, 0x70969811, - 0x70afa394, 0x70c8ad3d, 0x70e1b50c, 0x70fabb01, - 0x7113bf1d, 0x712cc161, 0x7145c1ce, 0x715ec064, - 0x7177bd24, 0x7190b80f, 0x71a9b124, 0x71c2a866, - 0x71db9dd4, 0x71f49170, 0x720d8339, 0x72267331, - 0x723f6159, 0x72584db0, 0x72713838, 0x728a20f1, - 0x72a307db, 0x72bbecf9, 0x72d4d049, 0x72edb1ce, - 0x73069187, 0x731f6f75, 0x73384b98, 0x735125f3, - 0x7369fe84, 0x7382d54d, 0x739baa4e, 0x73b47d89, - 0x73cd4efd, 0x73e61eab, 0x73feec94, 0x7417b8b8, - 0x74308319, 0x74494bb6, 0x74621291, 0x747ad7aa, - 0x74939b02, 0x74ac5c98, 0x74c51c6f, 0x74ddda86, - 0x74f696de, 0x750f5178, 0x75280a54, 0x7540c174, - 0x755976d7, 0x75722a7e, 0x758adc69, 0x75a38c9b, - 0x75bc3b12, 0x75d4e7cf, 0x75ed92d4, 0x76063c21, - 0x761ee3b6, 0x76378994, 0x76502dbc, 0x7668d02e, - 0x768170eb, 0x769a0ff3, 0x76b2ad47, 0x76cb48e7, - 0x76e3e2d5, 0x76fc7b10, 0x7715119a, 0x772da673, - 0x7746399b, 0x775ecb13, 0x77775adc, 0x778fe8f6, - 0x77a87561, 0x77c1001f, 0x77d98930, 0x77f21095, - 0x780a964d, 0x78231a5b, 0x783b9cbd, 0x78541d75, - 0x786c9c84, 0x788519e9, 0x789d95a6, 0x78b60fbb, - 0x78ce8828, 0x78e6feef, 0x78ff740f, 0x7917e78a, - 0x7930595f, 0x7948c990, 0x7961381d, 0x7979a506, - 0x7992104c, 0x79aa79f0, 0x79c2e1f1, 0x79db4852, - 0x79f3ad11, 0x7a0c1031, 0x7a2471b0, 0x7a3cd191, - 0x7a552fd3, 0x7a6d8c76, 0x7a85e77d, 0x7a9e40e6, - 0x7ab698b2, 0x7aceeee3, 0x7ae74378, 0x7aff9673, - 0x7b17e7d2, 0x7b303799, 0x7b4885c5, 0x7b60d259, - 0x7b791d55, 0x7b9166b9, 0x7ba9ae86, 0x7bc1f4bc, - 0x7bda395c, 0x7bf27c66, 0x7c0abddb, 0x7c22fdbb, - 0x7c3b3c07, 0x7c5378c0, 0x7c6bb3e5, 0x7c83ed78, - 0x7c9c2579, 0x7cb45be9, 0x7ccc90c7, 0x7ce4c414, - 0x7cfcf5d2, 0x7d152600, 0x7d2d549f, 0x7d4581b0, - 0x7d5dad32, 0x7d75d727, 0x7d8dff8f, 0x7da6266a, - 0x7dbe4bba, 0x7dd66f7d, 0x7dee91b6, 0x7e06b264, - 0x7e1ed188, 0x7e36ef22, 0x7e4f0b34, 0x7e6725bd, - 0x7e7f3ebd, 0x7e975636, 0x7eaf6c28, 0x7ec78093, - 0x7edf9378, 0x7ef7a4d7, 0x7f0fb4b1, 0x7f27c307, - 0x7f3fcfd8, 0x7f57db25, 0x7f6fe4ef, 0x7f87ed36, + 0x4c1bf829, 0x4c3880de, 0x4c550603, 0x4c71879c, + 0x4c8e05aa, 0x4caa8030, 0x4cc6f72f, 0x4ce36aab, + 0x4cffdaa4, 0x4d1c471d, 0x4d38b019, 0x4d55159a, + 0x4d7177a1, 0x4d8dd631, 0x4daa314b, 0x4dc688f3, + 0x4de2dd2a, 0x4dff2df2, 0x4e1b7b4d, 0x4e37c53d, + 0x4e540bc5, 0x4e704ee6, 0x4e8c8ea3, 0x4ea8cafd, + 0x4ec503f7, 0x4ee13992, 0x4efd6bd0, 0x4f199ab4, + 0x4f35c640, 0x4f51ee75, 0x4f6e1356, 0x4f8a34e4, + 0x4fa65321, 0x4fc26e10, 0x4fde85b2, 0x4ffa9a0a, + 0x5016ab18, 0x5032b8e0, 0x504ec362, 0x506acaa1, + 0x5086cea0, 0x50a2cf5e, 0x50becce0, 0x50dac725, + 0x50f6be31, 0x5112b205, 0x512ea2a3, 0x514a900d, + 0x51667a45, 0x5182614c, 0x519e4524, 0x51ba25cf, + 0x51d60350, 0x51f1dda7, 0x520db4d6, 0x522988e0, + 0x524559c6, 0x52612789, 0x527cf22d, 0x5298b9b1, + 0x52b47e19, 0x52d03f65, 0x52ebfd98, 0x5307b8b4, + 0x532370b9, 0x533f25aa, 0x535ad789, 0x53768656, + 0x53923215, 0x53addac6, 0x53c9806b, 0x53e52306, + 0x5400c298, 0x541c5f24, 0x5437f8ab, 0x54538f2e, + 0x546f22af, 0x548ab330, 0x54a640b3, 0x54c1cb38, + 0x54dd52c2, 0x54f8d753, 0x551458eb, 0x552fd78d, + 0x554b5339, 0x5566cbf3, 0x558241bb, 0x559db492, + 0x55b9247b, 0x55d49177, 0x55effb87, 0x560b62ad, + 0x5626c6eb, 0x56422842, 0x565d86b4, 0x5678e242, + 0x56943aee, 0x56af90b9, 0x56cae3a4, 0x56e633b2, + 0x570180e4, 0x571ccb3b, 0x573812b8, 0x5753575e, + 0x576e992e, 0x5789d829, 0x57a51450, 0x57c04da6, + 0x57db842b, 0x57f6b7e1, 0x5811e8c9, 0x582d16e6, + 0x58484238, 0x58636ac0, 0x587e9081, 0x5899b37c, + 0x58b4d3b1, 0x58cff123, 0x58eb0bd3, 0x590623c2, + 0x592138f2, 0x593c4b63, 0x59575b19, 0x59726812, + 0x598d7253, 0x59a879da, 0x59c37eab, 0x59de80c6, + 0x59f9802d, 0x5a147ce0, 0x5a2f76e2, 0x5a4a6e34, + 0x5a6562d6, 0x5a8054cb, 0x5a9b4414, 0x5ab630b2, + 0x5ad11aa6, 0x5aec01f1, 0x5b06e696, 0x5b21c895, + 0x5b3ca7ef, 0x5b5784a6, 0x5b725ebc, 0x5b8d3631, + 0x5ba80b06, 0x5bc2dd3e, 0x5bddacd9, 0x5bf879d8, + 0x5c13443d, 0x5c2e0c09, 0x5c48d13e, 0x5c6393dc, + 0x5c7e53e5, 0x5c99115a, 0x5cb3cc3c, 0x5cce848d, + 0x5ce93a4e, 0x5d03ed80, 0x5d1e9e24, 0x5d394c3b, + 0x5d53f7c7, 0x5d6ea0c9, 0x5d894742, 0x5da3eb33, + 0x5dbe8c9e, 0x5dd92b84, 0x5df3c7e5, 0x5e0e61c3, + 0x5e28f920, 0x5e438dfc, 0x5e5e2059, 0x5e78b037, + 0x5e933d99, 0x5eadc87e, 0x5ec850e9, 0x5ee2d6da, + 0x5efd5a53, 0x5f17db54, 0x5f3259e0, 0x5f4cd5f6, + 0x5f674f99, 0x5f81c6c8, 0x5f9c3b87, 0x5fb6add4, + 0x5fd11db3, 0x5feb8b23, 0x6005f626, 0x60205ebd, + 0x603ac4e9, 0x605528ac, 0x606f8a05, 0x6089e8f7, + 0x60a44583, 0x60be9fa9, 0x60d8f76b, 0x60f34cca, + 0x610d9fc7, 0x6127f062, 0x61423e9e, 0x615c8a7a, + 0x6176d3f9, 0x61911b1b, 0x61ab5fe1, 0x61c5a24d, + 0x61dfe25f, 0x61fa2018, 0x62145b7a, 0x622e9485, + 0x6248cb3b, 0x6262ff9d, 0x627d31ab, 0x62976167, + 0x62b18ed1, 0x62cbb9eb, 0x62e5e2b6, 0x63000933, + 0x631a2d62, 0x63344f45, 0x634e6edd, 0x63688c2b, + 0x6382a730, 0x639cbfec, 0x63b6d661, 0x63d0ea90, + 0x63eafc7a, 0x64050c1f, 0x641f1982, 0x643924a2, + 0x64532d80, 0x646d341f, 0x6487387e, 0x64a13a9e, + 0x64bb3a81, 0x64d53828, 0x64ef3393, 0x65092cc4, + 0x652323bb, 0x653d1879, 0x65570b00, 0x6570fb50, + 0x658ae96b, 0x65a4d550, 0x65bebf01, 0x65d8a680, + 0x65f28bcc, 0x660c6ee8, 0x66264fd3, 0x66402e8f, + 0x665a0b1c, 0x6673e57d, 0x668dbdb0, 0x66a793b8, + 0x66c16795, 0x66db3949, 0x66f508d4, 0x670ed636, + 0x6728a172, 0x67426a87, 0x675c3177, 0x6775f643, + 0x678fb8eb, 0x67a97971, 0x67c337d5, 0x67dcf418, + 0x67f6ae3b, 0x6810663f, 0x682a1c25, 0x6843cfed, + 0x685d8199, 0x68773129, 0x6890de9f, 0x68aa89fa, + 0x68c4333d, 0x68ddda67, 0x68f77f7a, 0x69112277, + 0x692ac35e, 0x69446230, 0x695dfeee, 0x6977999a, + 0x69913232, 0x69aac8ba, 0x69c45d31, 0x69ddef98, + 0x69f77ff0, 0x6a110e3a, 0x6a2a9a77, 0x6a4424a8, + 0x6a5daccc, 0x6a7732e6, 0x6a90b6f6, 0x6aaa38fd, + 0x6ac3b8fb, 0x6add36f2, 0x6af6b2e2, 0x6b102ccd, + 0x6b29a4b2, 0x6b431a92, 0x6b5c8e6f, 0x6b76004a, + 0x6b8f7022, 0x6ba8ddf9, 0x6bc249d0, 0x6bdbb3a7, + 0x6bf51b80, 0x6c0e815a, 0x6c27e537, 0x6c414718, + 0x6c5aa6fd, 0x6c7404e7, 0x6c8d60d7, 0x6ca6bace, + 0x6cc012cc, 0x6cd968d2, 0x6cf2bce1, 0x6d0c0ef9, + 0x6d255f1d, 0x6d3ead4b, 0x6d57f985, 0x6d7143cc, + 0x6d8a8c21, 0x6da3d283, 0x6dbd16f5, 0x6dd65976, + 0x6def9a08, 0x6e08d8ab, 0x6e221560, 0x6e3b5027, + 0x6e548902, 0x6e6dbff1, 0x6e86f4f5, 0x6ea0280e, + 0x6eb9593e, 0x6ed28885, 0x6eebb5e3, 0x6f04e15a, + 0x6f1e0aea, 0x6f373294, 0x6f505859, 0x6f697c39, + 0x6f829e35, 0x6f9bbe4e, 0x6fb4dc85, 0x6fcdf8d9, + 0x6fe7134d, 0x70002be0, 0x70194293, 0x70325767, + 0x704b6a5d, 0x70647b76, 0x707d8ab1, 0x70969811, + 0x70afa394, 0x70c8ad3d, 0x70e1b50c, 0x70fabb01, + 0x7113bf1d, 0x712cc161, 0x7145c1ce, 0x715ec064, + 0x7177bd24, 0x7190b80f, 0x71a9b124, 0x71c2a866, + 0x71db9dd4, 0x71f49170, 0x720d8339, 0x72267331, + 0x723f6159, 0x72584db0, 0x72713838, 0x728a20f1, + 0x72a307db, 0x72bbecf9, 0x72d4d049, 0x72edb1ce, + 0x73069187, 0x731f6f75, 0x73384b98, 0x735125f3, + 0x7369fe84, 0x7382d54d, 0x739baa4e, 0x73b47d89, + 0x73cd4efd, 0x73e61eab, 0x73feec94, 0x7417b8b8, + 0x74308319, 0x74494bb6, 0x74621291, 0x747ad7aa, + 0x74939b02, 0x74ac5c98, 0x74c51c6f, 0x74ddda86, + 0x74f696de, 0x750f5178, 0x75280a54, 0x7540c174, + 0x755976d7, 0x75722a7e, 0x758adc69, 0x75a38c9b, + 0x75bc3b12, 0x75d4e7cf, 0x75ed92d4, 0x76063c21, + 0x761ee3b6, 0x76378994, 0x76502dbc, 0x7668d02e, + 0x768170eb, 0x769a0ff3, 0x76b2ad47, 0x76cb48e7, + 0x76e3e2d5, 0x76fc7b10, 0x7715119a, 0x772da673, + 0x7746399b, 0x775ecb13, 0x77775adc, 0x778fe8f6, + 0x77a87561, 0x77c1001f, 0x77d98930, 0x77f21095, + 0x780a964d, 0x78231a5b, 0x783b9cbd, 0x78541d75, + 0x786c9c84, 0x788519e9, 0x789d95a6, 0x78b60fbb, + 0x78ce8828, 0x78e6feef, 0x78ff740f, 0x7917e78a, + 0x7930595f, 0x7948c990, 0x7961381d, 0x7979a506, + 0x7992104c, 0x79aa79f0, 0x79c2e1f1, 0x79db4852, + 0x79f3ad11, 0x7a0c1031, 0x7a2471b0, 0x7a3cd191, + 0x7a552fd3, 0x7a6d8c76, 0x7a85e77d, 0x7a9e40e6, + 0x7ab698b2, 0x7aceeee3, 0x7ae74378, 0x7aff9673, + 0x7b17e7d2, 0x7b303799, 0x7b4885c5, 0x7b60d259, + 0x7b791d55, 0x7b9166b9, 0x7ba9ae86, 0x7bc1f4bc, + 0x7bda395c, 0x7bf27c66, 0x7c0abddb, 0x7c22fdbb, + 0x7c3b3c07, 0x7c5378c0, 0x7c6bb3e5, 0x7c83ed78, + 0x7c9c2579, 0x7cb45be9, 0x7ccc90c7, 0x7ce4c414, + 0x7cfcf5d2, 0x7d152600, 0x7d2d549f, 0x7d4581b0, + 0x7d5dad32, 0x7d75d727, 0x7d8dff8f, 0x7da6266a, + 0x7dbe4bba, 0x7dd66f7d, 0x7dee91b6, 0x7e06b264, + 0x7e1ed188, 0x7e36ef22, 0x7e4f0b34, 0x7e6725bd, + 0x7e7f3ebd, 0x7e975636, 0x7eaf6c28, 0x7ec78093, + 0x7edf9378, 0x7ef7a4d7, 0x7f0fb4b1, 0x7f27c307, + 0x7f3fcfd8, 0x7f57db25, 0x7f6fe4ef, 0x7f87ed36, 0x7f9ff3fb, 0x7fb7f93e, 0x7fcffcff, 0x7fe7ff40 }; const Word32 mTab_4_3[512]={ - 0x32cbfd4a, 0x32eddd70, 0x330fc339, 0x3331aea3, - 0x33539fac, 0x33759652, 0x33979294, 0x33b99470, - 0x33db9be4, 0x33fda8ed, 0x341fbb8b, 0x3441d3bb, - 0x3463f17c, 0x348614cc, 0x34a83da8, 0x34ca6c10, - 0x34eca001, 0x350ed979, 0x35311877, 0x35535cfa, - 0x3575a6fe, 0x3597f683, 0x35ba4b87, 0x35dca607, - 0x35ff0603, 0x36216b78, 0x3643d665, 0x366646c7, - 0x3688bc9e, 0x36ab37e8, 0x36cdb8a2, 0x36f03ecb, - 0x3712ca62, 0x37355b64, 0x3757f1d1, 0x377a8da5, - 0x379d2ee0, 0x37bfd580, 0x37e28184, 0x380532e8, - 0x3827e9ad, 0x384aa5d0, 0x386d674f, 0x38902e2a, - 0x38b2fa5d, 0x38d5cbe9, 0x38f8a2ca, 0x391b7eff, - 0x393e6088, 0x39614761, 0x3984338a, 0x39a72501, - 0x39ca1bc4, 0x39ed17d1, 0x3a101928, 0x3a331fc6, - 0x3a562baa, 0x3a793cd2, 0x3a9c533d, 0x3abf6ee9, - 0x3ae28fd5, 0x3b05b5ff, 0x3b28e165, 0x3b4c1206, - 0x3b6f47e0, 0x3b9282f2, 0x3bb5c33a, 0x3bd908b7, - 0x3bfc5368, 0x3c1fa349, 0x3c42f85b, 0x3c66529c, - 0x3c89b209, 0x3cad16a2, 0x3cd08065, 0x3cf3ef51, - 0x3d176364, 0x3d3adc9c, 0x3d5e5af8, 0x3d81de77, - 0x3da56717, 0x3dc8f4d6, 0x3dec87b4, 0x3e101fae, - 0x3e33bcc3, 0x3e575ef2, 0x3e7b063a, 0x3e9eb298, - 0x3ec2640c, 0x3ee61a93, 0x3f09d62d, 0x3f2d96d8, - 0x3f515c93, 0x3f75275b, 0x3f98f731, 0x3fbccc11, - 0x3fe0a5fc, 0x400484ef, 0x402868ea, 0x404c51e9, - 0x40703fee, 0x409432f5, 0x40b82afd, 0x40dc2806, - 0x41002a0d, 0x41243111, 0x41483d12, 0x416c4e0d, - 0x41906401, 0x41b47eed, 0x41d89ecf, 0x41fcc3a7, - 0x4220ed72, 0x42451c30, 0x42694fde, 0x428d887d, - 0x42b1c609, 0x42d60883, 0x42fa4fe8, 0x431e9c37, - 0x4342ed70, 0x43674390, 0x438b9e96, 0x43affe82, - 0x43d46351, 0x43f8cd03, 0x441d3b95, 0x4441af08, - 0x44662758, 0x448aa487, 0x44af2690, 0x44d3ad75, - 0x44f83933, 0x451cc9c8, 0x45415f35, 0x4565f977, - 0x458a988d, 0x45af3c76, 0x45d3e531, 0x45f892bc, - 0x461d4516, 0x4641fc3e, 0x4666b832, 0x468b78f2, - 0x46b03e7c, 0x46d508cf, 0x46f9d7e9, 0x471eabca, - 0x47438470, 0x476861d9, 0x478d4406, 0x47b22af3, - 0x47d716a1, 0x47fc070e, 0x4820fc39, 0x4845f620, - 0x486af4c3, 0x488ff820, 0x48b50035, 0x48da0d03, - 0x48ff1e87, 0x492434c0, 0x49494fad, 0x496e6f4d, - 0x4993939f, 0x49b8bca2, 0x49ddea54, 0x4a031cb4, - 0x4a2853c1, 0x4a4d8f7a, 0x4a72cfde, 0x4a9814eb, - 0x4abd5ea1, 0x4ae2acfd, 0x4b080000, 0x4b2d57a8, - 0x4b52b3f3, 0x4b7814e1, 0x4b9d7a70, 0x4bc2e49f, - 0x4be8536e, 0x4c0dc6db, 0x4c333ee4, 0x4c58bb89, - 0x4c7e3cc9, 0x4ca3c2a2, 0x4cc94d14, 0x4ceedc1c, - 0x4d146fbb, 0x4d3a07ef, 0x4d5fa4b6, 0x4d854611, - 0x4daaebfd, 0x4dd09679, 0x4df64585, 0x4e1bf91f, - 0x4e41b146, 0x4e676dfa, 0x4e8d2f38, 0x4eb2f501, - 0x4ed8bf52, 0x4efe8e2b, 0x4f24618a, 0x4f4a3970, - 0x4f7015d9, 0x4f95f6c6, 0x4fbbdc36, 0x4fe1c626, - 0x5007b497, 0x502da787, 0x50539ef5, 0x50799ae1, - 0x509f9b48, 0x50c5a02a, 0x50eba985, 0x5111b75a, - 0x5137c9a6, 0x515de069, 0x5183fba2, 0x51aa1b4f, - 0x51d03f70, 0x51f66803, 0x521c9508, 0x5242c67d, - 0x5268fc62, 0x528f36b5, 0x52b57575, 0x52dbb8a2, - 0x5302003a, 0x53284c3c, 0x534e9ca8, 0x5374f17c, - 0x539b4ab7, 0x53c1a858, 0x53e80a5f, 0x540e70ca, - 0x5434db98, 0x545b4ac8, 0x5481be5a, 0x54a8364b, - 0x54ceb29c, 0x54f5334c, 0x551bb858, 0x554241c1, - 0x5568cf85, 0x558f61a3, 0x55b5f81b, 0x55dc92eb, - 0x56033212, 0x5629d590, 0x56507d63, 0x5677298a, - 0x569dda05, 0x56c48ed3, 0x56eb47f2, 0x57120562, - 0x5738c721, 0x575f8d2f, 0x5786578a, 0x57ad2633, - 0x57d3f927, 0x57fad066, 0x5821abef, 0x58488bc0, - 0x586f6fda, 0x5896583b, 0x58bd44e2, 0x58e435ce, - 0x590b2aff, 0x59322473, 0x59592229, 0x59802420, - 0x59a72a59, 0x59ce34d0, 0x59f54387, 0x5a1c567b, - 0x5a436dac, 0x5a6a8919, 0x5a91a8c1, 0x5ab8cca3, - 0x5adff4be, 0x5b072111, 0x5b2e519c, 0x5b55865e, - 0x5b7cbf54, 0x5ba3fc80, 0x5bcb3ddf, 0x5bf28371, - 0x5c19cd35, 0x5c411b2a, 0x5c686d4f, 0x5c8fc3a4, - 0x5cb71e27, 0x5cde7cd7, 0x5d05dfb4, 0x5d2d46bd, - 0x5d54b1f0, 0x5d7c214e, 0x5da394d4, 0x5dcb0c83, - 0x5df28859, 0x5e1a0856, 0x5e418c78, 0x5e6914be, - 0x5e90a129, 0x5eb831b7, 0x5edfc667, 0x5f075f38, - 0x5f2efc29, 0x5f569d3a, 0x5f7e426a, 0x5fa5ebb7, - 0x5fcd9921, 0x5ff54aa8, 0x601d004a, 0x6044ba06, - 0x606c77dc, 0x609439ca, 0x60bbffd0, 0x60e3c9ee, - 0x610b9821, 0x61336a6a, 0x615b40c8, 0x61831b39, - 0x61aaf9bd, 0x61d2dc53, 0x61fac2fa, 0x6222adb2, - 0x624a9c79, 0x62728f4f, 0x629a8633, 0x62c28123, - 0x62ea8020, 0x63128329, 0x633a8a3c, 0x63629559, - 0x638aa47f, 0x63b2b7ad, 0x63dacee2, 0x6402ea1e, - 0x642b0960, 0x64532ca6, 0x647b53f1, 0x64a37f3f, - 0x64cbae8f, 0x64f3e1e2, 0x651c1935, 0x65445488, - 0x656c93db, 0x6594d72c, 0x65bd1e7b, 0x65e569c7, - 0x660db90f, 0x66360c53, 0x665e6391, 0x6686bec9, - 0x66af1dfa, 0x66d78123, 0x66ffe844, 0x6728535b, - 0x6750c268, 0x6779356b, 0x67a1ac62, 0x67ca274c, - 0x67f2a629, 0x681b28f9, 0x6843afb9, 0x686c3a6a, - 0x6894c90b, 0x68bd5b9b, 0x68e5f219, 0x690e8c84, - 0x69372add, 0x695fcd21, 0x69887350, 0x69b11d6a, - 0x69d9cb6d, 0x6a027d5a, 0x6a2b332f, 0x6a53eceb, - 0x6a7caa8d, 0x6aa56c16, 0x6ace3184, 0x6af6fad6, - 0x6b1fc80c, 0x6b489925, 0x6b716e20, 0x6b9a46fd, - 0x6bc323bb, 0x6bec0458, 0x6c14e8d5, 0x6c3dd130, - 0x6c66bd69, 0x6c8fad80, 0x6cb8a172, 0x6ce19940, - 0x6d0a94e9, 0x6d33946d, 0x6d5c97ca, 0x6d859eff, - 0x6daeaa0d, 0x6dd7b8f1, 0x6e00cbad, 0x6e29e23e, - 0x6e52fca4, 0x6e7c1adf, 0x6ea53cee, 0x6ece62cf, - 0x6ef78c83, 0x6f20ba09, 0x6f49eb5f, 0x6f732085, - 0x6f9c597b, 0x6fc59640, 0x6feed6d3, 0x70181b33, - 0x70416360, 0x706aaf59, 0x7093ff1d, 0x70bd52ab, - 0x70e6aa04, 0x71100525, 0x7139640f, 0x7162c6c1, - 0x718c2d3a, 0x71b5977a, 0x71df057f, 0x72087749, - 0x7231ecd8, 0x725b662a, 0x7284e33f, 0x72ae6417, - 0x72d7e8b0, 0x7301710a, 0x732afd24, 0x73548cfe, - 0x737e2097, 0x73a7b7ee, 0x73d15303, 0x73faf1d5, - 0x74249462, 0x744e3aac, 0x7477e4b0, 0x74a1926e, - 0x74cb43e6, 0x74f4f917, 0x751eb201, 0x75486ea1, - 0x75722ef9, 0x759bf307, 0x75c5baca, 0x75ef8642, - 0x7619556f, 0x7643284f, 0x766cfee2, 0x7696d928, - 0x76c0b71f, 0x76ea98c7, 0x77147e20, 0x773e6728, - 0x776853df, 0x77924445, 0x77bc3858, 0x77e63019, - 0x78102b85, 0x783a2a9e, 0x78642d62, 0x788e33d1, - 0x78b83de9, 0x78e24bab, 0x790c5d15, 0x79367228, - 0x79608ae1, 0x798aa742, 0x79b4c748, 0x79deeaf4, - 0x7a091245, 0x7a333d3a, 0x7a5d6bd2, 0x7a879e0e, - 0x7ab1d3ec, 0x7adc0d6b, 0x7b064a8c, 0x7b308b4d, - 0x7b5acfae, 0x7b8517ae, 0x7baf634c, 0x7bd9b289, - 0x7c040563, 0x7c2e5bda, 0x7c58b5ec, 0x7c83139b, - 0x7cad74e4, 0x7cd7d9c7, 0x7d024244, 0x7d2cae5a, - 0x7d571e09, 0x7d81914f, 0x7dac082d, 0x7dd682a1, - 0x7e0100ac, 0x7e2b824b, 0x7e560780, 0x7e809048, - 0x7eab1ca5, 0x7ed5ac94, 0x7f004015, 0x7f2ad729, + 0x32cbfd4a, 0x32eddd70, 0x330fc339, 0x3331aea3, + 0x33539fac, 0x33759652, 0x33979294, 0x33b99470, + 0x33db9be4, 0x33fda8ed, 0x341fbb8b, 0x3441d3bb, + 0x3463f17c, 0x348614cc, 0x34a83da8, 0x34ca6c10, + 0x34eca001, 0x350ed979, 0x35311877, 0x35535cfa, + 0x3575a6fe, 0x3597f683, 0x35ba4b87, 0x35dca607, + 0x35ff0603, 0x36216b78, 0x3643d665, 0x366646c7, + 0x3688bc9e, 0x36ab37e8, 0x36cdb8a2, 0x36f03ecb, + 0x3712ca62, 0x37355b64, 0x3757f1d1, 0x377a8da5, + 0x379d2ee0, 0x37bfd580, 0x37e28184, 0x380532e8, + 0x3827e9ad, 0x384aa5d0, 0x386d674f, 0x38902e2a, + 0x38b2fa5d, 0x38d5cbe9, 0x38f8a2ca, 0x391b7eff, + 0x393e6088, 0x39614761, 0x3984338a, 0x39a72501, + 0x39ca1bc4, 0x39ed17d1, 0x3a101928, 0x3a331fc6, + 0x3a562baa, 0x3a793cd2, 0x3a9c533d, 0x3abf6ee9, + 0x3ae28fd5, 0x3b05b5ff, 0x3b28e165, 0x3b4c1206, + 0x3b6f47e0, 0x3b9282f2, 0x3bb5c33a, 0x3bd908b7, + 0x3bfc5368, 0x3c1fa349, 0x3c42f85b, 0x3c66529c, + 0x3c89b209, 0x3cad16a2, 0x3cd08065, 0x3cf3ef51, + 0x3d176364, 0x3d3adc9c, 0x3d5e5af8, 0x3d81de77, + 0x3da56717, 0x3dc8f4d6, 0x3dec87b4, 0x3e101fae, + 0x3e33bcc3, 0x3e575ef2, 0x3e7b063a, 0x3e9eb298, + 0x3ec2640c, 0x3ee61a93, 0x3f09d62d, 0x3f2d96d8, + 0x3f515c93, 0x3f75275b, 0x3f98f731, 0x3fbccc11, + 0x3fe0a5fc, 0x400484ef, 0x402868ea, 0x404c51e9, + 0x40703fee, 0x409432f5, 0x40b82afd, 0x40dc2806, + 0x41002a0d, 0x41243111, 0x41483d12, 0x416c4e0d, + 0x41906401, 0x41b47eed, 0x41d89ecf, 0x41fcc3a7, + 0x4220ed72, 0x42451c30, 0x42694fde, 0x428d887d, + 0x42b1c609, 0x42d60883, 0x42fa4fe8, 0x431e9c37, + 0x4342ed70, 0x43674390, 0x438b9e96, 0x43affe82, + 0x43d46351, 0x43f8cd03, 0x441d3b95, 0x4441af08, + 0x44662758, 0x448aa487, 0x44af2690, 0x44d3ad75, + 0x44f83933, 0x451cc9c8, 0x45415f35, 0x4565f977, + 0x458a988d, 0x45af3c76, 0x45d3e531, 0x45f892bc, + 0x461d4516, 0x4641fc3e, 0x4666b832, 0x468b78f2, + 0x46b03e7c, 0x46d508cf, 0x46f9d7e9, 0x471eabca, + 0x47438470, 0x476861d9, 0x478d4406, 0x47b22af3, + 0x47d716a1, 0x47fc070e, 0x4820fc39, 0x4845f620, + 0x486af4c3, 0x488ff820, 0x48b50035, 0x48da0d03, + 0x48ff1e87, 0x492434c0, 0x49494fad, 0x496e6f4d, + 0x4993939f, 0x49b8bca2, 0x49ddea54, 0x4a031cb4, + 0x4a2853c1, 0x4a4d8f7a, 0x4a72cfde, 0x4a9814eb, + 0x4abd5ea1, 0x4ae2acfd, 0x4b080000, 0x4b2d57a8, + 0x4b52b3f3, 0x4b7814e1, 0x4b9d7a70, 0x4bc2e49f, + 0x4be8536e, 0x4c0dc6db, 0x4c333ee4, 0x4c58bb89, + 0x4c7e3cc9, 0x4ca3c2a2, 0x4cc94d14, 0x4ceedc1c, + 0x4d146fbb, 0x4d3a07ef, 0x4d5fa4b6, 0x4d854611, + 0x4daaebfd, 0x4dd09679, 0x4df64585, 0x4e1bf91f, + 0x4e41b146, 0x4e676dfa, 0x4e8d2f38, 0x4eb2f501, + 0x4ed8bf52, 0x4efe8e2b, 0x4f24618a, 0x4f4a3970, + 0x4f7015d9, 0x4f95f6c6, 0x4fbbdc36, 0x4fe1c626, + 0x5007b497, 0x502da787, 0x50539ef5, 0x50799ae1, + 0x509f9b48, 0x50c5a02a, 0x50eba985, 0x5111b75a, + 0x5137c9a6, 0x515de069, 0x5183fba2, 0x51aa1b4f, + 0x51d03f70, 0x51f66803, 0x521c9508, 0x5242c67d, + 0x5268fc62, 0x528f36b5, 0x52b57575, 0x52dbb8a2, + 0x5302003a, 0x53284c3c, 0x534e9ca8, 0x5374f17c, + 0x539b4ab7, 0x53c1a858, 0x53e80a5f, 0x540e70ca, + 0x5434db98, 0x545b4ac8, 0x5481be5a, 0x54a8364b, + 0x54ceb29c, 0x54f5334c, 0x551bb858, 0x554241c1, + 0x5568cf85, 0x558f61a3, 0x55b5f81b, 0x55dc92eb, + 0x56033212, 0x5629d590, 0x56507d63, 0x5677298a, + 0x569dda05, 0x56c48ed3, 0x56eb47f2, 0x57120562, + 0x5738c721, 0x575f8d2f, 0x5786578a, 0x57ad2633, + 0x57d3f927, 0x57fad066, 0x5821abef, 0x58488bc0, + 0x586f6fda, 0x5896583b, 0x58bd44e2, 0x58e435ce, + 0x590b2aff, 0x59322473, 0x59592229, 0x59802420, + 0x59a72a59, 0x59ce34d0, 0x59f54387, 0x5a1c567b, + 0x5a436dac, 0x5a6a8919, 0x5a91a8c1, 0x5ab8cca3, + 0x5adff4be, 0x5b072111, 0x5b2e519c, 0x5b55865e, + 0x5b7cbf54, 0x5ba3fc80, 0x5bcb3ddf, 0x5bf28371, + 0x5c19cd35, 0x5c411b2a, 0x5c686d4f, 0x5c8fc3a4, + 0x5cb71e27, 0x5cde7cd7, 0x5d05dfb4, 0x5d2d46bd, + 0x5d54b1f0, 0x5d7c214e, 0x5da394d4, 0x5dcb0c83, + 0x5df28859, 0x5e1a0856, 0x5e418c78, 0x5e6914be, + 0x5e90a129, 0x5eb831b7, 0x5edfc667, 0x5f075f38, + 0x5f2efc29, 0x5f569d3a, 0x5f7e426a, 0x5fa5ebb7, + 0x5fcd9921, 0x5ff54aa8, 0x601d004a, 0x6044ba06, + 0x606c77dc, 0x609439ca, 0x60bbffd0, 0x60e3c9ee, + 0x610b9821, 0x61336a6a, 0x615b40c8, 0x61831b39, + 0x61aaf9bd, 0x61d2dc53, 0x61fac2fa, 0x6222adb2, + 0x624a9c79, 0x62728f4f, 0x629a8633, 0x62c28123, + 0x62ea8020, 0x63128329, 0x633a8a3c, 0x63629559, + 0x638aa47f, 0x63b2b7ad, 0x63dacee2, 0x6402ea1e, + 0x642b0960, 0x64532ca6, 0x647b53f1, 0x64a37f3f, + 0x64cbae8f, 0x64f3e1e2, 0x651c1935, 0x65445488, + 0x656c93db, 0x6594d72c, 0x65bd1e7b, 0x65e569c7, + 0x660db90f, 0x66360c53, 0x665e6391, 0x6686bec9, + 0x66af1dfa, 0x66d78123, 0x66ffe844, 0x6728535b, + 0x6750c268, 0x6779356b, 0x67a1ac62, 0x67ca274c, + 0x67f2a629, 0x681b28f9, 0x6843afb9, 0x686c3a6a, + 0x6894c90b, 0x68bd5b9b, 0x68e5f219, 0x690e8c84, + 0x69372add, 0x695fcd21, 0x69887350, 0x69b11d6a, + 0x69d9cb6d, 0x6a027d5a, 0x6a2b332f, 0x6a53eceb, + 0x6a7caa8d, 0x6aa56c16, 0x6ace3184, 0x6af6fad6, + 0x6b1fc80c, 0x6b489925, 0x6b716e20, 0x6b9a46fd, + 0x6bc323bb, 0x6bec0458, 0x6c14e8d5, 0x6c3dd130, + 0x6c66bd69, 0x6c8fad80, 0x6cb8a172, 0x6ce19940, + 0x6d0a94e9, 0x6d33946d, 0x6d5c97ca, 0x6d859eff, + 0x6daeaa0d, 0x6dd7b8f1, 0x6e00cbad, 0x6e29e23e, + 0x6e52fca4, 0x6e7c1adf, 0x6ea53cee, 0x6ece62cf, + 0x6ef78c83, 0x6f20ba09, 0x6f49eb5f, 0x6f732085, + 0x6f9c597b, 0x6fc59640, 0x6feed6d3, 0x70181b33, + 0x70416360, 0x706aaf59, 0x7093ff1d, 0x70bd52ab, + 0x70e6aa04, 0x71100525, 0x7139640f, 0x7162c6c1, + 0x718c2d3a, 0x71b5977a, 0x71df057f, 0x72087749, + 0x7231ecd8, 0x725b662a, 0x7284e33f, 0x72ae6417, + 0x72d7e8b0, 0x7301710a, 0x732afd24, 0x73548cfe, + 0x737e2097, 0x73a7b7ee, 0x73d15303, 0x73faf1d5, + 0x74249462, 0x744e3aac, 0x7477e4b0, 0x74a1926e, + 0x74cb43e6, 0x74f4f917, 0x751eb201, 0x75486ea1, + 0x75722ef9, 0x759bf307, 0x75c5baca, 0x75ef8642, + 0x7619556f, 0x7643284f, 0x766cfee2, 0x7696d928, + 0x76c0b71f, 0x76ea98c7, 0x77147e20, 0x773e6728, + 0x776853df, 0x77924445, 0x77bc3858, 0x77e63019, + 0x78102b85, 0x783a2a9e, 0x78642d62, 0x788e33d1, + 0x78b83de9, 0x78e24bab, 0x790c5d15, 0x79367228, + 0x79608ae1, 0x798aa742, 0x79b4c748, 0x79deeaf4, + 0x7a091245, 0x7a333d3a, 0x7a5d6bd2, 0x7a879e0e, + 0x7ab1d3ec, 0x7adc0d6b, 0x7b064a8c, 0x7b308b4d, + 0x7b5acfae, 0x7b8517ae, 0x7baf634c, 0x7bd9b289, + 0x7c040563, 0x7c2e5bda, 0x7c58b5ec, 0x7c83139b, + 0x7cad74e4, 0x7cd7d9c7, 0x7d024244, 0x7d2cae5a, + 0x7d571e09, 0x7d81914f, 0x7dac082d, 0x7dd682a1, + 0x7e0100ac, 0x7e2b824b, 0x7e560780, 0x7e809048, + 0x7eab1ca5, 0x7ed5ac94, 0x7f004015, 0x7f2ad729, 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, + 0x3FFD34FC, 0x2D3F8000, 0x24F18C7E, 0x1FFE9A7E, + 0x1C9DF10C, 0x1A1F851A, 0x182FE994, 0x169FC000, + 0x15542AAA, 0x143C31C2, 0x134B1B6C, 0x127920BE, + 0x11BF2FCC, 0x111A749E, 0x1085FC42, 0x0FFFA7BE, + 0x0F855818, 0x0F14EE56, 0x0EAE6A78, 0x0E4EF886, 0x0DF69880, 0x0DA49568, 0x0D578542, 0x0D101D0C }; @@ -1353,40 +1353,40 @@ const Word16 pow2tominusNover16[17] = { }; 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, + 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, + 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 13, 13 }; Word32 specExpMantTableComb_enc[4][14] = { - {0x40000000, 0x50a28be6, 0x6597fa95, 0x40000000, - 0x50a28be6, 0x6597fa95, 0x40000000, 0x50a28be6, - 0x6597fa95, 0x40000000, 0x50a28be6, 0x6597fa95, - 0x40000000, 0x50a28be6}, - - {0x4c1bf829, 0x5fe4435e, 0x78d0df9c, 0x4c1bf829, - 0x5fe4435e, 0x78d0df9c, 0x4c1bf829, 0x5fe4435e, - 0x78d0df9c, 0x4c1bf829, 0x5fe4435e, 0x78d0df9c, - 0x4c1bf829, 0x5fe4435e}, - - {0x5a82799a, 0x7208f81d, 0x47d66b0f, 0x5a82799a, - 0x7208f81d, 0x47d66b0f, 0x5a82799a, 0x7208f81d, - 0x47d66b0f, 0x5a82799a, 0x7208f81d, 0x47d66b0f, - 0x5a82799a, 0x7208f81d}, - - {0x6ba27e65, 0x43ce3e4b, 0x556e0424, 0x6ba27e65, - 0x43ce3e4b, 0x556e0424, 0x6ba27e65, 0x43ce3e4b, - 0x556e0424, 0x6ba27e65, 0x43ce3e4b, 0x556e0424, + {0x40000000, 0x50a28be6, 0x6597fa95, 0x40000000, + 0x50a28be6, 0x6597fa95, 0x40000000, 0x50a28be6, + 0x6597fa95, 0x40000000, 0x50a28be6, 0x6597fa95, + 0x40000000, 0x50a28be6}, + + {0x4c1bf829, 0x5fe4435e, 0x78d0df9c, 0x4c1bf829, + 0x5fe4435e, 0x78d0df9c, 0x4c1bf829, 0x5fe4435e, + 0x78d0df9c, 0x4c1bf829, 0x5fe4435e, 0x78d0df9c, + 0x4c1bf829, 0x5fe4435e}, + + {0x5a82799a, 0x7208f81d, 0x47d66b0f, 0x5a82799a, + 0x7208f81d, 0x47d66b0f, 0x5a82799a, 0x7208f81d, + 0x47d66b0f, 0x5a82799a, 0x7208f81d, 0x47d66b0f, + 0x5a82799a, 0x7208f81d}, + + {0x6ba27e65, 0x43ce3e4b, 0x556e0424, 0x6ba27e65, + 0x43ce3e4b, 0x556e0424, 0x6ba27e65, 0x43ce3e4b, + 0x556e0424, 0x6ba27e65, 0x43ce3e4b, 0x556e0424, 0x6ba27e65, 0x43ce3e4b} }; @@ -1417,12 +1417,12 @@ const Word16 quantRecon[4][3] = { }; const int sampRateTab[NUM_SAMPLE_RATES] = { - 96000, 88200, 64000, 48000, 44100, 32000, + 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000 }; -const int rates[8] = { +const int rates[8] = { 160, 240, 320, 400, 480, 560, 640, 0 }; @@ -1507,7 +1507,7 @@ const short sfBandTabLong[325] = { }; /* - these tables are used only for counting and + these tables are used only for counting and are stored in packed format */ const UWord16 huff_ltab1_2[3][3][3][3]= @@ -2260,12 +2260,12 @@ const UWord32 huff_ctabscf[121]= }; const Word32 m_log2_table[INT_BITS] = { - 0x00000000,0x4ae00d00,0x2934f080,0x15c01a3f, - 0x0b31fb80,0x05aeb4e0,0x02dcf2d0,0x016fe50c, + 0x00000000,0x4ae00d00,0x2934f080,0x15c01a3f, + 0x0b31fb80,0x05aeb4e0,0x02dcf2d0,0x016fe50c, 0x00b84e23,0x005c3e10,0x002e24ca,0x001713d6, 0x000b8a47,0x0005c53b,0x0002e2a3,0x00017153, 0x0000b8aa,0x00005c55,0x00002e2b,0x00001715, - 0x00000b8b,0x000005c5,0x000002e3,0x00000171, + 0x00000b8b,0x000005c5,0x000002e3,0x00000171, 0x000000b9,0x0000005c,0x0000002e,0x00000017, 0x0000000c,0x00000006,0x00000003,0x00000001 }; @@ -2344,7 +2344,7 @@ const Word32 tnsCoeff4Borders[16]= }; -const unsigned char bitrevTab[17 + 129] = +const unsigned char bitrevTab[17 + 129] = { /* 64 */ 0x01, 0x08, 0x02, 0x04, 0x03, 0x0c, 0x05, 0x0a, 0x07, 0x0e, 0x0b, 0x0d, 0x00, 0x06, 0x09, 0x0f, diff --git a/media/libstagefright/codecs/aacenc/src/aacenc.c b/media/libstagefright/codecs/aacenc/src/aacenc.c index 975f59891255..b5e8a9c5ba8a 100644 --- a/media/libstagefright/codecs/aacenc/src/aacenc.c +++ b/media/libstagefright/codecs/aacenc/src/aacenc.c @@ -48,7 +48,7 @@ VO_U32 VO_API voAACEncInit(VO_HANDLE * phCodec,VO_AUDIO_CODINGTYPE vType, VO_COD interMem = 0; error = 0; - + /* init the memory operator */ if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL ) { @@ -113,7 +113,7 @@ VO_U32 VO_API voAACEncInit(VO_HANDLE * phCodec,VO_AUDIO_CODINGTYPE vType, VO_COD { mem_free(pMemOP, hAacEnc, VO_INDEX_ENC_AAC); hAacEnc = NULL; - } + } *phCodec = NULL; return VO_ERR_OUTOF_MEMORY; } @@ -168,9 +168,9 @@ VO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput) { 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); @@ -178,12 +178,12 @@ VO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput) 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->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf + hAacEnc->intlen, hAacEnc->inbuf, length*sizeof(short)); hAacEnc->encbuf = hAacEnc->intbuf; @@ -192,7 +192,7 @@ VO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput) hAacEnc->inbuf += length; hAacEnc->inlen -= length; } - + return VO_ERR_NONE; } @@ -219,11 +219,11 @@ VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput, /* check the input pcm buffer and length*/ if(NULL == hAacEnc->encbuf || hAacEnc->enclen < inbuflen) { - length = hAacEnc->enclen; + length = hAacEnc->enclen; if(hAacEnc->intlen == 0) - { - hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf, - hAacEnc->encbuf, length*sizeof(short)); + { + hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf, + hAacEnc->encbuf, length*sizeof(short)); hAacEnc->uselength += length*sizeof(short); } else @@ -236,7 +236,7 @@ VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput, pOutput->Length = 0; if(pOutInfo) pOutInfo->InputUsed = hAacEnc->uselength; - return VO_ERR_INPUT_BUFFER_SMALL; + return VO_ERR_INPUT_BUFFER_SMALL; } /* check the output aac buffer and length*/ @@ -254,7 +254,7 @@ VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput, /* update the input pcm buffer and length*/ if(hAacEnc->intlen) { - length = inbuflen - hAacEnc->intlen; + length = inbuflen - hAacEnc->intlen; hAacEnc->encbuf = hAacEnc->inbuf; hAacEnc->enclen = hAacEnc->inlen; hAacEnc->uselength += length*sizeof(short); @@ -265,7 +265,7 @@ VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput, hAacEnc->encbuf = hAacEnc->encbuf + inbuflen; hAacEnc->enclen = hAacEnc->enclen - inbuflen; hAacEnc->uselength += inbuflen*sizeof(short); - } + } /* update the output aac information */ if(pOutInfo) @@ -287,7 +287,7 @@ VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput, VO_U32 VO_API voAACEncUninit(VO_HANDLE hCodec) { AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec; - + if(NULL != hAacEnc) { /* close the aac encoder */ @@ -296,7 +296,7 @@ VO_U32 VO_API voAACEncUninit(VO_HANDLE hCodec) /* free the aac encoder handle*/ mem_free(hAacEnc->voMemop, hAacEnc, VO_INDEX_ENC_AAC); hAacEnc = NULL; - } + } return VO_ERR_NONE; } @@ -319,7 +319,7 @@ VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData) if(NULL == hAacEnc) return VO_ERR_INVALID_ARG; - + switch(uParamID) { case VO_PID_AAC_ENCPARAM: /* init aac encoder parameter*/ @@ -354,11 +354,11 @@ VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData) SampleRateIdx = i; tmp = 441; - if(config.sampleRate%8000 == 0) + 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.nChannelsOut > 160000) || (config.bitRate > config.sampleRate*6*config.nChannelsOut)) { config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut; @@ -385,7 +385,7 @@ VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData) /* init aac encoder core */ ret = AacEncOpen(hAacEnc, config); - if(ret) + if(ret) return VO_ERR_AUDIO_UNSFEATURE; break; case VO_PID_AUDIO_FORMAT: /* init pcm channel and samplerate*/ @@ -426,7 +426,7 @@ VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData) /* update the bitrates */ tmp = 441; - if(config.sampleRate%8000 == 0) + if(config.sampleRate%8000 == 0) tmp =480; config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut; @@ -449,10 +449,10 @@ VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData) } config.bandWidth = BandwithCoefTab[i][SampleRateIdx]; - + /* init aac encoder core */ ret = AacEncOpen(hAacEnc, config); - if(ret) + if(ret) return VO_ERR_AUDIO_UNSFEATURE; break; default: @@ -483,7 +483,7 @@ 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; diff --git a/media/libstagefright/codecs/aacenc/src/aacenc_core.c b/media/libstagefright/codecs/aacenc/src/aacenc_core.c index b69a01707c76..2b3bd48c9772 100644 --- a/media/libstagefright/codecs/aacenc/src/aacenc_core.c +++ b/media/libstagefright/codecs/aacenc/src/aacenc_core.c @@ -43,8 +43,8 @@ void AacInitDefaultConfig(AACENC_CONFIG *config) config->adtsUsed = 1; config->nChannelsIn = 2; config->nChannelsOut = 2; - config->bitRate = 128000; - config->bandWidth = 0; + config->bitRate = 128000; + config->bandWidth = 0; } /******************************************************************************** @@ -63,11 +63,11 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder Word16 profile = 1; ELEMENT_INFO *elInfo = NULL; - + if (hAacEnc==0) { - error=1; + error=1; } - + if (!error) { hAacEnc->config = config; } @@ -83,7 +83,7 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder if (!error) { /* use or not tns tool for long and short block */ - Word16 tnsMask=3; + Word16 tnsMask=3; /* init encoder psychoacoustic */ error = psyMainInit(&hAacEnc->psyKernel, @@ -107,10 +107,10 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder qcInit.elInfo = &hAacEnc->elInfo; qcInit.maxBits = (Word16) (MAXBITS_COEF*elInfo->nChannelsInEl); - qcInit.bitRes = qcInit.maxBits; + qcInit.bitRes = qcInit.maxBits; qcInit.averageBits = (Word16) ((config.bitRate * FRAME_LEN_LONG) / config.sampleRate); - qcInit.padding.paddingRest = config.sampleRate; + qcInit.padding.paddingRest = config.sampleRate; qcInit.meanPe = (Word16) ((10 * FRAME_LEN_LONG * hAacEnc->config.bandWidth) / (config.sampleRate>>1)); @@ -118,17 +118,17 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder qcInit.maxBitFac = (Word16) ((100 * (MAXBITS_COEF-MINBITS_COEF)* elInfo->nChannelsInEl)/ (qcInit.averageBits?qcInit.averageBits:1)); - qcInit.bitrate = config.bitRate; + qcInit.bitrate = config.bitRate; error = QCInit(&hAacEnc->qcKernel, &qcInit); } /* init bitstream encoder */ if (!error) { - hAacEnc->bseInit.nChannels = elInfo->nChannelsInEl; - hAacEnc->bseInit.bitrate = config.bitRate; - hAacEnc->bseInit.sampleRate = config.sampleRate; - hAacEnc->bseInit.profile = profile; + hAacEnc->bseInit.nChannels = elInfo->nChannelsInEl; + hAacEnc->bseInit.bitrate = config.bitRate; + hAacEnc->bseInit.sampleRate = config.sampleRate; + hAacEnc->bseInit.profile = profile; } return error; @@ -152,14 +152,14 @@ Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */ ELEMENT_INFO *elInfo = &aacEnc->elInfo; Word16 globUsedBits; Word16 ancDataBytes, ancDataBytesLeft; - - ancDataBytes = ancDataBytesLeft = *numAncBytes; + + ancDataBytes = ancDataBytesLeft = *numAncBytes; /* init output aac data buffer and length */ aacEnc->hBitStream = CreateBitBuffer(&aacEnc->bitStream, outBytes, *numOutBytes); /* psychoacoustic process */ - psyMain(aacEnc->config.nChannelsOut, + psyMain(aacEnc->config.nChannelsOut, elInfo, timeSignal, &aacEnc->psyKernel.psyData[elInfo->ChannelIndex[0]], @@ -175,9 +175,9 @@ Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */ AdjustBitrate(&aacEnc->qcKernel, aacEnc->config.bitRate, aacEnc->config.sampleRate); - + /* quantization and coding process */ - QCMain(&aacEnc->qcKernel, + QCMain(&aacEnc->qcKernel, &aacEnc->qcKernel.elementBits, &aacEnc->qcKernel.adjThr.adjThrStateElem, &aacEnc->psyOut.psyOutChannel[elInfo->ChannelIndex[0]], @@ -193,11 +193,11 @@ Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */ &aacEnc->qcOut); /* write bitstream process */ - WriteBitstream(aacEnc->hBitStream, + WriteBitstream(aacEnc->hBitStream, *elInfo, &aacEnc->qcOut, &aacEnc->psyOut, - &globUsedBits, + &globUsedBits, ancBytes, aacEnc->psyKernel.sampleRateIdx); @@ -219,7 +219,7 @@ Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */ **********************************************************************************/ void AacEncClose (AAC_ENCODER* hAacEnc, VO_MEM_OPERATOR *pMemOP) { - if (hAacEnc) { + if (hAacEnc) { QCDelete(&hAacEnc->qcKernel, pMemOP); QCOutDelete(&hAacEnc->qcOut, pMemOP); diff --git a/media/libstagefright/codecs/aacenc/src/adj_thr.c b/media/libstagefright/codecs/aacenc/src/adj_thr.c index 83b43a13ec95..c656f65b8a5b 100644 --- a/media/libstagefright/codecs/aacenc/src/adj_thr.c +++ b/media/libstagefright/codecs/aacenc/src/adj_thr.c @@ -71,7 +71,7 @@ static void calcThreshExp(Word32 thrExp[MAX_CHANNELS][MAX_GROUPED_SFB], Word32 *pthrExp, *psfbThre; for (ch=0; ch<nChannels; ch++) { PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; - for(sfbGrp = 0; sfbGrp < psyOutChan->sfbCnt; sfbGrp+= psyOutChan->sfbPerGroup) + for(sfbGrp = 0; sfbGrp < psyOutChan->sfbCnt; sfbGrp+= psyOutChan->sfbPerGroup) pthrExp = &(thrExp[ch][sfbGrp]); psfbThre = psyOutChan->sfbThreshold + sfbGrp; for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { @@ -96,21 +96,21 @@ static void adaptMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], Word32 nSfb, avgEn; Word16 log_avgEn = 0; Word32 startRatio_x_avgEn = 0; - + for (ch=0; ch<nChannels; ch++) { PSY_OUT_CHANNEL* psyOutChan = &psyOutChannel[ch]; /* calc average energy per scalefactor band */ - avgEn = 0; - nSfb = 0; + avgEn = 0; + nSfb = 0; for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup) { for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { avgEn = L_add(avgEn, psyOutChan->sfbEnergy[sfbOffs+sfb]); nSfb = nSfb + 1; } } - + if (nSfb > 0) { avgEn = avgEn / nSfb; @@ -118,7 +118,7 @@ static void adaptMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], startRatio_x_avgEn = fixmul(msaParam->startRatio, avgEn); } - + /* reduce minSnr requirement by minSnr^minSnrRed dependent on avgEn/sfbEn */ for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup) { for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { @@ -126,22 +126,22 @@ static void adaptMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], Word16 dbRatio, minSnrRed; Word32 snrRed; Word16 newMinSnr; - + dbRatio = log_avgEn - logSfbEnergy[ch][sfbOffs+sfb]; dbRatio = dbRatio + (dbRatio << 1); minSnrRed = 110 - ((dbRatio + (dbRatio << 1)) >> 2); - minSnrRed = max(minSnrRed, 20); /* 110: (0.375(redOffs)+1)*80, + minSnrRed = max(minSnrRed, 20); /* 110: (0.375(redOffs)+1)*80, 3: 0.00375(redRatioFac)*80 20: 0.25(maxRed) * 80 */ - snrRed = minSnrRed * iLog4((psyOutChan->sfbMinSnr[sfbOffs+sfb] << 16)); - /* + snrRed = minSnrRed * iLog4((psyOutChan->sfbMinSnr[sfbOffs+sfb] << 16)); + /* snrRedI si now scaled by 80 (minSnrRed) and 4 (ffr_iLog4) */ - + newMinSnr = round16(pow2_xy(snrRed,80*4)); - + psyOutChan->sfbMinSnr[sfbOffs+sfb] = min(newMinSnr, minSnrLimit); } } @@ -169,7 +169,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], for (ch=0; ch<nChannels; ch++) { PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; - + if (psyOutChan->windowSequence != SHORT_WINDOW) { for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp; @@ -194,7 +194,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], if (ahParam->modifyMinSnr) { for(ch=0; ch<nChannels; ch++) { PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; - + if (psyOutChan->windowSequence != SHORT_WINDOW) threshold = HOLE_THR_LONG; else @@ -204,39 +204,39 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], Word16 *psfbMinSnr = psyOutChan->sfbMinSnr + sfbGrp; for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { Word32 sfbEn, sfbEnm1, sfbEnp1, avgEn; - + if (sfb > 0) sfbEnm1 = psyOutChan->sfbEnergy[sfbGrp+sfb-1]; else sfbEnm1 = psyOutChan->sfbEnergy[sfbGrp]; - + if (sfb < (psyOutChan->maxSfbPerGroup-1)) sfbEnp1 = psyOutChan->sfbEnergy[sfbGrp+sfb+1]; else sfbEnp1 = psyOutChan->sfbEnergy[sfbGrp+sfb]; avgEn = (sfbEnm1 + sfbEnp1) >> 1; - sfbEn = psyOutChan->sfbEnergy[sfbGrp+sfb]; - + sfbEn = psyOutChan->sfbEnergy[sfbGrp+sfb]; + if (sfbEn > avgEn && avgEn > 0) { Word32 tmpMinSnr; shift = norm_l(sfbEn); tmpMinSnr = Div_32(L_mpy_ls(avgEn, minSnrLimit) << shift, sfbEn << shift ); - tmpMinSnr = max(tmpMinSnr, HOLE_THR_LONG); + tmpMinSnr = max(tmpMinSnr, HOLE_THR_LONG); tmpMinSnr = max(tmpMinSnr, threshold); *psfbMinSnr = min(*psfbMinSnr, tmpMinSnr); } /* valley ? */ - + if ((sfbEn < (avgEn >> 1)) && (sfbEn > 0)) { Word32 tmpMinSnr; - Word32 minSnrEn = L_mpy_wx(avgEn, *psfbMinSnr); - + Word32 minSnrEn = L_mpy_wx(avgEn, *psfbMinSnr); + if(minSnrEn < sfbEn) { shift = norm_l(sfbEn); tmpMinSnr = Div_32( minSnrEn << shift, sfbEn<<shift); } else { - tmpMinSnr = MAX_16; + tmpMinSnr = MAX_16; } tmpMinSnr = min(minSnrLimit, tmpMinSnr); @@ -251,7 +251,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], /* stereo: adapt the minimum requirements sfbMinSnr of mid and side channels */ - + if (nChannels == 2) { PSY_OUT_CHANNEL *psyOutChanM = &psyOutChannel[0]; PSY_OUT_CHANNEL *psyOutChanS = &psyOutChannel[1]; @@ -260,30 +260,30 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], Word32 sfbEnM = psyOutChanM->sfbEnergy[sfb]; Word32 sfbEnS = psyOutChanS->sfbEnergy[sfb]; Word32 maxSfbEn = max(sfbEnM, sfbEnS); - Word32 maxThr = L_mpy_wx(maxSfbEn, psyOutChanM->sfbMinSnr[sfb]) >> 1; - + Word32 maxThr = L_mpy_wx(maxSfbEn, psyOutChanM->sfbMinSnr[sfb]) >> 1; + if(maxThr >= sfbEnM) { - psyOutChanM->sfbMinSnr[sfb] = MAX_16; + 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 { 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); } - + if (sfbEnM > psyOutChanM->sfbSpreadedEnergy[sfb]) psyOutChanS->sfbSpreadedEnergy[sfb] = L_mpy_ls(sfbEnS, MS_THRSPREAD_COEF); - + if (sfbEnS > psyOutChanS->sfbSpreadedEnergy[sfb]) psyOutChanM->sfbSpreadedEnergy[sfb] = L_mpy_ls(sfbEnM, MS_THRSPREAD_COEF); } @@ -297,7 +297,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ Word16 *pahFlag = ahFlag[ch] + sfbGrp; for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { - + if ((psyOutChan->sfbSpreadedEnergy[sfbGrp+sfb] > psyOutChan->sfbEnergy[sfbGrp+sfb]) || (psyOutChan->sfbEnergy[sfbGrp+sfb] <= psyOutChan->sfbThreshold[sfbGrp+sfb]) || (psyOutChan->sfbMinSnr[sfbGrp+sfb] == MAX_16)) { @@ -308,7 +308,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], } } for (sfb=psyOutChan->maxSfbPerGroup; sfb<psyOutChan->sfbPerGroup; sfb++) { - *pahFlag++ = NO_AH; + *pahFlag++ = NO_AH; } } } @@ -331,15 +331,15 @@ static void calcPeNoAH(Word16 *pe, Word16 ch, sfb, sfbGrp; int ipe, iconstPart, inActiveLines; - ipe = 0; - iconstPart = 0; - inActiveLines = 0; + ipe = 0; + iconstPart = 0; + inActiveLines = 0; for(ch=0; ch<nChannels; ch++) { PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch]; for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { - + if (ahFlag[ch][sfbGrp+sfb] < AH_ACTIVE) { ipe = ipe + peChanData->sfbPe[sfbGrp+sfb]; iconstPart = iconstPart + peChanData->sfbConstPart[sfbGrp+sfb]; @@ -349,9 +349,9 @@ static void calcPeNoAH(Word16 *pe, } } - *pe = saturate(ipe); - *constPart = saturate(iconstPart); - *nActiveLines = saturate(inActiveLines); + *pe = saturate(ipe); + *constPart = saturate(iconstPart); + *nActiveLines = saturate(inActiveLines); } /******************************************************************************** @@ -367,16 +367,16 @@ static void reduceThresholds(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], const Word32 redVal) { Word32 sfbThrReduced; - Word32 *psfbEn, *psfbThr; + 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; + psfbEn = psyOutChan->sfbEnergy + sfbGrp; psfbThr = psyOutChan->sfbThreshold + sfbGrp; for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { - + if (*psfbEn > *psfbThr) { /* threshold reduction formula */ Word32 tmp = thrExp[ch][sfbGrp+sfb] + redVal; @@ -384,11 +384,11 @@ static void reduceThresholds(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], sfbThrReduced = fixmul(tmp, tmp); /* avoid holes */ tmp = L_mpy_ls(*psfbEn, psyOutChan->sfbMinSnr[sfbGrp+sfb]); - - if ((sfbThrReduced > tmp) && + + if ((sfbThrReduced > tmp) && (ahFlag[ch][sfbGrp+sfb] != NO_AH)){ sfbThrReduced = max(tmp, *psfbThr); - ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE; + ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE; } *psfbThr = sfbThrReduced; } @@ -426,7 +426,7 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], Word32 sfbThrReduced; /* for each sfb calc relative factors for pe changes */ - normFactor = 1; + normFactor = 1; for(ch=0; ch<nChannels; ch++) { psyOutChan = &psyOutChannel[ch]; peChanData = &peData->peChannelData[ch]; @@ -436,22 +436,22 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], pahFlag = ahFlag[ch] + sfbGrp; for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { Word32 redThrExp = thrExp[ch][sfbGrp+sfb] + redVal; - + if (((*pahFlag < AH_ACTIVE) || (deltaPe > 0)) && (redThrExp > 0) ) { - + *psfbPeFactors = (*psfbNActiveLines) * (0x7fffffff / redThrExp); normFactor = L_add(normFactor, *psfbPeFactors); } else { - *psfbPeFactors = 0; + *psfbPeFactors = 0; } - psfbPeFactors++; + psfbPeFactors++; pahFlag++; psfbNActiveLines++; } } } - + /* calculate new thresholds */ for(ch=0; ch<nChannels; ch++) { psyOutChan = &psyOutChannel[ch]; @@ -464,7 +464,7 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], /* pe difference for this sfb */ deltaSfbPe = *psfbPeFactors * deltaPe; - /* thr3(n) = thr2(n)*2^deltaSfbPe/b(n) */ + /* thr3(n) = thr2(n)*2^deltaSfbPe/b(n) */ if (*psfbNActiveLines > 0) { /* new threshold */ Word32 thrFactor; @@ -476,7 +476,7 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], reduce threshold */ thrFactor = pow2_xy(L_negate(deltaSfbPe), (normFactor* (*psfbNActiveLines))); - + sfbThrReduced = L_mpy_ls(sfbThr, round16(thrFactor)); } else { @@ -484,28 +484,28 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], increase threshold */ thrFactor = pow2_xy(deltaSfbPe, (normFactor * (*psfbNActiveLines))); - - + + if(thrFactor > sfbThr) { shift = norm_l(thrFactor); sfbThrReduced = Div_32( sfbThr << shift, thrFactor<<shift ); } else { - sfbThrReduced = MAX_32; + sfbThrReduced = MAX_32; } } - + /* avoid hole */ sfbEn = L_mpy_ls(sfbEn, psyOutChan->sfbMinSnr[sfbGrp+sfb]); - + if ((sfbThrReduced > sfbEn) && (*pahFlag == AH_INACTIVE)) { sfbThrReduced = max(sfbEn, sfbThr); - *pahFlag = AH_ACTIVE; + *pahFlag = AH_ACTIVE; } - psyOutChan->sfbThreshold[sfbGrp+sfb] = sfbThrReduced; + psyOutChan->sfbThreshold[sfbGrp+sfb] = sfbThrReduced; } pahFlag++; psfbNActiveLines++; psfbPeFactors++; @@ -521,8 +521,8 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], * description: if the desired pe can not be reached, reduce pe by reducing minSnr * **********************************************************************************/ -static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], - PE_DATA *peData, +static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], + PE_DATA *peData, Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], const Word16 nChannels, const Word16 desiredPe) @@ -531,9 +531,9 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], Word16 deltaPe; /* start at highest freq down to 0 */ - sfbSubWin = psyOutChannel[0].maxSfbPerGroup; + sfbSubWin = psyOutChannel[0].maxSfbPerGroup; while (peData->pe > desiredPe && sfbSubWin > 0) { - + sfbSubWin = sfbSubWin - 1; /* loop over all subwindows */ for (sfb=sfbSubWin; sfb<psyOutChannel[0].sfbCnt; @@ -541,10 +541,10 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], /* loop over all channels */ PE_CHANNEL_DATA* peChan = peData->peChannelData; PSY_OUT_CHANNEL* psyOutCh = psyOutChannel; - for (ch=0; ch<nChannels; ch++) { + for (ch=0; ch<nChannels; ch++) { if (ahFlag[ch][sfb] != NO_AH && psyOutCh->sfbMinSnr[sfb] < minSnrLimit) { - psyOutCh->sfbMinSnr[sfb] = minSnrLimit; + psyOutCh->sfbMinSnr[sfb] = minSnrLimit; psyOutCh->sfbThreshold[sfb] = L_mpy_ls(psyOutCh->sfbEnergy[sfb], psyOutCh->sfbMinSnr[sfb]); @@ -552,12 +552,12 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], deltaPe = ((peChan->sfbNLines4[sfb] + (peChan->sfbNLines4[sfb] >> 1)) >> 2) - peChan->sfbPe[sfb]; peData->pe = peData->pe + deltaPe; - peChan->pe = peChan->pe + deltaPe; + peChan->pe = peChan->pe + deltaPe; } peChan += 1; psyOutCh += 1; } /* stop if enough has been saved */ - + if (peData->pe <= desiredPe) break; } @@ -567,13 +567,13 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], /******************************************************************************** * * function name:allowMoreHoles -* description: if the desired pe can not be reached, some more scalefactor bands +* description: if the desired pe can not be reached, some more scalefactor bands * have to be quantized to zero * **********************************************************************************/ -static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], +static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], PSY_OUT_ELEMENT *psyOutElement, - PE_DATA *peData, + PE_DATA *peData, Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], const AH_PARAM *ahParam, const Word16 nChannels, @@ -582,46 +582,46 @@ static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], Word16 ch, sfb; Word16 actPe, shift; - actPe = peData->pe; + actPe = peData->pe; /* for MS allow hole in the channel with less energy */ - + if (nChannels==2 && psyOutChannel[0].windowSequence==psyOutChannel[1].windowSequence) { PSY_OUT_CHANNEL *psyOutChanL = &psyOutChannel[0]; PSY_OUT_CHANNEL *psyOutChanR = &psyOutChannel[1]; for (sfb=0; sfb<psyOutChanL->sfbCnt; sfb++) { Word32 minEn; - + if (psyOutElement->toolsInfo.msMask[sfb]) { /* allow hole in side channel ? */ minEn = L_mpy_ls(psyOutChanL->sfbEnergy[sfb], (minSnrLimit * psyOutChanL->sfbMinSnr[sfb]) >> 16); - + if (ahFlag[1][sfb] != NO_AH && minEn > psyOutChanR->sfbEnergy[sfb]) { - ahFlag[1][sfb] = NO_AH; + ahFlag[1][sfb] = NO_AH; psyOutChanR->sfbThreshold[sfb] = L_add(psyOutChanR->sfbEnergy[sfb], psyOutChanR->sfbEnergy[sfb]); actPe = actPe - peData->peChannelData[1].sfbPe[sfb]; } /* allow hole in mid channel ? */ else { minEn = L_mpy_ls(psyOutChanR->sfbEnergy[sfb], (minSnrLimit * psyOutChanR->sfbMinSnr[sfb]) >> 16); - + if (ahFlag[0][sfb]!= NO_AH && minEn > psyOutChanL->sfbEnergy[sfb]) { - ahFlag[0][sfb] = NO_AH; + ahFlag[0][sfb] = NO_AH; psyOutChanL->sfbThreshold[sfb] = L_add(psyOutChanL->sfbEnergy[sfb], psyOutChanL->sfbEnergy[sfb]); actPe = actPe - peData->peChannelData[0].sfbPe[sfb]; } } - + if (actPe < desiredPe) break; } } } - /* subsequently erase bands */ + /* subsequently erase bands */ if (actPe > desiredPe) { Word16 startSfb[2]; Word32 avgEn, minEn; @@ -634,20 +634,20 @@ static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], /* do not go below startSfb */ for (ch=0; ch<nChannels; ch++) { - + if (psyOutChannel[ch].windowSequence != SHORT_WINDOW) startSfb[ch] = ahParam->startSfbL; else startSfb[ch] = ahParam->startSfbS; } - avgEn = 0; - minEn = MAX_32; - ahCnt = 0; + avgEn = 0; + minEn = MAX_32; + ahCnt = 0; for (ch=0; ch<nChannels; ch++) { PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; for (sfb=startSfb[ch]; sfb<psyOutChan->sfbCnt; sfb++) { - + if ((ahFlag[ch][sfb] != NO_AH) && (psyOutChan->sfbEnergy[sfb] > psyOutChan->sfbThreshold[sfb])) { minEn = min(minEn, psyOutChan->sfbEnergy[sfb]); @@ -656,7 +656,7 @@ static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], } } } - + if(ahCnt) { Word32 iahCnt; shift = norm_l(ahCnt); @@ -674,46 +674,46 @@ static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], /* start with lowest energy border at highest sfb */ maxSfb = psyOutChannel[0].sfbCnt - 1; - minSfb = startSfb[0]; - + minSfb = startSfb[0]; + if (nChannels == 2) { maxSfb = max(maxSfb, (psyOutChannel[1].sfbCnt - 1)); minSfb = min(minSfb, startSfb[1]); } - sfb = maxSfb; - enIdx = 0; - done = 0; + sfb = maxSfb; + enIdx = 0; + done = 0; while (!done) { - + for (ch=0; ch<nChannels; ch++) { PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; - + if (sfb>=startSfb[ch] && sfb<psyOutChan->sfbCnt) { /* sfb energy below border ? */ - + if (ahFlag[ch][sfb] != NO_AH && psyOutChan->sfbEnergy[sfb] < en[enIdx]){ /* allow hole */ - ahFlag[ch][sfb] = NO_AH; + ahFlag[ch][sfb] = NO_AH; psyOutChan->sfbThreshold[sfb] = L_add(psyOutChan->sfbEnergy[sfb], psyOutChan->sfbEnergy[sfb]); actPe = actPe - peData->peChannelData[ch].sfbPe[sfb]; } - + if (actPe < desiredPe) { - done = 1; + done = 1; break; } } } sfb = sfb - 1; - + if (sfb < minSfb) { /* restart with next energy border */ - sfb = maxSfb; + sfb = maxSfb; enIdx = enIdx + 1; - + if (enIdx - 4 >= 0) - done = 1; + done = 1; } } } @@ -748,13 +748,13 @@ static void adaptThresholdsToPe(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], initAvoidHoleFlag(peData->ahFlag, psyOutChannel, psyOutElement, nChannels, ahParam); - noRedPe = peData->pe; - constPart = peData->constPart; - nActiveLines = peData->nActiveLines; + noRedPe = peData->pe; + constPart = peData->constPart; + nActiveLines = peData->nActiveLines; /* first guess of reduction value t^0.25 = 2^((a-pen)/4*b) */ avgThrExp = pow2_xy((constPart - noRedPe), (nActiveLines << 2)); - + /* r1 = 2^((a-per)/4*b) - t^0.25 */ redVal = pow2_xy((constPart - desiredPe), (nActiveLines << 2)) - avgThrExp; @@ -763,40 +763,40 @@ static void adaptThresholdsToPe(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], /* pe after first guess */ calcSfbPe(peData, psyOutChannel, nChannels); - redPe = peData->pe; + redPe = peData->pe; - iter = 0; + iter = 0; do { /* pe for bands where avoid hole is inactive */ calcPeNoAH(&redPeNoAH, &constPartNoAH, &nActiveLinesNoAH, peData, peData->ahFlag, psyOutChannel, nChannels); desiredPeNoAH = desiredPe -(redPe - redPeNoAH); - + if (desiredPeNoAH < 0) { - desiredPeNoAH = 0; + desiredPeNoAH = 0; } /* second guess */ - + if (nActiveLinesNoAH > 0) { - + avgThrExp = pow2_xy((constPartNoAH - redPeNoAH), (nActiveLinesNoAH << 2)); - + redVal = (redVal + pow2_xy((constPartNoAH - desiredPeNoAH), (nActiveLinesNoAH << 2))) - avgThrExp; - + /* reduce thresholds */ reduceThresholds(psyOutChannel, peData->ahFlag, peData->thrExp, nChannels, redVal); } calcSfbPe(peData, psyOutChannel, nChannels); - redPe = peData->pe; + redPe = peData->pe; iter = iter+1; - + } while ((20 * abs_s(redPe - desiredPe) > desiredPe) && (iter < 2)); - + if ((100 * redPe < 115 * desiredPe)) { correctThresh(psyOutChannel, peData->ahFlag, peData, peData->thrExp, redVal, nChannels, desiredPe - redPe); @@ -863,7 +863,7 @@ static Word16 calcBitSpend(Word16 fillLevel, if(clipHigh-clipLow) bitspend = (minBitSpend + ((maxBitSpend - minBitSpend)*(fillLevel - clipLow) / (clipHigh-clipLow))); - + return (bitspend); } @@ -884,19 +884,19 @@ static void adjustPeMinMax(const Word16 currPe, Word16 minFacHi, maxFacHi, minFacLo, maxFacLo; Word16 diff; Word16 minDiff = extract_l(currPe / 6); - minFacHi = 30; - maxFacHi = 100; - minFacLo = 14; - maxFacLo = 7; + minFacHi = 30; + maxFacHi = 100; + minFacLo = 14; + maxFacLo = 7; diff = currPe - *peMax ; - + if (diff > 0) { *peMin = *peMin + ((diff * minFacHi) / 100); *peMax = *peMax + ((diff * maxFacHi) / 100); } else { diff = *peMin - currPe; - + if (diff > 0) { *peMin = *peMin - ((diff * minFacLo) / 100); *peMax = *peMax - ((diff * maxFacLo) / 100); @@ -906,7 +906,7 @@ static void adjustPeMinMax(const Word16 currPe, } } - + if ((*peMax - *peMin) < minDiff) { Word16 partLo, partHi; @@ -969,7 +969,7 @@ static Word16 bitresCalcBitFac( const Word16 bitresBits, (adjThrChan->peMax - adjThrChan->peMin)); else bitresFac = 0x7fff; - + bitresFac = min(bitresFac, (100-30 + extract_l((100 * bitresBits) / avgBits))); @@ -995,23 +995,23 @@ void AdjThrInit(ADJ_THR_STATE *hAdjThr, /* common for all elements: */ /* parameters for bitres control */ - hAdjThr->bresParamLong.clipSaveLow = 20; - hAdjThr->bresParamLong.clipSaveHigh = 95; - hAdjThr->bresParamLong.minBitSave = -5; - hAdjThr->bresParamLong.maxBitSave = 30; - hAdjThr->bresParamLong.clipSpendLow = 20; - hAdjThr->bresParamLong.clipSpendHigh = 95; - hAdjThr->bresParamLong.minBitSpend = -10; - hAdjThr->bresParamLong.maxBitSpend = 40; - - hAdjThr->bresParamShort.clipSaveLow = 20; - hAdjThr->bresParamShort.clipSaveHigh = 75; - hAdjThr->bresParamShort.minBitSave = 0; - hAdjThr->bresParamShort.maxBitSave = 20; - hAdjThr->bresParamShort.clipSpendLow = 20; - hAdjThr->bresParamShort.clipSpendHigh = 75; - hAdjThr->bresParamShort.minBitSpend = -5; - hAdjThr->bresParamShort.maxBitSpend = 50; + hAdjThr->bresParamLong.clipSaveLow = 20; + hAdjThr->bresParamLong.clipSaveHigh = 95; + hAdjThr->bresParamLong.minBitSave = -5; + hAdjThr->bresParamLong.maxBitSave = 30; + hAdjThr->bresParamLong.clipSpendLow = 20; + hAdjThr->bresParamLong.clipSpendHigh = 95; + hAdjThr->bresParamLong.minBitSpend = -10; + hAdjThr->bresParamLong.maxBitSpend = 40; + + hAdjThr->bresParamShort.clipSaveLow = 20; + hAdjThr->bresParamShort.clipSaveHigh = 75; + hAdjThr->bresParamShort.minBitSave = 0; + hAdjThr->bresParamShort.maxBitSave = 20; + hAdjThr->bresParamShort.clipSpendLow = 20; + hAdjThr->bresParamShort.clipSpendHigh = 75; + hAdjThr->bresParamShort.minBitSpend = -5; + hAdjThr->bresParamShort.maxBitSpend = 50; /* specific for each element: */ @@ -1020,7 +1020,7 @@ void AdjThrInit(ADJ_THR_STATE *hAdjThr, atsElem->peMax = extract_l(((120*meanPe) / 100)); /* additional pe offset to correct pe2bits for low bitrates */ - atsElem->peOffset = 0; + atsElem->peOffset = 0; if (chBitrate < 32000) { atsElem->peOffset = max(50, (100 - extract_l((100 * chBitrate) / 32000))); } @@ -1039,24 +1039,24 @@ void AdjThrInit(ADJ_THR_STATE *hAdjThr, /* minSnr adaptation */ /* maximum reduction of minSnr goes down to minSnr^maxRed */ - msaParam->maxRed = 0x20000000; /* *0.25f / + msaParam->maxRed = 0x20000000; /* *0.25f / /* start adaptation of minSnr for avgEn/sfbEn > startRatio */ - msaParam->startRatio = 0x0ccccccd; /* 10 */ + msaParam->startRatio = 0x0ccccccd; /* 10 */ /* maximum minSnr reduction to minSnr^maxRed is reached for avgEn/sfbEn >= maxRatio */ - msaParam->maxRatio = 0x0020c49c; /* 1000 */ + msaParam->maxRatio = 0x0020c49c; /* 1000 */ /* helper variables to interpolate minSnr reduction for avgEn/sfbEn between startRatio and maxRatio */ - msaParam->redRatioFac = 0xfb333333; /* -0.75/20 */ + msaParam->redRatioFac = 0xfb333333; /* -0.75/20 */ + + msaParam->redOffs = 0x30000000; /* msaParam->redRatioFac * 10*log10(msaParam->startRatio) */ - msaParam->redOffs = 0x30000000; /* msaParam->redRatioFac * 10*log10(msaParam->startRatio) */ - /* pe correction */ - atsElem->peLast = 0; - atsElem->dynBitsLast = 0; - atsElem->peCorrectionFactor = 100; /* 1.0 */ + atsElem->peLast = 0; + atsElem->dynBitsLast = 0; + atsElem->peCorrectionFactor = 100; /* 1.0 */ } @@ -1069,20 +1069,20 @@ void AdjThrInit(ADJ_THR_STATE *hAdjThr, *****************************************************************************/ static void calcPeCorrection(Word16 *correctionFac, const Word16 peAct, - const Word16 peLast, - const Word16 bitsLast) + const Word16 peLast, + const Word16 bitsLast) { Word32 peAct100 = 100 * peAct; Word32 peLast100 = 100 * peLast; Word16 peBitsLast = bits2pe(bitsLast); - + if ((bitsLast > 0) && (peAct100 < (150 * peLast)) && (peAct100 > (70 * peLast)) && ((120 * peBitsLast) > peLast100 ) && (( 65 * peBitsLast) < peLast100)) { Word16 newFac = (100 * peLast) / peBitsLast; /* dead zone */ - + if (newFac < 100) { newFac = min(((110 * newFac) / 100), 100); newFac = max(newFac, 85); @@ -1091,13 +1091,13 @@ static void calcPeCorrection(Word16 *correctionFac, newFac = max(((90 * newFac) / 100), 100); newFac = min(newFac, 115); } - + if ((newFac > 100 && *correctionFac < 100) || (newFac < 100 && *correctionFac > 100)) { - *correctionFac = 100; + *correctionFac = 100; } /* faster adaptation towards 1.0, slower in the other direction */ - + if ((*correctionFac < 100 && newFac < *correctionFac) || (*correctionFac > 100 && newFac > *correctionFac)) *correctionFac = (85 * *correctionFac + 15 * newFac) / 100; @@ -1107,7 +1107,7 @@ static void calcPeCorrection(Word16 *correctionFac, *correctionFac = max(*correctionFac, 85); } else { - *correctionFac = 100; + *correctionFac = 100; } } @@ -1123,40 +1123,40 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState, PSY_OUT_ELEMENT *psyOutElement, Word16 *chBitDistribution, Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB], - Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB], + Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB], QC_OUT_ELEMENT *qcOE, ELEMENT_BITS *elBits, const Word16 nChannels, const Word16 maxBitFac) { - PE_DATA peData; + PE_DATA peData; Word16 noRedPe, grantedPe, grantedPeCorr; Word16 curWindowSequence; Word16 bitFactor; Word16 avgBits = (elBits->averageBits - (qcOE->staticBitsUsed + qcOE->ancBitsUsed)); - Word16 bitresBits = elBits->bitResLevel; + Word16 bitresBits = elBits->bitResLevel; Word16 maxBitresBits = elBits->maxBits; Word16 sideInfoBits = (qcOE->staticBitsUsed + qcOE->ancBitsUsed); Word16 ch; - + prepareSfbPe(&peData, psyOutChannel, logSfbEnergy, sfbNRelevantLines, nChannels, AdjThrStateElement->peOffset); - + /* pe without reduction */ calcSfbPe(&peData, psyOutChannel, nChannels); - noRedPe = peData.pe; + noRedPe = peData.pe; - curWindowSequence = LONG_WINDOW; - + curWindowSequence = LONG_WINDOW; + if (nChannels == 2) { - + if ((psyOutChannel[0].windowSequence == SHORT_WINDOW) || (psyOutChannel[1].windowSequence == SHORT_WINDOW)) { - curWindowSequence = SHORT_WINDOW; + curWindowSequence = SHORT_WINDOW; } } else { - curWindowSequence = psyOutChannel[0].windowSequence; + curWindowSequence = psyOutChannel[0].windowSequence; } @@ -1170,13 +1170,13 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState, grantedPe = ((bitFactor * bits2pe(avgBits)) / 100); /* correction of pe value */ - calcPeCorrection(&(AdjThrStateElement->peCorrectionFactor), + calcPeCorrection(&(AdjThrStateElement->peCorrectionFactor), min(grantedPe, noRedPe), - AdjThrStateElement->peLast, + AdjThrStateElement->peLast, AdjThrStateElement->dynBitsLast); grantedPeCorr = (grantedPe * AdjThrStateElement->peCorrectionFactor) / 100; - + if (grantedPeCorr < noRedPe && noRedPe > peData.offset) { /* calc threshold necessary for desired pe */ adaptThresholdsToPe(psyOutChannel, @@ -1192,8 +1192,8 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState, /* calculate relative distribution */ for (ch=0; ch<nChannels; ch++) { Word16 peOffsDiff = peData.pe - peData.offset; - chBitDistribution[ch] = 200; - + chBitDistribution[ch] = 200; + if (peOffsDiff > 0) { Word32 temp = 1000 - (nChannels * 200); chBitDistribution[ch] = chBitDistribution[ch] + @@ -1202,10 +1202,10 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState, } /* store pe */ - qcOE->pe = noRedPe; + qcOE->pe = noRedPe; /* update last pe */ - AdjThrStateElement->peLast = grantedPe; + AdjThrStateElement->peLast = grantedPe; } /******************************************************************************** @@ -1217,7 +1217,7 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState, void AdjThrUpdate(ATS_ELEMENT *AdjThrStateElement, const Word16 dynBitsUsed) { - AdjThrStateElement->dynBitsLast = dynBitsUsed; + AdjThrStateElement->dynBitsLast = dynBitsUsed; } 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 e0885f1b0b3a..e7051975f8f4 100644 --- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/AutoCorrelation_v5.s +++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/AutoCorrelation_v5.s @@ -22,34 +22,34 @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - .section .text + .section .text .global AutoCorrelation AutoCorrelation: stmdb sp!, {r4 - r11, lr} - sub r13, r13, #20 + 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 + 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 - sub r12, r4, #8 -L132: - ldr r6, [r5, r2] + 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] + ldr r1, [r5, r2] smultt r10, r6, r6 mov r3, r3, asr #9 smulbb r6, r1, r1 @@ -72,95 +72,95 @@ L132: 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 + 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 +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] + 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 - + 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 + add r13, r13, #20 ldmia sp!, {r4 - r11, pc} @ENDP @ |AutoCorrelation| 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 75b916ca7446..b30e8cb8147a 100644 --- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/CalcWindowEnergy_v5.s +++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/CalcWindowEnergy_v5.s @@ -22,91 +22,91 @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .section .text - + .global CalcWindowEnergy CalcWindowEnergy: stmdb sp!, {r4 - r11, lr} - sub r13, r13, #20 + sub r13, r13, #20 - mov r3, r3, lsl #16 + mov r3, r3, lsl #16 ldr r10, [r0, #168] @ states0 = blockSwitchingControl->iirStates[0]; - mov r3, r3, asr #16 + mov r3, r3, asr #16 ldr r11, [r0, #172] @ states1 = blockSwitchingControl->iirStates[1]; mov r2, r2, lsl #16 - ldr r12, hiPassCoeff @ Coeff0 = hiPassCoeff[0]; + 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 r6, #0 @ accuUE = 0; + mov r7, #0 @ accuFE = 0; mov r4, #0 @ i=0 - - str r8, [r13, #4] - str r0, [r13, #8] + + str r8, [r13, #4] + str r0, [r13, #8] str r3, [r13, #12] - -ENERGY_BEG: - mov r9, r5, lsl #1 + +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); + + 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 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 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 + mul r9, r8, r8 ldr r3, [r13, #12] add r7, r7, r9, asr #7 - - cmp r4, r3 - blt ENERGY_BEG - + + 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] + str r6, [r4, #72] + add r8, r8, #1 + str r7, [r4, #136] cmp r8, #8 - blt BLOCK_BEGIN + 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} + 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 38fe092aa7cf..103cc91814ad 100644 --- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/PrePostMDCT_v5.s +++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/PrePostMDCT_v5.s @@ -26,46 +26,46 @@ 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)@ + 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] + mov r6, r11 + + strd r6, [r0] strd r8, [r3] - + subs r1, r1, #1 sub r3, r3, #8 add r0, r0, #8 @@ -74,52 +74,52 @@ 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 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)@ + 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 + + mov r7, r11 strd r4, [r0] strd r6, [r3] - + subs r1, r1, #1 sub r3, r3, #8 add r0, r0, #8 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 b30881af3097..72cb9a3ca907 100644 --- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/R4R8First_v5.s +++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/R4R8First_v5.s @@ -26,46 +26,46 @@ 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 @@ -73,180 +73,180 @@ 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 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 - + 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 r3, [sp, #20] + str r0, [sp, #24] - str r1, [sp, #28] - - ldrd r2, [r14, #32] + 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 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 - + + 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 - + + 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 bc069b49f376..e81c82eaf790 100644 --- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/Radix4FFT_v5.s +++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/Radix4FFT_v5.s @@ -25,145 +25,145 @@ Radix4FFT: stmdb sp!, {r4 - r11, lr} - sub sp, sp, #32 + sub sp, sp, #32 mov r1, r1, asr #2 - cmp r1, #0 - beq Radix4FFT_END - -Radix4FFT_LOOP1: - mov r14, r0 @ xptr = buf@ + 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] + cmp r10, #0 + str r0, [sp] + str r1, [sp, #4] str r2, [sp, #8] - str r3, [sp, #12] - beq Radix4FFT_LOOP1_END - -Radix4FFT_LOOP2: + str r3, [sp, #12] + beq Radix4FFT_LOOP1_END + +Radix4FFT_LOOP2: mov r12, r3 @ csptr = twidTab@ mov r11, r2 @ j = bgn - cmp r11, #0 + cmp r11, #0 str r10, [sp, #16] - beq Radix4FFT_LOOP2_END - -Radix4FFT_LOOP3: - str r11, [sp, #20] - + 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]@ + + 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@ - + 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@ + + 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] + + 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] + + 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] + + 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] + + strd r10, [r14] add r14, r14, #8 @ xptr += 2@ - + ldr r11, [sp, #20] subs r11, r11, #1 - bne Radix4FFT_LOOP3 - -Radix4FFT_LOOP2_END: + bne Radix4FFT_LOOP3 + +Radix4FFT_LOOP2_END: ldr r10, [sp, #16] ldr r3, [sp, #12] ldr r2, [sp, #8] - rsb r8, r9, r9, lsl #2 + 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] + 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 + 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 3b88810cc380..4789f6d1d67d 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 @@ -26,31 +26,31 @@ .global CalcBandEnergy CalcBandEnergy: - stmdb sp!, {r4 - r11, lr} - - mov r2, r2, lsl #16 + 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 + 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 - + 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] + 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 + add r10, r10, #1 smull r6, r8, r6, r6 ldr r11, [r0, +r10, lsl #2] qadd r14, r14, r7 @@ -59,71 +59,71 @@ L23: ldr r6, [r0, +r10, lsl #2] qadd r14, r14, r8 smull r6, r8, r6, r6 - add r10, r10, #1 + add r10, r10, #1 qadd r14, r14, r7 cmp r10, r2 qadd r14, r14, r8 - blt L23 + blt L23 -L28: +L28: qadd r14, r14, r14 str r14, [r3, +r4, lsl #2] - add r4, r4, #1 + add r4, r4, #1 qadd r9, r9, r14 - cmp r4, r5 + cmp r4, r5 - blt L22 + blt L22 -L212: - str r9, [r12, #0] +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 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 + 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] +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 r12, [r0, +r10, lsl #2] + add r5, r8, r9 ldr r14, [r1, +r10, lsl #2] sub r8, r8, r9 - smull r5, r3, r5, r5 + smull r5, r3, r5, r5 mov r12, r12, asr #1 - smull r8, r4, r8, r8 + smull r8, r4, r8, r8 mov r14, r14, asr #1 qadd r6, r6, r3 @@ -131,27 +131,27 @@ L33: qadd r7, r7, r4 sub r8, r12, r14 - smull r5, r3, r5, r5 + smull r5, r3, r5, r5 add r10, r10, #1 - smull r8, r4, r8, r8 - + smull r8, r4, r8, r8 + qadd r6, r6, r3 qadd r7, r7, r4 - ldr r8, [r0, +r10, lsl #2] + 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 r12, [r0, +r10, lsl #2] + add r5, r8, r9 ldr r14, [r1, +r10, lsl #2] sub r8, r8, r9 - smull r5, r3, r5, r5 + smull r5, r3, r5, r5 mov r12, r12, asr #1 - smull r8, r4, r8, r8 + smull r8, r4, r8, r8 mov r14, r14, asr #1 qadd r6, r6, r3 @@ -159,37 +159,37 @@ L33: qadd r7, r7, r4 sub r8, r12, r14 - smull r5, r3, r5, r5 + smull r5, r3, r5, r5 add r10, r10, #1 - smull r8, r4, r8, r8 - + 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 r4, [r13, #8] ldr r12, [r13, #12] ldr r14, [r13, #16] -L39: +L39: qadd r6, r6, r6 - qadd r7, r7, r7 - + 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] - + + str r6, [r8, +r4, lsl #2] + str r7, [r9, +r4, lsl #2] + add r4, r4, #1 cmp r4, r3 - blt L32 + blt L32 L315: ldr r8, [r13, #64] 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 a04c105510a7..64d767a5c3e6 100644 --- a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/PrePostMDCT_v7.s +++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/PrePostMDCT_v7.s @@ -26,53 +26,53 @@ PreMDCT: stmdb sp!, {r4 - r11, lr} - + add r9, r0, r1, lsl #2 sub r3, r9, #32 movs r1, r1, asr #2 - beq PreMDCT_END - + 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 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]! - + + VST2.I32 {d5, d7}, [r3]! + VST2.I32 {d4, d6}, [r3]! + subs r1, r1, #4 - sub r3, r3, #64 + sub r3, r3, #64 bne PreMDCT_LOOP - + PreMDCT_END: ldmia sp!, {r4 - r11, pc} @ENDP @ |PreMDCT| @@ -82,50 +82,50 @@ PreMDCT_END: 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)@ + VLD2.I32 {d12, d14}, [r3]! @ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@ + + VREV64.32 Q8, Q6 + VREV64.32 Q9, Q7 - 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)@ - + VSUB.S32 Q1, Q13, Q12 @ *buf0++ = MULHIGH(sina, tr2) - MULHIGH(cosa, ti2)@ + VREV64.32 Q2, Q4 - VREV64.32 Q3, Q5 - - sub r3, r3, #32 + 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]! - + + VST2.I32 {d5, d7}, [r3]! + VST2.I32 {d4, d6}, [r3]! + subs r1, r1, #4 - sub r3, r3, #64 + sub r3, r3, #64 bne PostMDCT_LOOP PostMDCT_END: 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 defd45d42a29..7fc55203978d 100644 --- a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/R4R8First_v7.s +++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/R4R8First_v7.s @@ -29,86 +29,86 @@ Radix8First: ldr r3, SQRT1_2 cmp r1, #0 - - VDUP.I32 Q15, r3 + + 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]@ + 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 - + 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 + 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]@ + 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 + VREV64.I32 d7, d7 VSUB.S32 d5, d8, d9 @ r3 = buf[ 8] - buf[10]@i3 = buf[ 9] - buf[11]@ - - VTRN.32 d1, d3 - + + 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 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 + 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 - + 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 - + + subs r1, r1, #1 + VST1.I32 {d12, d13, d14, d15}, [r0]! - VST1.I32 {d16, d17, d18, d19}, [r0]! + VST1.I32 {d16, d17, d18, d19}, [r0]! bne Radix8First_LOOP - + Radix8First_END: - ldmia sp!, {r4 - r11, pc} + ldmia sp!, {r4 - r11, pc} SQRT1_2: .word 0x2d413ccd - + @ENDP @ |Radix8First| - + .section .text .global Radix4First @@ -117,28 +117,28 @@ Radix4First: 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]@ + 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 @ - + + 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 + 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} 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 84a4a8043860..b8655aee2096 100644 --- a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/Radix4FFT_v7.s +++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/Radix4FFT_v7.s @@ -28,116 +28,116 @@ 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: + 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 {D0, D1, D2, D3}, [r8] VLD2.I32 {D28, D29, D30, D31}, [r6]! @ cosx = csptr[0]@ sinx = csptr[1]@ - - add r8, r8, r5 @ xptr += step@ + + 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]! + + 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] + 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) - + 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 + + 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: + 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 89c39b6a8782..7501af121927 100644 --- a/media/libstagefright/codecs/aacenc/src/band_nrg.c +++ b/media/libstagefright/codecs/aacenc/src/band_nrg.c @@ -37,18 +37,18 @@ void CalcBandEnergy(const Word32 *mdctSpectrum, Word32 *bandEnergySum) { Word32 i, j; - Word32 accuSum = 0; + Word32 accuSum = 0; for (i=0; i<numBands; i++) { - Word32 accu = 0; + 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, accu); accuSum = L_add(accuSum, accu); - bandEnergy[i] = accu; + bandEnergy[i] = accu; } - *bandEnergySum = accuSum; + *bandEnergySum = accuSum; } /******************************************************************************** @@ -68,15 +68,15 @@ void CalcBandEnergyMS(const Word32 *mdctSpectrumLeft, { Word32 i, j; - Word32 accuMidSum = 0; - Word32 accuSideSum = 0; - + Word32 accuMidSum = 0; + Word32 accuSideSum = 0; + for(i=0; i<numBands; i++) { Word32 accuMid = 0; - Word32 accuSide = 0; + Word32 accuSide = 0; for (j=bandOffset[i]; j<bandOffset[i+1]; j++) { - Word32 specm, specs; + Word32 specm, specs; Word32 l, r; l = mdctSpectrumLeft[j] >> 1; @@ -86,17 +86,17 @@ void CalcBandEnergyMS(const Word32 *mdctSpectrumLeft, accuMid = L_add(accuMid, MULHIGH(specm, specm)); accuSide = L_add(accuSide, MULHIGH(specs, specs)); } - + accuMid = L_add(accuMid, accuMid); accuSide = L_add(accuSide, accuSide); - bandEnergyMid[i] = accuMid; + bandEnergyMid[i] = accuMid; accuMidSum = L_add(accuMidSum, accuMid); - bandEnergySide[i] = accuSide; + bandEnergySide[i] = accuSide; accuSideSum = L_add(accuSideSum, accuSide); - + } - *bandEnergyMidSum = accuMidSum; - *bandEnergySideSum = accuSideSum; + *bandEnergyMidSum = accuMidSum; + *bandEnergySideSum = accuSideSum; } #endif
\ No newline at end of file diff --git a/media/libstagefright/codecs/aacenc/src/bit_cnt.c b/media/libstagefright/codecs/aacenc/src/bit_cnt.c index 8853efc035e9..9fe511cd9751 100644 --- a/media/libstagefright/codecs/aacenc/src/bit_cnt.c +++ b/media/libstagefright/codecs/aacenc/src/bit_cnt.c @@ -26,14 +26,14 @@ #define HI_LTAB(a) (a>>8) #define LO_LTAB(a) (a & 0xff) -#define EXPAND(a) ((((Word32)(a&0xff00)) << 8)|(Word32)(a&0xff)) +#define EXPAND(a) ((((Word32)(a&0xff00)) << 8)|(Word32)(a&0xff)) /***************************************************************************** * * function name: count1_2_3_4_5_6_7_8_9_10_11 -* description: counts tables 1-11 -* returns: +* description: counts tables 1-11 +* returns: * input: quantized spectrum * output: bitCount for tables 1-11 * @@ -46,51 +46,51 @@ static void count1_2_3_4_5_6_7_8_9_10_11(const Word16 *values, Word32 t0,t1,t2,t3,i; Word32 bc1_2,bc3_4,bc5_6,bc7_8,bc9_10; Word16 bc11,sc; - - bc1_2=0; - bc3_4=0; - bc5_6=0; - bc7_8=0; - bc9_10=0; - bc11=0; - sc=0; + + bc1_2=0; + bc3_4=0; + bc5_6=0; + bc7_8=0; + bc9_10=0; + bc11=0; + sc=0; for(i=0;i<width;i+=4){ - - t0= values[i+0]; - t1= values[i+1]; - t2= values[i+2]; - t3= values[i+3]; - + + t0= values[i+0]; + t1= values[i+1]; + t2= values[i+2]; + t3= values[i+3]; + /* 1,2 */ - bc1_2 = bc1_2 + EXPAND(huff_ltab1_2[t0+1][t1+1][t2+1][t3+1]); + bc1_2 = bc1_2 + EXPAND(huff_ltab1_2[t0+1][t1+1][t2+1][t3+1]); /* 5,6 */ - bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t0+4][t1+4]); - bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t2+4][t3+4]); + bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t0+4][t1+4]); + bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t2+4][t3+4]); t0=ABS(t0); t1=ABS(t1); t2=ABS(t2); t3=ABS(t3); - - bc3_4 = bc3_4 + EXPAND(huff_ltab3_4[t0][t1][t2][t3]); - - bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t0][t1]); - bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t2][t3]); - - bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t0][t1]); - bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t2][t3]); - + + bc3_4 = bc3_4 + EXPAND(huff_ltab3_4[t0][t1][t2][t3]); + + bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t0][t1]); + bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t2][t3]); + + bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t0][t1]); + bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t2][t3]); + bc11 = bc11 + huff_ltab11[t0][t1]; bc11 = bc11 + huff_ltab11[t2][t3]; - - + + sc = sc + (t0>0) + (t1>0) + (t2>0) + (t3>0); } - + bitCount[1]=extract_h(bc1_2); bitCount[2]=extract_l(bc1_2); bitCount[3]=extract_h(bc3_4) + sc; @@ -108,8 +108,8 @@ static void count1_2_3_4_5_6_7_8_9_10_11(const Word16 *values, /***************************************************************************** * * function name: count3_4_5_6_7_8_9_10_11 -* description: counts tables 3-11 -* returns: +* description: counts tables 3-11 +* returns: * input: quantized spectrum * output: bitCount for tables 3-11 * @@ -122,26 +122,26 @@ static void count3_4_5_6_7_8_9_10_11(const Word16 *values, Word32 t0,t1,t2,t3, i; Word32 bc3_4,bc5_6,bc7_8,bc9_10; Word16 bc11,sc; - - bc3_4=0; - bc5_6=0; - bc7_8=0; - bc9_10=0; - bc11=0; - sc=0; + + bc3_4=0; + bc5_6=0; + bc7_8=0; + bc9_10=0; + bc11=0; + sc=0; for(i=0;i<width;i+=4){ - t0= values[i+0]; - t1= values[i+1]; - t2= values[i+2]; - t3= values[i+3]; - + t0= values[i+0]; + t1= values[i+1]; + t2= values[i+2]; + t3= values[i+3]; + /* 5,6 */ - bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t0+4][t1+4]); - bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t2+4][t3+4]); + bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t0+4][t1+4]); + bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t2+4][t3+4]); t0=ABS(t0); t1=ABS(t1); @@ -149,23 +149,23 @@ static void count3_4_5_6_7_8_9_10_11(const Word16 *values, t3=ABS(t3); - bc3_4 = bc3_4 + EXPAND(huff_ltab3_4[t0][t1][t2][t3]); - - bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t0][t1]); - bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t2][t3]); - - bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t0][t1]); - bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t2][t3]); - + bc3_4 = bc3_4 + EXPAND(huff_ltab3_4[t0][t1][t2][t3]); + + bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t0][t1]); + bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t2][t3]); + + bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t0][t1]); + bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t2][t3]); + bc11 = bc11 + huff_ltab11[t0][t1]; bc11 = bc11 + huff_ltab11[t2][t3]; - - sc = sc + (t0>0) + (t1>0) + (t2>0) + (t3>0); + + sc = sc + (t0>0) + (t1>0) + (t2>0) + (t3>0); } - - bitCount[1]=INVALID_BITCOUNT; - bitCount[2]=INVALID_BITCOUNT; + + bitCount[1]=INVALID_BITCOUNT; + bitCount[2]=INVALID_BITCOUNT; bitCount[3]=extract_h(bc3_4) + sc; bitCount[4]=extract_l(bc3_4) + sc; bitCount[5]=extract_h(bc5_6); @@ -175,7 +175,7 @@ static void count3_4_5_6_7_8_9_10_11(const Word16 *values, bitCount[9]=extract_h(bc9_10) + sc; bitCount[10]=extract_l(bc9_10) + sc; bitCount[11]=bc11 + sc; - + } @@ -183,8 +183,8 @@ static void count3_4_5_6_7_8_9_10_11(const Word16 *values, /***************************************************************************** * * function name: count5_6_7_8_9_10_11 -* description: counts tables 5-11 -* returns: +* description: counts tables 5-11 +* returns: * input: quantized spectrum * output: bitCount for tables 5-11 * @@ -198,33 +198,33 @@ static void count5_6_7_8_9_10_11(const Word16 *values, Word32 bc5_6,bc7_8,bc9_10; Word16 bc11,sc; - bc5_6=0; - bc7_8=0; - bc9_10=0; - bc11=0; - sc=0; + bc5_6=0; + bc7_8=0; + bc9_10=0; + bc11=0; + sc=0; for(i=0;i<width;i+=2){ - t0 = values[i+0]; - t1 = values[i+1]; + t0 = values[i+0]; + t1 = values[i+1]; - bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t0+4][t1+4]); + bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t0+4][t1+4]); t0=ABS(t0); t1=ABS(t1); - - bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t0][t1]); - bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t0][t1]); + + bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t0][t1]); + bc9_10 = 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[1]=INVALID_BITCOUNT; + bitCount[2]=INVALID_BITCOUNT; + bitCount[3]=INVALID_BITCOUNT; + bitCount[4]=INVALID_BITCOUNT; bitCount[5]=extract_h(bc5_6); bitCount[6]=extract_l(bc5_6); bitCount[7]=extract_h(bc7_8) + sc; @@ -232,15 +232,15 @@ static void count5_6_7_8_9_10_11(const Word16 *values, bitCount[9]=extract_h(bc9_10) + sc; bitCount[10]=extract_l(bc9_10) + sc; bitCount[11]=bc11 + sc; - + } /***************************************************************************** * * function name: count7_8_9_10_11 -* description: counts tables 7-11 -* returns: +* description: counts tables 7-11 +* returns: * input: quantized spectrum * output: bitCount for tables 7-11 * @@ -253,43 +253,43 @@ static void count7_8_9_10_11(const Word16 *values, Word32 t0,t1, i; Word32 bc7_8,bc9_10; Word16 bc11,sc; - - bc7_8=0; - bc9_10=0; - bc11=0; - sc=0; + + bc7_8=0; + bc9_10=0; + bc11=0; + sc=0; for(i=0;i<width;i+=2){ t0=ABS(values[i+0]); t1=ABS(values[i+1]); - bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t0][t1]); - bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t0][t1]); + bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t0][t1]); + bc9_10 = 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[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]=extract_h(bc7_8) + sc; bitCount[8]=extract_l(bc7_8) + sc; bitCount[9]=extract_h(bc9_10) + sc; bitCount[10]=extract_l(bc9_10) + sc; bitCount[11]=bc11 + sc; - + } /***************************************************************************** * * function name: count9_10_11 -* description: counts tables 9-11 -* returns: +* description: counts tables 9-11 +* returns: * input: quantized spectrum * output: bitCount for tables 9-11 * @@ -299,45 +299,45 @@ static void count9_10_11(const Word16 *values, Word16 *bitCount) { - Word32 t0,t1,i; + Word32 t0,t1,i; Word32 bc9_10; Word16 bc11,sc; - bc9_10=0; - bc11=0; - sc=0; + 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]); + + 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[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; - + } - + /***************************************************************************** * * function name: count11 -* description: counts table 11 -* returns: +* description: counts table 11 +* returns: * input: quantized spectrum * output: bitCount for table 11 * @@ -347,37 +347,37 @@ static void count9_10_11(const Word16 *values, Word16 *bitCount) { Word32 t0,t1,i; - Word16 bc11,sc; + Word16 bc11,sc; - bc11=0; - sc=0; + 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[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; } /***************************************************************************** * * function name: countEsc -* description: counts table 11 (with Esc) -* returns: +* description: counts table 11 (with Esc) +* returns: * input: quantized spectrum * output: bitCount for tables 11 (with Esc) * @@ -388,31 +388,31 @@ static void countEsc(const Word16 *values, Word16 *bitCount) { Word32 t0,t1,t00,t01,i; - Word16 bc11,ec,sc; + Word16 bc11,ec,sc; - bc11=0; - sc=0; - ec=0; + 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) { @@ -420,16 +420,16 @@ static void countEsc(const Word16 *values, } } } - 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[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; } @@ -463,7 +463,7 @@ static COUNT_FUNCTION countFuncTable[CODE_BOOK_ESC_LAV+1] = /***************************************************************************** * * function name: bitCount -* description: count bits +* description: count bits * *****************************************************************************/ Word16 bitCount(const Word16 *values, @@ -474,7 +474,7 @@ Word16 bitCount(const Word16 *values, /* check if we can use codebook 0 */ - + if(maxVal == 0) bitCount[0] = 0; else @@ -489,7 +489,7 @@ Word16 bitCount(const Word16 *values, /***************************************************************************** * * function name: codeValues -* description: write huffum bits +* description: write huffum bits * *****************************************************************************/ Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF hBitstream) @@ -499,85 +499,85 @@ Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF UWord16 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); + 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]); + 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]; - + sign=0; + signLength=0; + t0 = values[i+0]; + if(t0 != 0){ signLength = signLength + 1; - sign = sign << 1; - + sign = sign << 1; + if(t0 < 0){ - sign|=1; + sign|=1; t0=-t0; } } - t1 = values[i+1]; - + t1 = values[i+1]; + if(t1 != 0){ signLength = signLength + 1; - sign = sign << 1; - + sign = sign << 1; + if(t1 < 0){ - sign|=1; + sign|=1; t1=-t1; } } - t2 = values[i+2]; - + t2 = values[i+2]; + if(t2 != 0){ signLength = signLength + 1; - sign = sign << 1; - + sign = sign << 1; + if(t2 < 0){ - sign|=1; + sign|=1; t2=-t2; } } - t3 = values[i+3]; + t3 = values[i+3]; if(t3 != 0){ signLength = signLength + 1; - sign = sign << 1; - + sign = sign << 1; + if(t3 < 0){ - sign|=1; + sign|=1; t3=-t3; } } - codeWord = huff_ctab3[t0][t1][t2][t3]; - codeLength = HI_LTAB(huff_ltab3_4[t0][t1][t2][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); } @@ -585,107 +585,107 @@ Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF case CODE_BOOK_4_NO: for(i=0; i<width; i+=4) { - sign=0; - signLength=0; - t0 = values[i+0]; - - if(t0 != 0){ + sign=0; + signLength=0; + t0 = values[i+0]; + + if(t0 != 0){ signLength = signLength + 1; - sign = sign << 1; - if(t0 < 0){ - sign|=1; - t0=-t0; + sign = sign << 1; + if(t0 < 0){ + sign|=1; + t0=-t0; } - } - t1 = values[i+1]; - - if(t1 != 0){ + } + 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){ + 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){ + 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]); + 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]); + 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]; - + sign=0; + signLength=0; + t0 = values[i+0]; + if(t0 != 0){ signLength = signLength + 1; - sign = sign << 1; - + sign = sign << 1; + if(t0 < 0){ - sign|=1; + sign|=1; t0=-t0; } } - t1 = values[i+1]; - + t1 = values[i+1]; + if(t1 != 0){ signLength = signLength + 1; - sign = sign << 1; - + sign = sign << 1; + if(t1 < 0){ - sign|=1; + sign|=1; t1=-t1; } } - codeWord = huff_ctab7[t0][t1]; - codeLength = HI_LTAB(huff_ltab7_8[t0][t1]); + codeWord = huff_ctab7[t0][t1]; + codeLength = HI_LTAB(huff_ltab7_8[t0][t1]); WriteBits(hBitstream,codeWord,codeLength); WriteBits(hBitstream,sign,signLength); } @@ -693,33 +693,33 @@ Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF 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]); + 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); } @@ -727,33 +727,33 @@ Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF 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]); + 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); } @@ -761,33 +761,33 @@ Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF 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]); + 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); } @@ -795,45 +795,45 @@ Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF 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; - } - } + 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]; + 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; + n=0; + p=t0; while(sub(p=(p >> 1), 16) >= 0){ - + WriteBits(hBitstream,1,1); n = n + 1; } @@ -841,13 +841,13 @@ Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF n = n + 4; WriteBits(hBitstream,(t0 - (1 << n)),n); } - + if(t1 >= 16){ Word16 n, p; - n=0; - p=t1; + n=0; + p=t1; while(sub(p=(p >> 1), 16) >= 0){ - + WriteBits(hBitstream,1,1); n = n + 1; } @@ -871,15 +871,15 @@ Word16 bitCountScalefactorDelta(Word16 delta) Word16 codeScalefactorDelta(Word16 delta, HANDLE_BIT_BUF hBitstream) { - Word32 codeWord; + Word32 codeWord; Word16 codeLength; - - + + if(delta > CODE_BOOK_SCF_LAV || delta < -CODE_BOOK_SCF_LAV) return(1); - - codeWord = huff_ctabscf[delta + CODE_BOOK_SCF_LAV]; - codeLength = huff_ltabscf[delta + CODE_BOOK_SCF_LAV]; + + codeWord = huff_ctabscf[delta + CODE_BOOK_SCF_LAV]; + codeLength = huff_ltabscf[delta + CODE_BOOK_SCF_LAV]; WriteBits(hBitstream,codeWord,codeLength); return(0); } diff --git a/media/libstagefright/codecs/aacenc/src/bitbuffer.c b/media/libstagefright/codecs/aacenc/src/bitbuffer.c index ef13c1345e52..5615ac3cd65c 100644 --- a/media/libstagefright/codecs/aacenc/src/bitbuffer.c +++ b/media/libstagefright/codecs/aacenc/src/bitbuffer.c @@ -32,15 +32,15 @@ static void updateBitBufWordPtr(HANDLE_BIT_BUF hBitBuf, UWord8 **pBitBufWord, Word16 cnt) { - *pBitBufWord += cnt; + *pBitBufWord += cnt; + - if(*pBitBufWord > hBitBuf->pBitBufEnd) { - *pBitBufWord -= (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1); + *pBitBufWord -= (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1); } - + if(*pBitBufWord < hBitBuf->pBitBufBase) { - *pBitBufWord += (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1); + *pBitBufWord += (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1); } } @@ -57,18 +57,18 @@ HANDLE_BIT_BUF CreateBitBuffer(HANDLE_BIT_BUF hBitBuf, { assert(bitBufSize*8 <= 32768); - hBitBuf->pBitBufBase = pBitBufBase; - hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1; + hBitBuf->pBitBufBase = pBitBufBase; + hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1; - hBitBuf->pWriteNext = pBitBufBase; + hBitBuf->pWriteNext = pBitBufBase; hBitBuf->cache = 0; - - hBitBuf->wBitPos = 0; - hBitBuf->cntBits = 0; - - hBitBuf->size = (bitBufSize << 3); - hBitBuf->isValid = 1; + + hBitBuf->wBitPos = 0; + hBitBuf->cntBits = 0; + + hBitBuf->size = (bitBufSize << 3); + hBitBuf->isValid = 1; return hBitBuf; } @@ -82,8 +82,8 @@ HANDLE_BIT_BUF CreateBitBuffer(HANDLE_BIT_BUF hBitBuf, void DeleteBitBuffer(HANDLE_BIT_BUF *hBitBuf) { if(*hBitBuf) - (*hBitBuf)->isValid = 0; - *hBitBuf = NULL; + (*hBitBuf)->isValid = 0; + *hBitBuf = NULL; } /***************************************************************************** @@ -96,15 +96,15 @@ void ResetBitBuf(HANDLE_BIT_BUF hBitBuf, UWord8 *pBitBufBase, Word16 bitBufSize) { - hBitBuf->pBitBufBase = pBitBufBase; - hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1; + hBitBuf->pBitBufBase = pBitBufBase; + hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1; + - - hBitBuf->pWriteNext = pBitBufBase; + hBitBuf->pWriteNext = pBitBufBase; + + hBitBuf->wBitPos = 0; + hBitBuf->cntBits = 0; - hBitBuf->wBitPos = 0; - hBitBuf->cntBits = 0; - hBitBuf->cache = 0; } @@ -117,7 +117,7 @@ void ResetBitBuf(HANDLE_BIT_BUF hBitBuf, void CopyBitBuf(HANDLE_BIT_BUF hBitBufSrc, HANDLE_BIT_BUF hBitBufDst) { - *hBitBufDst = *hBitBufSrc; + *hBitBufDst = *hBitBufSrc; } /***************************************************************************** @@ -148,25 +148,25 @@ Word16 WriteBits(HANDLE_BIT_BUF hBitBuf, if(noBitsToWrite == 0) return noBitsToWrite; - hBitBuf->cntBits += noBitsToWrite; + hBitBuf->cntBits += noBitsToWrite; wBitPos = hBitBuf->wBitPos; wBitPos += noBitsToWrite; - writeValue <<= 32 - wBitPos; + writeValue <<= 32 - wBitPos; writeValue |= hBitBuf->cache; - - while (wBitPos >= 8) + + while (wBitPos >= 8) { UWord8 tmp; tmp = (UWord8)((writeValue >> 24) & 0xFF); - - *hBitBuf->pWriteNext++ = tmp; + + *hBitBuf->pWriteNext++ = tmp; writeValue <<= 8; wBitPos -= 8; } - + hBitBuf->wBitPos = wBitPos; hBitBuf->cache = writeValue; - + return noBitsToWrite; } diff --git a/media/libstagefright/codecs/aacenc/src/bitenc.c b/media/libstagefright/codecs/aacenc/src/bitenc.c index ea3440758109..fcc12ddfcc16 100644 --- a/media/libstagefright/codecs/aacenc/src/bitenc.c +++ b/media/libstagefright/codecs/aacenc/src/bitenc.c @@ -46,7 +46,7 @@ static Word32 encodeSpectralData(Word16 *sfbOffset, Word16 i,sfb; Word16 dbgVal; SECTION_INFO* psectioninfo; - dbgVal = GetBitsAvail(hBitStream); + dbgVal = GetBitsAvail(hBitStream); for(i=0; i<sectionData->noOfSections; i++) { psectioninfo = &(sectionData->sectionInfo[i]); @@ -100,7 +100,7 @@ static void encodeIcsInfo(Word16 blockType, WriteBits(hBitStream,blockType,2); WriteBits(hBitStream,windowShape,1); - + switch(blockType){ case LONG_WINDOW: case START_WINDOW: @@ -137,30 +137,30 @@ static Word32 encodeSectionData(SECTION_DATA *sectionData, Word16 sectLen; Word16 i; Word16 dbgVal=GetBitsAvail(hBitStream); - - + + switch(sectionData->blockType) { case LONG_WINDOW: case START_WINDOW: case STOP_WINDOW: - sectEscapeVal = SECT_ESC_VAL_LONG; - sectLenBits = SECT_BITS_LONG; + sectEscapeVal = SECT_ESC_VAL_LONG; + sectLenBits = SECT_BITS_LONG; break; case SHORT_WINDOW: - sectEscapeVal = SECT_ESC_VAL_SHORT; - sectLenBits = SECT_BITS_SHORT; + sectEscapeVal = SECT_ESC_VAL_SHORT; + sectLenBits = SECT_BITS_SHORT; break; } for(i=0;i<sectionData->noOfSections;i++) { WriteBits(hBitStream,sectionData->sectionInfo[i].codeBook,4); - sectLen = sectionData->sectionInfo[i].sfbCnt; + sectLen = sectionData->sectionInfo[i].sfbCnt; while(sectLen >= sectEscapeVal) { - + WriteBits(hBitStream,sectEscapeVal,sectLenBits); sectLen = sectLen - sectEscapeVal; } @@ -183,24 +183,24 @@ static Word32 encodeScaleFactorData(UWord16 *maxValueInSfb, { Word16 i,j,lastValScf,deltaScf; Word16 dbgVal = GetBitsAvail(hBitStream); - SECTION_INFO* psectioninfo; + SECTION_INFO* psectioninfo; - lastValScf=scalefac[sectionData->firstScf]; + lastValScf=scalefac[sectionData->firstScf]; for(i=0;i<sectionData->noOfSections;i++){ - psectioninfo = &(sectionData->sectionInfo[i]); + psectioninfo = &(sectionData->sectionInfo[i]); if (psectioninfo->codeBook != CODE_BOOK_ZERO_NO){ for (j=psectioninfo->sfbStart; j<psectioninfo->sfbStart+psectioninfo->sfbCnt; j++){ - + if(maxValueInSfb[j] == 0) { - deltaScf = 0; + deltaScf = 0; } else { deltaScf = lastValScf - scalefac[j]; - lastValScf = scalefac[j]; + lastValScf = scalefac[j]; } - + if(codeScalefactorDelta(deltaScf,hBitStream)){ return(1); } @@ -227,7 +227,7 @@ static void encodeMSInfo(Word16 sfbCnt, { Word16 sfb, sfbOff; - + switch(msDigest) { case MS_NONE: @@ -242,7 +242,7 @@ static void encodeMSInfo(Word16 sfbCnt, WriteBits(hBitStream,SI_MS_MASK_SOME,2); for(sfbOff = 0; sfbOff < sfbCnt; sfbOff+=grpSfb) { for(sfb=0; sfb<maxSfb; sfb++) { - + if(jsFlags[sfbOff+sfb] & MS_ON) { WriteBits(hBitStream,1,1); } @@ -272,7 +272,7 @@ static void encodeTnsData(TNS_INFO tnsInfo, Word16 coefBits; Flag isShort; - + if (blockType==2) { isShort = 1; numOfWindows = TRANS_FAC; @@ -282,52 +282,52 @@ static void encodeTnsData(TNS_INFO tnsInfo, numOfWindows = 1; } - tnsPresent=0; + tnsPresent=0; for (i=0; i<numOfWindows; i++) { - + if (tnsInfo.tnsActive[i]) { - tnsPresent=1; + tnsPresent=1; } } - + if (tnsPresent==0) { WriteBits(hBitStream,0,1); } else{ /* there is data to be written*/ WriteBits(hBitStream,1,1); /*data_present */ for (i=0; i<numOfWindows; i++) { - + WriteBits(hBitStream,tnsInfo.tnsActive[i],(isShort?1:2)); - + if (tnsInfo.tnsActive[i]) { - + WriteBits(hBitStream,((tnsInfo.coefRes[i] - 4)==0?1:0),1); - + WriteBits(hBitStream,tnsInfo.length[i],(isShort?4:6)); - + WriteBits(hBitStream,tnsInfo.order[i],(isShort?3:5)); - + if (tnsInfo.order[i]){ WriteBits(hBitStream, FILTER_DIRECTION, 1); - + if(tnsInfo.coefRes[i] == 4) { - coefBits = 3; + coefBits = 3; for(k=0; k<tnsInfo.order[i]; k++) { - + if (tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] > 3 || tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] < -4) { - coefBits = 4; + coefBits = 4; break; } } } else { - coefBits = 2; + coefBits = 2; for(k=0; k<tnsInfo.order[i]; k++) { - + if (tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] > 1 || tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] < -2) { - coefBits = 3; + coefBits = 3; break; } } @@ -335,7 +335,7 @@ static void encodeTnsData(TNS_INFO tnsInfo, WriteBits(hBitStream, tnsInfo.coefRes[i] - coefBits, 1); /*coef_compres*/ for (k=0; k<tnsInfo.order[i]; k++ ) { static const Word16 rmask[] = {0,1,3,7,15}; - + WriteBits(hBitStream,tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] & rmask[coefBits],coefBits); } } @@ -397,7 +397,7 @@ writeIndividualChannelStream(Flag commonWindow, encodeGlobalGain(globalGain, logNorm,scf[sectionData->firstScf], hBitStream); - + if(!commonWindow) { encodeIcsInfo(sectionData->blockType, windowShape, groupingMask, sectionData, hBitStream); } @@ -536,7 +536,7 @@ static void writeFillElement( const UWord8 *ancBytes, Write fill Element(s): amount of a fill element can be 7+X*8 Bits, X element of [0..270] */ - + while(totFillBits >= (3+4)) { cnt = min(((totFillBits - (3+4)) >> 3), ((1<<4)-1)); @@ -545,7 +545,7 @@ static void writeFillElement( const UWord8 *ancBytes, totFillBits = totFillBits - (3+4); - + if ((cnt == (1<<4)-1)) { esc_count = min( ((totFillBits >> 3) - ((1<<4)-1)), (1<<8)-1); @@ -555,7 +555,7 @@ static void writeFillElement( const UWord8 *ancBytes, } for(i=0;i<cnt;i++) { - + if(ancBytes) WriteBits(hBitStream, *ancBytes++,8); else @@ -576,7 +576,7 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream, ELEMENT_INFO elInfo, QC_OUT *qcOut, PSY_OUT *psyOut, - Word16 *globUsedBits, + Word16 *globUsedBits, const UWord8 *ancBytes, Word16 sampindex ) /* returns error code */ @@ -586,7 +586,7 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream, Word16 frameBits=0; /* struct bitbuffer bsWriteCopy; */ - bitMarkUp = GetBitsAvail(hBitStream); + bitMarkUp = GetBitsAvail(hBitStream); if(qcOut->qcElement.adtsUsed) /* write adts header*/ { WriteBits(hBitStream, 0xFFF, 12); /* 12 bit Syncword */ @@ -601,23 +601,23 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream, 6 channels or less, else a channel configuration should be written */ WriteBits(hBitStream, 0, 1); /* original/copy */ - WriteBits(hBitStream, 0, 1); /* home */ - + 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) */ + WriteBits(hBitStream, 0, 2); /* raw data blocks (0+1=1) */ } - *globUsedBits=0; + *globUsedBits=0; { Word16 *sfbOffset[2]; TNS_INFO tnsInfo[2]; - elementUsedBits = 0; + elementUsedBits = 0; switch (elInfo.elType) { @@ -636,7 +636,7 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream, { Word16 msDigest; Word16 *msFlags = psyOut->psyOutElement.toolsInfo.msMask; - msDigest = psyOut->psyOutElement.toolsInfo.msDigest; + msDigest = psyOut->psyOutElement.toolsInfo.msDigest; sfbOffset[0] = psyOut->psyOutChannel[elInfo.ChannelIndex[0]].sfbOffsets; sfbOffset[1] = @@ -668,20 +668,20 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream, } writeFillElement(NULL, - qcOut->totFillBits, + qcOut->totFillBits, hBitStream); WriteBits(hBitStream,ID_END,3); /* byte alignement */ - WriteBits(hBitStream,0, (8 - (hBitStream->cntBits & 7)) & 7); - + WriteBits(hBitStream,0, (8 - (hBitStream->cntBits & 7)) & 7); + *globUsedBits = *globUsedBits- bitMarkUp; - bitMarkUp = GetBitsAvail(hBitStream); + bitMarkUp = GetBitsAvail(hBitStream); *globUsedBits = *globUsedBits + bitMarkUp; frameBits = frameBits + *globUsedBits; - + if (frameBits != (qcOut->totStaticBitsUsed+qcOut->totDynBitsUsed + qcOut->totAncBitsUsed + qcOut->totFillBits + qcOut->alignBits)) { return(-1); diff --git a/media/libstagefright/codecs/aacenc/src/block_switch.c b/media/libstagefright/codecs/aacenc/src/block_switch.c index d54e32f2f7ff..47fd15e71639 100644 --- a/media/libstagefright/codecs/aacenc/src/block_switch.c +++ b/media/libstagefright/codecs/aacenc/src/block_switch.c @@ -52,7 +52,7 @@ CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, IIR high pass coeffs */ Word32 hiPassCoeff[BLOCK_SWITCHING_IIR_LEN] = { - 0xbec8b439, 0x609d4952 /* -0.5095f, 0.7548f */ + 0xbec8b439, 0x609d4952 /* -0.5095f, 0.7548f */ }; static const Word32 accWindowNrgFac = 0x26666666; /* factor for accumulating filtered window energies 0.3 */ @@ -76,8 +76,8 @@ Word16 InitBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, const Word32 bitRate, const Word16 nChannels) { /* select attackRatio */ - - if ((sub(nChannels,1)==0 && L_sub(bitRate, 24000) > 0) || + + if ((sub(nChannels,1)==0 && L_sub(bitRate, 24000) > 0) || (sub(nChannels,1)>0 && bitRate > (nChannels * 16000))) { blockSwitchingControl->invAttackRatio = invAttackRatioHighBr; } @@ -116,7 +116,7 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, /* Reset grouping info */ for (i=0; i<TRANS_FAC; i++) { - blockSwitchingControl->groupLen[i] = 0; + blockSwitchingControl->groupLen[i] = 0; } @@ -125,21 +125,21 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, &blockSwitchingControl->attackIndex, BLOCK_SWITCH_WINDOWS); - blockSwitchingControl->attackIndex = blockSwitchingControl->lastAttackIndex; + blockSwitchingControl->attackIndex = blockSwitchingControl->lastAttackIndex; /* Set grouping info */ - blockSwitchingControl->noOfGroups = MAX_NO_OF_GROUPS; + blockSwitchingControl->noOfGroups = MAX_NO_OF_GROUPS; for (i=0; i<MAX_NO_OF_GROUPS; i++) { - blockSwitchingControl->groupLen[i] = suggestedGroupingTable[blockSwitchingControl->attackIndex][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) { /* Save current window energy as last window energy */ for (w=0; w<BLOCK_SWITCH_WINDOWS; w++) { - blockSwitchingControl->windowNrg[0][w] = blockSwitchingControl->windowNrg[1][w]; - blockSwitchingControl->windowNrgF[0][w] = blockSwitchingControl->windowNrgF[1][w]; + blockSwitchingControl->windowNrg[0][w] = blockSwitchingControl->windowNrg[1][w]; + blockSwitchingControl->windowNrgF[0][w] = blockSwitchingControl->windowNrgF[1][w]; } @@ -147,10 +147,10 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, CalcWindowEnergy(blockSwitchingControl, timeSignal, chIncrement, BLOCK_SWITCH_WINDOW_LEN); /* reset attack */ - blockSwitchingControl->attack = FALSE; + blockSwitchingControl->attack = FALSE; - enMax = 0; - enM1 = blockSwitchingControl->windowNrgF[0][BLOCK_SWITCH_WINDOWS-1]; + enMax = 0; + enM1 = blockSwitchingControl->windowNrgF[0][BLOCK_SWITCH_WINDOWS-1]; for (w=0; w<BLOCK_SWITCH_WINDOWS; w++) { Word32 enM1_Tmp, accWindowNrg_Tmp, windowNrgF_Tmp; @@ -172,15 +172,15 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, /* if the energy with the ratio is bigger than the average, and the attack and short block */ if ((fixmul(windowNrgF_Tmp, blockSwitchingControl->invAttackRatio) >> windowNrgF_Shf) > blockSwitchingControl->accWindowNrg ) { - blockSwitchingControl->attack = TRUE; - blockSwitchingControl->lastAttackIndex = w; + blockSwitchingControl->attack = TRUE; + blockSwitchingControl->lastAttackIndex = w; } - enM1 = blockSwitchingControl->windowNrgF[1][w]; + enM1 = blockSwitchingControl->windowNrgF[1][w]; enMax = max(enMax, enM1); } if (enMax < minAttackNrg) { - blockSwitchingControl->attack = FALSE; + blockSwitchingControl->attack = FALSE; } } else @@ -188,22 +188,22 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, blockSwitchingControl->attack = TRUE; } - /* Check if attack spreads over frame border */ + /* Check if attack spreads over frame border */ if ((!blockSwitchingControl->attack) && (blockSwitchingControl->lastattack)) { - + if (blockSwitchingControl->attackIndex == TRANS_FAC-1) { - blockSwitchingControl->attack = TRUE; + blockSwitchingControl->attack = TRUE; } - blockSwitchingControl->lastattack = FALSE; + blockSwitchingControl->lastattack = FALSE; } else { - blockSwitchingControl->lastattack = blockSwitchingControl->attack; + blockSwitchingControl->lastattack = blockSwitchingControl->attack; } - blockSwitchingControl->windowSequence = blockSwitchingControl->nextwindowSequence; + blockSwitchingControl->windowSequence = blockSwitchingControl->nextwindowSequence; + - if (blockSwitchingControl->attack) { blockSwitchingControl->nextwindowSequence = SHORT_WINDOW; } @@ -211,27 +211,27 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, blockSwitchingControl->nextwindowSequence = LONG_WINDOW; } - /* update short block group */ + /* update short block group */ if (blockSwitchingControl->nextwindowSequence == SHORT_WINDOW) { - + if (blockSwitchingControl->windowSequence== LONG_WINDOW) { - blockSwitchingControl->windowSequence = START_WINDOW; + blockSwitchingControl->windowSequence = START_WINDOW; } - + if (blockSwitchingControl->windowSequence == STOP_WINDOW) { - blockSwitchingControl->windowSequence = SHORT_WINDOW; - blockSwitchingControl->noOfGroups = 3; - blockSwitchingControl->groupLen[0] = 3; - blockSwitchingControl->groupLen[1] = 3; - blockSwitchingControl->groupLen[2] = 2; + blockSwitchingControl->windowSequence = SHORT_WINDOW; + blockSwitchingControl->noOfGroups = 3; + blockSwitchingControl->groupLen[0] = 3; + blockSwitchingControl->groupLen[1] = 3; + blockSwitchingControl->groupLen[2] = 2; } } - /* update block type */ + /* update block type */ if (blockSwitchingControl->nextwindowSequence == LONG_WINDOW) { - + if (blockSwitchingControl->windowSequence == SHORT_WINDOW) { - blockSwitchingControl->nextwindowSequence = STOP_WINDOW; + blockSwitchingControl->nextwindowSequence = STOP_WINDOW; } } @@ -252,17 +252,17 @@ static Word32 SrchMaxWithIndex(const Word32 in[], Word16 *index, Word16 n) Word32 i, idx; /* Search maximum value in array and return index and value */ - max = 0; - idx = 0; + max = 0; + idx = 0; for (i = 0; i < n; i++) { - + if (in[i+1] > max) { - max = in[i+1]; - idx = i; + max = in[i+1]; + idx = i; } } - *index = idx; + *index = idx; return(max); } @@ -292,11 +292,11 @@ Word32 CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, states1 = blockSwitchingControl->iirStates[1]; Coeff0 = hiPassCoeff[0]; Coeff1 = hiPassCoeff[1]; - tidx = 0; + tidx = 0; for (w=0; w < BLOCK_SWITCH_WINDOWS; w++) { - accuUE = 0; - accuFE = 0; + accuUE = 0; + accuFE = 0; for(i=0; i<windowLen; i++) { Word32 accu1, accu2, accu3; @@ -309,16 +309,16 @@ Word32 CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, accu3 = accu1 - states0; out = accu3 - accu2; - states0 = accu1; - states1 = out; + states0 = accu1; + states1 = out; - tempFiltered = extract_h(out); + tempFiltered = extract_h(out); accuUE += (tempUnfiltered * tempUnfiltered) >> ENERGY_SHIFT; accuFE += (tempFiltered * tempFiltered) >> ENERGY_SHIFT; } - blockSwitchingControl->windowNrg[1][w] = accuUE; - blockSwitchingControl->windowNrgF[1][w] = accuFE; + blockSwitchingControl->windowNrg[1][w] = accuUE; + blockSwitchingControl->windowNrgF[1][w] = accuFE; } @@ -346,8 +346,8 @@ static Word16 IIRFilter(const Word16 in, const Word32 coeff[], Word32 states[]) accu2 = fixmul( coeff[0], states[1] ); out = accu3 - accu2; - states[0] = accu1; - states[1] = out; + states[0] = accu1; + states[1] = out; return round16(out); } @@ -374,54 +374,54 @@ Word16 SyncBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControlLeft, const Word16 nChannels) { Word16 i; - Word16 patchType = LONG_WINDOW; + Word16 patchType = LONG_WINDOW; + - if (nChannels == 1) { /* Mono */ if (blockSwitchingControlLeft->windowSequence != SHORT_WINDOW) { - blockSwitchingControlLeft->noOfGroups = 1; - blockSwitchingControlLeft->groupLen[0] = 1; + blockSwitchingControlLeft->noOfGroups = 1; + blockSwitchingControlLeft->groupLen[0] = 1; for (i=1; i<TRANS_FAC; i++) { - blockSwitchingControlLeft->groupLen[i] = 0; + blockSwitchingControlLeft->groupLen[i] = 0; } } } else { /* Stereo common Window */ - patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlLeft->windowSequence]; - patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlRight->windowSequence]; + patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlLeft->windowSequence]; + patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlRight->windowSequence]; /* Set synchronized Blocktype */ - blockSwitchingControlLeft->windowSequence = patchType; - blockSwitchingControlRight->windowSequence = patchType; + blockSwitchingControlLeft->windowSequence = patchType; + blockSwitchingControlRight->windowSequence = patchType; - /* Synchronize grouping info */ + /* Synchronize grouping info */ if(patchType != SHORT_WINDOW) { /* Long Blocks */ /* Set grouping info */ - blockSwitchingControlLeft->noOfGroups = 1; - blockSwitchingControlRight->noOfGroups = 1; - blockSwitchingControlLeft->groupLen[0] = 1; - blockSwitchingControlRight->groupLen[0] = 1; + blockSwitchingControlLeft->noOfGroups = 1; + blockSwitchingControlRight->noOfGroups = 1; + blockSwitchingControlLeft->groupLen[0] = 1; + blockSwitchingControlRight->groupLen[0] = 1; for (i=1; i<TRANS_FAC; i++) { - blockSwitchingControlLeft->groupLen[i] = 0; - blockSwitchingControlRight->groupLen[i] = 0; + blockSwitchingControlLeft->groupLen[i] = 0; + blockSwitchingControlRight->groupLen[i] = 0; } } else { - + if (blockSwitchingControlLeft->maxWindowNrg > blockSwitchingControlRight->maxWindowNrg) { /* Left Channel wins */ - blockSwitchingControlRight->noOfGroups = blockSwitchingControlLeft->noOfGroups; + blockSwitchingControlRight->noOfGroups = blockSwitchingControlLeft->noOfGroups; for (i=0; i<TRANS_FAC; i++) { - blockSwitchingControlRight->groupLen[i] = blockSwitchingControlLeft->groupLen[i]; + blockSwitchingControlRight->groupLen[i] = blockSwitchingControlLeft->groupLen[i]; } } else { /* Right Channel wins */ - blockSwitchingControlLeft->noOfGroups = blockSwitchingControlRight->noOfGroups; + blockSwitchingControlLeft->noOfGroups = blockSwitchingControlRight->noOfGroups; for (i=0; i<TRANS_FAC; i++) { - blockSwitchingControlLeft->groupLen[i] = blockSwitchingControlRight->groupLen[i]; + blockSwitchingControlLeft->groupLen[i] = blockSwitchingControlRight->groupLen[i]; } } } diff --git a/media/libstagefright/codecs/aacenc/src/channel_map.c b/media/libstagefright/codecs/aacenc/src/channel_map.c index 2d41f8c21ccc..f6552ed424c4 100644 --- a/media/libstagefright/codecs/aacenc/src/channel_map.c +++ b/media/libstagefright/codecs/aacenc/src/channel_map.c @@ -29,32 +29,32 @@ static const Word16 maxChannelBits = MAXBITS_COEF; static Word16 initElement(ELEMENT_INFO* elInfo, ELEMENT_TYPE elType) { - Word16 error=0; + Word16 error=0; - elInfo->elType=elType; + elInfo->elType=elType; switch(elInfo->elType) { case ID_SCE: - elInfo->nChannelsInEl=1; + elInfo->nChannelsInEl=1; - elInfo->ChannelIndex[0]=0; + elInfo->ChannelIndex[0]=0; - elInfo->instanceTag=0; + elInfo->instanceTag=0; break; case ID_CPE: - elInfo->nChannelsInEl=2; + elInfo->nChannelsInEl=2; - elInfo->ChannelIndex[0]=0; - elInfo->ChannelIndex[1]=1; + elInfo->ChannelIndex[0]=0; + elInfo->ChannelIndex[1]=1; - elInfo->instanceTag=0; + elInfo->instanceTag=0; break; default: - error=1; + error=1; } return error; @@ -64,11 +64,11 @@ static Word16 initElement(ELEMENT_INFO* elInfo, ELEMENT_TYPE elType) Word16 InitElementInfo (Word16 nChannels, ELEMENT_INFO* elInfo) { Word16 error; - error = 0; + error = 0; switch(nChannels) { - case 1: + case 1: initElement(elInfo, ID_SCE); break; @@ -77,7 +77,7 @@ Word16 InitElementInfo (Word16 nChannels, ELEMENT_INFO* elInfo) break; default: - error=4; + error=4; } return error; @@ -91,18 +91,18 @@ Word16 InitElementBits(ELEMENT_BITS *elementBits, Word16 staticBitsTot) { Word16 error; - error = 0; + error = 0; switch(elInfo.nChannelsInEl) { case 1: - elementBits->chBitrate = bitrateTot; + elementBits->chBitrate = bitrateTot; elementBits->averageBits = averageBitsTot - staticBitsTot; - elementBits->maxBits = maxChannelBits; + elementBits->maxBits = maxChannelBits; elementBits->maxBitResBits = maxChannelBits - averageBitsTot; - elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7); - elementBits->bitResLevel = elementBits->maxBitResBits; - elementBits->relativeBits = 0x4000; /* 1.0f/2 */ + elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7); + elementBits->bitResLevel = elementBits->maxBitResBits; + elementBits->relativeBits = 0x4000; /* 1.0f/2 */ break; case 2: @@ -111,13 +111,13 @@ Word16 InitElementBits(ELEMENT_BITS *elementBits, elementBits->maxBits = maxChannelBits << 1; elementBits->maxBitResBits = (maxChannelBits << 1) - averageBitsTot; - elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7); - elementBits->bitResLevel = elementBits->maxBitResBits; - elementBits->relativeBits = 0x4000; /* 1.0f/2 */ + elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7); + elementBits->bitResLevel = elementBits->maxBitResBits; + elementBits->relativeBits = 0x4000; /* 1.0f/2 */ break; default: - error = 1; + error = 1; } return error; } diff --git a/media/libstagefright/codecs/aacenc/src/dyn_bits.c b/media/libstagefright/codecs/aacenc/src/dyn_bits.c index f3b3e02058c1..3d2efdc1ef32 100644 --- a/media/libstagefright/codecs/aacenc/src/dyn_bits.c +++ b/media/libstagefright/codecs/aacenc/src/dyn_bits.c @@ -45,12 +45,12 @@ buildBitLookUp(const Word16 *quantSpectrum, for (i=0; i<maxSfb; i++) { Word16 sfbWidth, maxVal; - sectionInfo[i].sfbCnt = 1; - sectionInfo[i].sfbStart = i; - sectionInfo[i].sectionBits = INVALID_BITCOUNT; - sectionInfo[i].codeBook = -1; - sfbWidth = sfbOffset[i + 1] - sfbOffset[i]; - maxVal = sfbMax[i]; + sectionInfo[i].sfbCnt = 1; + sectionInfo[i].sfbStart = i; + sectionInfo[i].sectionBits = INVALID_BITCOUNT; + sectionInfo[i].codeBook = -1; + sfbWidth = sfbOffset[i + 1] - sfbOffset[i]; + maxVal = sfbMax[i]; bitCount(quantSpectrum + sfbOffset[i], sfbWidth, maxVal, bitLookUp[i]); } } @@ -66,13 +66,13 @@ static Word16 findBestBook(const Word16 *bc, Word16 *book) { Word32 minBits, j; - minBits = INVALID_BITCOUNT; + minBits = INVALID_BITCOUNT; for (j=0; j<=CODE_BOOK_ESC_NDX; j++) { - + if (bc[j] < minBits) { - minBits = bc[j]; - *book = j; + minBits = bc[j]; + *book = j; } } return extract_l(minBits); @@ -82,12 +82,12 @@ static Word16 findMinMergeBits(const Word16 *bc1, const Word16 *bc2) { Word32 minBits, j, sum; - minBits = INVALID_BITCOUNT; + minBits = INVALID_BITCOUNT; for (j=0; j<=CODE_BOOK_ESC_NDX; j++) { sum = bc1[j] + bc2[j]; if (sum < minBits) { - minBits = sum; + minBits = sum; } } return extract_l(minBits); @@ -109,13 +109,13 @@ findMaxMerge(const Word16 mergeGainLookUp[MAX_SFB_LONG], const Word16 maxSfb, Word16 *maxNdx) { Word32 i, maxMergeGain; - maxMergeGain = 0; + maxMergeGain = 0; for (i=0; i+sectionInfo[i].sfbCnt < maxSfb; i += sectionInfo[i].sfbCnt) { - + if (mergeGainLookUp[i] > maxMergeGain) { - maxMergeGain = mergeGainLookUp[i]; - *maxNdx = i; + maxMergeGain = mergeGainLookUp[i]; + *maxNdx = i; } } return extract_l(maxMergeGain); @@ -159,7 +159,7 @@ gmStage0(SECTION_INFO * sectionInfo, for (i=0; i<maxSfb; i++) { /* Side-Info bits will be calculated in Stage 1! */ - + if (sectionInfo[i].sectionBits == INVALID_BITCOUNT) { sectionInfo[i].sectionBits = findBestBook(bitLookUp[i], &(sectionInfo[i].codeBook)); } @@ -180,13 +180,13 @@ gmStage1(SECTION_INFO * sectionInfo, SECTION_INFO * sectionInfo_s; SECTION_INFO * sectionInfo_e; Word32 mergeStart, mergeEnd; - mergeStart = 0; + mergeStart = 0; do { sectionInfo_s = sectionInfo + mergeStart; for (mergeEnd=mergeStart+1; mergeEnd<maxSfb; mergeEnd++) { - sectionInfo_e = sectionInfo + mergeEnd; + sectionInfo_e = sectionInfo + mergeEnd; if (sectionInfo_s->codeBook != sectionInfo_e->codeBook) break; sectionInfo_s->sfbCnt += 1; @@ -196,11 +196,11 @@ gmStage1(SECTION_INFO * sectionInfo, } sectionInfo_s->sectionBits += sideInfoTab[sectionInfo_s->sfbCnt]; - sectionInfo[mergeEnd - 1].sfbStart = sectionInfo_s->sfbStart; /* speed up prev search */ + sectionInfo[mergeEnd - 1].sfbStart = sectionInfo_s->sfbStart; /* speed up prev search */ + + mergeStart = mergeEnd; - mergeStart = mergeEnd; - } while (mergeStart - maxSfb < 0); } @@ -230,7 +230,7 @@ gmStage2(SECTION_INFO *sectionInfo, maxMergeGain = findMaxMerge(mergeGainLookUp, sectionInfo, maxSfb, &maxNdx); - + if (maxMergeGain <= 0) break; @@ -244,7 +244,7 @@ gmStage2(SECTION_INFO *sectionInfo, mergeBitLookUp(bitLookUp[maxNdx], bitLookUp[maxNdxNext]); - + if (maxNdx != 0) { maxNdxLast = sectionInfo[maxNdx - 1].sfbStart; mergeGainLookUp[maxNdxLast] = CalcMergeGain(sectionInfo, @@ -255,9 +255,9 @@ gmStage2(SECTION_INFO *sectionInfo, } maxNdxNext = maxNdx + sectionInfo[maxNdx].sfbCnt; - sectionInfo[maxNdxNext - 1].sfbStart = sectionInfo[maxNdx].sfbStart; + sectionInfo[maxNdxNext - 1].sfbStart = sectionInfo[maxNdx].sfbStart; + - if (maxNdxNext - maxSfb < 0) { mergeGainLookUp[maxNdx] = CalcMergeGain(sectionInfo, bitLookUp, @@ -286,7 +286,7 @@ noiselessCounter(SECTION_DATA *sectionData, /* use appropriate side info table - */ + */ switch (blockType) { case LONG_WINDOW: @@ -300,11 +300,11 @@ noiselessCounter(SECTION_DATA *sectionData, } - sectionData->noOfSections = 0; - sectionData->huffmanBits = 0; - sectionData->sideInfoBits = 0; + sectionData->noOfSections = 0; + sectionData->huffmanBits = 0; + sectionData->sideInfoBits = 0; + - if (sectionData->maxSfbPerGroup == 0) return; @@ -353,7 +353,7 @@ noiselessCounter(SECTION_DATA *sectionData, sectionData->huffmanBits = (sectionData->huffmanBits + (sectionInfo[i].sectionBits - sideInfoTab[sectionInfo[i].sfbCnt])); sectionData->sideInfoBits = (sectionData->sideInfoBits + sideInfoTab[sectionInfo[i].sfbCnt]); - sectionData->sectionInfo[sectionData->noOfSections] = sectionInfo[i]; + sectionData->sectionInfo[sectionData->noOfSections] = sectionInfo[i]; sectionData->noOfSections = sectionData->noOfSections + 1; } } @@ -386,25 +386,25 @@ static void scfCount(const Word16 *scalefacGain, Word32 lastValScf = 0; Word32 deltaScf = 0; Flag found = 0; - Word32 scfSkipCounter = 0; - + Word32 scfSkipCounter = 0; + + + sectionData->scalefacBits = 0; - sectionData->scalefacBits = 0; - if (scalefacGain == NULL) { return; } - lastValScf = 0; - sectionData->firstScf = 0; - + lastValScf = 0; + sectionData->firstScf = 0; + psectionInfo = sectionData->sectionInfo; for (i=0; i<sectionData->noOfSections; i++) { - + if (psectionInfo->codeBook != CODE_BOOK_ZERO_NO) { - sectionData->firstScf = psectionInfo->sfbStart; - lastValScf = scalefacGain[sectionData->firstScf]; + sectionData->firstScf = psectionInfo->sfbStart; + lastValScf = scalefacGain[sectionData->firstScf]; break; } psectionInfo += 1; @@ -412,38 +412,38 @@ static void scfCount(const Word16 *scalefacGain, psectionInfo = sectionData->sectionInfo; for (i=0; i<sectionData->noOfSections; i++, psectionInfo += 1) { - + if (psectionInfo->codeBook != CODE_BOOK_ZERO_NO && psectionInfo->codeBook != CODE_BOOK_PNS_NO) { for (j = psectionInfo->sfbStart; j < (psectionInfo->sfbStart + psectionInfo->sfbCnt); j++) { /* check if we can repeat the last value to save bits */ - + if (maxValueInSfb[j] == 0) { - found = 0; - + found = 0; + if (scfSkipCounter == 0) { /* end of section */ - + if (j - ((psectionInfo->sfbStart + psectionInfo->sfbCnt) - 1) == 0) { - found = 0; + found = 0; } else { for (k = j + 1; k < psectionInfo->sfbStart + psectionInfo->sfbCnt; k++) { - + if (maxValueInSfb[k] != 0) { int tmp = L_abs(scalefacGain[k] - lastValScf); - found = 1; - + found = 1; + if ( tmp < CODE_BOOK_SCF_LAV) { /* save bits */ - deltaScf = 0; + deltaScf = 0; } else { /* do not save bits */ deltaScf = lastValScf - scalefacGain[j]; - lastValScf = scalefacGain[j]; - scfSkipCounter = 0; + lastValScf = scalefacGain[j]; + scfSkipCounter = 0; } break; } @@ -451,26 +451,26 @@ static void scfCount(const Word16 *scalefacGain, 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++) { - + if ((psectionInfom->codeBook != CODE_BOOK_ZERO_NO) && (psectionInfom->codeBook != CODE_BOOK_PNS_NO)) { for (n = psectionInfom->sfbStart; n < (psectionInfom->sfbStart + psectionInfom->sfbCnt); n++) { - + if (maxValueInSfb[n] != 0) { - found = 1; - + found = 1; + if ( (abs_s(scalefacGain[n] - lastValScf) < CODE_BOOK_SCF_LAV)) { - deltaScf = 0; + deltaScf = 0; } else { deltaScf = (lastValScf - scalefacGain[j]); - lastValScf = scalefacGain[j]; - scfSkipCounter = 0; + lastValScf = scalefacGain[j]; + scfSkipCounter = 0; } break; } @@ -481,20 +481,20 @@ static void scfCount(const Word16 *scalefacGain, psectionInfom += 1; } - + if (found == 0) { - deltaScf = 0; - scfSkipCounter = 0; + deltaScf = 0; + scfSkipCounter = 0; } } else { - deltaScf = 0; + deltaScf = 0; scfSkipCounter = scfSkipCounter - 1; } } else { deltaScf = lastValScf - scalefacGain[j]; - lastValScf = scalefacGain[j]; + lastValScf = scalefacGain[j]; } sectionData->scalefacBits += bitCountScalefactorDelta(deltaScf); } @@ -517,14 +517,14 @@ dynBitCount(const Word16 *quantSpectrum, const Word16 *sfbOffset, SECTION_DATA *sectionData) { - sectionData->blockType = blockType; - sectionData->sfbCnt = sfbCnt; - sectionData->sfbPerGroup = sfbPerGroup; + sectionData->blockType = blockType; + sectionData->sfbCnt = sfbCnt; + sectionData->sfbPerGroup = sfbPerGroup; if(sfbPerGroup) - sectionData->noOfGroups = sfbCnt/sfbPerGroup; + sectionData->noOfGroups = sfbCnt/sfbPerGroup; else sectionData->noOfGroups = 0x7fff; - sectionData->maxSfbPerGroup = maxSfbPerGroup; + sectionData->maxSfbPerGroup = maxSfbPerGroup; noiselessCounter(sectionData, sectionData->mergeGainLookUp, @@ -539,7 +539,7 @@ dynBitCount(const Word16 *quantSpectrum, 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 fb88654b6636..7861e1cdcc59 100644 --- a/media/libstagefright/codecs/aacenc/src/grp_data.c +++ b/media/libstagefright/codecs/aacenc/src/grp_data.c @@ -57,29 +57,29 @@ groupShortData(Word32 *mdctSpectrum, /* for short: regroup and */ /* cumulate energies und thresholds group-wise . */ - + /* calculate sfbCnt */ - highestSfb = 0; + highestSfb = 0; for (wnd=0; wnd<TRANS_FAC; wnd++) { for (sfb=sfbCnt - 1; sfb>=highestSfb; sfb--) { for (line=(sfbOffset[sfb + 1] - 1); line>=sfbOffset[sfb]; line--) { - - if (mdctSpectrum[wnd*FRAME_LEN_SHORT+line] != 0) break; + + if (mdctSpectrum[wnd*FRAME_LEN_SHORT+line] != 0) break; } - + if (line >= sfbOffset[sfb]) break; } highestSfb = max(highestSfb, sfb); } - + if (highestSfb < 0) { - highestSfb = 0; + highestSfb = 0; } *maxSfbPerGroup = highestSfb + 1; /* calculate sfbOffset */ - i = 0; - offset = 0; + i = 0; + offset = 0; for (grp = 0; grp < noOfGroups; grp++) { for (sfb = 0; sfb < sfbCnt; sfb++) { groupedSfbOffset[i] = offset + sfbOffset[sfb] * groupLen[grp]; @@ -87,15 +87,15 @@ groupShortData(Word32 *mdctSpectrum, } offset += groupLen[grp] * FRAME_LEN_SHORT; } - groupedSfbOffset[i] = FRAME_LEN_LONG; + groupedSfbOffset[i] = FRAME_LEN_LONG; i += 1; /* calculate minSnr */ - i = 0; - offset = 0; + i = 0; + offset = 0; for (grp = 0; grp < noOfGroups; grp++) { for (sfb = 0; sfb < sfbCnt; sfb++) { - groupedSfbMinSnr[i] = sfbMinSnr[sfb]; + groupedSfbMinSnr[i] = sfbMinSnr[sfb]; i += 1; } offset += groupLen[grp] * FRAME_LEN_SHORT; @@ -103,74 +103,74 @@ groupShortData(Word32 *mdctSpectrum, /* sum up sfbThresholds */ - wnd = 0; - i = 0; + wnd = 0; + i = 0; for (grp = 0; grp < noOfGroups; grp++) { for (sfb = 0; sfb < sfbCnt; sfb++) { - Word32 thresh = sfbThreshold->sfbShort[wnd][sfb]; + Word32 thresh = sfbThreshold->sfbShort[wnd][sfb]; for (j=1; j<groupLen[grp]; j++) { thresh = L_add(thresh, sfbThreshold->sfbShort[wnd+j][sfb]); } - sfbThreshold->sfbLong[i] = thresh; + sfbThreshold->sfbLong[i] = thresh; i += 1; } wnd += groupLen[grp]; } /* sum up sfbEnergies left/right */ - wnd = 0; - i = 0; + wnd = 0; + i = 0; for (grp = 0; grp < noOfGroups; grp++) { for (sfb = 0; sfb < sfbCnt; sfb++) { - Word32 energy = sfbEnergy->sfbShort[wnd][sfb]; + Word32 energy = sfbEnergy->sfbShort[wnd][sfb]; for (j=1; j<groupLen[grp]; j++) { energy = L_add(energy, sfbEnergy->sfbShort[wnd+j][sfb]); } - sfbEnergy->sfbLong[i] = energy; + sfbEnergy->sfbLong[i] = energy; i += 1; } wnd += groupLen[grp]; } /* sum up sfbEnergies mid/side */ - wnd = 0; - i = 0; + wnd = 0; + i = 0; for (grp = 0; grp < noOfGroups; grp++) { for (sfb = 0; sfb < sfbCnt; sfb++) { - Word32 energy = sfbEnergyMS->sfbShort[wnd][sfb]; + Word32 energy = sfbEnergyMS->sfbShort[wnd][sfb]; for (j=1; j<groupLen[grp]; j++) { energy = L_add(energy, sfbEnergyMS->sfbShort[wnd+j][sfb]); } - sfbEnergyMS->sfbLong[i] = energy; + sfbEnergyMS->sfbLong[i] = energy; i += 1; } wnd += groupLen[grp]; } /* sum up sfbSpreadedEnergies */ - wnd = 0; - i = 0; + wnd = 0; + i = 0; for (grp = 0; grp < noOfGroups; grp++) { for (sfb = 0; sfb < sfbCnt; sfb++) { - Word32 energy = sfbSpreadedEnergy->sfbShort[wnd][sfb]; + Word32 energy = sfbSpreadedEnergy->sfbShort[wnd][sfb]; for (j=1; j<groupLen[grp]; j++) { energy = L_add(energy, sfbSpreadedEnergy->sfbShort[wnd+j][sfb]); } - sfbSpreadedEnergy->sfbLong[i] = energy; + sfbSpreadedEnergy->sfbLong[i] = energy; i += 1; } wnd += groupLen[grp]; } /* re-group spectrum */ - wnd = 0; - i = 0; + wnd = 0; + i = 0; for (grp = 0; grp < noOfGroups; grp++) { for (sfb = 0; sfb < sfbCnt; sfb++) { for (j = 0; j < groupLen[grp]; j++) { Word16 lineOffset = FRAME_LEN_SHORT * (wnd + j); for (line = lineOffset + sfbOffset[sfb]; line < lineOffset + sfbOffset[sfb+1]; line++) { - tmpSpectrum[i] = mdctSpectrum[line]; + tmpSpectrum[i] = mdctSpectrum[line]; i = i + 1; } } @@ -179,10 +179,10 @@ groupShortData(Word32 *mdctSpectrum, } 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+3] = tmpSpectrum[i+3]; + 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 34fee00d8c9d..f2472d8c8680 100644 --- a/media/libstagefright/codecs/aacenc/src/interface.c +++ b/media/libstagefright/codecs/aacenc/src/interface.c @@ -49,56 +49,56 @@ void BuildInterface(Word32 *groupedMdctSpectrum, PSY_OUT_CHANNEL *psyOutCh) { Word32 j; - Word32 grp; + Word32 grp; Word32 mask; Word16 *tmpV; /* copy values to psyOut */ - psyOutCh->maxSfbPerGroup = maxSfbPerGroup; - psyOutCh->sfbCnt = groupedSfbCnt; + psyOutCh->maxSfbPerGroup = maxSfbPerGroup; + psyOutCh->sfbCnt = groupedSfbCnt; if(noOfGroups) psyOutCh->sfbPerGroup = groupedSfbCnt/ noOfGroups; else psyOutCh->sfbPerGroup = 0x7fff; - psyOutCh->windowSequence = windowSequence; - psyOutCh->windowShape = windowShape; - psyOutCh->mdctScale = mdctScale; + psyOutCh->windowSequence = windowSequence; + psyOutCh->windowShape = windowShape; + psyOutCh->mdctScale = mdctScale; psyOutCh->mdctSpectrum = groupedMdctSpectrum; psyOutCh->sfbEnergy = groupedSfbEnergy->sfbLong; psyOutCh->sfbThreshold = groupedSfbThreshold->sfbLong; psyOutCh->sfbSpreadedEnergy = groupedSfbSpreadedEnergy->sfbLong; - + 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]; } - + /* generate grouping mask */ - mask = 0; + mask = 0; for (grp = 0; grp < noOfGroups; grp++) { mask = mask << 1; for (j=1; j<groupLen[grp]; j++) { mask = mask << 1; - mask |= 1; + mask |= 1; } } - psyOutCh->groupingMask = mask; - + psyOutCh->groupingMask = mask; + if (windowSequence != SHORT_WINDOW) { - psyOutCh->sfbEnSumLR = sfbEnergySumLR.sfbLong; - psyOutCh->sfbEnSumMS = sfbEnergySumMS.sfbLong; + psyOutCh->sfbEnSumLR = sfbEnergySumLR.sfbLong; + psyOutCh->sfbEnSumMS = sfbEnergySumMS.sfbLong; } else { Word32 i; Word32 accuSumMS=0; - Word32 accuSumLR=0; + Word32 accuSumLR=0; Word32 *pSumMS = sfbEnergySumMS.sfbShort; Word32 *pSumLR = sfbEnergySumLR.sfbShort; @@ -106,7 +106,7 @@ void BuildInterface(Word32 *groupedMdctSpectrum, accuSumLR = L_add(accuSumLR, *pSumLR); pSumLR++; accuSumMS = L_add(accuSumMS, *pSumMS); pSumMS++; } - psyOutCh->sfbEnSumMS = accuSumMS; - psyOutCh->sfbEnSumLR = accuSumLR; + psyOutCh->sfbEnSumMS = accuSumMS; + psyOutCh->sfbEnSumLR = accuSumLR; } } diff --git a/media/libstagefright/codecs/aacenc/src/line_pe.c b/media/libstagefright/codecs/aacenc/src/line_pe.c index 5e93cd0e4cc1..480dc288b922 100644 --- a/media/libstagefright/codecs/aacenc/src/line_pe.c +++ b/media/libstagefright/codecs/aacenc/src/line_pe.c @@ -45,20 +45,20 @@ void prepareSfbPe(PE_DATA *peData, const Word16 peOffset) { Word32 sfbGrp, sfb; - Word32 ch; + Word32 ch; for(ch=0; ch<nChannels; ch++) { PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; PE_CHANNEL_DATA *peChanData=&peData->peChannelData[ch]; for(sfbGrp=0;sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup){ for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { - peChanData->sfbNLines4[sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb]; - sfbNRelevantLines[ch][sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb] >> 2; - peChanData->sfbLdEnergy[sfbGrp+sfb] = logSfbEnergy[ch][sfbGrp+sfb]; + peChanData->sfbNLines4[sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb]; + sfbNRelevantLines[ch][sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb] >> 2; + peChanData->sfbLdEnergy[sfbGrp+sfb] = logSfbEnergy[ch][sfbGrp+sfb]; } } } - peData->offset = peOffset; + peData->offset = peOffset; } @@ -78,23 +78,23 @@ void calcSfbPe(PE_DATA *peData, Word32 ldThr, ldRatio; Word32 pe, constPart, nActiveLines; - peData->pe = peData->offset; - peData->constPart = 0; - peData->nActiveLines = 0; + peData->pe = peData->offset; + peData->constPart = 0; + peData->nActiveLines = 0; for(ch=0; ch<nChannels; ch++) { PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch]; const Word32 *sfbEnergy = psyOutChan->sfbEnergy; const Word32 *sfbThreshold = psyOutChan->sfbThreshold; - pe = 0; - constPart = 0; - nActiveLines = 0; + pe = 0; + constPart = 0; + nActiveLines = 0; for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) { for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { - Word32 nrg = sfbEnergy[sfbGrp+sfb]; - Word32 thres = sfbThreshold[sfbGrp+sfb]; + Word32 nrg = sfbEnergy[sfbGrp+sfb]; + Word32 thres = sfbThreshold[sfbGrp+sfb]; Word32 sfbLDEn = peChanData->sfbLdEnergy[sfbGrp+sfb]; if (nrg > thres) { @@ -102,8 +102,8 @@ void calcSfbPe(PE_DATA *peData, ldRatio = sfbLDEn - ldThr; - nLines4 = peChanData->sfbNLines4[sfbGrp+sfb]; - + nLines4 = peChanData->sfbNLines4[sfbGrp+sfb]; + /* sfbPe = nl*log2(en/thr)*/ if (ldRatio >= C1_I) { peChanData->sfbPe[sfbGrp+sfb] = (nLines4*ldRatio + 8) >> 4; @@ -120,26 +120,26 @@ void calcSfbPe(PE_DATA *peData, peChanData->sfbNActiveLines[sfbGrp+sfb] = nLines4 >> 2; } else { - peChanData->sfbPe[sfbGrp+sfb] = 0; - peChanData->sfbConstPart[sfbGrp+sfb] = 0; - peChanData->sfbNActiveLines[sfbGrp+sfb] = 0; + peChanData->sfbPe[sfbGrp+sfb] = 0; + peChanData->sfbConstPart[sfbGrp+sfb] = 0; + peChanData->sfbNActiveLines[sfbGrp+sfb] = 0; } pe = pe + peChanData->sfbPe[sfbGrp+sfb]; constPart = constPart + peChanData->sfbConstPart[sfbGrp+sfb]; 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; - peData->pe = saturate(pe); + peData->pe = saturate(pe); constPart += peData->constPart; - peData->constPart = saturate(constPart); + peData->constPart = saturate(constPart); nActiveLines += peData->nActiveLines; peData->nActiveLines = saturate(nActiveLines); - } + } } diff --git a/media/libstagefright/codecs/aacenc/src/memalign.c b/media/libstagefright/codecs/aacenc/src/memalign.c index 44dd4bab415d..bb266dcde79d 100644 --- a/media/libstagefright/codecs/aacenc/src/memalign.c +++ b/media/libstagefright/codecs/aacenc/src/memalign.c @@ -32,7 +32,7 @@ /***************************************************************************** * * function name: mem_malloc -* description: malloc the alignments memory +* description: malloc the alignments memory * returns: the point of the memory * **********************************************************************************/ diff --git a/media/libstagefright/codecs/aacenc/src/ms_stereo.c b/media/libstagefright/codecs/aacenc/src/ms_stereo.c index 44d45cc914e7..2e34f14b964f 100644 --- a/media/libstagefright/codecs/aacenc/src/ms_stereo.c +++ b/media/libstagefright/codecs/aacenc/src/ms_stereo.c @@ -30,7 +30,7 @@ * * function name: MsStereoProcessing * description: detect use ms stereo or not -* if ((min(thrLn, thrRn)*min(thrLn, thrRn))/(enMn*enSn)) +* if ((min(thrLn, thrRn)*min(thrLn, thrRn))/(enMn*enSn)) * >= ((thrLn *thrRn)/(enLn*enRn)) then ms stereo * **********************************************************************************/ @@ -51,7 +51,7 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft, const Word16 maxSfbPerGroup, const Word16 *sfbOffset) { Word32 temp; - Word32 sfb,sfboffs, j; + Word32 sfb,sfboffs, j; Word32 msMaskTrueSomewhere = 0; Word32 msMaskFalseSomewhere = 0; @@ -64,12 +64,12 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft, Word32 thrL, thrR, nrgL, nrgR; Word32 idx, shift; - idx = sfb + sfboffs; + idx = sfb + sfboffs; - thrL = sfbThresholdLeft[idx]; - thrR = sfbThresholdRight[idx]; - nrgL = sfbEnergyLeft[idx]; - nrgR = sfbEnergyRight[idx]; + thrL = sfbThresholdLeft[idx]; + thrR = sfbThresholdRight[idx]; + nrgL = sfbEnergyLeft[idx]; + nrgR = sfbEnergyRight[idx]; minThreshold = min(thrL, thrR); @@ -82,8 +82,8 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft, pnlr = fixmul(nrgL, nrgR); - nrgL = sfbEnergyMid[idx]; - nrgR = sfbEnergySide[idx]; + nrgL = sfbEnergyMid[idx]; + nrgR = sfbEnergySide[idx]; nrgL = max(nrgL,minThreshold) + 1; shift = norm_l(nrgL); @@ -97,42 +97,42 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft, temp = (pnlr + 1) / ((pnms >> 8) + 1); - temp = pnms - pnlr; + temp = pnms - pnlr; if( temp > 0 ){ - msMask[idx] = 1; - msMaskTrueSomewhere = 1; + msMask[idx] = 1; + msMaskTrueSomewhere = 1; for (j=sfbOffset[idx]; j<sfbOffset[idx+1]; j++) { Word32 left, right; left = (mdctSpectrumLeft[j] >> 1); right = (mdctSpectrumRight[j] >> 1); - mdctSpectrumLeft[j] = left + right; - mdctSpectrumRight[j] = left - right; + mdctSpectrumLeft[j] = left + right; + mdctSpectrumRight[j] = left - right; } - - sfbThresholdLeft[idx] = minThreshold; - sfbThresholdRight[idx] = minThreshold; - sfbEnergyLeft[idx] = sfbEnergyMid[idx]; - sfbEnergyRight[idx] = sfbEnergySide[idx]; - - sfbSpreadedEnRight[idx] = min(sfbSpreadedEnLeft[idx],sfbSpreadedEnRight[idx]) >> 1; - sfbSpreadedEnLeft[idx] = sfbSpreadedEnRight[idx]; - + + sfbThresholdLeft[idx] = minThreshold; + sfbThresholdRight[idx] = minThreshold; + sfbEnergyLeft[idx] = sfbEnergyMid[idx]; + sfbEnergyRight[idx] = sfbEnergySide[idx]; + + sfbSpreadedEnRight[idx] = min(sfbSpreadedEnLeft[idx],sfbSpreadedEnRight[idx]) >> 1; + sfbSpreadedEnLeft[idx] = sfbSpreadedEnRight[idx]; + } else { - msMask[idx] = 0; - msMaskFalseSomewhere = 1; + msMask[idx] = 0; + msMaskFalseSomewhere = 1; } - } - if ( msMaskTrueSomewhere ) { + } + if ( msMaskTrueSomewhere ) { if(msMaskFalseSomewhere ) { - *msDigest = SI_MS_MASK_SOME; + *msDigest = SI_MS_MASK_SOME; } else { - *msDigest = SI_MS_MASK_ALL; + *msDigest = SI_MS_MASK_ALL; } } else { - *msDigest = SI_MS_MASK_NONE; + *msDigest = SI_MS_MASK_NONE; } } diff --git a/media/libstagefright/codecs/aacenc/src/pre_echo_control.c b/media/libstagefright/codecs/aacenc/src/pre_echo_control.c index 1e818a2084f4..1406e11b0ec6 100644 --- a/media/libstagefright/codecs/aacenc/src/pre_echo_control.c +++ b/media/libstagefright/codecs/aacenc/src/pre_echo_control.c @@ -29,7 +29,7 @@ /***************************************************************************** * -* function name:InitPreEchoControl +* function name:InitPreEchoControl * description: init pre echo control parameter * *****************************************************************************/ @@ -40,13 +40,13 @@ void InitPreEchoControl(Word32 *pbThresholdNm1, Word16 pb; for(pb=0; pb<numPb; pb++) { - pbThresholdNm1[pb] = pbThresholdQuiet[pb]; + pbThresholdNm1[pb] = pbThresholdQuiet[pb]; } } /***************************************************************************** * -* function name:PreEchoControl +* function name:PreEchoControl * description: update shreshold to avoid pre echo * thr(n) = max(rpmin*thrq(n), min(thrq(n), rpelev*thrq1(n))) * @@ -68,22 +68,22 @@ void PreEchoControl(Word32 *pbThresholdNm1, (void)maxAllowedIncreaseFactor; scaling = ((mdctScale - mdctScalenm1) << 1); - + if ( scaling > 0 ) { for(i = 0; i < numPb; i++) { tmpThreshold1 = pbThresholdNm1[i] >> (scaling-1); tmpThreshold2 = L_mpy_ls(pbThreshold[i], minRemainingThresholdFactor); /* copy thresholds to internal memory */ - pbThresholdNm1[i] = pbThreshold[i]; + pbThresholdNm1[i] = pbThreshold[i]; + - if(pbThreshold[i] > tmpThreshold1) { - pbThreshold[i] = tmpThreshold1; + pbThreshold[i] = tmpThreshold1; } - + if(tmpThreshold2 > pbThreshold[i]) { - pbThreshold[i] = tmpThreshold2; + pbThreshold[i] = tmpThreshold2; } } @@ -96,15 +96,15 @@ void PreEchoControl(Word32 *pbThresholdNm1, tmpThreshold2 = L_mpy_ls(pbThreshold[i], minRemainingThresholdFactor); /* copy thresholds to internal memory */ - pbThresholdNm1[i] = pbThreshold[i]; + pbThresholdNm1[i] = pbThreshold[i]; + - if(((pbThreshold[i] >> scaling) > tmpThreshold1)) { pbThreshold[i] = tmpThreshold1 << scaling; } - + if(tmpThreshold2 > pbThreshold[i]) { - pbThreshold[i] = tmpThreshold2; + pbThreshold[i] = tmpThreshold2; } } diff --git a/media/libstagefright/codecs/aacenc/src/psy_configuration.c b/media/libstagefright/codecs/aacenc/src/psy_configuration.c index 8e599b0cbc4a..02d92ab1c4b0 100644 --- a/media/libstagefright/codecs/aacenc/src/psy_configuration.c +++ b/media/libstagefright/codecs/aacenc/src/psy_configuration.c @@ -88,17 +88,17 @@ Word32 GetSRIndex(Word32 sampleRate) * * function name: atan_1000 * description: calculates 1000*atan(x/1000) -* based on atan approx for x > 0 +* 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 * return: 1000*atan(x/1000) * **********************************************************************************/ -static Word16 atan_1000(Word32 val) +static Word16 atan_1000(Word32 val) { Word32 y; - + if(L_sub(val, 1000) < 0) { y = extract_l(((1000 * val) / (1000 + ((val * val) / ATAN_COEF1)))); } @@ -126,9 +126,9 @@ static Word16 BarcLineValue(Word16 noOfLines, Word16 fftLine, Word32 samplingFre /* center frequency of fft line */ center_freq = (fftLine * samplingFreq) / (noOfLines << 1); temp = atan_1000((center_freq << 2) / (3*10)); - bvalFFTLine = + bvalFFTLine = (26600 * atan_1000((center_freq*76) / 100) + 7*temp*temp) / (2*1000*1000 / BARC_SCALE); - + return saturate(bvalFFTLine); } @@ -148,17 +148,17 @@ static void initThrQuiet(Word16 numPb, for(i=0; i<numPb; i++) { Word16 bv1, bv2; - + if (i>0) bv1 = (pbBarcVal[i] + pbBarcVal[i-1]) >> 1; else bv1 = pbBarcVal[i] >> 1; - + if (i < (numPb - 1)) bv2 = (pbBarcVal[i] + pbBarcVal[i+1]) >> 1; else { - bv2 = pbBarcVal[i]; + bv2 = pbBarcVal[i]; } bv1 = min((bv1 / BARC_SCALE), max_bark); @@ -166,9 +166,9 @@ static void initThrQuiet(Word16 numPb, barcThrQuiet = min(BARC_THR_QUIET[bv1], BARC_THR_QUIET[bv2]); - + /* - we calculate + we calculate pow(10.0f,(float)(barcThrQuiet - ABS_LEV)*0.1)*(float)ABS_LOW*(pbOffset[i+1] - pbOffset[i]); */ @@ -196,47 +196,47 @@ static void initSpreading(Word16 numPb, Word16 i; Word16 maskLowSprEn, maskHighSprEn; - + if (sub(blockType, SHORT_WINDOW) != 0) { - maskLowSprEn = maskLowSprEnLong; - + maskLowSprEn = maskLowSprEnLong; + if (bitrate > 22000) maskHighSprEn = maskHighSprEnLong; else maskHighSprEn = maskHighSprEnLongLowBr; } else { - maskLowSprEn = maskLowSprEnShort; - maskHighSprEn = maskHighSprEnShort; + maskLowSprEn = maskLowSprEnShort; + maskHighSprEn = maskHighSprEnShort; } for(i=0; i<numPb; i++) { - + if (i > 0) { Word32 dbVal; Word16 dbark = pbBarcValue[i] - pbBarcValue[i-1]; /* - we calulate pow(10.0f, -0.1*dbVal/BARC_SCALE) + we calulate pow(10.0f, -0.1*dbVal/BARC_SCALE) */ dbVal = (maskHigh * dbark); pbMaskHiFactor[i] = round16(pow2_xy(L_negate(dbVal), (Word32)LOG2_1000)); /* 0.301 log10(2) */ - + dbVal = (maskLow * dbark); - pbMaskLoFactor[i-1] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000)); - - + pbMaskLoFactor[i-1] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000)); + + dbVal = (maskHighSprEn * dbark); - pbMaskHiFactorSprEn[i] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000)); + pbMaskHiFactorSprEn[i] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000)); dbVal = (maskLowSprEn * dbark); pbMaskLoFactorSprEn[i-1] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000)); } else { - pbMaskHiFactor[i] = 0; - pbMaskLoFactor[numPb-1] = 0; + pbMaskHiFactor[i] = 0; + pbMaskLoFactor[numPb-1] = 0; - pbMaskHiFactorSprEn[i] = 0; - pbMaskLoFactorSprEn[numPb-1] = 0; + pbMaskHiFactorSprEn[i] = 0; + pbMaskLoFactorSprEn[numPb-1] = 0; } } @@ -258,12 +258,12 @@ static void initBarcValues(Word16 numPb, Word16 i; Word16 pbBval0, pbBval1; - pbBval0 = 0; + pbBval0 = 0; for(i=0; i<numPb; i++){ pbBval1 = BarcLineValue(numLines, pbOffset[i+1], samplingFrequency); pbBval[i] = (pbBval0 + pbBval1) >> 1; - pbBval0 = pbBval1; + pbBval0 = pbBval1; } } @@ -295,38 +295,38 @@ static void initMinSnr(const Word32 bitrate, pePerWindow = bits2pe(extract_l((bitrate * numLines) / samplerate)); - pbVal0 = 0; + pbVal0 = 0; for (sfb=0; sfb<sfbActive; sfb++) { pbVal1 = (pbBarcVal[sfb] << 1) - pbVal0; barcWidth = pbVal1 - pbVal0; - pbVal0 = pbVal1; + pbVal0 = pbVal1; /* 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])); - - - pePart = min(pePart, 8400); + + + pePart = min(pePart, 8400); pePart = max(pePart, 1400); /* 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)*/ - + snr = pow2_xy((pePart - 16*1000),1000) - 0x0000c000; - + if(snr > 0x00008000) { shift = norm_l(snr); - snr = Div_32(0x00008000 << shift, snr << shift); + snr = Div_32(0x00008000 << shift, snr << shift); } else { snr = 0x7fffffff; } - + /* upper limit is -1 dB */ snr = min(snr, c_maxsnr); /* lower limit is -25 dB */ @@ -354,7 +354,7 @@ Word16 InitPsyConfigurationLong(Word32 bitrate, /* init sfb table */ - samplerateindex = GetSRIndex(samplerate); + samplerateindex = GetSRIndex(samplerate); psyConf->sfbCnt = sfBandTotalLong[samplerateindex]; psyConf->sfbOffset = sfBandTabLong + sfBandTabLongOffset[samplerateindex]; psyConf->sampRateIdx = samplerateindex; @@ -391,19 +391,19 @@ Word16 InitPsyConfigurationLong(Word32 bitrate, /* init ratio */ - psyConf->ratio = c_ratio; + psyConf->ratio = c_ratio; - psyConf->maxAllowedIncreaseFactor = 2; - psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor; /* 0.01 *(1 << 15)*/ + psyConf->maxAllowedIncreaseFactor = 2; + psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor; /* 0.01 *(1 << 15)*/ - psyConf->clipEnergy = c_maxClipEnergyLong; + psyConf->clipEnergy = c_maxClipEnergyLong; psyConf->lowpassLine = extract_l((bandwidth<<1) * FRAME_LEN_LONG / samplerate); for (sfb = 0; sfb < psyConf->sfbCnt; sfb++) { if (sub(psyConf->sfbOffset[sfb], psyConf->lowpassLine) >= 0) break; } - psyConf->sfbActive = sfb; + psyConf->sfbActive = sfb; /* calculate minSnr @@ -429,7 +429,7 @@ Word16 InitPsyConfigurationLong(Word32 bitrate, Word16 InitPsyConfigurationShort(Word32 bitrate, Word32 samplerate, Word16 bandwidth, - PSY_CONFIGURATION_SHORT *psyConf) + PSY_CONFIGURATION_SHORT *psyConf) { Word32 samplerateindex; Word16 sfbBarcVal[MAX_SFB_SHORT]; @@ -437,7 +437,7 @@ Word16 InitPsyConfigurationShort(Word32 bitrate, /* init sfb table */ - samplerateindex = GetSRIndex(samplerate); + samplerateindex = GetSRIndex(samplerate); psyConf->sfbCnt = sfBandTotalShort[samplerateindex]; psyConf->sfbOffset = sfBandTabShort + sfBandTabShortOffset[samplerateindex]; psyConf->sampRateIdx = samplerateindex; @@ -473,21 +473,21 @@ Word16 InitPsyConfigurationShort(Word32 bitrate, /* init ratio */ - psyConf->ratio = c_ratio; + psyConf->ratio = c_ratio; - psyConf->maxAllowedIncreaseFactor = 2; - psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor; + psyConf->maxAllowedIncreaseFactor = 2; + psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor; - psyConf->clipEnergy = c_maxClipEnergyShort; + psyConf->clipEnergy = c_maxClipEnergyShort; psyConf->lowpassLine = extract_l(((bandwidth << 1) * FRAME_LEN_SHORT) / samplerate); - + for (sfb = 0; sfb < psyConf->sfbCnt; sfb++) { - + if (psyConf->sfbOffset[sfb] >= psyConf->lowpassLine) break; } - psyConf->sfbActive = sfb; + psyConf->sfbActive = sfb; /* calculate minSnr diff --git a/media/libstagefright/codecs/aacenc/src/psy_main.c b/media/libstagefright/codecs/aacenc/src/psy_main.c index 3d0a355881e2..085acb8c8692 100644 --- a/media/libstagefright/codecs/aacenc/src/psy_main.c +++ b/media/libstagefright/codecs/aacenc/src/psy_main.c @@ -81,7 +81,7 @@ Word16 PsyNew(PSY_KERNEL *hPsy, Word32 nChan, VO_MEM_OPERATOR *pMemOP) 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; @@ -99,7 +99,7 @@ Word16 PsyNew(PSY_KERNEL *hPsy, Word32 nChan, VO_MEM_OPERATOR *pMemOP) } for (i=0; i<nChan; i++){ - hPsy->psyData[i].mdctDelayBuffer = mdctDelayBuffer + i*BLOCK_SWITCHING_OFFSET; + hPsy->psyData[i].mdctDelayBuffer = mdctDelayBuffer + i*BLOCK_SWITCHING_OFFSET; hPsy->psyData[i].mdctSpectrum = mdctSpectrum + i*FRAME_LEN_LONG; } @@ -124,12 +124,12 @@ Word16 PsyDelete(PSY_KERNEL *hPsy, VO_MEM_OPERATOR *pMemOP) { 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].mdctDelayBuffer = NULL; hPsy->psyData[nch].mdctSpectrum = NULL; } @@ -216,14 +216,14 @@ Word16 psyMainInit(PSY_KERNEL *hPsy, if (!err) for(ch=0;ch < channels;ch++){ - + InitBlockSwitching(&hPsy->psyData[ch].blockSwitchingControl, bitRate, channels); InitPreEchoControl(hPsy->psyData[ch].sfbThresholdnm1, hPsy->psyConfLong.sfbCnt, hPsy->psyConfLong.sfbThresholdQuiet); - hPsy->psyData[ch].mdctScalenm1 = 0; + hPsy->psyData[ch].mdctScalenm1 = 0; } return(err); @@ -241,7 +241,7 @@ Word16 psyMainInit(PSY_KERNEL *hPsy, Word16 psyMain(Word16 nChannels, ELEMENT_INFO *elemInfo, - Word16 *timeSignal, + Word16 *timeSignal, PSY_DATA psyData[MAX_CHANNELS], TNS_DATA tnsData[MAX_CHANNELS], PSY_CONFIGURATION_LONG *hPsyConfLong, @@ -260,8 +260,8 @@ Word16 psyMain(Word16 nChannels, Word16 channels; Word16 maxScale; - channels = elemInfo->nChannelsInEl; - maxScale = 0; + channels = elemInfo->nChannelsInEl; + maxScale = 0; /* block switching */ for(ch = 0; ch < channels; ch++) { @@ -291,7 +291,7 @@ Word16 psyMain(Word16 nChannels, /* common scaling for all channels */ for (ch=0; ch<channels; ch++) { Word16 scaleDiff = maxScale - mdctScalingArray[ch]; - + if (scaleDiff > 0) { Word32 *Spectrum = psyData[ch].mdctSpectrum; for(line=0; line<FRAME_LEN_LONG; line++) { @@ -299,11 +299,11 @@ Word16 psyMain(Word16 nChannels, Spectrum++; } } - psyData[ch].mdctScale = maxScale; + psyData[ch].mdctScale = maxScale; } for (ch=0; ch<channels; ch++) { - + if(psyData[ch].blockSwitchingControl.windowSequence != SHORT_WINDOW) { /* update long block parameter */ advancePsychLong(&psyData[ch], @@ -317,7 +317,7 @@ Word16 psyMain(Word16 nChannels, /* determine maxSfb */ for (sfb=hPsyConfLong->sfbCnt-1; sfb>=0; sfb--) { for (line=hPsyConfLong->sfbOffset[sfb+1] - 1; line>=hPsyConfLong->sfbOffset[sfb]; line--) { - + if (psyData[ch].mdctSpectrum[line] != 0) break; } if (line >= hPsyConfLong->sfbOffset[sfb]) break; @@ -326,7 +326,7 @@ Word16 psyMain(Word16 nChannels, /* Calc bandwise energies for mid and side channel Do it only if 2 channels exist */ - + if (ch == 1) advancePsychLongMS(psyData, hPsyConfLong); } @@ -341,7 +341,7 @@ Word16 psyMain(Word16 nChannels, /* Calc bandwise energies for mid and side channel Do it only if 2 channels exist */ - + if (ch == 1) advancePsychShortMS (psyData, hPsyConfShort); } @@ -349,7 +349,7 @@ Word16 psyMain(Word16 nChannels, /* group short data */ for(ch=0; ch<channels; ch++) { - + if (psyData[ch].blockSwitchingControl.windowSequence == SHORT_WINDOW) { groupShortData(psyData[ch].mdctSpectrum, pScratchTns, @@ -374,10 +374,10 @@ Word16 psyMain(Word16 nChannels, stereo Processing */ if (channels == 2) { - psyOutElement->toolsInfo.msDigest = MS_NONE; + psyOutElement->toolsInfo.msDigest = MS_NONE; maxSfbPerGroup[0] = maxSfbPerGroup[1] = max(maxSfbPerGroup[0], maxSfbPerGroup[1]); - + if (psyData[0].blockSwitchingControl.windowSequence != SHORT_WINDOW) MsStereoProcessing(psyData[0].sfbEnergy.sfbLong, psyData[1].sfbEnergy.sfbLong, @@ -420,7 +420,7 @@ Word16 psyMain(Word16 nChannels, build output */ for(ch=0;ch<channels;ch++) { - + if (psyData[ch].blockSwitchingControl.windowSequence != SHORT_WINDOW) BuildInterface(psyData[ch].mdctSpectrum, psyData[ch].mdctScale, @@ -483,7 +483,7 @@ static Word16 advancePsychLong(PSY_DATA* psyData, /* low pass */ data0 = psyData->mdctSpectrum + hPsyConfLong->lowpassLine; for(i=hPsyConfLong->lowpassLine; i<FRAME_LEN_LONG; i++) { - *data0++ = 0; + *data0++ = 0; } /* Calc sfb-bandwise mdct-energies for left and right channel */ @@ -505,7 +505,7 @@ static Word16 advancePsychLong(PSY_DATA* psyData, psyData->blockSwitchingControl.windowSequence, psyData->sfbEnergy.sfbLong); - /* TnsSync */ + /* TnsSync */ if (ch == 1) { TnsSync(tnsData, tnsData2, @@ -514,7 +514,7 @@ static Word16 advancePsychLong(PSY_DATA* psyData, psyData->blockSwitchingControl.windowSequence); } - /* Tns Encoder */ + /* Tns Encoder */ TnsEncode(&psyOutChannel->tnsInfo, tnsData, hPsyConfLong->sfbCnt, @@ -532,15 +532,15 @@ static Word16 advancePsychLong(PSY_DATA* psyData, *data1++ = min(tdata, clipEnergy); } - /* Calc sfb-bandwise mdct-energies for left and right channel again */ + /* Calc sfb-bandwise mdct-energies for left and right channel again */ if (tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive!=0) { - Word16 tnsStartBand = hPsyConfLong->tnsConf.tnsStartBand; + Word16 tnsStartBand = hPsyConfLong->tnsConf.tnsStartBand; CalcBandEnergy( psyData->mdctSpectrum, hPsyConfLong->sfbOffset+tnsStartBand, hPsyConfLong->sfbActive - tnsStartBand, psyData->sfbEnergy.sfbLong+tnsStartBand, &psyData->sfbEnergySum.sfbLong); - + data0 = psyData->sfbEnergy.sfbLong; tdata = psyData->sfbEnergySum.sfbLong; for (i=0; i<tnsStartBand; i++) @@ -565,13 +565,13 @@ static Word16 advancePsychLong(PSY_DATA* psyData, data0++; data1++; } - /* preecho control */ + /* preecho control */ if (psyData->blockSwitchingControl.windowSequence == STOP_WINDOW) { data0 = psyData->sfbThresholdnm1; for (i=hPsyConfLong->sfbCnt; i; i--) { - *data0++ = MAX_32; + *data0++ = MAX_32; } - psyData->mdctScalenm1 = 0; + psyData->mdctScalenm1 = 0; } PreEchoControl( psyData->sfbThresholdnm1, @@ -581,15 +581,15 @@ static Word16 advancePsychLong(PSY_DATA* psyData, psyData->sfbThreshold.sfbLong, psyData->mdctScale, psyData->mdctScalenm1); - psyData->mdctScalenm1 = psyData->mdctScale; + psyData->mdctScalenm1 = psyData->mdctScale; + - if (psyData->blockSwitchingControl.windowSequence== START_WINDOW) { data0 = psyData->sfbThresholdnm1; for (i=hPsyConfLong->sfbCnt; i; i--) { - *data0++ = MAX_32; + *data0++ = MAX_32; } - psyData->mdctScalenm1 = 0; + psyData->mdctScalenm1 = 0; } /* apply tns mult table on cb thresholds */ @@ -603,13 +603,13 @@ static Word16 advancePsychLong(PSY_DATA* psyData, 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++; } /* spreading energy */ SpreadingMax(hPsyConfLong->sfbCnt, - hPsyConfLong->sfbMaskLowFactorSprEn, + hPsyConfLong->sfbMaskLowFactorSprEn, hPsyConfLong->sfbMaskHighFactorSprEn, psyData->sfbSpreadedEnergy.sfbLong); @@ -619,7 +619,7 @@ static Word16 advancePsychLong(PSY_DATA* psyData, /***************************************************************************** * * function name: advancePsychLongMS -* description: update mdct-energies for left add or minus right channel +* description: update mdct-energies for left add or minus right channel * for long block * *****************************************************************************/ @@ -657,7 +657,7 @@ static Word16 advancePsychShort(PSY_DATA* psyData, 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++) { @@ -666,7 +666,7 @@ static Word16 advancePsychShort(PSY_DATA* psyData, /* low pass */ data0 = psyData->mdctSpectrum + wOffset + hPsyConfShort->lowpassLine; for(i=hPsyConfShort->lowpassLine; i<FRAME_LEN_SHORT; i++){ - *data0++ = 0; + *data0++ = 0; } /* Calc sfb-bandwise mdct-energies for left and right channel */ @@ -713,9 +713,9 @@ static Word16 advancePsychShort(PSY_DATA* psyData, *data0++ = min(tdata, clipEnergy); } - /* Calc sfb-bandwise mdct-energies for left and right channel again */ + /* Calc sfb-bandwise mdct-energies for left and right channel again */ if (tnsData->dataRaw.tnsShort.subBlockInfo[w].tnsActive != 0) { - Word16 tnsStartBand = hPsyConfShort->tnsConf.tnsStartBand; + Word16 tnsStartBand = hPsyConfShort->tnsConf.tnsStartBand; CalcBandEnergy( psyData->mdctSpectrum+wOffset, hPsyConfShort->sfbOffset+tnsStartBand, (hPsyConfShort->sfbActive - tnsStartBand), @@ -748,7 +748,7 @@ static Word16 advancePsychShort(PSY_DATA* psyData, } - /* preecho */ + /* preecho */ PreEchoControl( psyData->sfbThresholdnm1, hPsyConfShort->sfbCnt, hPsyConfShort->maxAllowedIncreaseFactor, @@ -770,14 +770,14 @@ static Word16 advancePsychShort(PSY_DATA* psyData, *data0++ = *data1++; } SpreadingMax(hPsyConfShort->sfbCnt, - hPsyConfShort->sfbMaskLowFactorSprEn, + hPsyConfShort->sfbMaskLowFactorSprEn, hPsyConfShort->sfbMaskHighFactorSprEn, psyData->sfbSpreadedEnergy.sfbShort[w]); wOffset += FRAME_LEN_SHORT; } /* for TRANS_FAC */ - psyData->mdctScalenm1 = psyData->mdctScale; + psyData->mdctScalenm1 = psyData->mdctScale; return 0; } @@ -785,7 +785,7 @@ static Word16 advancePsychShort(PSY_DATA* psyData, /***************************************************************************** * * function name: advancePsychShortMS -* description: update mdct-energies for left add or minus right channel +* description: update mdct-energies for left add or minus right channel * for short block * *****************************************************************************/ @@ -793,7 +793,7 @@ static Word16 advancePsychShortMS (PSY_DATA psyData[MAX_CHANNELS], const PSY_CONFIGURATION_SHORT *hPsyConfShort) { Word32 w, wOffset; - wOffset = 0; + wOffset = 0; for(w=0; w<TRANS_FAC; w++) { CalcBandEnergyMS(psyData[0].mdctSpectrum+wOffset, psyData[1].mdctSpectrum+wOffset, diff --git a/media/libstagefright/codecs/aacenc/src/qc_main.c b/media/libstagefright/codecs/aacenc/src/qc_main.c index e8c39e41e13b..df6d46e68940 100644 --- a/media/libstagefright/codecs/aacenc/src/qc_main.c +++ b/media/libstagefright/codecs/aacenc/src/qc_main.c @@ -68,12 +68,12 @@ static Word16 calcFrameLen(Word32 bitRate, result = (FRAME_LEN_LONG >> 3) * bitRate; quot = result / sampleRate; - + if (mode == FRAME_LEN_BYTES_MODULO) { result -= quot * sampleRate; } else { /* FRAME_LEN_BYTES_INT */ - result = quot; + result = quot; } return result; @@ -83,7 +83,7 @@ static Word16 calcFrameLen(Word32 bitRate, * * function name:framePadding * description: Calculates if padding is needed for actual frame -* returns: paddingOn or not +* returns: paddingOn or not * *****************************************************************************/ static Word16 framePadding(Word32 bitRate, @@ -93,16 +93,16 @@ static Word16 framePadding(Word32 bitRate, Word16 paddingOn; Word16 difference; - paddingOn = 0; + paddingOn = 0; difference = calcFrameLen( bitRate, sampleRate, FRAME_LEN_BYTES_MODULO ); *paddingRest = *paddingRest - difference; - + if (*paddingRest <= 0 ) { - paddingOn = 1; + paddingOn = 1; *paddingRest = *paddingRest + sampleRate; } @@ -123,12 +123,12 @@ Word16 QCOutNew(QC_OUT *hQC, Word16 nChannels, VO_MEM_OPERATOR *pMemOP) Word32 i; Word16 *quantSpec; Word16 *scf; - UWord16 *maxValueInSfb; - + UWord16 *maxValueInSfb; + 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); + scf = (Word16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(Word16), 32, VO_INDEX_ENC_AAC); if(NULL == scf) { return 1; @@ -141,12 +141,12 @@ Word16 QCOutNew(QC_OUT *hQC, Word16 nChannels, VO_MEM_OPERATOR *pMemOP) for (i=0; i<nChannels; i++) { hQC->qcChannel[i].quantSpec = quantSpec + i*FRAME_LEN_LONG; - + hQC->qcChannel[i].maxValueInSfb = maxValueInSfb + i*MAX_GROUPED_SFB; - + hQC->qcChannel[i].scf = scf + i*MAX_GROUPED_SFB; } - + return 0; } @@ -165,21 +165,21 @@ void QCOutDelete(QC_OUT* hQC, VO_MEM_OPERATOR *pMemOP) { 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; } - } + } } /********************************************************************************* @@ -204,8 +204,8 @@ Word16 QCNew(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP) **********************************************************************************/ void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP) { - - /* + + /* nothing to do */ hQC=NULL; @@ -221,15 +221,15 @@ void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP) Word16 QCInit(QC_STATE *hQC, struct QC_INIT *init) { - hQC->nChannels = init->elInfo->nChannelsInEl; - hQC->maxBitsTot = init->maxBits; + hQC->nChannels = init->elInfo->nChannelsInEl; + hQC->maxBitsTot = init->maxBits; hQC->bitResTot = sub(init->bitRes, init->averageBits); - hQC->averageBitsTot = init->averageBits; - hQC->maxBitFac = init->maxBitFac; + hQC->averageBitsTot = init->averageBits; + hQC->maxBitFac = init->maxBitFac; - hQC->padding.paddingRest = init->padding.paddingRest; + hQC->padding.paddingRest = init->padding.paddingRest; - hQC->globStatBits = 3; /* for ID_END */ + hQC->globStatBits = 3; /* for ID_END */ /* channel elements init */ InitElementBits(&hQC->elementBits, @@ -248,13 +248,13 @@ Word16 QCInit(QC_STATE *hQC, /********************************************************************************* -* +* * function name: QCMain * description: quantization and coding the spectrum * returns: 0 if success * **********************************************************************************/ -Word16 QCMain(QC_STATE* hQC, +Word16 QCMain(QC_STATE* hQC, ELEMENT_BITS* elBits, ATS_ELEMENT* adjThrStateElement, PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], /* may be modified in-place */ @@ -262,34 +262,34 @@ Word16 QCMain(QC_STATE* hQC, QC_OUT_CHANNEL qcOutChannel[MAX_CHANNELS], /* out */ QC_OUT_ELEMENT* qcOutElement, Word16 nChannels, - Word16 ancillaryDataBytes) + Word16 ancillaryDataBytes) { Word16 maxChDynBits[MAX_CHANNELS]; - Word16 chBitDistribution[MAX_CHANNELS]; + Word16 chBitDistribution[MAX_CHANNELS]; Word32 ch; - + if (elBits->bitResLevel < 0) { return -1; } - + if (elBits->bitResLevel > elBits->maxBitResBits) { return -1; } qcOutElement->staticBitsUsed = countStaticBitdemand(psyOutChannel, psyOutElement, - nChannels, + nChannels, qcOutElement->adtsUsed); - + if (ancillaryDataBytes) { qcOutElement->ancBitsUsed = 7 + (ancillaryDataBytes << 3); - + if (ancillaryDataBytes >= 15) qcOutElement->ancBitsUsed = qcOutElement->ancBitsUsed + 8; } else { - qcOutElement->ancBitsUsed = 0; + qcOutElement->ancBitsUsed = 0; } CalcFormFactor(hQC->logSfbFormFactor, hQC->sfbNRelevantLines, hQC->logSfbEnergy, psyOutChannel, nChannels); @@ -301,7 +301,7 @@ Word16 QCMain(QC_STATE* hQC, psyOutElement, chBitDistribution, hQC->logSfbEnergy, - hQC->sfbNRelevantLines, + hQC->sfbNRelevantLines, qcOutElement, elBits, nChannels, @@ -323,14 +323,14 @@ Word16 QCMain(QC_STATE* hQC, maxChDynBits[ch] = extract_l(chBitDistribution[ch] * maxDynBits / 1000); } - qcOutElement->dynBitsUsed = 0; + qcOutElement->dynBitsUsed = 0; for (ch = 0; ch < nChannels; ch++) { Word32 chDynBits; Flag constraintsFulfilled; Word32 iter; - iter = 0; + iter = 0; do { - constraintsFulfilled = 1; + constraintsFulfilled = 1; QuantizeSpectrum(psyOutChannel[ch].sfbCnt, psyOutChannel[ch].maxSfbPerGroup, @@ -340,14 +340,14 @@ Word16 QCMain(QC_STATE* hQC, qcOutChannel[ch].globalGain, qcOutChannel[ch].scf, qcOutChannel[ch].quantSpec); - + if (calcMaxValueInSfb(psyOutChannel[ch].sfbCnt, psyOutChannel[ch].maxSfbPerGroup, psyOutChannel[ch].sfbPerGroup, psyOutChannel[ch].sfbOffsets, qcOutChannel[ch].quantSpec, qcOutChannel[ch].maxValueInSfb) > MAX_QUANT) { - constraintsFulfilled = 0; + constraintsFulfilled = 0; } chDynBits = dynBitCount(qcOutChannel[ch].quantSpec, @@ -359,24 +359,24 @@ Word16 QCMain(QC_STATE* hQC, psyOutChannel[ch].sfbPerGroup, psyOutChannel[ch].sfbOffsets, &qcOutChannel[ch].sectionData); - + if (chDynBits >= maxChDynBits[ch]) { - constraintsFulfilled = 0; + constraintsFulfilled = 0; } - + if (!constraintsFulfilled) { qcOutChannel[ch].globalGain = qcOutChannel[ch].globalGain + 1; } iter = iter + 1; - + } while(!constraintsFulfilled); qcOutElement->dynBitsUsed = qcOutElement->dynBitsUsed + chDynBits; - qcOutChannel[ch].mdctScale = psyOutChannel[ch].mdctScale; - qcOutChannel[ch].groupingMask = psyOutChannel[ch].groupingMask; - qcOutChannel[ch].windowShape = psyOutChannel[ch].windowShape; + qcOutChannel[ch].mdctScale = psyOutChannel[ch].mdctScale; + qcOutChannel[ch].groupingMask = psyOutChannel[ch].groupingMask; + qcOutChannel[ch].windowShape = psyOutChannel[ch].windowShape; } /* save dynBitsUsed for correction of bits2pe relation */ @@ -411,13 +411,13 @@ static Word16 calcMaxValueInSfb(Word16 sfbCnt, Word16 sfbOffs, sfb; Word16 maxValueAll; - maxValueAll = 0; + maxValueAll = 0; for(sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup) { for (sfb = 0; sfb < maxSfbPerGroup; sfb++) { Word16 line; Word16 maxThisSfb; - maxThisSfb = 0; + maxThisSfb = 0; for (line = sfbOffset[sfbOffs+sfb]; line < sfbOffset[sfbOffs+sfb+1]; line++) { Word16 absVal; @@ -425,7 +425,7 @@ static Word16 calcMaxValueInSfb(Word16 sfbCnt, maxThisSfb = max(maxThisSfb, absVal); } - maxValue[sfbOffs+sfb] = maxThisSfb; + maxValue[sfbOffs+sfb] = maxThisSfb; maxValueAll = max(maxValueAll, maxThisSfb); } } @@ -441,15 +441,15 @@ static Word16 calcMaxValueInSfb(Word16 sfbCnt, **********************************************************************************/ void updateBitres(QC_STATE* qcKernel, QC_OUT* qcOut) - + { ELEMENT_BITS *elBits; - - qcKernel->bitResTot = 0; + + qcKernel->bitResTot = 0; elBits = &qcKernel->elementBits; - + if (elBits->averageBits > 0) { /* constant bitrate */ Word16 bitsUsed; @@ -460,8 +460,8 @@ void updateBitres(QC_STATE* qcKernel, } else { /* variable bitrate */ - elBits->bitResLevel = elBits->maxBits; - qcKernel->bitResTot = qcKernel->maxBitsTot; + elBits->bitResLevel = elBits->maxBits; + qcKernel->bitResTot = qcKernel->maxBitsTot; } } @@ -476,55 +476,55 @@ Word16 FinalizeBitConsumption(QC_STATE *qcKernel, { Word32 nFullFillElem; Word32 totFillBits; - Word16 diffBits; + Word16 diffBits; Word16 bitsUsed; - totFillBits = 0; + totFillBits = 0; - qcOut->totStaticBitsUsed = qcKernel->globStatBits; + qcOut->totStaticBitsUsed = qcKernel->globStatBits; qcOut->totStaticBitsUsed += qcOut->qcElement.staticBitsUsed; qcOut->totDynBitsUsed = qcOut->qcElement.dynBitsUsed; qcOut->totAncBitsUsed = qcOut->qcElement.ancBitsUsed; qcOut->totFillBits = qcOut->qcElement.fillBits; - + if (qcOut->qcElement.fillBits) { totFillBits += qcOut->qcElement.fillBits; } nFullFillElem = (max((qcOut->totFillBits - 1), 0) / maxFillElemBits) * maxFillElemBits; - + qcOut->totFillBits = qcOut->totFillBits - nFullFillElem; /* check fill elements */ - + if (qcOut->totFillBits > 0) { /* minimum Fillelement contains 7 (TAG + byte cnt) bits */ qcOut->totFillBits = max(7, qcOut->totFillBits); /* fill element size equals n*8 + 7 */ - qcOut->totFillBits = qcOut->totFillBits + ((8 - ((qcOut->totFillBits - 7) & 0x0007)) & 0x0007); + qcOut->totFillBits = qcOut->totFillBits + ((8 - ((qcOut->totFillBits - 7) & 0x0007)) & 0x0007); } qcOut->totFillBits = qcOut->totFillBits + nFullFillElem; /* now distribute extra fillbits and alignbits over channel elements */ qcOut->alignBits = 7 - ((qcOut->totDynBitsUsed + qcOut->totStaticBitsUsed + - qcOut->totAncBitsUsed + qcOut->totFillBits - 1) & 0x0007); + qcOut->totAncBitsUsed + qcOut->totFillBits - 1) & 0x0007); + - if ( (qcOut->alignBits + qcOut->totFillBits - totFillBits == 8) && (qcOut->totFillBits > 8)) qcOut->totFillBits = qcOut->totFillBits - 8; - + diffBits = qcOut->alignBits + qcOut->totFillBits - totFillBits; - + if(diffBits>=0) { qcOut->qcElement.fillBits += diffBits; } bitsUsed = qcOut->totDynBitsUsed + qcOut->totStaticBitsUsed + qcOut->totAncBitsUsed; bitsUsed = bitsUsed + qcOut->totFillBits + qcOut->alignBits; - + if (bitsUsed > qcKernel->maxBitsTot) { return -1; } @@ -564,9 +564,9 @@ Word16 AdjustBitrate(QC_STATE *hQC, codeBitsLast = hQC->averageBitsTot - hQC->globStatBits; codeBits = frameLen - hQC->globStatBits; - /* calculate bits for every channel element */ + /* calculate bits for every channel element */ if (codeBits != codeBitsLast) { - Word16 totalBits = 0; + Word16 totalBits = 0; hQC->elementBits.averageBits = (hQC->elementBits.relativeBits * codeBits) >> 16; /* relativeBits was scaled down by 2 */ totalBits += hQC->elementBits.averageBits; @@ -574,7 +574,7 @@ Word16 AdjustBitrate(QC_STATE *hQC, hQC->elementBits.averageBits = hQC->elementBits.averageBits + (codeBits - totalBits); } - hQC->averageBitsTot = frameLen; + hQC->averageBitsTot = frameLen; return 0; } diff --git a/media/libstagefright/codecs/aacenc/src/quantize.c b/media/libstagefright/codecs/aacenc/src/quantize.c index 973554e48356..54add2f73f47 100644 --- a/media/libstagefright/codecs/aacenc/src/quantize.c +++ b/media/libstagefright/codecs/aacenc/src/quantize.c @@ -34,32 +34,32 @@ static const Word32 XROUND = 0x33e425af; /* final rounding constant (-0.0946f+ 0 /***************************************************************************** * -* function name:pow34 -* description: calculate $x^{\frac{3}{4}}, for 0.5 < x < 1.0$. +* function name:pow34 +* description: calculate $x^{\frac{3}{4}}, for 0.5 < x < 1.0$. * *****************************************************************************/ __inline Word32 pow34(Word32 x) { /* index table using MANT_DIGITS bits, but mask out the sign bit and the MSB - which is always one */ + which is always one */ return mTab_3_4[(x >> (INT_BITS-2-MANT_DIGITS)) & (MANT_SIZE-1)]; } /***************************************************************************** * -* function name:quantizeSingleLine -* description: quantizes spectrum -* quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain) +* function name:quantizeSingleLine +* description: quantizes spectrum +* quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain) * *****************************************************************************/ static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum) { Word32 e, minusFinalExp, finalShift; Word32 x; - Word16 qua = 0; + Word16 qua = 0; + - if (absSpectrum) { e = norm_l(absSpectrum); x = pow34(absSpectrum << e); @@ -71,7 +71,7 @@ static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum) /* separate the exponent into a shift, and a multiply */ finalShift = minusFinalExp >> 4; - + if (finalShift < INT_BITS) { x = L_mpy_wx(x, pow2tominusNover16[minusFinalExp & 15]); @@ -84,7 +84,7 @@ static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum) x >>= finalShift; else x <<= (-finalShift); - + qua = saturate(x); } } @@ -94,10 +94,10 @@ static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum) /***************************************************************************** * -* function name:quantizeLines -* description: quantizes spectrum lines -* quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain) -* input: global gain, number of lines to process, spectral data +* function name:quantizeLines +* description: quantizes spectrum lines +* quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain) +* input: global gain, number of lines to process, spectral data * output: quantized spectrum * *****************************************************************************/ @@ -116,15 +116,15 @@ static void quantizeLines(const Word16 gain, pquat = quantBorders[m]; g += 16; - + if(g >= 0) { for (line=0; line<noOfLines; line++) { Word32 qua; - qua = 0; - + qua = 0; + mdctSpeL = mdctSpectrum[line]; - + if (mdctSpeL) { Word32 sa; Word32 saShft; @@ -134,27 +134,27 @@ static void quantizeLines(const Word16 gain, 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; } @@ -162,17 +162,17 @@ static void quantizeLines(const Word16 gain, } } } - quaSpectrum[line] = qua ; + quaSpectrum[line] = qua ; } } else { for (line=0; line<noOfLines; line++) { Word32 qua; - qua = 0; - + qua = 0; + mdctSpeL = mdctSpectrum[line]; - + if (mdctSpeL) { Word32 sa; Word32 saShft; @@ -181,27 +181,27 @@ static void quantizeLines(const Word16 gain, 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; } @@ -209,8 +209,8 @@ static void quantizeLines(const Word16 gain, } } } - quaSpectrum[line] = qua ; - } + quaSpectrum[line] = qua ; + } } } @@ -218,10 +218,10 @@ static void quantizeLines(const Word16 gain, /***************************************************************************** * -* function name:iquantizeLines +* function name:iquantizeLines * description: iquantizes spectrum lines without sign -* mdctSpectrum = iquaSpectrum^4/3 *2^(0.25*gain) -* input: global gain, number of lines to process,quantized spectrum +* mdctSpectrum = iquaSpectrum^4/3 *2^(0.25*gain) +* input: global gain, number of lines to process,quantized spectrum * output: spectral data * *****************************************************************************/ @@ -234,11 +234,11 @@ static void iquantizeLines(const Word16 gain, Word32 iquantizershift; Word32 line; - iquantizermod = gain & 3; + iquantizermod = gain & 3; iquantizershift = gain >> 2; for (line=0; line<noOfLines; line++) { - + if( quantSpectrum[line] != 0 ) { Word32 accu; Word32 ex; @@ -252,19 +252,19 @@ static void iquantizeLines(const Word16 gain, accu = accu << ex; specExp = INT_BITS-1 - ex; - tabIndex = (accu >> (INT_BITS-2-MANT_DIGITS)) & (~MANT_SIZE); + tabIndex = (accu >> (INT_BITS-2-MANT_DIGITS)) & (~MANT_SIZE); /* calculate "mantissa" ^4/3 */ - s = mTab_4_3[tabIndex]; + s = mTab_4_3[tabIndex]; /* get approperiate exponent multiplier for specExp^3/4 combined with scfMod */ - t = specExpMantTableComb_enc[iquantizermod][specExp]; + t = specExpMantTableComb_enc[iquantizermod][specExp]; /* multiply "mantissa" ^4/3 with exponent multiplier */ accu = MULHIGH(s, t); /* get approperiate exponent shifter */ - specExp = specExpTableComb_enc[iquantizermod][specExp]; + specExp = specExpTableComb_enc[iquantizermod][specExp]; specExp += iquantizershift + 1; if(specExp >= 0) @@ -273,7 +273,7 @@ static void iquantizeLines(const Word16 gain, mdctSpectrum[line] = accu >> (-specExp); } else { - mdctSpectrum[line] = 0; + mdctSpectrum[line] = 0; } } } @@ -301,7 +301,7 @@ void QuantizeSpectrum(Word16 sfbCnt, for(sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup) { Word32 sfbNext ; for (sfb = 0; sfb < maxSfbPerGroup; sfb = sfbNext) { - Word16 scalefactor = scalefactors[sfbOffs+sfb]; + Word16 scalefactor = scalefactors[sfbOffs+sfb]; /* coalesce sfbs with the same scalefactor */ for (sfbNext = sfb+1; sfbNext < maxSfbPerGroup && scalefactor == scalefactors[sfbOffs+sfbNext]; @@ -318,7 +318,7 @@ void QuantizeSpectrum(Word16 sfbCnt, /***************************************************************************** * -* function name:calcSfbDist +* function name:calcSfbDist * description: quantizes and requantizes lines to calculate distortion * input: number of lines to be quantized, ... * output: distortion @@ -338,14 +338,14 @@ Word32 calcSfbDist(const Word32 *spec, pquat = quantBorders[m]; repquat = quantRecon[m]; - - dist = 0; + + dist = 0; g += 16; if(g2 < 0 && g >= 0) - { + { g2 = -g2; - for(line=0; line<sfbWidth; line++) { - if (spec[line]) { + for(line=0; line<sfbWidth; line++) { + if (spec[line]) { Word32 diff; Word32 distSingle; Word32 sa; @@ -359,19 +359,19 @@ Word32 calcSfbDist(const Word32 *spec, 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; @@ -387,15 +387,15 @@ Word32 calcSfbDist(const Word32 *spec, } } } - + dist = L_add(dist, distSingle); } } } else { - for(line=0; line<sfbWidth; line++) { - if (spec[line]) { + for(line=0; line<sfbWidth; line++) { + if (spec[line]) { Word32 diff; Word32 distSingle; Word32 sa; @@ -408,19 +408,19 @@ Word32 calcSfbDist(const Word32 *spec, 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); @@ -438,7 +438,7 @@ Word32 calcSfbDist(const Word32 *spec, } 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 ffe2e83686d4..fe401374c022 100644 --- a/media/libstagefright/codecs/aacenc/src/sf_estim.c +++ b/media/libstagefright/codecs/aacenc/src/sf_estim.c @@ -30,17 +30,17 @@ static const Word16 MAX_SCF_DELTA = 60; /*! -constants reference in comments +constants reference in comments C0 = 6.75f; - C1 = -69.33295f; -16/3*log(MAX_QUANT+0.5-logCon)/log(2) + C1 = -69.33295f; -16/3*log(MAX_QUANT+0.5-logCon)/log(2) C2 = 4.0f; C3 = 2.66666666f; - - PE_C1 = 3.0f; log(8.0)/log(2) - PE_C2 = 1.3219281f; log(2.5)/log(2) - PE_C3 = 0.5593573f; 1-C2/C1 - + + PE_C1 = 3.0f; log(8.0)/log(2) + PE_C2 = 1.3219281f; log(2.5)/log(2) + PE_C3 = 0.5593573f; 1-C2/C1 + */ #define FF_SQRT_BITS 7 @@ -55,15 +55,15 @@ constants reference in comments /********************************************************************************* * * function name: formfac_sqrt -* description: calculates sqrt(x)/256 +* description: calculates sqrt(x)/256 * **********************************************************************************/ __inline Word32 formfac_sqrt(Word32 x) { Word32 y; Word32 preshift, postshift; - - + + if (x==0) return 0; preshift = norm_l(x) - (INT_BITS-1-FF_SQRT_BITS); postshift = preshift >> 1; @@ -74,12 +74,12 @@ __inline Word32 formfac_sqrt(Word32 x) else y = x >> (-preshift); y = formfac_sqrttable[y-32]; - + if(postshift >= 0) y = y >> postshift; else y = y << (-postshift); - + return y; } @@ -100,19 +100,19 @@ CalcFormFactorChannel(Word16 *logSfbFormFactor, Word32 sfbw, sfbw1; Word32 i, j; Word32 sfbOffs, sfb, shift; - + sfbw = sfbw1 = 0; for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup){ for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { - i = sfbOffs+sfb; - + i = sfbOffs+sfb; + if (psyOutChan->sfbEnergy[i] > psyOutChan->sfbThreshold[i]) { Word32 accu, avgFormFactor,iSfbWidth; Word32 *mdctSpec; sfbw = psyOutChan->sfbOffsets[i+1] - psyOutChan->sfbOffsets[i]; iSfbWidth = invSBF[(sfbw >> 2) - 1]; mdctSpec = psyOutChan->mdctSpectrum + psyOutChan->sfbOffsets[i]; - accu = 0; + accu = 0; /* calc sum of sqrt(spec) */ for (j=sfbw; j; j--) { accu += formfac_sqrt(L_abs(*mdctSpec)); mdctSpec++; @@ -129,7 +129,7 @@ CalcFormFactorChannel(Word16 *logSfbFormFactor, } else { /* set number of lines to zero */ - sfbNRelevantLines[i] = 0; + sfbNRelevantLines[i] = 0; } } } @@ -141,68 +141,68 @@ CalcFormFactorChannel(Word16 *logSfbFormFactor, * description: find better scalefactor with analysis by synthesis * **********************************************************************************/ -static Word16 improveScf(Word32 *spec, - Word16 sfbWidth, - Word32 thresh, +static Word16 improveScf(Word32 *spec, + Word16 sfbWidth, + Word32 thresh, Word16 scf, Word16 minScf, - Word32 *dist, + Word32 *dist, Word16 *minScfCalculated) { Word32 cnt; Word32 sfbDist; Word32 scfBest; Word32 thresh125 = L_add(thresh, (thresh >> 2)); - - scfBest = scf; - + + scfBest = scf; + /* calc real distortion */ sfbDist = calcSfbDist(spec, sfbWidth, scf); - *minScfCalculated = scf; + *minScfCalculated = scf; if(!sfbDist) return scfBest; - + if (sfbDist > thresh125) { Word32 scfEstimated; Word32 sfbDistBest; - scfEstimated = scf; - sfbDistBest = sfbDist; - - cnt = 0; + scfEstimated = scf; + sfbDistBest = sfbDist; + + cnt = 0; while (sfbDist > thresh125 && (cnt < 3)) { - + scf = scf + 1; sfbDist = calcSfbDist(spec, sfbWidth, scf); - + if (sfbDist < sfbDistBest) { - scfBest = scf; - sfbDistBest = sfbDist; + scfBest = scf; + sfbDistBest = sfbDist; } cnt = cnt + 1; } - cnt = 0; - scf = scfEstimated; - sfbDist = sfbDistBest; + cnt = 0; + scf = scfEstimated; + sfbDist = sfbDistBest; while ((sfbDist > thresh125) && (cnt < 1) && (scf > minScf)) { - + scf = scf - 1; sfbDist = calcSfbDist(spec, sfbWidth, scf); - + if (sfbDist < sfbDistBest) { - scfBest = scf; - sfbDistBest = sfbDist; + scfBest = scf; + sfbDistBest = sfbDist; } - *minScfCalculated = scf; + *minScfCalculated = scf; cnt = cnt + 1; } - *dist = sfbDistBest; + *dist = sfbDistBest; } else { - Word32 sfbDistBest; + Word32 sfbDistBest; Word32 sfbDistAllowed; Word32 thresh08 = fixmul(COEF08_31, thresh); - sfbDistBest = sfbDist; - + sfbDistBest = sfbDist; + if (sfbDist < thresh08) sfbDistAllowed = sfbDist; else @@ -210,16 +210,16 @@ static Word16 improveScf(Word32 *spec, for (cnt=0; cnt<3; cnt++) { scf = scf + 1; sfbDist = calcSfbDist(spec, sfbWidth, scf); - + if (fixmul(COEF08_31,sfbDist) < sfbDistAllowed) { *minScfCalculated = scfBest + 1; - scfBest = scf; - sfbDistBest = sfbDist; + scfBest = scf; + sfbDistBest = sfbDist; } } - *dist = sfbDistBest; + *dist = sfbDistBest; } - + /* return best scalefactor */ return scfBest; } @@ -233,10 +233,10 @@ static Word16 improveScf(Word32 *spec, static Word16 countSingleScfBits(Word16 scf, Word16 scfLeft, Word16 scfRight) { Word16 scfBits; - + scfBits = bitCountScalefactorDelta(scfLeft - scf) + bitCountScalefactorDelta(scf - scfRight); - + return scfBits; } @@ -245,7 +245,7 @@ static Word16 countSingleScfBits(Word16 scf, Word16 scfLeft, Word16 scfRight) * function name: calcSingleSpecPe * description: ldRatio = log2(en(n)) - 0,375*scfGain(n) * nbits = 0.7*nLines*ldRation for ldRation >= c1 -* nbits = 0.7*nLines*(c2 + c3*ldRatio) for ldRation < c1 +* nbits = 0.7*nLines*(c2 + c3*ldRatio) for ldRation < c1 * **********************************************************************************/ static Word16 calcSingleSpecPe(Word16 scf, Word16 sfbConstPePart, Word16 nLines) @@ -253,18 +253,18 @@ static Word16 calcSingleSpecPe(Word16 scf, Word16 sfbConstPePart, Word16 nLines) Word32 specPe; Word32 ldRatio; Word32 scf3; - + ldRatio = sfbConstPePart << 3; /* (sfbConstPePart -0.375*scf)*8 */ scf3 = scf + scf + scf; ldRatio = ldRatio - scf3; - + if (ldRatio < PE_C1_8) { - /* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/ + /* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/ ldRatio = (ldRatio + PE_C2_16) >> 1; } specPe = nLines * ldRatio; specPe = (specPe * PE_SCALE) >> 14; - + return saturate(specPe); } @@ -275,53 +275,53 @@ static Word16 calcSingleSpecPe(Word16 scf, Word16 sfbConstPePart, Word16 nLines) * description: count different scf bits used * **********************************************************************************/ -static Word16 countScfBitsDiff(Word16 *scfOld, Word16 *scfNew, +static Word16 countScfBitsDiff(Word16 *scfOld, Word16 *scfNew, Word16 sfbCnt, Word16 startSfb, Word16 stopSfb) { Word32 scfBitsDiff; Word32 sfb, sfbLast; Word32 sfbPrev, sfbNext; - - scfBitsDiff = 0; - sfb = 0; - + + scfBitsDiff = 0; + sfb = 0; + /* search for first relevant sfb */ - sfbLast = startSfb; + sfbLast = startSfb; while (sfbLast < stopSfb && scfOld[sfbLast] == VOAAC_SHRT_MIN) { - + sfbLast = sfbLast + 1; } /* search for previous relevant sfb and count diff */ sfbPrev = startSfb - 1; while ((sfbPrev>=0) && scfOld[sfbPrev] == VOAAC_SHRT_MIN) { - + sfbPrev = sfbPrev - 1; } - + if (sfbPrev>=0) { scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbPrev] - scfNew[sfbLast]) - bitCountScalefactorDelta(scfOld[sfbPrev] - scfOld[sfbLast]); } /* now loop through all sfbs and count diffs of relevant sfbs */ for (sfb=sfbLast+1; sfb<stopSfb; sfb++) { - + if (scfOld[sfb] != VOAAC_SHRT_MIN) { scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbLast] - scfNew[sfb]) - bitCountScalefactorDelta(scfOld[sfbLast] - scfOld[sfb]); - sfbLast = sfb; + sfbLast = sfb; } } /* search for next relevant sfb and count diff */ - sfbNext = stopSfb; + sfbNext = stopSfb; while (sfbNext < sfbCnt && scfOld[sfbNext] == VOAAC_SHRT_MIN) { - + sfbNext = sfbNext + 1; } - + if (sfbNext < sfbCnt) scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbLast] - scfNew[sfbNext]) - bitCountScalefactorDelta(scfOld[sfbLast] - scfOld[sfbNext]); - + return saturate(scfBitsDiff); } @@ -331,52 +331,52 @@ static Word16 calcSpecPeDiff(Word16 *scfOld, Word16 *logSfbEnergy, Word16 *logSfbFormFactor, Word16 *sfbNRelevantLines, - Word16 startSfb, + Word16 startSfb, Word16 stopSfb) { Word32 specPeDiff; Word32 sfb; - - specPeDiff = 0; - + + specPeDiff = 0; + /* loop through all sfbs and count pe difference */ for (sfb=startSfb; sfb<stopSfb; sfb++) { - - + + if (scfOld[sfb] != VOAAC_SHRT_MIN) { Word32 ldRatioOld, ldRatioNew; Word32 scf3; - - + + if (sfbConstPePart[sfb] == MIN_16) { sfbConstPePart[sfb] = ((logSfbEnergy[sfb] - logSfbFormFactor[sfb]) + 11-8*4+3) >> 2; } - - + + ldRatioOld = sfbConstPePart[sfb] << 3; scf3 = scfOld[sfb] + scfOld[sfb] + scfOld[sfb]; ldRatioOld = ldRatioOld - scf3; ldRatioNew = sfbConstPePart[sfb] << 3; scf3 = scfNew[sfb] + scfNew[sfb] + scfNew[sfb]; ldRatioNew = ldRatioNew - scf3; - + if (ldRatioOld < PE_C1_8) { /* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/ ldRatioOld = (ldRatioOld + PE_C2_16) >> 1; } - + if (ldRatioNew < PE_C1_8) { /* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/ ldRatioNew = (ldRatioNew + PE_C2_16) >> 1; } - + specPeDiff += sfbNRelevantLines[sfb] * (ldRatioNew - ldRatioOld); } } - + specPeDiff = (specPeDiff * PE_SCALE) >> 14; - + return saturate(specPeDiff); } @@ -390,9 +390,9 @@ static Word16 calcSpecPeDiff(Word16 *scfOld, * **********************************************************************************/ static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan, - Word16 *scf, + Word16 *scf, Word16 *minScf, - Word32 *sfbDist, + Word32 *sfbDist, Word16 *sfbConstPePart, Word16 *logSfbEnergy, Word16 *logSfbFormFactor, @@ -411,94 +411,94 @@ static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan, Word16 *prevScfNext = psyOutChan->prevScfNext; Word16 *deltaPeLast = psyOutChan->deltaPeLast; Flag updateMinScfCalculated; - - success = 0; - deltaPe = 0; - + + success = 0; + deltaPe = 0; + for(j=0;j<psyOutChan->sfbCnt;j++){ - prevScfLast[j] = MAX_16; - prevScfNext[j] = MAX_16; - deltaPeLast[j] = MAX_16; + prevScfLast[j] = MAX_16; + prevScfNext[j] = MAX_16; + deltaPeLast[j] = MAX_16; } - - sfbLast = -1; - sfbAct = -1; - sfbNext = -1; + + sfbLast = -1; + sfbAct = -1; + sfbNext = -1; scfLast = 0; scfNext = 0; - scfMin = MAX_16; + scfMin = MAX_16; do { /* search for new relevant sfb */ sfbNext = sfbNext + 1; while (sfbNext < psyOutChan->sfbCnt && scf[sfbNext] == MIN_16) { - + sfbNext = sfbNext + 1; } - + if ((sfbLast>=0) && (sfbAct>=0) && sfbNext < psyOutChan->sfbCnt) { /* relevant scfs to the left and to the right */ - scfAct = scf[sfbAct]; + scfAct = scf[sfbAct]; scfLast = scf + sfbLast; scfNext = scf + sfbNext; scfMin = min(*scfLast, *scfNext); } else { - + if (sfbLast == -1 && (sfbAct>=0) && sfbNext < psyOutChan->sfbCnt) { /* first relevant scf */ - scfAct = scf[sfbAct]; + scfAct = scf[sfbAct]; scfLast = &scfAct; scfNext = scf + sfbNext; - scfMin = *scfNext; + scfMin = *scfNext; } else { - + if ((sfbLast>=0) && (sfbAct>=0) && sfbNext == psyOutChan->sfbCnt) { /* last relevant scf */ - scfAct = scf[sfbAct]; + scfAct = scf[sfbAct]; scfLast = scf + sfbLast; scfNext = &scfAct; - scfMin = *scfLast; + scfMin = *scfLast; } } } - + if (sfbAct>=0) scfMin = max(scfMin, minScf[sfbAct]); - - if ((sfbAct >= 0) && - (sfbLast>=0 || sfbNext < psyOutChan->sfbCnt) && - scfAct > scfMin && - (*scfLast != prevScfLast[sfbAct] || - *scfNext != prevScfNext[sfbAct] || + + if ((sfbAct >= 0) && + (sfbLast>=0 || sfbNext < psyOutChan->sfbCnt) && + scfAct > scfMin && + (*scfLast != prevScfLast[sfbAct] || + *scfNext != prevScfNext[sfbAct] || deltaPe < deltaPeLast[sfbAct])) { - success = 0; - - /* estimate required bits for actual scf */ + success = 0; + + /* estimate required bits for actual scf */ if (sfbConstPePart[sfbAct] == MIN_16) { sfbConstPePart[sfbAct] = logSfbEnergy[sfbAct] - logSfbFormFactor[sfbAct] + 11-8*4; /* 4*log2(6.75) - 32 */ - + if (sfbConstPePart[sfbAct] < 0) sfbConstPePart[sfbAct] = sfbConstPePart[sfbAct] + 3; sfbConstPePart[sfbAct] = sfbConstPePart[sfbAct] >> 2; } - + sfbPeOld = calcSingleSpecPe(scfAct, sfbConstPePart[sfbAct], sfbNRelevantLines[sfbAct]) + countSingleScfBits(scfAct, *scfLast, *scfNext); - deltaPeNew = deltaPe; - updateMinScfCalculated = 1; + deltaPeNew = deltaPe; + updateMinScfCalculated = 1; do { scfAct = scfAct - 1; /* check only if the same check was not done before */ - + if (scfAct < minScfCalculated[sfbAct]) { sfbPeNew = calcSingleSpecPe(scfAct, sfbConstPePart[sfbAct], sfbNRelevantLines[sfbAct]) + countSingleScfBits(scfAct, *scfLast, *scfNext); - /* use new scf if no increase in pe and + /* use new scf if no increase in pe and quantization error is smaller */ deltaPeTmp = deltaPe + sfbPeNew - sfbPeOld; - + if (deltaPeTmp < 10) { sfbDistNew = calcSfbDist(psyOutChan->mdctSpectrum+ psyOutChan->sfbOffsets[sfbAct], @@ -506,46 +506,46 @@ static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan, scfAct); if (sfbDistNew < sfbDist[sfbAct]) { /* success, replace scf by new one */ - scf[sfbAct] = scfAct; - sfbDist[sfbAct] = sfbDistNew; - deltaPeNew = deltaPeTmp; - success = 1; + scf[sfbAct] = scfAct; + sfbDist[sfbAct] = sfbDistNew; + deltaPeNew = deltaPeTmp; + success = 1; } /* mark as already checked */ - + if (updateMinScfCalculated) { - minScfCalculated[sfbAct] = scfAct; + minScfCalculated[sfbAct] = scfAct; } } else { - updateMinScfCalculated = 0; + updateMinScfCalculated = 0; } } - + } while (scfAct > scfMin); - deltaPe = deltaPeNew; + deltaPe = deltaPeNew; /* save parameters to avoid multiple computations of the same sfb */ - prevScfLast[sfbAct] = *scfLast; - prevScfNext[sfbAct] = *scfNext; - deltaPeLast[sfbAct] = deltaPe; + prevScfLast[sfbAct] = *scfLast; + prevScfNext[sfbAct] = *scfNext; + deltaPeLast[sfbAct] = deltaPe; } - + if (success && restartOnSuccess) { /* start again at first sfb */ - sfbLast = -1; - sfbAct = -1; - sfbNext = -1; + sfbLast = -1; + sfbAct = -1; + sfbNext = -1; scfLast = 0; scfNext = 0; - scfMin = MAX_16; - success = 0; + scfMin = MAX_16; + success = 0; } else { /* shift sfbs for next band */ - sfbLast = sfbAct; - sfbAct = sfbNext; + sfbLast = sfbAct; + sfbAct = sfbNext; } - + } while (sfbNext < psyOutChan->sfbCnt); } @@ -557,9 +557,9 @@ static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan, * **********************************************************************************/ static void assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan, - Word16 *scf, + Word16 *scf, Word16 *minScf, - Word32 *sfbDist, + Word32 *sfbDist, Word16 *sfbConstPePart, Word16 *logSfbEnergy, Word16 *logSfbFormFactor, @@ -574,95 +574,95 @@ static void assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan, Word32 *sfbDistNew = psyOutChan->sfbDistNew; Word16 *scfTmp = psyOutChan->prevScfLast; - deltaPe = 0; - sfbCnt = psyOutChan->sfbCnt; - + deltaPe = 0; + sfbCnt = psyOutChan->sfbCnt; + /* calc min and max scalfactors */ - scfMin = MAX_16; - scfMax = MIN_16; + scfMin = MAX_16; + scfMax = MIN_16; for (sfb=0; sfb<sfbCnt; sfb++) { - + if (scf[sfb] != MIN_16) { scfMin = min(scfMin, scf[sfb]); scfMax = max(scfMax, scf[sfb]); } } - + if (scfMax != MIN_16) { - - scfAct = scfMax; - + + scfAct = scfMax; + do { scfAct = scfAct - 1; for (sfb=0; sfb<sfbCnt; sfb++) { - scfTmp[sfb] = scf[sfb]; + scfTmp[sfb] = scf[sfb]; } - stopSfb = 0; + stopSfb = 0; do { - sfb = stopSfb; - + sfb = stopSfb; + while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] <= scfAct)) { sfb = sfb + 1; } - startSfb = sfb; + startSfb = sfb; sfb = sfb + 1; - + while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] > scfAct)) { sfb = sfb + 1; } - stopSfb = sfb; - - possibleRegionFound = 0; - + stopSfb = sfb; + + possibleRegionFound = 0; + if (startSfb < sfbCnt) { - possibleRegionFound = 1; + possibleRegionFound = 1; for (sfb=startSfb; sfb<stopSfb; sfb++) { - + if (scf[sfb]!=MIN_16) { - + if (scfAct < minScf[sfb]) { - possibleRegionFound = 0; + possibleRegionFound = 0; break; } } } } - - + + if (possibleRegionFound) { /* region found */ - + /* replace scfs in region by scfAct */ for (sfb=startSfb; sfb<stopSfb; sfb++) { - + if (scfTmp[sfb]!=MIN_16) - scfTmp[sfb] = scfAct; + scfTmp[sfb] = scfAct; } - + /* estimate change in bit demand for new scfs */ deltaScfBits = countScfBitsDiff(scf,scfTmp,sfbCnt,startSfb,stopSfb); deltaSpecPe = calcSpecPeDiff(scf, scfTmp, sfbConstPePart, - logSfbEnergy, logSfbFormFactor, sfbNRelevantLines, + logSfbEnergy, logSfbFormFactor, sfbNRelevantLines, startSfb, stopSfb); deltaPeNew = deltaPe + deltaScfBits + deltaSpecPe; - - + + if (deltaPeNew < 10) { Word32 distOldSum, distNewSum; - + /* quantize and calc sum of new distortion */ - distOldSum = 0; - distNewSum = 0; + distOldSum = 0; + distNewSum = 0; for (sfb=startSfb; sfb<stopSfb; sfb++) { - + if (scfTmp[sfb] != MIN_16) { distOldSum = L_add(distOldSum, sfbDist[sfb]); - + sfbDistNew[sfb] = calcSfbDist(psyOutChan->mdctSpectrum + - psyOutChan->sfbOffsets[sfb], + psyOutChan->sfbOffsets[sfb], (psyOutChan->sfbOffsets[sfb+1] - psyOutChan->sfbOffsets[sfb]), scfAct); - - + + if (sfbDistNew[sfb] > psyOutChan->sfbThreshold[sfb]) { distNewSum = distOldSum << 1; break; @@ -670,20 +670,20 @@ static void assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan, distNewSum = L_add(distNewSum, sfbDistNew[sfb]); } } - + if (distNewSum < distOldSum) { - deltaPe = deltaPeNew; + deltaPe = deltaPeNew; for (sfb=startSfb; sfb<stopSfb; sfb++) { - + if (scf[sfb]!=MIN_16) { - scf[sfb] = scfAct; - sfbDist[sfb] = sfbDistNew[sfb]; + scf[sfb] = scfAct; + sfbDist[sfb] = sfbDistNew[sfb]; } } } } - } - } while (stopSfb <= sfbCnt); + } + } while (stopSfb <= sfbCnt); } while (scfAct > scfMin); } } @@ -710,125 +710,125 @@ EstimateScaleFactorsChannel(PSY_OUT_CHANNEL *psyOutChan, Word32 *sfbDist = psyOutChan->sfbDist; Word16 *minSfMaxQuant = psyOutChan->minSfMaxQuant; Word16 *minScfCalculated = psyOutChan->minScfCalculated; - - + + for (i=0; i<psyOutChan->sfbCnt; i++) { Word32 sbfwith, sbfStart; Word32 *mdctSpec; - thresh = psyOutChan->sfbThreshold[i]; - energy = psyOutChan->sfbEnergy[i]; - + thresh = psyOutChan->sfbThreshold[i]; + energy = psyOutChan->sfbEnergy[i]; + sbfStart = psyOutChan->sfbOffsets[i]; sbfwith = psyOutChan->sfbOffsets[i+1] - sbfStart; mdctSpec = psyOutChan->mdctSpectrum+sbfStart; - - maxSpec = 0; + + maxSpec = 0; /* maximum of spectrum */ for (j=sbfwith; j; j-- ) { Word32 absSpec = L_abs(*mdctSpec); mdctSpec++; - maxSpec |= absSpec; + maxSpec |= absSpec; } - + /* scfs without energy or with thresh>energy are marked with MIN_16 */ - scf[i] = MIN_16; - minSfMaxQuant[i] = MIN_16; - + scf[i] = MIN_16; + minSfMaxQuant[i] = MIN_16; + if ((maxSpec > 0) && (energy > thresh)) { - - energyPart = logSfbFormFactor[i]; - thresholdPart = iLog4(thresh); + + energyPart = logSfbFormFactor[i]; + thresholdPart = iLog4(thresh); /* -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 */ - - + + if (minSfMaxQuant[i] > scfInt) { - scfInt = minSfMaxQuant[i]; + scfInt = minSfMaxQuant[i]; } - + /* find better scalefactor with analysis by synthesis */ scfInt = improveScf(psyOutChan->mdctSpectrum+sbfStart, sbfwith, - thresh, scfInt, minSfMaxQuant[i], + thresh, scfInt, minSfMaxQuant[i], &sfbDist[i], &minScfCalculated[i]); - - scf[i] = scfInt; + + scf[i] = scfInt; } } - - + + /* scalefactor differece reduction */ { Word16 sfbConstPePart[MAX_GROUPED_SFB]; for(i=0;i<psyOutChan->sfbCnt;i++) { - sfbConstPePart[i] = MIN_16; + sfbConstPePart[i] = MIN_16; } - - assimilateSingleScf(psyOutChan, scf, + + assimilateSingleScf(psyOutChan, scf, minSfMaxQuant, sfbDist, sfbConstPePart, logSfbEnergy, logSfbFormFactor, sfbNRelevantLines, minScfCalculated, 1); - - assimilateMultipleScf(psyOutChan, scf, + + assimilateMultipleScf(psyOutChan, scf, minSfMaxQuant, sfbDist, sfbConstPePart, logSfbEnergy, logSfbFormFactor, sfbNRelevantLines); } /* get max scalefac for global gain */ - maxScf = MIN_16; - minScf = MAX_16; + maxScf = MIN_16; + minScf = MAX_16; for (i=0; i<psyOutChan->sfbCnt; i++) { - + if (maxScf < scf[i]) { - maxScf = scf[i]; + maxScf = scf[i]; } - + if ((scf[i] != MIN_16) && (minScf > scf[i])) { - minScf = scf[i]; + minScf = scf[i]; } } /* limit scf delta */ maxAllowedScf = minScf + MAX_SCF_DELTA; for(i=0; i<psyOutChan->sfbCnt; i++) { - + if ((scf[i] != MIN_16) && (maxAllowedScf < scf[i])) { - scf[i] = maxAllowedScf; + scf[i] = maxAllowedScf; } } /* new maxScf if any scf has been limited */ - + if (maxAllowedScf < maxScf) { - maxScf = maxAllowedScf; + maxScf = maxAllowedScf; } - + /* calc loop scalefactors */ - + if (maxScf > MIN_16) { - *globalGain = maxScf; - lastSf = 0; - + *globalGain = maxScf; + lastSf = 0; + for(i=0; i<psyOutChan->sfbCnt; i++) { - + if (scf[i] == MIN_16) { - scf[i] = lastSf; + scf[i] = lastSf; /* set band explicitely to zero */ for (j=psyOutChan->sfbOffsets[i]; j<psyOutChan->sfbOffsets[i+1]; j++) { - psyOutChan->mdctSpectrum[j] = 0; + psyOutChan->mdctSpectrum[j] = 0; } } else { scf[i] = maxScf - scf[i]; - lastSf = scf[i]; + lastSf = scf[i]; } } } else{ - *globalGain = 0; + *globalGain = 0; /* set spectrum explicitely to zero */ for(i=0; i<psyOutChan->sfbCnt; i++) { - scf[i] = 0; + scf[i] = 0; for (j=psyOutChan->sfbOffsets[i]; j<psyOutChan->sfbOffsets[i+1]; j++) { - psyOutChan->mdctSpectrum[j] = 0; + psyOutChan->mdctSpectrum[j] = 0; } } } @@ -848,7 +848,7 @@ CalcFormFactor(Word16 logSfbFormFactor[MAX_CHANNELS][MAX_GROUPED_SFB], const Word16 nChannels) { Word16 j; - + for (j=0; j<nChannels; j++) { CalcFormFactorChannel(logSfbFormFactor[j], sfbNRelevantLines[j], logSfbEnergy[j], &psyOutChannel[j]); } @@ -869,7 +869,7 @@ EstimateScaleFactors(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], const Word16 nChannels) { Word16 j; - + for (j=0; j<nChannels; j++) { EstimateScaleFactorsChannel(&psyOutChannel[j], qcOutChannel[j].scf, diff --git a/media/libstagefright/codecs/aacenc/src/stat_bits.c b/media/libstagefright/codecs/aacenc/src/stat_bits.c index baa289c8293e..c2bd8bde61c4 100644 --- a/media/libstagefright/codecs/aacenc/src/stat_bits.c +++ b/media/libstagefright/codecs/aacenc/src/stat_bits.c @@ -52,9 +52,9 @@ static Word16 countMsMaskBits(Word16 sfbCnt, struct TOOLSINFO *toolsInfo) { Word16 msBits, sfbOff, sfb; - msBits = 0; + msBits = 0; + - switch(toolsInfo->msDigest) { case MS_NONE: case MS_ALL: @@ -85,34 +85,34 @@ static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType) Word32 coefBits; Word16 *ptcoef; - count = 0; - + count = 0; + if (blockType == 2) numOfWindows = 8; else numOfWindows = 1; - tnsPresent = 0; + tnsPresent = 0; for (i=0; i<numOfWindows; i++) { - + if (tnsInfo->tnsActive[i]!=0) { - tnsPresent = 1; + tnsPresent = 1; } } - + if (tnsPresent) { /* there is data to be written*/ /*count += 1; */ for (i=0; i<numOfWindows; i++) { - + if (blockType == 2) count += 1; else count += 2; - + if (tnsInfo->tnsActive[i]) { count += 1; - + if (blockType == 2) { count += 4; count += 3; @@ -121,29 +121,29 @@ static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType) count += 6; count += 5; } - + if (tnsInfo->order[i]) { count += 1; /*direction*/ - count += 1; /*coef_compression */ - + count += 1; /*coef_compression */ + if (tnsInfo->coefRes[i] == 4) { ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT; - coefBits = 3; + coefBits = 3; for(k=0; k<tnsInfo->order[i]; k++) { - + if ((ptcoef[k] > 3) || (ptcoef[k] < -4)) { - coefBits = 4; + coefBits = 4; break; } } } else { - coefBits = 2; + coefBits = 2; ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT; for(k=0; k<tnsInfo->order[i]; k++) { - + if ((ptcoef[k] > 1) || (ptcoef[k] < -2)) { - coefBits = 3; + coefBits = 3; break; } } @@ -155,14 +155,14 @@ static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType) } } } - + return count; } /********************************************************************************** * * function name: countTnsBits -* description: count tns bit demand +* description: count tns bit demand * **********************************************************************************/ static Word16 countTnsBits(TNS_INFO *tnsInfo,Word16 blockType) @@ -173,29 +173,29 @@ static Word16 countTnsBits(TNS_INFO *tnsInfo,Word16 blockType) /********************************************************************************* * * function name: countStaticBitdemand -* description: count static bit demand include tns +* description: count static bit demand include tns * **********************************************************************************/ 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; - + switch (channels) { case 1: statBits += SI_ID_BITS+SI_SCE_BITS+SI_ICS_BITS; statBits += countTnsBits(&(psyOutChannel[0].tnsInfo), psyOutChannel[0].windowSequence); - + switch(psyOutChannel[0].windowSequence){ case LONG_WINDOW: case START_WINDOW: @@ -215,7 +215,7 @@ Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], psyOutChannel[0].sfbPerGroup, psyOutChannel[0].maxSfbPerGroup, &psyOutElement->toolsInfo); - + switch (psyOutChannel[0].windowSequence) { case LONG_WINDOW: case START_WINDOW: diff --git a/media/libstagefright/codecs/aacenc/src/tns.c b/media/libstagefright/codecs/aacenc/src/tns.c index 473e0a0462d5..455a864cbb5a 100644 --- a/media/libstagefright/codecs/aacenc/src/tns.c +++ b/media/libstagefright/codecs/aacenc/src/tns.c @@ -100,20 +100,20 @@ static Word16 FreqToBandWithRounding(Word32 freq, /*!< frequen /* assert(freq >= 0); */ shift = norm_l(fs); lineNumber = (extract_l(fixmul((bandStartOffset[numOfBands] << 2),Div_32(freq << shift,fs << shift))) + 1) >> 1; - + /* freq > fs/2 */ - temp = lineNumber - bandStartOffset[numOfBands] ; + temp = lineNumber - bandStartOffset[numOfBands] ; if (temp >= 0) return numOfBands; /* find band the line number lies in */ for (band=0; band<numOfBands; band++) { - temp = bandStartOffset[band + 1] - lineNumber; + temp = bandStartOffset[band + 1] - lineNumber; if (temp > 0) break; } temp = (lineNumber - bandStartOffset[band]); - temp = (temp - (bandStartOffset[band + 1] - lineNumber)); + temp = (temp - (bandStartOffset[band + 1] - lineNumber)); if ( temp > 0 ) { band = band + 1; @@ -139,25 +139,25 @@ Word16 InitTnsConfigurationLong(Word32 bitRate, /*!< bitrate */ { Word32 bitratePerChannel; - tC->maxOrder = TNS_MAX_ORDER; + tC->maxOrder = TNS_MAX_ORDER; tC->tnsStartFreq = 1275; - tC->coefRes = 4; - + tC->coefRes = 4; + /* to avoid integer division */ - if ( sub(channels,2) == 0 ) { - bitratePerChannel = bitRate >> 1; + if ( sub(channels,2) == 0 ) { + bitratePerChannel = bitRate >> 1; } else { - bitratePerChannel = bitRate; + bitratePerChannel = bitRate; } tC->tnsMaxSfb = tnsMaxBandsLongMainLow[pC->sampRateIdx]; - tC->tnsActive = active; + tC->tnsActive = active; /* now calc band and line borders */ tC->tnsStopBand = min(pC->sfbCnt, tC->tnsMaxSfb); - tC->tnsStopLine = pC->sfbOffset[tC->tnsStopBand]; + tC->tnsStopLine = pC->sfbOffset[tC->tnsStopBand]; tC->tnsStartBand = FreqToBandWithRounding(tC->tnsStartFreq, sampleRate, pC->sfbCnt, (const Word16*)pC->sfbOffset); @@ -173,18 +173,18 @@ Word16 InitTnsConfigurationLong(Word32 bitRate, /*!< bitrate */ (const Word16*)pC->sfbOffset); - tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand]; + tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand]; 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]; + tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand]; - tC->threshold = TNS_GAIN_THRESH; + tC->threshold = TNS_GAIN_THRESH; return(0); @@ -207,23 +207,23 @@ Word16 InitTnsConfigurationShort(Word32 bitRate, /*!< bitrate */ Word32 bitratePerChannel; tC->maxOrder = TNS_MAX_ORDER_SHORT; tC->tnsStartFreq = 2750; - tC->coefRes = 3; - + tC->coefRes = 3; + /* to avoid integer division */ if ( sub(channels,2) == 0 ) { - bitratePerChannel = L_shr(bitRate,1); + bitratePerChannel = L_shr(bitRate,1); } else { - bitratePerChannel = bitRate; + bitratePerChannel = bitRate; } tC->tnsMaxSfb = tnsMaxBandsShortMainLow[pC->sampRateIdx]; - tC->tnsActive = active; + tC->tnsActive = active; /* now calc band and line borders */ tC->tnsStopBand = min(pC->sfbCnt, tC->tnsMaxSfb); - tC->tnsStopLine = pC->sfbOffset[tC->tnsStopBand]; + tC->tnsStopLine = pC->sfbOffset[tC->tnsStopBand]; tC->tnsStartBand=FreqToBandWithRounding(tC->tnsStartFreq, sampleRate, pC->sfbCnt, (const Word16*)pC->sfbOffset); @@ -239,19 +239,19 @@ Word16 InitTnsConfigurationShort(Word32 bitRate, /*!< bitrate */ (const Word16*)pC->sfbOffset); - tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand]; + tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand]; tC->lpcStopBand = tnsMaxBandsShortMainLow[pC->sampRateIdx]; tC->lpcStopBand = min(tC->lpcStopBand, pC->sfbActive); - tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand]; + tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand]; tC->lpcStartBand = tnsMinBandNumberShort[pC->sampRateIdx]; - tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand]; + tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand]; - tC->threshold = TNS_GAIN_THRESH; + tC->threshold = TNS_GAIN_THRESH; return(0); } @@ -259,7 +259,7 @@ Word16 InitTnsConfigurationShort(Word32 bitRate, /*!< bitrate */ /** * * function name: TnsDetect -* description: Calculate TNS filter and decide on TNS usage +* description: Calculate TNS filter and decide on TNS usage * returns: 0 if success * */ @@ -278,7 +278,7 @@ Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */ Word32* pWork32 = &pScratchTns[subBlockNumber >> 8]; Word16* pWeightedSpectrum = (Word16 *)&pScratchTns[subBlockNumber >> 8]; - + if (tC.tnsActive) { CalcWeightedSpectrum(spectrum, pWeightedSpectrum, @@ -290,7 +290,7 @@ Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */ tC.lpcStopBand, pWork32); - temp = blockType - SHORT_WINDOW; + temp = blockType - SHORT_WINDOW; if ( temp != 0 ) { predictionGain = CalcTnsFilter( &pWeightedSpectrum[tC.lpcStartLine], tC.acfWindow, @@ -299,15 +299,15 @@ Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */ tnsData->dataRaw.tnsLong.subBlockInfo.parcor); - temp = predictionGain - tC.threshold; + temp = predictionGain - tC.threshold; if ( temp > 0 ) { - tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 1; + tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 1; } else { - tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 0; + tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 0; } - tnsData->dataRaw.tnsLong.subBlockInfo.predictionGain = predictionGain; + tnsData->dataRaw.tnsLong.subBlockInfo.predictionGain = predictionGain; } else{ @@ -317,28 +317,28 @@ Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */ tC.maxOrder, tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].parcor); - temp = predictionGain - tC.threshold; + temp = predictionGain - tC.threshold; if ( temp > 0 ) { - tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 1; + tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 1; } else { - tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 0; + tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 0; } - tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].predictionGain = predictionGain; + tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].predictionGain = predictionGain; } } else{ - temp = blockType - SHORT_WINDOW; + temp = blockType - SHORT_WINDOW; if ( temp != 0 ) { - tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 0; - tnsData->dataRaw.tnsLong.subBlockInfo.predictionGain = 0; + tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 0; + tnsData->dataRaw.tnsLong.subBlockInfo.predictionGain = 0; } else { - tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 0; - tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].predictionGain = 0; + tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 0; + tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].predictionGain = 0; } } @@ -362,21 +362,21 @@ void TnsSync(TNS_DATA *tnsDataDest, const TNS_SUBBLOCK_INFO *sbInfoSrc; Word32 i, temp; - temp = blockType - SHORT_WINDOW; + temp = blockType - SHORT_WINDOW; if ( temp != 0 ) { - sbInfoDest = &tnsDataDest->dataRaw.tnsLong.subBlockInfo; - sbInfoSrc = &tnsDataSrc->dataRaw.tnsLong.subBlockInfo; + sbInfoDest = &tnsDataDest->dataRaw.tnsLong.subBlockInfo; + sbInfoSrc = &tnsDataSrc->dataRaw.tnsLong.subBlockInfo; } else { - sbInfoDest = &tnsDataDest->dataRaw.tnsShort.subBlockInfo[subBlockNumber]; - sbInfoSrc = &tnsDataSrc->dataRaw.tnsShort.subBlockInfo[subBlockNumber]; + sbInfoDest = &tnsDataDest->dataRaw.tnsShort.subBlockInfo[subBlockNumber]; + sbInfoSrc = &tnsDataSrc->dataRaw.tnsShort.subBlockInfo[subBlockNumber]; } if (100*abs_s(sbInfoDest->predictionGain - sbInfoSrc->predictionGain) < (3 * sbInfoDest->predictionGain)) { - sbInfoDest->tnsActive = sbInfoSrc->tnsActive; + sbInfoDest->tnsActive = sbInfoSrc->tnsActive; for ( i=0; i< tC.maxOrder; i++) { - sbInfoDest->parcor[i] = sbInfoSrc->parcor[i]; + sbInfoDest->parcor[i] = sbInfoSrc->parcor[i]; } } } @@ -402,11 +402,11 @@ Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */ Word32 temp; TNS_SUBBLOCK_INFO *psubBlockInfo; - temp_s = blockType - SHORT_WINDOW; - if ( temp_s != 0) { + temp_s = blockType - SHORT_WINDOW; + if ( temp_s != 0) { psubBlockInfo = &tnsData->dataRaw.tnsLong.subBlockInfo; if (psubBlockInfo->tnsActive == 0) { - tnsInfo->tnsActive[subBlockNumber] = 0; + tnsInfo->tnsActive[subBlockNumber] = 0; return(0); } else { @@ -422,22 +422,22 @@ Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */ tC.coefRes); for (i=tC.maxOrder - 1; i>=0; i--) { - temp = psubBlockInfo->parcor[i] - TNS_PARCOR_THRESH; + temp = psubBlockInfo->parcor[i] - TNS_PARCOR_THRESH; if ( temp > 0 ) break; - temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH; + temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH; if ( temp < 0 ) break; } - tnsInfo->order[subBlockNumber] = i + 1; + tnsInfo->order[subBlockNumber] = i + 1; - tnsInfo->tnsActive[subBlockNumber] = 1; + tnsInfo->tnsActive[subBlockNumber] = 1; for (i=subBlockNumber+1; i<TRANS_FAC; i++) { - tnsInfo->tnsActive[i] = 0; + tnsInfo->tnsActive[i] = 0; } - tnsInfo->coefRes[subBlockNumber] = tC.coefRes; - tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand; + tnsInfo->coefRes[subBlockNumber] = tC.coefRes; + tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand; AnalysisFilterLattice(&(spectrum[tC.tnsStartLine]), @@ -448,10 +448,10 @@ Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */ } } /* if (blockType!=SHORT_WINDOW) */ - else /*short block*/ { + else /*short block*/ { psubBlockInfo = &tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber]; if (psubBlockInfo->tnsActive == 0) { - tnsInfo->tnsActive[subBlockNumber] = 0; + tnsInfo->tnsActive[subBlockNumber] = 0; return(0); } else { @@ -466,19 +466,19 @@ Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */ tC.maxOrder, tC.coefRes); for (i=(tC.maxOrder - 1); i>=0; i--) { - temp = psubBlockInfo->parcor[i] - TNS_PARCOR_THRESH; + temp = psubBlockInfo->parcor[i] - TNS_PARCOR_THRESH; if ( temp > 0 ) break; - temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH; + temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH; if ( temp < 0 ) break; } - tnsInfo->order[subBlockNumber] = i + 1; + tnsInfo->order[subBlockNumber] = i + 1; - tnsInfo->tnsActive[subBlockNumber] = 1; - tnsInfo->coefRes[subBlockNumber] = tC.coefRes; - tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand; + tnsInfo->tnsActive[subBlockNumber] = 1; + tnsInfo->coefRes[subBlockNumber] = tC.coefRes; + tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand; AnalysisFilterLattice(&(spectrum[tC.tnsStartLine]), (tC.tnsStopLine - tC.tnsStartLine), @@ -507,14 +507,14 @@ static Word32 m_pow2_cordic(Word32 x, Word16 scale) { Word32 k; - Word32 accu_y = 0x40000000; + Word32 accu_y = 0x40000000; accu_y = L_shr(accu_y,scale); for(k=1; k<INT_BITS; k++) { - const Word32 z = m_log2_table[k]; + const Word32 z = m_log2_table[k]; while(L_sub(x,z) >= 0) { - + x = L_sub(x, z); accu_y = L_add(accu_y, (accu_y >> k)); } @@ -548,43 +548,43 @@ static void CalcWeightedSpectrum(const Word32 spectrum[], /*!< input sp Word32 maxWS; Word32 tnsSfbMean[MAX_SFB]; /* length [lpcStopBand-lpcStartBand] should be sufficient here */ - maxWS = 0; - + maxWS = 0; + /* calc 1.0*2^-INT_BITS/2/sqrt(en) */ for( sfb = lpcStartBand; sfb < lpcStopBand; sfb++) { - tmp2 = sfbEnergy[sfb] - 2; + tmp2 = sfbEnergy[sfb] - 2; if( tmp2 > 0) { tmp = rsqrt(sfbEnergy[sfb], INT_BITS); - if(tmp > INT_BITS_SCAL) + if(tmp > INT_BITS_SCAL) { shift = norm_l(tmp); - tmp = Div_32( INT_BITS_SCAL << shift, tmp << shift ); + tmp = Div_32( INT_BITS_SCAL << shift, tmp << shift ); } else { - tmp = 0x7fffffff; + tmp = 0x7fffffff; } } else { - tmp = 0x7fffffff; - } - tnsSfbMean[sfb] = tmp; + tmp = 0x7fffffff; + } + tnsSfbMean[sfb] = tmp; } /* spread normalized values from sfbs to lines */ - sfb = lpcStartBand; - tmp = tnsSfbMean[sfb]; + sfb = lpcStartBand; + tmp = tnsSfbMean[sfb]; for ( i=lpcStartLine; i<lpcStopLine; i++){ - tmp_s = sfbOffset[sfb + 1] - i; + tmp_s = sfbOffset[sfb + 1] - i; if ( tmp_s == 0 ) { sfb = sfb + 1; - tmp2_s = sfb + 1 - lpcStopBand; + tmp2_s = sfb + 1 - lpcStopBand; if (tmp2_s <= 0) { - tmp = tnsSfbMean[sfb]; + tmp = tnsSfbMean[sfb]; } } - pWork32[i] = tmp; + pWork32[i] = tmp; } /*filter down*/ for (i=(lpcStopLine - 2); i>=lpcStartLine; i--){ @@ -597,8 +597,8 @@ static void CalcWeightedSpectrum(const Word32 spectrum[], /*!< input sp /* weight and normalize */ for (i=lpcStartLine; i<lpcStopLine; i++){ - pWork32[i] = MULHIGH(pWork32[i], spectrum[i]); - maxWS |= L_abs(pWork32[i]); + pWork32[i] = MULHIGH(pWork32[i], spectrum[i]); + maxWS |= L_abs(pWork32[i]); } maxShift = norm_l(maxWS); @@ -646,7 +646,7 @@ static Word16 CalcTnsFilter(const Word16 *signal, assert(tnsOrder <= TNS_MAX_ORDER); /* remove asserts later? (btg) */ for(i=0;i<tnsOrder;i++) { - parcor[i] = 0; + parcor[i] = 0; } AutoCorrelation(signal, parcorWorkBuffer, numOfLines, tnsOrderPlus1); @@ -678,15 +678,15 @@ void AutoCorrelation(const Word16 input[], Word32 accu; Word32 scf; - scf = 10 - 1; + scf = 10 - 1; isamples = samples; /* calc first corrCoef: R[0] = sum { t[i] * t[i] } ; i = 0..N-1 */ - accu = 0; + accu = 0; for(j=0; j<isamples; j++) { accu = L_add(accu, ((input[j] * input[j]) >> scf)); } - corr[0] = accu; + corr[0] = accu; /* early termination if all corr coeffs are likely going to be zero */ if(corr[0] == 0) return ; @@ -694,13 +694,13 @@ void AutoCorrelation(const Word16 input[], /* calc all other corrCoef: R[j] = sum { t[i] * t[i+j] } ; i = 0..(N-j-1), j=1..p */ for(i=1; i<corrCoeff; i++) { isamples = isamples - 1; - accu = 0; + accu = 0; for(j=0; j<isamples; j++) { accu = L_add(accu, ((input[j] * input[j+i]) >> scf)); } - corr[i] = accu; + corr[i] = accu; } -} +} #endif /***************************************************************************** @@ -720,20 +720,20 @@ static Word16 AutoToParcor(Word32 workBuffer[], Word32 reflCoeff[], Word16 numOf Word32 predictionGain = 0; Word32 num, denom; Word32 temp, workBuffer0; - - num = workBuffer[0]; - temp = workBuffer[numOfCoeff]; + + num = workBuffer[0]; + temp = workBuffer[numOfCoeff]; for(i=0; i<numOfCoeff-1; i++) { - workBuffer[i + numOfCoeff] = workBuffer[i + 1]; + workBuffer[i + numOfCoeff] = workBuffer[i + 1]; } - workBuffer[i + numOfCoeff] = temp; - + workBuffer[i + numOfCoeff] = temp; + for(i=0; i<numOfCoeff; i++) { Word32 refc; - + if (workBuffer[0] < L_abs(workBuffer[i + numOfCoeff])) { return 0 ; } @@ -742,21 +742,21 @@ static Word16 AutoToParcor(Word32 workBuffer[], Word32 reflCoeff[], Word16 numOf /* calculate refc = -workBuffer[numOfCoeff+i] / workBuffer[0]; -1 <= refc < 1 */ refc = L_negate(fixmul(workBuffer[numOfCoeff + i], workBuffer0)); - reflCoeff[i] = refc; + reflCoeff[i] = refc; - pWorkBuffer = &(workBuffer[numOfCoeff]); + pWorkBuffer = &(workBuffer[numOfCoeff]); for(j=i; j<numOfCoeff; j++) { Word32 accu1, accu2; accu1 = L_add(pWorkBuffer[j], fixmul(refc, workBuffer[j - i])); accu2 = L_add(workBuffer[j - i], fixmul(refc, pWorkBuffer[j])); - pWorkBuffer[j] = accu1; - workBuffer[j - i] = accu2; + pWorkBuffer[j] = accu1; + workBuffer[j - i] = accu2; } } denom = MULHIGH(workBuffer[0], NORM_COEF); - + if (denom != 0) { Word32 temp; shift = norm_l(denom); @@ -774,11 +774,11 @@ static Word16 Search3(Word32 parcor) Word32 index = 0; Word32 i; Word32 temp; - + for (i=0;i<8;i++) { - temp = L_sub( parcor, tnsCoeff3Borders[i]); + temp = L_sub( parcor, tnsCoeff3Borders[i]); if (temp > 0) - index=i; + index=i; } return extract_l(index - 4); } @@ -788,12 +788,12 @@ static Word16 Search4(Word32 parcor) Word32 index = 0; Word32 i; Word32 temp; - + for (i=0;i<16;i++) { - temp = L_sub(parcor, tnsCoeff4Borders[i]); + temp = L_sub(parcor, tnsCoeff4Borders[i]); if (temp > 0) - index=i; + index=i; } return extract_l(index - 8); } @@ -814,12 +814,12 @@ static void Parcor2Index(const Word32 parcor[], /*!< parcor coefficients */ Word32 temp; for(i=0; i<order; i++) { - temp = bitsPerCoeff - 3; + temp = bitsPerCoeff - 3; if (temp == 0) { - index[i] = Search3(parcor[i]); - } + index[i] = Search3(parcor[i]); + } else { - index[i] = Search4(parcor[i]); + index[i] = Search4(parcor[i]); } } } @@ -839,12 +839,12 @@ static void Index2Parcor(const Word16 index[], /*!< quantized values */ Word32 temp; for (i=0; i<order; i++) { - temp = bitsPerCoeff - 4; + temp = bitsPerCoeff - 4; if ( temp == 0 ) { - parcor[i] = tnsCoeff4[index[i] + 8]; + parcor[i] = tnsCoeff4[index[i] + 8]; } else { - parcor[i] = tnsCoeff3[index[i] + 4]; + parcor[i] = tnsCoeff3[index[i] + 4]; } } } @@ -865,20 +865,20 @@ static Word32 FIRLattice(Word16 order, /*!< filter order */ Word32 accu,tmp,tmpSave; x = x >> 1; - tmpSave = x; + tmpSave = x; for (i=0; i<(order - 1); i++) { tmp = L_add(fixmul(coef_par[i], x), state_par[i]); x = L_add(fixmul(coef_par[i], state_par[i]), x); - state_par[i] = tmpSave; - tmpSave = tmp; + state_par[i] = tmpSave; + tmpSave = tmp; } /* last stage: only need half operations */ accu = fixmul(state_par[order - 1], coef_par[(order - 1)]); - state_par[(order - 1)] = tmpSave; + state_par[(order - 1)] = tmpSave; x = L_add(accu, x); x = L_add(x, x); @@ -903,11 +903,11 @@ static void AnalysisFilterLattice(const Word32 signal[], /*!< input spectrum * Word32 j; for ( j=0; j<TNS_MAX_ORDER; j++ ) { - state_par[j] = 0; + state_par[j] = 0; } for(j=0; j<numOfLines; j++) { - output[j] = FIRLattice(order,signal[j],state_par,parCoeff); + output[j] = FIRLattice(order,signal[j],state_par,parCoeff); } } @@ -922,11 +922,11 @@ void ApplyTnsMultTableToRatios(Word16 startCb, TNS_SUBBLOCK_INFO subInfo, /*!< TNS subblock info */ Word32 *thresholds) /*!< thresholds (modified) */ { - Word32 i; + Word32 i; if (subInfo.tnsActive) { for(i=startCb; i<stopCb; i++) { /* thresholds[i] * 0.25 */ - thresholds[i] = (thresholds[i] >> 2); + thresholds[i] = (thresholds[i] >> 2); } } } diff --git a/media/libstagefright/codecs/aacenc/src/transform.c b/media/libstagefright/codecs/aacenc/src/transform.c index 4d11f78f0399..a154a2f9b0b0 100644 --- a/media/libstagefright/codecs/aacenc/src/transform.c +++ b/media/libstagefright/codecs/aacenc/src/transform.c @@ -31,7 +31,7 @@ #define swap2(p0,p1) \ t = p0; t1 = *(&(p0)+1); \ p0 = p1; *(&(p0)+1) = *(&(p1)+1); \ - p1 = t; *(&(p1)+1) = t1 + p1 = t; *(&(p1)+1) = t1 /********************************************************************************* * @@ -47,18 +47,18 @@ static void Shuffle(int *buf, int num, const unsigned char* bitTab) 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]); + 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]); + swap2(part0[4*i+2], part1[4*i+0]); } while ((i = *bitTab++) != 0); } @@ -74,8 +74,8 @@ static void Radix4First(int *buf, int num) { int r0, r1, r2, r3; int r4, r5, r6, r7; - - for (; num != 0; num--) + + for (; num != 0; num--) { r0 = buf[0] + buf[2]; r1 = buf[1] + buf[3]; @@ -113,7 +113,7 @@ static void Radix8First(int *buf, int num) int i4, i5, i6, i7; int t0, t1, t2, t3; - for ( ; num != 0; num--) + for ( ; num != 0; num--) { r0 = buf[0] + buf[2]; i0 = buf[1] + buf[3]; @@ -194,23 +194,23 @@ static void Radix4FFT(int *buf, int num, int bgn, int *twidTab) int i, j, step; int *xptr, *csptr; - for (num >>= 2; num != 0; num >>= 2) + for (num >>= 2; num != 0; num >>= 2) { step = 2*bgn; xptr = buf; - for (i = num; i != 0; i--) + for (i = num; i != 0; i--) { csptr = twidTab; - for (j = bgn; j != 0; j--) + for (j = bgn; j != 0; j--) { r0 = xptr[0]; r1 = xptr[1]; xptr += step; - + t0 = xptr[0]; - t1 = xptr[1]; + t1 = xptr[1]; cosx = csptr[0]; sinx = csptr[1]; r2 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*br + sin*bi */ @@ -223,7 +223,7 @@ static void Radix4FFT(int *buf, int num, int bgn, int *twidTab) r1 = t1 - r3; r2 = t0 + r2; r3 = t1 + r3; - + t0 = xptr[0]; t1 = xptr[1]; cosx = csptr[2]; @@ -231,7 +231,7 @@ static void Radix4FFT(int *buf, int num, int bgn, int *twidTab) 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]; @@ -282,25 +282,25 @@ static void PreMDCT(int *buf0, int num, const int *csptr) 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++; + 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); + *buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1); + + *buf1-- = MULHIGH(cosb, ti2) - MULHIGH(sinb, tr2); *buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2); } } @@ -319,12 +319,12 @@ static void PostMDCT(int *buf0, int num, const int *csptr) int *buf1; buf1 = buf0 + num - 1; - + for(i = num >> 2; i != 0; i--) { - cosa = *csptr++; - sina = *csptr++; - cosb = *csptr++; + cosa = *csptr++; + sina = *csptr++; + cosb = *csptr++; sinb = *csptr++; tr1 = *(buf0 + 0); @@ -333,10 +333,10 @@ static void PostMDCT(int *buf0, int num, const int *csptr) tr2 = *(buf1 - 1); *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1); - *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1); - + *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1); + *buf0++ = MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2); - *buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2); + *buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2); } } #endif @@ -353,17 +353,17 @@ void Mdct_Long(int *buf) PreMDCT(buf, 1024, cossintab + 128); Shuffle(buf, 512, bitrevTab + 17); - Radix8First(buf, 512 >> 3); + Radix8First(buf, 512 >> 3); Radix4FFT(buf, 512 >> 3, 8, (int *)twidTab512); - PostMDCT(buf, 1024, cossintab + 128); + PostMDCT(buf, 1024, cossintab + 128); } /********************************************************************************** * * function name: Mdct_Short -* description: the short block mdct +* description: the short block mdct * **********************************************************************************/ void Mdct_Short(int *buf) @@ -371,10 +371,10 @@ void Mdct_Short(int *buf) PreMDCT(buf, 128, cossintab); Shuffle(buf, 64, bitrevTab); - Radix4First(buf, 64 >> 2); - Radix4FFT(buf, 64 >> 2, 4, (int *)twidTab64); + Radix4First(buf, 64 >> 2); + Radix4FFT(buf, 64 >> 2, 4, (int *)twidTab64); - PostMDCT(buf, 128, cossintab); + PostMDCT(buf, 128, cossintab); } @@ -382,7 +382,7 @@ void Mdct_Short(int *buf) * * function name: shiftMdctDelayBuffer * description: the mdct delay buffer has a size of 1600, -* so the calculation of LONG,STOP must be spilt in two +* so the calculation of LONG,STOP must be spilt in two * passes with 1024 samples and a mid shift, * the SHORT transforms can be completed in the delay buffer, * and afterwards a shift @@ -409,7 +409,7 @@ static void shiftMdctDelayBuffer(Word16 *mdctDelayBuffer, /*! start of mdct dela dsBuf = timeSignal; for(i=0; i<FRAME_LEN_LONG; i+=8) - { + { *srBuf++ = *dsBuf; dsBuf += chIncrement; *srBuf++ = *dsBuf; dsBuf += chIncrement; *srBuf++ = *dsBuf; dsBuf += chIncrement; @@ -470,10 +470,10 @@ void Transform_Real(Word16 *mdctDelayBuffer, Word32 delayBufferSf,timeSignalSf,minSf; Word32 headRoom=0; - + switch(blockType){ - - + + case LONG_WINDOW: /* we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + 448 new timeSignal samples @@ -483,15 +483,15 @@ void Transform_Real(Word16 *mdctDelayBuffer, timeSignalSf = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement); minSf = min(delayBufferSf,timeSignalSf); minSf = min(minSf,14); - + dctIn0 = mdctDelayBuffer; dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1; outData0 = realOut + FRAME_LEN_LONG/2; - + /* add windows and pre add for mdct to last buffer*/ winPtr = (int *)LongWindowKBD; for(i=0;i<FRAME_LEN_LONG/2;i++){ - timeSignalSample = (*dctIn0++) << minSf; + timeSignalSample = (*dctIn0++) << minSf; ws1 = timeSignalSample * (*winPtr >> 16); timeSignalSample = (*dctIn1--) << minSf; ws2 = timeSignalSample * (*winPtr & 0xffff); @@ -499,30 +499,30 @@ void Transform_Real(Word16 *mdctDelayBuffer, /* shift 2 to avoid overflow next */ *outData0++ = (ws1 >> 2) - (ws2 >> 2); } - + shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement); - + /* add windows and pre add for mdct to new buffer*/ dctIn0 = mdctDelayBuffer; dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1; - outData0 = realOut + FRAME_LEN_LONG/2 - 1; + outData0 = realOut + FRAME_LEN_LONG/2 - 1; winPtr = (int *)LongWindowKBD; - for(i=0;i<FRAME_LEN_LONG/2;i++){ + for(i=0;i<FRAME_LEN_LONG/2;i++){ timeSignalSample = (*dctIn0++) << minSf; ws1 = timeSignalSample * (*winPtr & 0xffff); timeSignalSample = (*dctIn1--) << minSf; ws2 = timeSignalSample * (*winPtr >> 16); winPtr++; /* shift 2 to avoid overflow next */ - *outData0-- = -((ws1 >> 2) + (ws2 >> 2)); + *outData0-- = -((ws1 >> 2) + (ws2 >> 2)); } Mdct_Long(realOut); /* update scale factor */ minSf = 14 - minSf; - *mdctScale=minSf; + *mdctScale=minSf; break; - + case START_WINDOW: /* we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no timeSignal samples @@ -533,7 +533,7 @@ void Transform_Real(Word16 *mdctDelayBuffer, dctIn0 = mdctDelayBuffer; dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1; - outData0 = realOut + FRAME_LEN_LONG/2; + outData0 = realOut + FRAME_LEN_LONG/2; winPtr = (int *)LongWindowKBD; /* add windows and pre add for mdct to last buffer*/ @@ -545,18 +545,18 @@ void Transform_Real(Word16 *mdctDelayBuffer, winPtr ++; *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */ } - + shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement); - - outData0 = realOut + FRAME_LEN_LONG/2 - 1; + + outData0 = realOut + FRAME_LEN_LONG/2 - 1; for(i=0;i<LS_TRANS;i++){ - *outData0-- = -mdctDelayBuffer[i] << (15 - 2 + minSf); + *outData0-- = -mdctDelayBuffer[i] << (15 - 2 + minSf); } - + /* add windows and pre add for mdct to new buffer*/ dctIn0 = mdctDelayBuffer + LS_TRANS; dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS; - outData0 = realOut + FRAME_LEN_LONG/2 - 1 -LS_TRANS; + outData0 = realOut + FRAME_LEN_LONG/2 - 1 -LS_TRANS; winPtr = (int *)ShortWindowSine; for(i=0;i<FRAME_LEN_SHORT/2;i++){ timeSignalSample= (*dctIn0++) << minSf; @@ -572,7 +572,7 @@ void Transform_Real(Word16 *mdctDelayBuffer, minSf = 14 - minSf; *mdctScale= minSf; break; - + case STOP_WINDOW: /* we access BLOCK_SWITCHING_OFFSET-LS_TRANS (1600-448 ) delay buffer samples + 448 new timeSignal samples @@ -580,19 +580,19 @@ void Transform_Real(Word16 *mdctDelayBuffer, */ delayBufferSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+LS_TRANS,BLOCK_SWITCHING_OFFSET-LS_TRANS,1); timeSignalSf = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement); - minSf = min(delayBufferSf,timeSignalSf); + minSf = min(delayBufferSf,timeSignalSf); minSf = min(minSf,13); - + outData0 = realOut + FRAME_LEN_LONG/2; dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1; for(i=0;i<LS_TRANS;i++){ - *outData0++ = -(*dctIn1--) << (15 - 2 + minSf); + *outData0++ = -(*dctIn1--) << (15 - 2 + minSf); } - + /* add windows and pre add for mdct to last buffer*/ dctIn0 = mdctDelayBuffer + LS_TRANS; dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS; - outData0 = realOut + FRAME_LEN_LONG/2 + LS_TRANS; + outData0 = realOut + FRAME_LEN_LONG/2 + LS_TRANS; winPtr = (int *)ShortWindowSine; for(i=0;i<FRAME_LEN_SHORT/2;i++){ timeSignalSample = (*dctIn0++) << minSf; @@ -602,13 +602,13 @@ void Transform_Real(Word16 *mdctDelayBuffer, winPtr++; *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */ } - + shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement); - + /* add windows and pre add for mdct to new buffer*/ dctIn0 = mdctDelayBuffer; dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1; - outData0 = realOut + FRAME_LEN_LONG/2 - 1; + outData0 = realOut + FRAME_LEN_LONG/2 - 1; winPtr = (int *)LongWindowKBD; for(i=0;i<FRAME_LEN_LONG/2;i++){ timeSignalSample= (*dctIn0++) << minSf; @@ -618,26 +618,26 @@ void Transform_Real(Word16 *mdctDelayBuffer, *outData0-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */ winPtr++; } - + Mdct_Long(realOut); minSf = 14 - minSf; *mdctScale= minSf; /* update scale factor */ break; - + case SHORT_WINDOW: /* we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no new timeSignal samples and get the biggest scale factor for next calculate more precise - */ + */ minSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+TRANSFORM_OFFSET_SHORT,9*FRAME_LEN_SHORT,1); minSf = min(minSf,10); - - + + for(w=0;w<TRANS_FAC;w++){ dctIn0 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT; dctIn1 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT + FRAME_LEN_SHORT-1; - outData0 = realOut + FRAME_LEN_SHORT/2; - outData1 = realOut + FRAME_LEN_SHORT/2 - 1; + outData0 = realOut + FRAME_LEN_SHORT/2; + outData1 = realOut + FRAME_LEN_SHORT/2 - 1; winPtr = (int *)ShortWindowSine; for(i=0;i<FRAME_LEN_SHORT/2;i++){ @@ -646,7 +646,7 @@ void Transform_Real(Word16 *mdctDelayBuffer, timeSignalSample= *dctIn1 << minSf; ws2 = timeSignalSample * (*winPtr & 0xffff); *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; @@ -661,10 +661,10 @@ void Transform_Real(Word16 *mdctDelayBuffer, Mdct_Short(realOut); realOut += FRAME_LEN_SHORT; } - + minSf = 11 - minSf; *mdctScale = minSf; /* update scale factor */ - + shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement); break; } diff --git a/media/libstagefright/codecs/amrwbenc/Android.mk b/media/libstagefright/codecs/amrwbenc/Android.mk index 5179380c6bbb..ae43870b5461 100644 --- a/media/libstagefright/codecs/amrwbenc/Android.mk +++ b/media/libstagefright/codecs/amrwbenc/Android.mk @@ -3,7 +3,7 @@ include $(CLEAR_VARS) include frameworks/base/media/libstagefright/codecs/common/Config.mk - + LOCAL_SRC_FILES := \ AMRWBEncoder.cpp \ src/autocorr.c \ @@ -91,7 +91,7 @@ LOCAL_MODULE := libstagefright_amrwbenc LOCAL_ARM_MODE := arm -LOCAL_STATIC_LIBRARIES := +LOCAL_STATIC_LIBRARIES := LOCAL_SHARED_LIBRARIES := diff --git a/media/libstagefright/codecs/amrwbenc/inc/basic_op.h b/media/libstagefright/codecs/amrwbenc/inc/basic_op.h index 773491396dc2..c23dce6fb1a2 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/basic_op.h +++ b/media/libstagefright/codecs/amrwbenc/inc/basic_op.h @@ -33,7 +33,7 @@ #define static_vo static __inline__ #else #define static_vo static __inline -#endif +#endif #define saturate(L_var1) (((L_var1) > 0X00007fffL) ? (MAX_16): (((L_var1) < (Word32) 0xffff8000L) ? (MIN_16): ((L_var1) & 0xffff))) @@ -87,7 +87,7 @@ static_vo Word32 L_shr (Word32 L_var1, Word16 var2); /* Long shift right 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 */ +static_vo Word16 norm_l (Word32 L_var1); /* Long norm, 30 */ /*___________________________________________________________________________ | | @@ -1030,8 +1030,8 @@ static_vo Word16 div_s (Word16 var1, Word16 var2) L_num <<= 1; if (L_num >= L_denom) { - L_num -= L_denom; - var_out += 1; + L_num -= L_denom; + var_out += 1; } } } diff --git a/media/libstagefright/codecs/amrwbenc/inc/homing.tab b/media/libstagefright/codecs/amrwbenc/inc/homing.tab index edcccdd1386f..e399fb845597 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/homing.tab +++ b/media/libstagefright/codecs/amrwbenc/inc/homing.tab @@ -33,89 +33,89 @@ static const Word16 dfh_M7k[PRMN_7k] = { - 3168, 29954, 29213, 16121, - 64, 13440, 30624, 16430, + 3168, 29954, 29213, 16121, + 64, 13440, 30624, 16430, 19008 }; static const Word16 dfh_M9k[PRMN_9k] = { - 3168, 31665, 9943, 9123, - 15599, 4358, 20248, 2048, + 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, + 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, + 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, + 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, + 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, + 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, + 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, + 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 23228457c9d3..97c3b684e664 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/isp_isf.tab +++ b/media/libstagefright/codecs/amrwbenc/inc/isp_isf.tab @@ -42,7 +42,7 @@ const static Word16 table[129] = { /* slope in Q11 used to compute y = acos(x) */ -const static Word16 slope[128] = { +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, diff --git a/media/libstagefright/codecs/amrwbenc/inc/log2.h b/media/libstagefright/codecs/amrwbenc/inc/log2.h index 6a3501951328..b065eb4df437 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/log2.h +++ b/media/libstagefright/codecs/amrwbenc/inc/log2.h @@ -25,20 +25,20 @@ */ #ifndef __LOG2_H__ #define __LOG2_H__ - + /* ******************************************************************************** * INCLUDE FILES ******************************************************************************** */ #include "typedef.h" - + /* ******************************************************************************** * DEFINITION OF DATA TYPES ******************************************************************************** */ - + /* ******************************************************************************** * DECLARATION OF PROTOTYPES diff --git a/media/libstagefright/codecs/amrwbenc/inc/mime_io.tab b/media/libstagefright/codecs/amrwbenc/inc/mime_io.tab index 5f85dd0bd660..7b485eae99dd 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/mime_io.tab +++ b/media/libstagefright/codecs/amrwbenc/inc/mime_io.tab @@ -98,7 +98,7 @@ static Word16 sort_1265[253] = { 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 + 142, 195, 245 }; static Word16 sort_1425[285] = { @@ -205,7 +205,7 @@ static Word16 sort_1825[365] = { 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 + 169, 268, 226, 236, 264 }; static Word16 sort_1985[397] = { @@ -248,7 +248,7 @@ static Word16 sort_1985[397] = { 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 + 71, 332, 61, 265, 157, 246, 236 }; static Word16 sort_2305[461] = { @@ -349,7 +349,7 @@ static Word16 sort_2385[477] = { 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 + 239, 250, 133, 144, 432, 337, 326 }; static Word16 sort_SID[35] = { diff --git a/media/libstagefright/codecs/amrwbenc/inc/stream.h b/media/libstagefright/codecs/amrwbenc/inc/stream.h index 3e5336a81a42..4c1d0f07c230 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/stream.h +++ b/media/libstagefright/codecs/amrwbenc/inc/stream.h @@ -26,7 +26,7 @@ Contains: VOME API Buffer Operator Implement Header #define __STREAM_H__ #include "voMem.h" -#define Frame_Maxsize 1024 * 2 //Work Buffer 10K +#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)) @@ -35,7 +35,7 @@ typedef struct{ unsigned char *frame_ptr; unsigned char *frame_ptr_bk; int set_len; - int framebuffer_len; + int framebuffer_len; int frame_storelen; int used_len; }FrameStream; diff --git a/media/libstagefright/codecs/amrwbenc/inc/typedef.h b/media/libstagefright/codecs/amrwbenc/inc/typedef.h index 533e68bf601e..f08a678c73b5 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/typedef.h +++ b/media/libstagefright/codecs/amrwbenc/inc/typedef.h @@ -31,7 +31,7 @@ /* * 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; diff --git a/media/libstagefright/codecs/amrwbenc/inc/typedefs.h b/media/libstagefright/codecs/amrwbenc/inc/typedefs.h index f30d25556171..0062584adb5b 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/typedefs.h +++ b/media/libstagefright/codecs/amrwbenc/inc/typedefs.h @@ -45,7 +45,7 @@ * 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 @@ -68,7 +68,7 @@ /* ******************************************************************************** -* DEFINITION OF CONSTANTS +* DEFINITION OF CONSTANTS ******************************************************************************** */ /* @@ -197,7 +197,7 @@ typedef int Bool; #define Syn_filt_32 voAWB_Syn_filt_32 #define Isf_isp voAWB_Isf_isp #define Levinson voAWB_Levinson -#define median5 voAWB_median5 +#define median5 voAWB_median5 #define Pred_lt4 voAWB_Pred_lt4 #define Reorder_isf voAWB_Reorder_isf #define Dpisf_2s_36b voAWB_Dpisf_2s_36b 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 c1c74e61363c..282db9218df1 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 @@ -30,10 +30,10 @@ .section .text .global Deemph_32_asm - + Deemph_32_asm: - STMFD r13!, {r4 - r12, r14} + 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] @@ -47,9 +47,9 @@ Deemph_32_asm: 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] + LDRSH r6, [r0], #2 @load x_hi[1] QDADD r10, r10, r9 - LDRSH r7, [r1], #2 @load x_lo[1] + 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) @@ -94,9 +94,9 @@ LOOP: BLT LOOP STR r14, [r3] - STRH r14, [r2] + STRH r14, [r2] - LDMFD r13!, {r4 - r12, r15} + 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 02bdcab4bcba..4aa317e63def 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 @@ -31,7 +31,7 @@ Dot_product12_asm: - STMFD r13!, {r4 - r12, r14} + STMFD r13!, {r4 - r12, r14} MOV r4, #0 @ L_sum = 0 MOV r5, #0 @ i = 0 @@ -41,13 +41,13 @@ LOOP: LDR r8, [r0], #4 SMLABB r4, r6, r7, r4 LDR r9, [r1], #4 - SMLATT r4, r6, r7, r4 + SMLATT r4, r6, r7, r4 LDR r6, [r0], #4 SMLABB r4, r8, r9, r4 LDR r7, [r1], #4 - SMLATT r4, r8, r9, r4 + SMLATT r4, r8, r9, r4 LDR r8, [r0], #4 SMLABB r4, r6, r7, r4 @@ -58,7 +58,7 @@ LOOP: 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 @@ -69,12 +69,12 @@ LOOP: 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] + STRH r11, [r3] Dot_product12_end: - - LDMFD r13!, {r4 - r12, r15} + + 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 1ce2a85b9461..856ada86340b 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 @@ -23,7 +23,7 @@ @****************************************************************** @ r0 --- signal[] @ r1 --- lg -@ r2 --- mem[] +@ r2 --- mem[] .section .text .global Filt_6k_7k_asm @@ -32,7 +32,7 @@ Filt_6k_7k_asm: - STMFD r13!, {r4 - r12, r14} + 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 @@ -43,9 +43,9 @@ Filt_6k_7k_asm: MOV r2, #30 @ L_FIR - 1 BL voAWB_Copy @ memcpy(x, mem, (L_FIR - 1)<<1) - LDR r10, Lable1 @ get fir_7k address + LDR r10, Lable1 @ get fir_7k address - MOV r14, #0 + 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] @@ -76,14 +76,14 @@ LOOP1: STRH r12, [r6], #2 ADD r14, r14, #8 CMP r14, #80 - BLT LOOP1 + 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 + MOV r4, r13 + MOV r5, #0 @ i = 0 LOOP2: LDR r0, [r10] @@ -111,13 +111,13 @@ LOOP2: 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] - + 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 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] @@ -125,8 +125,8 @@ LOOP2: 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] + 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] @@ -144,7 +144,7 @@ LOOP2: 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]) + 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] @@ -152,31 +152,31 @@ LOOP2: 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] + 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] + 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] + SMLABT r14, r1, r0, r14 @ x[i+15] * fir_7k[15] ADD r5, r5, #1 ADD r14, r14, #0x4000 - ADD r4, r4, #2 + ADD r4, r4, #2 MOV r1, r14, ASR #15 CMP r5, #80 STRH r1, [r3], #2 @signal[i] = (L_tmp + 0x4000) >> 15 - BLT LOOP2 - + 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} - + ADD r13, r13, #240 + LDMFD r13!, {r4 - r12, r15} + Lable1: .word fir_6k_7k @ENDFUNC diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Norm_Corr_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Norm_Corr_opt.s index b440a31ed0b6..49bdc2b4bcf9 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Norm_Corr_opt.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Norm_Corr_opt.s @@ -32,8 +32,8 @@ @ r6 --- corr_norm[] - .section .text - .global Norm_corr_asm + .section .text + .global Norm_corr_asm .extern Convolve_asm .extern Isqrt_n @****************************** @@ -47,17 +47,17 @@ .equ T_MIN , 212 .equ T_MAX , 216 .equ CORR_NORM , 220 - + Norm_corr_asm: - STMFD r13!, {r4 - r12, r14} + STMFD r13!, {r4 - r12, r14} SUB r13, r13, #voSTACK - + ADD r8, r13, #20 @get the excf[L_SUBFR] LDR r4, [r13, #T_MIN] @get t_min RSB r11, r4, #0 @k = -t_min - ADD r5, r0, r11, LSL #1 @get the &exc[k] - + ADD r5, r0, r11, LSL #1 @get the &exc[k] + @transfer Convolve function STMFD sp!, {r0 - r3} MOV r0, r5 @@ -68,7 +68,7 @@ Norm_corr_asm: @ r8 --- excf[] - MOV r14, r1 @copy xn[] address + MOV r14, r1 @copy xn[] address MOV r5, #64 MOV r6, #0 @L_tmp = 0 MOV r7, #1 @@ -93,21 +93,21 @@ LOOP1: CLZ r7, r9 SUB r6, r7, #1 @exp = norm_l(L_tmp) RSB r7, r6, #32 @exp = 32 - exp - MOV r6, r7, ASR #1 + MOV r6, r7, ASR #1 RSB r7, r6, #0 @scale = -(exp >> 1) - + @loop for every possible period @for(t = t_min@ t <= t_max@ t++) @r7 --- scale r4 --- t_min r8 --- excf[] -LOOPFOR: +LOOPFOR: MOV r5, #0 @L_tmp = 0 MOV r6, #0 @L_tmp1 = 0 - MOV r9, #64 + MOV r9, #64 MOV r12, r1 @copy of xn[] ADD r14, r13, #20 @copy of excf[] MOV r8, #0x8000 - + LOOPi: LDR r11, [r14], #4 @load excf[i], excf[i+1] LDR r10, [r12], #4 @load xn[i], xn[i+1] @@ -128,13 +128,13 @@ LOOPi: MOV r10, #1 ADD r5, r10, r5, LSL #1 @L_tmp = (L_tmp << 1) + 1 ADD r6, r10, r6, LSL #1 @L_tmp1 = (L_tmp1 << 1) + 1 - - CLZ r10, r5 + + CLZ r10, r5 CMP r5, #0 RSBLT r11, r5, #0 CLZLT r10, r11 SUB r10, r10, #1 @exp = norm_l(L_tmp) - + MOV r5, r5, LSL r10 @L_tmp = (L_tmp << exp) RSB r10, r10, #30 @exp_corr = 30 - exp MOV r11, r5, ASR #16 @corr = extract_h(L_tmp) @@ -150,7 +150,7 @@ LOOPi: @Isqrt_n(&L_tmp, &exp_norm) MOV r14, r0 - MOV r12, r1 + MOV r12, r1 STMFD sp!, {r0 - r4, r7 - r12, r14} ADD r1, sp, #4 @@ -168,7 +168,7 @@ LOOPi: MOV r6, r6, ASR #16 @norm = extract_h(L_tmp) MUL r12, r6, r11 ADD r12, r12, r12 @L_tmp = vo_L_mult(corr, norm) - + ADD r6, r10, r5 ADD r6, r6, r7 @exp_corr + exp_norm + scale @@ -187,9 +187,9 @@ LOOPi: CMP r4, r6 BEQ Norm_corr_asm_end - + ADD r4, r4, #1 @ t_min ++ - + RSB r5, r4, #0 @ k MOV r6, #63 @ i = 63 @@ -216,16 +216,16 @@ LOOPK: MUL r14, r11, r8 LDR r6, [r13, #T_MAX] @ get t_max MOV r8, r14, ASR #15 - STRH r8, [r10] + STRH r8, [r10] CMP r4, r6 BLE LOOPFOR -Norm_corr_asm_end: - - ADD r13, r13, #voSTACK +Norm_corr_asm_end: + + ADD r13, r13, #voSTACK LDMFD r13!, {r4 - r12, r15} - + .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 70464e4da223..3f4930cba76c 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 @@ -38,7 +38,7 @@ Syn_filt_32_asm: - STMFD r13!, {r4 - r12, r14} + STMFD r13!, {r4 - r12, r14} LDR r4, [r13, #40] @ get sig_hi[] address LDR r5, [r13, #44] @ get sig_lo[] address @@ -55,7 +55,7 @@ Syn_filt_32_asm: 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 r10, [r13, #-4] STR r11, [r13, #-8] LDRSH r6, [r0, #10] @ load Aq[5] @@ -73,12 +73,12 @@ Syn_filt_32_asm: 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 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] + STR r11, [r13, #-24] LDRSH r6, [r0, #26] @ load Aq[13] LDRSH r7, [r0, #28] @ load Aq[14] @@ -90,14 +90,14 @@ Syn_filt_32_asm: ORR r11, r8, r9, LSL #16 @ Aq[16] -- Aq[15] STR r10, [r13, #-28] STR r11, [r13, #-32] - + MOV r8, #0 @ i = 0 - -LOOP: + +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] + 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] @@ -135,12 +135,12 @@ LOOP: 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] + 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 + 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 @@ -149,7 +149,7 @@ LOOP: 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] + 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] @@ -198,14 +198,14 @@ LOOP: 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] + SMLABT r12, r10, r11, r12 @ sig_hi[i-16] * Aq[16] ADD r6, r12, r12 @ r12 << 1 - SUB r14, r14, r6 + 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 @@ -213,14 +213,14 @@ LOOP: SUB r9, r14, r7, LSL #12 @ sig_lo[i] = L_tmp - (sig_hi[i] << 12) ADD r8, r8, #1 - STRH r9, [r5], #2 + STRH r9, [r5], #2 CMP r8, #64 - BLT LOOP - + BLT LOOP + Syn_filt_32_end: - - LDMFD r13!, {r4 - r12, r15} + + LDMFD r13!, {r4 - r12, r15} @ENDFUNC .END - + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/convolve_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/convolve_opt.s index 0228bda4a165..71bb532dd74d 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/convolve_opt.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/convolve_opt.s @@ -27,24 +27,24 @@ @ r3 --- L .section .text - .global Convolve_asm + .global Convolve_asm Convolve_asm: - STMFD r13!, {r4 - r12, r14} + STMFD r13!, {r4 - r12, r14} MOV r3, #0 @ n MOV r11, #0x8000 - -LOOP: + +LOOP: ADD r4, r1, r3, LSL #1 @ tmpH address ADD r5, r3, #1 @ i = n + 1 MOV r6, r0 @ tmpX = x LDRSH r9, [r6], #2 @ *tmpX++ LDRSH r10, [r4], #-2 @ *tmpH-- SUB r5, r5, #1 - MUL r8, r9, r10 + MUL r8, r9, r10 -LOOP1: +LOOP1: CMP r5, #0 BLE L1 LDRSH r9, [r6], #2 @ *tmpX++ @@ -58,12 +58,12 @@ LOOP1: LDRSH r12, [r6], #2 @ *tmpX++ LDRSH r14, [r4], #-2 @ *tmpH-- MLA r8, r9, r10, r8 - SUBS r5, r5, #4 + SUBS r5, r5, #4 MLA r8, r12, r14, r8 - - B LOOP1 -L1: + B LOOP1 + +L1: ADD r5, r11, r8, LSL #1 MOV r5, r5, LSR #16 @extract_h(s) @@ -75,14 +75,14 @@ L1: ADD r5, r3, #1 MOV r6, r0 LDRSH r9, [r6], #2 @ *tmpX++ - LDRSH r10, [r4], #-2 + LDRSH r10, [r4], #-2 LDRSH r12, [r6], #2 LDRSH r14, [r4], #-2 MUL r8, r9, r10 SUB r5, r5, #2 MLA r8, r12, r14, r8 - + LOOP2: CMP r5, #0 BLE L2 @@ -97,14 +97,14 @@ LOOP2: LDRSH r12, [r6], #2 @ *tmpX++ LDRSH r14, [r4], #-2 @ *tmpH-- MLA r8, r9, r10, r8 - SUBS r5, r5, #4 + SUBS r5, r5, #4 MLA r8, r12, r14, r8 B LOOP2 L2: ADD r8, r11, r8, LSL #1 MOV r8, r8, LSR #16 @extract_h(s) - ADD r3, r3, #1 + ADD r3, r3, #1 STRH r8, [r2], #2 @y[n] ADD r4, r1, r3, LSL #1 @@ -117,7 +117,7 @@ L2: MUL r8, r9, r10 LDRSH r9, [r6], #2 LDRSH r10, [r4], #-2 - MLA r8, r12, r14, r8 + MLA r8, r12, r14, r8 SUB r5, r5, #3 MLA r8, r9, r10, r8 @@ -135,9 +135,9 @@ LOOP3: LDRSH r12, [r6], #2 @ *tmpX++ LDRSH r14, [r4], #-2 @ *tmpH-- MLA r8, r9, r10, r8 - SUBS r5, r5, #4 - MLA r8, r12, r14, r8 - B LOOP3 + SUBS r5, r5, #4 + MLA r8, r12, r14, r8 + B LOOP3 L3: ADD r8, r11, r8, LSL #1 @@ -150,7 +150,7 @@ L3: MOV r6, r0 MOV r8, #0 -LOOP4: +LOOP4: CMP r5, #0 BLE L4 LDRSH r9, [r6], #2 @ *tmpX++ @@ -164,22 +164,22 @@ LOOP4: LDRSH r12, [r6], #2 @ *tmpX++ LDRSH r14, [r4], #-2 @ *tmpH-- MLA r8, r9, r10, r8 - SUBS r5, r5, #4 - MLA r8, r12, r14, r8 - B LOOP4 -L4: + SUBS r5, r5, #4 + MLA r8, r12, r14, r8 + B LOOP4 +L4: ADD r5, r11, r8, LSL #1 MOV r5, r5, LSR #16 @extract_h(s) ADD r3, r3, #1 STRH r5, [r2], #2 @y[n] - + CMP r3, #64 BLT LOOP - -Convolve_asm_end: - + +Convolve_asm_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 8f32733f7d4b..2d4c7cc9bbe9 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 @@ -51,12 +51,12 @@ LOOPi: RSB r11, r2, #62 @j=62-pos LOOPj1: - LDRSH r12, [r10], #2 + 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 + MLA r6, r12, r14, r6 BGE LOOPj1 LDRSH r12, [r10], #2 @*p1++ @@ -64,7 +64,7 @@ LOOPj1: MLA r5, r12, r14, r5 MOV r14, #0x8000 MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) - ADD r10, r6, r14 + ADD r10, r6, r14 ADD r9, r5, r14 MOV r5, r9, ASR #16 MOV r6, r10, ASR #16 @@ -76,7 +76,7 @@ LOOPj1: MUL r14, r6, r11 MOV r5, r12, ASR #15 MOV r6, r14, ASR #15 - LDR r9, [r13, #44] + LDR r9, [r13, #44] LDR r12, [r13, #48] LDRSH r10, [r7], #2 @*p0++ LDRSH r11, [r8] @*p3++ @@ -88,7 +88,7 @@ LOOPj1: 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] @@ -97,12 +97,12 @@ LOOPj1: ADD r4, r4, #1 @i++ LOOPj2: - LDRSH r12, [r10], #2 + 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 + MLA r6, r12, r14, r6 BGE LOOPj2 LDRSH r12, [r10], #2 @*p1++ @@ -110,7 +110,7 @@ LOOPj2: MLA r5, r12, r14, r5 MOV r14, #0x8000 MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) - ADD r10, r6, r14 + ADD r10, r6, r14 ADD r9, r5, r14 MOV r5, r9, ASR #16 @@ -123,7 +123,7 @@ LOOPj2: MUL r14, r6, r11 MOV r5, r12, ASR #15 MOV r6, r14, ASR #15 - LDR r9, [r13, #44] + LDR r9, [r13, #44] LDR r12, [r13, #48] LDRSH r10, [r7], #2 @*p0++ LDRSH r11, [r8] @*p3++ @@ -136,16 +136,16 @@ LOOPj2: 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 - - - + .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 d7b45099abe0..e0b338d547f4 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 @@ -35,7 +35,7 @@ pred_lt4_asm: - STMFD r13!, {r4 - r12, r14} + 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 @@ -45,7 +45,7 @@ pred_lt4_asm: SUB r5, r5, #30 @x -= 15 RSB r4, r2, #3 @k = 3 - frac LDR r6, Table - MOV r8, r4, LSL #6 + MOV r8, r4, LSL #6 @MOV r7, #0 @j = 0 ADD r8, r6, r8 @ptr2 = &(inter4_2[k][0]) @@ -63,7 +63,7 @@ THREE_LOOP: LDRSH r6, [r1], #2 @x[1] LDRSH r9, [r1], #2 @x[2] - SMULBB r10, r4, r3 @x[0] * h[0] + SMULBB r10, r4, r3 @x[0] * h[0] SMULBB r11, r6, r3 @x[1] * h[0] SMULBB r12, r9, r3 @x[2] * h[0] @@ -285,7 +285,7 @@ Last2LOOP: 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] @@ -435,7 +435,7 @@ Last2LOOP: MOV r11, r11, LSL #1 QADD r10, r10, r10 - QADD r11, r11, r11 + QADD r11, r11, r11 QADD r10, r10, r5 QADD r11, r11, r5 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 86b3bd613347..5ff096488cb9 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 @@ -34,12 +34,12 @@ Residu_opt: LDRH r5, [r0], #2 LDRH r6, [r0], #2 - ORR r5, r6, r5, LSL #16 @r5 --- a0, a1 + 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 @@ -59,13 +59,13 @@ Residu_opt: 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 + + 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 @@ -78,7 +78,7 @@ residu_loop: 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 + 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 @@ -88,20 +88,20 @@ residu_loop: 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 - + 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 + 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) @@ -111,7 +111,7 @@ residu_loop: 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) @@ -122,7 +122,7 @@ residu_loop: 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) @@ -133,7 +133,7 @@ residu_loop: 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) @@ -144,7 +144,7 @@ residu_loop: 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) @@ -154,7 +154,7 @@ residu_loop: 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) @@ -165,64 +165,64 @@ residu_loop: 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 - - + + + 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 + BNE residu_loop end: - LDMFD r13!, {r8 -r12} + LDMFD r13!, {r8 -r12} LDMFD r13!, {r4 -r12,pc} @ENDFUNC - .END - - - + .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 f83e688cbbdd..b300224513d4 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 @@ -38,7 +38,7 @@ Scale_sig_opt: MOV r8, #0x7fffffff MOV r9, #0x8000 BLE LOOP2 - + LOOP1: LDRSH r5, [r4] @load x[i] @@ -65,11 +65,11 @@ LOOP2: The_end: LDMFD r13!, {r4 - r12, r15} - + @ENDFUNC - .END - - - + .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 f4700cdbb2dc..0c287a4d6286 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 @@ -33,18 +33,18 @@ Syn_filt_asm: - STMFD r13!, {r4 - r12, r14} + 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 r6, [r4], #2 LDRH r7, [r4], #2 LDRH r8, [r4], #2 LDRH r9, [r4], #2 @@ -62,7 +62,7 @@ Syn_filt_asm: STRH r12, [r5], #2 STRH r14, [r5], #2 - LDRH r6, [r4], #2 + LDRH r6, [r4], #2 LDRH r7, [r4], #2 LDRH r8, [r4], #2 LDRH r9, [r4], #2 @@ -92,45 +92,45 @@ Syn_filt_asm: LDRSH r9, [r0, #6] @ load a[3] LDRSH r11,[r0, #8] @ load a[4] AND r6, r6, r14 - AND r9, r9, 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 + 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] - + 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 + 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] + 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 + 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] - + STR r12, [r13, #-32] + ADD r4, r13, #32 LOOP: LDRSH r6, [r1], #2 @ load x[i] @@ -155,8 +155,8 @@ LOOP: 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)) + + 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) @@ -169,13 +169,13 @@ LOOP: 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)) - + 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) @@ -192,11 +192,11 @@ LOOP: LDRSH r9, [r10, #-26] @ *(temp_p - 13) - SMLABT r14, r11, r7, r14 @ -a[12] * (*(temp_p -12)) + 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) @@ -211,28 +211,28 @@ LOOP: 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 + 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 + BL voAWB_Copy Syn_filt_asm_end: - - ADD r13, r13, #700 - LDMFD r13!, {r4 - r12, r15} + + 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 2afc146e9a64..1d5893f3d360 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 @@ -30,10 +30,10 @@ .section .text .global Deemph_32_asm - + Deemph_32_asm: - STMFD r13!, {r4 - r12, r14} + 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] @@ -47,9 +47,9 @@ Deemph_32_asm: 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] + LDRSH r6, [r0], #2 @load x_hi[1] QDADD r10, r10, r9 - LDRSH r7, [r1], #2 @load x_lo[1] + 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) @@ -94,9 +94,9 @@ LOOP: BLT LOOP STR r14, [r3] - STRH r14, [r2] + STRH r14, [r2] - LDMFD r13!, {r4 - r12, r15} + 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 678f1d044c7a..8230944d4217 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 @@ -45,14 +45,14 @@ Dot_product12_asm: VLD1.S16 {Q12, Q13}, [r1]! @load 16 Word16 y[] VMULL.S16 Q15, D16, D0 - VMLAL.S16 Q15, D17, D1 + 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 + 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, D23, D7 VMLAL.S16 Q15, D24, D8 VMLAL.S16 Q15, D25, D9 VMLAL.S16 Q15, D26, D10 @@ -64,9 +64,9 @@ Dot_product12_asm: CMP r2, #64 BEQ Lable1 - VLD1.S16 {Q0, Q1}, [r0]! @load 16 Word16 x[] - VLD1.S16 {Q2, Q3}, [r1]! - VMLAL.S16 Q15, D4, D0 + 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 @@ -102,11 +102,11 @@ LOOP_EQ: VMLAL.S16 Q15, D2, D2 VMLAL.S16 Q15, D3, D3 -Lable1: +Lable1: VQADD.S32 D30, D30, D31 VPADD.S32 D30, D30, D30 - VMOV.S32 r12, D30[0] + VMOV.S32 r12, D30[0] ADD r12, r12, r12 ADD r12, r12, #1 @ L_sum = (L_sum << 1) + 1 @@ -117,11 +117,11 @@ Lable1: 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] + STRH r11, [r3] Dot_product12_end: - - LDMFD r13!, {r4 - r12, r15} + + 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 5389a1c4314f..14ba8289f4ca 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 @@ -13,7 +13,7 @@ @ ** See the License for the specific language governing permissions and @ ** limitations under the License. @ */ -@ +@ @**********************************************************************/ @void Filt_6k_7k( @ Word16 signal[], /* input: signal */ @@ -23,7 +23,7 @@ @*********************************************************************** @ r0 --- signal[] @ r1 --- lg -@ r2 --- mem[] +@ r2 --- mem[] .section .text .global Filt_6k_7k_asm @@ -31,7 +31,7 @@ Filt_6k_7k_asm: - STMFD r13!, {r0 - r12, r14} + 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 @@ -49,7 +49,7 @@ Filt_6k_7k_asm: - LDR r10, Lable1 @ get fir_7k address + 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] @@ -81,9 +81,9 @@ Filt_6k_7k_asm: 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 - + 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] @@ -91,20 +91,20 @@ Filt_6k_7k_asm: 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 - + 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 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] + VMLAL.S16 Q12,D12,D3[0] VEXT.8 Q5,Q5,Q6,#2 VMLAL.S16 Q9,D12,D4[0] VMLAL.S16 Q10,D13,D5[0] @@ -115,18 +115,18 @@ LOOP_6K7K: VMLAL.S16 Q10,D15,D7[0] VMLAL.S16 Q11,D15,D6[0] VMLAL.S16 Q12,D16,D7[0] - VEXT.8 Q7,Q7,Q8,#2 + VEXT.8 Q7,Q7,Q8,#2 - VMLAL.S16 Q9,D8,D0[1] + VMLAL.S16 Q9,D8,D0[1] VMLAL.S16 Q10,D9,D1[1] - VEXT.8 Q8,Q8,Q15,#2 - VMLAL.S16 Q11,D9,D0[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] + VMLAL.S16 Q12,D12,D3[1] VEXT.8 Q5,Q5,Q6,#2 VMLAL.S16 Q9,D12,D4[1] VMLAL.S16 Q10,D13,D5[1] @@ -137,18 +137,18 @@ LOOP_6K7K: VMLAL.S16 Q10,D15,D7[1] VMLAL.S16 Q11,D15,D6[1] VMLAL.S16 Q12,D16,D7[1] - VEXT.8 Q7,Q7,Q8,#2 + VEXT.8 Q7,Q7,Q8,#2 - VMLAL.S16 Q9,D8,D0[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] + 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] + VMLAL.S16 Q12,D12,D3[2] VEXT.8 Q5,Q5,Q6,#2 VMLAL.S16 Q9,D12,D4[2] VMLAL.S16 Q10,D13,D5[2] @@ -159,18 +159,18 @@ LOOP_6K7K: VMLAL.S16 Q10,D15,D7[2] VMLAL.S16 Q11,D15,D6[2] VMLAL.S16 Q12,D16,D7[2] - VEXT.8 Q7,Q7,Q8,#2 + VEXT.8 Q7,Q7,Q8,#2 - VMLAL.S16 Q9,D8,D0[3] + VMLAL.S16 Q9,D8,D0[3] VMLAL.S16 Q10,D9,D1[3] - VEXT.8 Q8,Q8,Q15,#2 - VMLAL.S16 Q11,D9,D0[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] + VMLAL.S16 Q12,D12,D3[3] VEXT.8 Q5,Q5,Q6,#2 VMLAL.S16 Q9,D12,D4[3] VMLAL.S16 Q10,D13,D5[3] @@ -181,10 +181,10 @@ LOOP_6K7K: VMLAL.S16 Q10,D15,D7[3] VMLAL.S16 Q11,D15,D6[3] VMLAL.S16 Q12,D16,D7[3] - VEXT.8 Q7,Q7,Q8,#2 + VEXT.8 Q7,Q7,Q8,#2 VMOV.S16 D8,D9 - VEXT.8 Q8,Q8,Q15,#2 + VEXT.8 Q8,Q8,Q15,#2 VMOV.S16 D9,D10 VADD.S32 Q9,Q9,Q10 VMOV.S16 D10,D11 @@ -214,12 +214,12 @@ LOOP_6K7K: 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} - + ADD r13, r13, #240 + LDMFD r13!, {r0 - r12, r15} + Lable1: .word fir_6k_7k @ENDFUNC diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Norm_Corr_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Norm_Corr_neon.s index 60e9adec166a..4263cd4d1817 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Norm_Corr_neon.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Norm_Corr_neon.s @@ -33,7 +33,7 @@ .section .text - .global Norm_corr_asm + .global Norm_corr_asm .extern Convolve_asm .extern Isqrt_n @****************************** @@ -47,17 +47,17 @@ .equ T_MIN , 212 .equ T_MAX , 216 .equ CORR_NORM , 220 - + Norm_corr_asm: - STMFD r13!, {r4 - r12, r14} + STMFD r13!, {r4 - r12, r14} SUB r13, r13, #voSTACK - + ADD r8, r13, #20 @get the excf[L_SUBFR] LDR r4, [r13, #T_MIN] @get t_min RSB r11, r4, #0 @k = -t_min - ADD r5, r0, r11, LSL #1 @get the &exc[k] - + ADD r5, r0, r11, LSL #1 @get the &exc[k] + @transfer Convolve function STMFD sp!, {r0 - r3} MOV r0, r5 @@ -68,7 +68,7 @@ Norm_corr_asm: @ r8 --- excf[] - MOV r14, r1 @copy xn[] address + MOV r14, r1 @copy xn[] address MOV r7, #1 VLD1.S16 {Q0, Q1}, [r14]! VLD1.S16 {Q2, Q3}, [r14]! @@ -95,34 +95,34 @@ Norm_corr_asm: VQADD.S32 D20, D20, D21 VMOV.S32 r9, D20[0] VMOV.S32 r10, D20[1] - QADD r6, r9, r10 + QADD r6, r9, r10 QADD r6, r6, r6 QADD r9, r6, r7 @L_tmp = (L_tmp << 1) + 1; CLZ r7, r9 SUB r6, r7, #1 @exp = norm_l(L_tmp) RSB r7, r6, #32 @exp = 32 - exp - MOV r6, r7, ASR #1 + MOV r6, r7, ASR #1 RSB r7, r6, #0 @scale = -(exp >> 1) - + @loop for every possible period @for(t = t_min@ t <= t_max@ t++) @r7 --- scale r4 --- t_min r8 --- excf[] -LOOPFOR: +LOOPFOR: ADD r14, r13, #20 @copy of excf[] MOV r12, r1 @copy of xn[] MOV r8, #0x8000 VLD1.S16 {Q0, Q1}, [r14]! @ load 16 excf[] - VLD1.S16 {Q2, Q3}, [r14]! @ load 16 excf[] + VLD1.S16 {Q2, Q3}, [r14]! @ load 16 excf[] VLD1.S16 {Q4, Q5}, [r12]! @ load 16 x[] VLD1.S16 {Q6, Q7}, [r12]! @ load 16 x[] VMULL.S16 Q10, D0, D0 @L_tmp1 += excf[] * excf[] - VMULL.S16 Q11, D0, D8 @L_tmp += x[] * excf[] + VMULL.S16 Q11, D0, D8 @L_tmp += x[] * excf[] VMLAL.S16 Q10, D1, D1 VMLAL.S16 Q11, D1, D9 VMLAL.S16 Q10, D2, D2 - VMLAL.S16 Q11, D2, D10 + VMLAL.S16 Q11, D2, D10 VMLAL.S16 Q10, D3, D3 VMLAL.S16 Q11, D3, D11 VMLAL.S16 Q10, D4, D4 @@ -143,7 +143,7 @@ LOOPFOR: VMLAL.S16 Q10, D1, D1 VMLAL.S16 Q11, D1, D9 VMLAL.S16 Q10, D2, D2 - VMLAL.S16 Q11, D2, D10 + VMLAL.S16 Q11, D2, D10 VMLAL.S16 Q10, D3, D3 VMLAL.S16 Q11, D3, D11 VMLAL.S16 Q10, D4, D4 @@ -162,19 +162,19 @@ LOOPFOR: VPADD.S32 D22, D22, D22 @D22[0] --- L_tmp << 1 VMOV.S32 r6, D20[0] - VMOV.S32 r5, D22[0] + VMOV.S32 r5, D22[0] @r5 --- L_tmp, r6 --- L_tmp1 MOV r10, #1 ADD r5, r10, r5, LSL #1 @L_tmp = (L_tmp << 1) + 1 ADD r6, r10, r6, LSL #1 @L_tmp1 = (L_tmp1 << 1) + 1 - - CLZ r10, r5 + + CLZ r10, r5 CMP r5, #0 RSBLT r11, r5, #0 CLZLT r10, r11 SUB r10, r10, #1 @exp = norm_l(L_tmp) - + MOV r5, r5, LSL r10 @L_tmp = (L_tmp << exp) RSB r10, r10, #30 @exp_corr = 30 - exp MOV r11, r5, ASR #16 @corr = extract_h(L_tmp) @@ -190,7 +190,7 @@ LOOPFOR: @Isqrt_n(&L_tmp, &exp_norm) MOV r14, r0 - MOV r12, r1 + MOV r12, r1 STMFD sp!, {r0 - r4, r7 - r12, r14} ADD r1, sp, #4 @@ -208,7 +208,7 @@ LOOPFOR: MOV r6, r6, ASR #16 @norm = extract_h(L_tmp) MUL r12, r6, r11 ADD r12, r12, r12 @L_tmp = vo_L_mult(corr, norm) - + ADD r6, r10, r5 ADD r6, r6, r7 @exp_corr + exp_norm + scale @@ -227,8 +227,8 @@ LOOPFOR: CMP r4, r6 BEQ Norm_corr_asm_end - - ADD r4, r4, #1 @ t_min ++ + + ADD r4, r4, #1 @ t_min ++ RSB r5, r4, #0 @ k MOV r6, #63 @ i = 63 @@ -255,16 +255,16 @@ LOOPK: MUL r14, r11, r8 LDR r6, [r13, #T_MAX] @ get t_max MOV r8, r14, ASR #15 - STRH r8, [r10] + STRH r8, [r10] CMP r4, r6 BLE LOOPFOR -Norm_corr_asm_end: - - ADD r13, r13, #voSTACK +Norm_corr_asm_end: + + ADD r13, r13, #voSTACK LDMFD r13!, {r4 - r12, r15} - + .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 1e65efa1ec25..e786dde79d68 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 @@ -33,12 +33,12 @@ @ sig_lo[] --- r5 @ lg --- r6 - .section .text + .section .text .global Syn_filt_32_asm Syn_filt_32_asm: - STMFD r13!, {r4 - r12, r14} + STMFD r13!, {r4 - r12, r14} LDR r4, [r13, #40] @ get sig_hi[] address LDR r5, [r13, #44] @ get sig_lo[] address @@ -49,8 +49,8 @@ Syn_filt_32_asm: 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] - + 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] @@ -58,9 +58,9 @@ Syn_filt_32_asm: 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 + VREV64.16 D3, D3 VDUP.S32 Q15, r8 - + SYN_LOOP: LDRSH r6, [r2], #2 @exc[i] @@ -73,12 +73,12 @@ SYN_LOOP: 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 @@ -101,7 +101,7 @@ SYN_LOOP: VSHR.S32 Q10, Q10, #11 @result1 >>= 11 VSHL.S32 Q11, Q11, #1 @result2 <<= 1 - VDUP.S32 Q12, r14 + VDUP.S32 Q12, r14 VADD.S32 Q12, Q12, Q10 @L_tmp = L_tmp - (result1 >>= 11) - (result2 <<= 1) VSUB.S32 Q12, Q12, Q11 @@ -122,12 +122,12 @@ SYN_LOOP: STRH r12, [r5], #2 @stroe sig_lo[i] CMP r8, #64 - BLT SYN_LOOP - + BLT SYN_LOOP + Syn_filt_32_end: - - LDMFD r13!, {r4 - r12, r15} + + LDMFD r13!, {r4 - r12, r15} @ENDFUNC .END - + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/convolve_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/convolve_neon.s index 189e33bb194b..8efa9fbba4ed 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/convolve_neon.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/convolve_neon.s @@ -20,22 +20,22 @@ @* Word16 y[], /* (o) : output vector */ @* Word16 L /* (i) : vector size */ @*) -@ +@ @ r0 --- x[] @ r1 --- h[] @ r2 --- y[] @ r3 --- L - .section .text - .global Convolve_asm + .section .text + .global Convolve_asm Convolve_asm: - STMFD r13!, {r4 - r12, r14} - MOV r3, #0 + STMFD r13!, {r4 - r12, r14} + MOV r3, #0 MOV r11, #0x8000 - -LOOP: + +LOOP: @MOV r8, #0 @ s = 0 ADD r4, r1, r3, LSL #1 @ tmpH address ADD r5, r3, #1 @ i = n + 1 @@ -43,21 +43,21 @@ LOOP: LDRSH r9, [r6], #2 @ *tmpX++ LDRSH r10, [r4] @ *tmpH-- SUB r5, r5, #1 - VMOV.S32 Q10, #0 - MUL r8, r9, r10 + VMOV.S32 Q10, #0 + MUL r8, r9, r10 -LOOP1: +LOOP1: CMP r5, #0 BLE L1 SUB r4, r4, #8 MOV r9, r4 - VLD1.S16 D0, [r6]! + VLD1.S16 D0, [r6]! VLD1.S16 D1, [r9]! VREV64.16 D1, D1 - SUBS r5, r5, #4 - VMLAL.S16 Q10, D0, D1 - B LOOP1 -L1: + SUBS r5, r5, #4 + VMLAL.S16 Q10, D0, D1 + B LOOP1 +L1: VADD.S32 D20, D20, D21 VPADD.S32 D20, D20, D20 VMOV.S32 r5, D20[0] @@ -73,25 +73,25 @@ L1: ADD r5, r3, #1 MOV r6, r0 LDRSH r9, [r6], #2 @ *tmpX++ - LDRSH r10, [r4], #-2 + LDRSH r10, [r4], #-2 LDRSH r12, [r6], #2 LDRSH r14, [r4] MUL r8, r9, r10 SUB r5, r5, #2 MLA r8, r12, r14, r8 - + VMOV.S32 Q10, #0 LOOP2: CMP r5, #0 BLE L2 SUB r4, r4, #8 MOV r9, r4 - VLD1.S16 D0, [r6]! + VLD1.S16 D0, [r6]! VLD1.S16 D1, [r9]! SUBS r5, r5, #4 VREV64.16 D1, D1 - VMLAL.S16 Q10, D0, D1 + VMLAL.S16 Q10, D0, D1 B LOOP2 L2: VADD.S32 D20, D20, D21 @@ -100,7 +100,7 @@ L2: ADD r8, r8, r5 ADD r8, r11, r8, LSL #1 MOV r8, r8, LSR #16 @extract_h(s) - ADD r3, r3, #1 + ADD r3, r3, #1 STRH r8, [r2], #2 @y[n] @@ -115,7 +115,7 @@ L2: MUL r8, r9, r10 LDRSH r9, [r6], #2 LDRSH r10, [r4] - MLA r8, r12, r14, r8 + MLA r8, r12, r14, r8 SUB r5, r5, #3 MLA r8, r9, r10, r8 @@ -125,12 +125,12 @@ LOOP3: BLE L3 SUB r4, r4, #8 MOV r9, r4 - VLD1.S16 D0, [r6]! + VLD1.S16 D0, [r6]! VLD1.S16 D1, [r9]! VREV64.16 D1, D1 SUBS r5, r5, #4 - VMLAL.S16 Q10, D0, D1 - B LOOP3 + VMLAL.S16 Q10, D0, D1 + B LOOP3 L3: VADD.S32 D20, D20, D21 @@ -146,18 +146,18 @@ L3: ADD r4, r1, r5, LSL #1 @ tmpH address MOV r6, r0 VMOV.S32 Q10, #0 -LOOP4: +LOOP4: CMP r5, #0 BLE L4 SUB r4, r4, #8 MOV r9, r4 - VLD1.S16 D0, [r6]! + VLD1.S16 D0, [r6]! VLD1.S16 D1, [r9]! VREV64.16 D1, D1 - SUBS r5, r5, #4 - VMLAL.S16 Q10, D0, D1 - B LOOP4 -L4: + SUBS r5, r5, #4 + VMLAL.S16 Q10, D0, D1 + B LOOP4 +L4: VADD.S32 D20, D20, D21 VPADD.S32 D20, D20, D20 VMOV.S32 r5, D20[0] @@ -165,14 +165,14 @@ L4: MOV r5, r5, LSR #16 @extract_h(s) ADD r3, r3, #1 STRH r5, [r2], #2 @y[n] - + CMP r3, #64 BLT LOOP - -Convolve_asm_end: - + +Convolve_asm_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 c314a8879ba0..8904289b55ac 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 @@ -31,7 +31,7 @@ @r5 ---- cor_1[] @r6 ---- cor_2[] - .section .text + .section .text .global cor_h_vec_012_asm cor_h_vec_012_asm: @@ -52,12 +52,12 @@ LOOPi: RSB r11, r2, #62 @j=62-pos LOOPj1: - LDRSH r12, [r10], #2 + 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 + MLA r6, r12, r14, r6 BGE LOOPj1 LDRSH r12, [r10], #2 @*p1++ @@ -65,7 +65,7 @@ LOOPj1: MLA r5, r12, r14, r5 MOV r14, #0x8000 MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) - ADD r10, r6, r14 + ADD r10, r6, r14 ADD r9, r5, r14 MOV r5, r9, ASR #16 MOV r6, r10, ASR #16 @@ -77,7 +77,7 @@ LOOPj1: MUL r14, r6, r11 MOV r5, r12, ASR #15 MOV r6, r14, ASR #15 - LDR r9, [r13, #44] + LDR r9, [r13, #44] LDR r12, [r13, #48] LDRSH r10, [r7], #2 @*p0++ LDRSH r11, [r8] @*p3++ @@ -89,7 +89,7 @@ LOOPj1: 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] @@ -98,12 +98,12 @@ LOOPj1: ADD r4, r4, #1 @i++ LOOPj2: - LDRSH r12, [r10], #2 + 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 + MLA r6, r12, r14, r6 BGE LOOPj2 LDRSH r12, [r10], #2 @*p1++ @@ -111,7 +111,7 @@ LOOPj2: MLA r5, r12, r14, r5 MOV r14, #0x8000 MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) - ADD r10, r6, r14 + ADD r10, r6, r14 ADD r9, r5, r14 MOV r5, r9, ASR #16 @@ -124,7 +124,7 @@ LOOPj2: MUL r14, r6, r11 MOV r5, r12, ASR #15 MOV r6, r14, ASR #15 - LDR r9, [r13, #44] + LDR r9, [r13, #44] LDR r12, [r13, #48] LDRSH r10, [r7], #2 @*p0++ LDRSH r11, [r8] @*p3++ @@ -137,15 +137,15 @@ LOOPj2: 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 - - - + + .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 dffb750bef1c..6b782cb40b81 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 @@ -25,14 +25,14 @@ @ r1 --- T0 @ r2 --- frac @ r3 --- L_subfr - - .section .text + + .section .text .global pred_lt4_asm .extern inter4_2 pred_lt4_asm: - STMFD r13!, {r4 - r12, r14} + 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 @@ -47,8 +47,8 @@ pred_lt4_asm: VLD1.S16 {Q0, Q1}, [r11]! VLD1.S16 {Q2, Q3}, [r11]! - - MOV r6, #0x8000 + + MOV r6, #0x8000 VLD1.S16 {Q4, Q5}, [r4]! @load 16 x[] VLD1.S16 {Q6, Q7}, [r4]! @load 16 x[] @@ -58,14 +58,14 @@ LOOP: 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 - + LDRSH r12, [r4], #2 + VEXT.S16 D8, D8, D9, #1 VEXT.S16 D9, D9, D10, #1 VEXT.S16 D10, D10, D11, #1 @@ -73,26 +73,26 @@ LOOP: VDUP.S16 D24, r12 VEXT.S16 D12, D12, D13, #1 VEXT.S16 D13, D13, D14, #1 - + VQADD.S32 D30, D30, D31 - MOV r11, #0x8000 + MOV r11, #0x8000 VPADD.S32 D30, D30, D30 ADD r8, r8, #1 VMOV.S32 r12, D30[0] - VEXT.S16 D14, D14, D15, #1 + 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 + 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} - + + LDMFD r13!, {r4 - r12, r15} + Lable1: .word inter4_2 @ENDFUNC diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/residu_asm_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/residu_asm_neon.s index b9e6b23c6a59..394fa8301e07 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/residu_asm_neon.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/residu_asm_neon.s @@ -26,17 +26,17 @@ @lg RN r3 .section .text - .global Residu_opt + .global Residu_opt Residu_opt: - STMFD r13!, {r4 - r12, r14} + STMFD r13!, {r4 - r12, r14} SUB r7, r3, #4 @i = lg - 4 - - VLD1.S16 {D0, D1, D2, D3}, [r0]! @get all a[] + + VLD1.S16 {D0, D1, D2, D3}, [r0]! @get all a[] VLD1.S16 {D4}, [r0]! VMOV.S32 Q8, #0x8000 - + LOOP1: ADD r9, r1, r7, LSL #1 @copy the address ADD r10, r2, r7, LSL #1 @@ -45,7 +45,7 @@ LOOP1: VQDMULL.S16 Q10, D5, D0[0] @finish the first L_mult SUB r8, r9, #2 @get the x[i-1] address - VLD1.S16 D5, [r8]! + VLD1.S16 D5, [r8]! VQDMLAL.S16 Q10, D5, D0[1] SUB r8, r9, #4 @load the x[i-2] address @@ -53,36 +53,36 @@ LOOP1: VQDMLAL.S16 Q10, D5, D0[2] SUB r8, r9, #6 @load the x[i-3] address - VLD1.S16 D5, [r8]! - VQDMLAL.S16 Q10, D5, D0[3] + VLD1.S16 D5, [r8]! + VQDMLAL.S16 Q10, D5, D0[3] SUB r8, r9, #8 @load the x[i-4] address - VLD1.S16 D5, [r8]! - VQDMLAL.S16 Q10, D5, D1[0] + VLD1.S16 D5, [r8]! + VQDMLAL.S16 Q10, D5, D1[0] SUB r8, r9, #10 @load the x[i-5] address - VLD1.S16 D5, [r8]! - VQDMLAL.S16 Q10, D5, D1[1] + VLD1.S16 D5, [r8]! + VQDMLAL.S16 Q10, D5, D1[1] SUB r8, r9, #12 @load the x[i-6] address - VLD1.S16 D5, [r8]! - VQDMLAL.S16 Q10, D5, D1[2] + VLD1.S16 D5, [r8]! + VQDMLAL.S16 Q10, D5, D1[2] SUB r8, r9, #14 @load the x[i-7] address - VLD1.S16 D5, [r8]! - VQDMLAL.S16 Q10, D5, D1[3] + VLD1.S16 D5, [r8]! + VQDMLAL.S16 Q10, D5, D1[3] SUB r8, r9, #16 @load the x[i-8] address - VLD1.S16 D5, [r8]! - VQDMLAL.S16 Q10, D5, D2[0] + VLD1.S16 D5, [r8]! + VQDMLAL.S16 Q10, D5, D2[0] SUB r8, r9, #18 @load the x[i-9] address - VLD1.S16 D5, [r8]! - VQDMLAL.S16 Q10, D5, D2[1] - + VLD1.S16 D5, [r8]! + VQDMLAL.S16 Q10, D5, D2[1] + SUB r8, r9, #20 @load the x[i-10] address - VLD1.S16 D5, [r8]! - VQDMLAL.S16 Q10, D5, D2[2] + VLD1.S16 D5, [r8]! + VQDMLAL.S16 Q10, D5, D2[2] SUB r8, r9, #22 @load the x[i-11] address VLD1.S16 D5, [r8]! @@ -117,10 +117,10 @@ LOOP1: BGE LOOP1 -Residu_asm_end: - +Residu_asm_end: + LDMFD r13!, {r4 - r12, r15} - + @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 bbd354da211a..e45daace8b2e 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 @@ -13,7 +13,7 @@ @ ** See the License for the specific language governing permissions and @ ** limitations under the License. @ */ -@ +@ @**********************************************************************/ @void Scale_sig( @ Word16 x[], /* (i/o) : signal to scale */ @@ -25,16 +25,16 @@ @ lg --- r1 @ exp --- r2 - .section .text + .section .text .global Scale_sig_opt Scale_sig_opt: - STMFD r13!, {r4 - r12, r14} + STMFD r13!, {r4 - r12, r14} MOV r4, #4 - VMOV.S32 Q15, #0x8000 - VDUP.S32 Q14, r2 - MOV r5, r0 @ copy x[] address + VMOV.S32 Q15, #0x8000 + VDUP.S32 Q14, r2 + MOV r5, r0 @ copy x[] address CMP r1, #64 MOVEQ r4, #1 BEQ LOOP @@ -48,7 +48,7 @@ Scale_sig_opt: BEQ LOOP1 LOOP1: - VLD1.S16 {Q0, Q1}, [r5]! @load 16 Word16 x[] + VLD1.S16 {Q0, Q1}, [r5]! @load 16 Word16 x[] VSHLL.S16 Q10, D0, #16 VSHLL.S16 Q11, D1, #16 VSHLL.S16 Q12, D2, #16 @@ -63,7 +63,7 @@ LOOP1: VADDHN.S32 D19, Q13, Q15 VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] -LOOP: +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[] @@ -72,7 +72,7 @@ LOOP: VSHLL.S16 Q8, D0, #16 VSHLL.S16 Q9, D1, #16 VSHLL.S16 Q10, D2, #16 - VSHLL.S16 Q11, D3, #16 + VSHLL.S16 Q11, D3, #16 VSHL.S32 Q8, Q8, Q14 VSHL.S32 Q9, Q9, Q14 VSHL.S32 Q10, Q10, Q14 @@ -83,7 +83,7 @@ LOOP: 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 @@ -112,7 +112,7 @@ LOOP: VADDHN.S32 D19, Q13, Q15 VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] - VSHLL.S16 Q10, D12, #16 + VSHLL.S16 Q10, D12, #16 VSHLL.S16 Q11, D13, #16 VSHLL.S16 Q12, D14, #16 VSHLL.S16 Q13, D15, #16 @@ -123,16 +123,16 @@ LOOP: 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[] + VADDHN.S32 D19, Q13, Q15 + VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] SUBS r4, r4, #1 - BGT LOOP - - + BGT LOOP + + Scale_sig_asm_end: - LDMFD r13!, {r4 - r12, r15} + 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 db4559c308a7..5731bdb35728 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 @@ -27,21 +27,21 @@ @ mem[] --- r3 @ m --- 16 lg --- 80 update --- 1 - .section .text + .section .text .global Syn_filt_asm Syn_filt_asm: - STMFD r13!, {r4 - r12, r14} + 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 @@ -54,7 +54,7 @@ Syn_filt_asm: VREV64.16 D0, D0 VREV64.16 D1, D1 VREV64.16 D2, D2 - VREV64.16 D3, D3 + VREV64.16 D3, D3 MOV r8, #0 @ loop times MOV r10, r13 @ temp = y_buf ADD r4, r13, #32 @ yy[i] address @@ -68,7 +68,7 @@ SYN_LOOP: ADD r10, r4, r8, LSL #1 @ y[i], yy[i] address VDUP.S32 Q10, r12 - VMULL.S16 Q5, D3, D4 + VMULL.S16 Q5, D3, D4 VMLAL.S16 Q5, D2, D5 VMLAL.S16 Q5, D1, D6 VMLAL.S16 Q5, D0, D7 @@ -82,25 +82,25 @@ SYN_LOOP: VDUP.S32 Q7, D10[0] VSUB.S32 Q9, Q10, Q7 - VQRSHRN.S32 D20, Q9, #12 + 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] - + 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]! + VST1.S16 {D0, D1, D2, D3}, [r3]! Syn_filt_asm_end: - - ADD r13, r13, #700 - LDMFD r13!, {r4 - r12, r15} + + 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 9baa937d2a6d..8c477caf4d8b 100644 --- a/media/libstagefright/codecs/amrwbenc/src/autocorr.c +++ b/media/libstagefright/codecs/amrwbenc/src/autocorr.c @@ -70,19 +70,19 @@ void Autocorr( p1 = y; for (i = 0; i < L_WINDOW; i+=4) { - *p1 = vo_shr_r(*p1, shift); + *p1 = vo_shr_r(*p1, shift); p1++; - *p1 = vo_shr_r(*p1, shift); + *p1 = vo_shr_r(*p1, shift); p1++; *p1 = vo_shr_r(*p1, shift); p1++; - *p1 = vo_shr_r(*p1, shift); + *p1 = vo_shr_r(*p1, shift); p1++; } } /* Compute and normalize r[0] */ - L_sum = 1; + L_sum = 1; for (i = 0; i < L_WINDOW; i+=4) { L_sum += vo_L_mult(y[i], y[i]); diff --git a/media/libstagefright/codecs/amrwbenc/src/az_isp.c b/media/libstagefright/codecs/amrwbenc/src/az_isp.c index 9333d19841ba..43db27a88ec9 100644 --- a/media/libstagefright/codecs/amrwbenc/src/az_isp.c +++ b/media/libstagefright/codecs/amrwbenc/src/az_isp.c @@ -90,9 +90,9 @@ void Az_isp( 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]; + f1[NC] = a[NC]; for (i = 2; i < NC; i++) /* Divide by (1-z^-2) */ - f2[i] = add1(f2[i], f2[i - 2]); + f2[i] = add1(f2[i], f2[i - 2]); /*---------------------------------------------------------------------* * Find the ISPs (roots of F1(z) and F2(z) ) using the * @@ -107,17 +107,17 @@ void Az_isp( *---------------------------------------------------------------------*/ nf = 0; /* number of found frequencies */ ip = 0; /* indicator for f1 or f2 */ - coef = f1; - order = NC; - xlow = vogrid[0]; + 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]; + xhigh = xlow; + yhigh = ylow; + xlow = vogrid[j]; ylow = Chebps2(xlow, coef, order); if ((ylow * yhigh) <= (Word32) 0) { @@ -128,12 +128,12 @@ void Az_isp( ymid = Chebps2(xmid, coef, order); if ((ylow * ymid) <= (Word32) 0) { - yhigh = ymid; - xhigh = xmid; + yhigh = ymid; + xhigh = xmid; } else { - ylow = ymid; - xlow = xmid; + ylow = ymid; + xlow = xmid; } } /*-------------------------------------------------------------* @@ -144,10 +144,10 @@ void Az_isp( y = yhigh - ylow; if (y == 0) { - xint = xlow; + xint = xlow; } else { - sign = y; + sign = y; y = abs_s(y); exp = norm_s(y); y = y << exp; @@ -161,19 +161,19 @@ void Az_isp( t0 = (t0 >> 10); /* result in Q15 */ xint = vo_sub(xlow, vo_extract_l(t0)); /* xint = xlow - ylow*y */ } - isp[nf] = xint; - xlow = xint; - nf++; + isp[nf] = xint; + xlow = xint; + nf++; if (ip == 0) { - ip = 1; - coef = f2; - order = NC - 1; + ip = 1; + coef = f2; + order = NC - 1; } else { - ip = 0; - coef = f1; - order = NC; + ip = 0; + coef = f1; + order = NC; } ylow = Chebps2(xlow, coef, order); } @@ -183,7 +183,7 @@ void Az_isp( { for (i = 0; i < M; i++) { - isp[i] = old_isp[i]; + isp[i] = old_isp[i]; } } else { @@ -243,9 +243,9 @@ static __inline Word16 Chebps2(Word16 x, Word16 f[], Word32 n) b0_l = (t0 & 0xffff) >> 1; b2_l = b1_l; /* b2 = b1; */ - b2_h = b1_h; + b2_h = b1_h; b1_l = b0_l; /* b1 = b0; */ - b1_h = b0_h; + b1_h = b0_h; } t0 = ((b1_h * x)<<1) + (((b1_l * x)>>15)<<1); diff --git a/media/libstagefright/codecs/amrwbenc/src/bits.c b/media/libstagefright/codecs/amrwbenc/src/bits.c index 61cac3d56abc..e78dc1f26fcd 100644 --- a/media/libstagefright/codecs/amrwbenc/src/bits.c +++ b/media/libstagefright/codecs/amrwbenc/src/bits.c @@ -34,8 +34,8 @@ 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 mode, /* i: coding bit-stream ratio mode*/ + Coder_State *st /*i/o: coder global parameters struct */ ) { Word16 i, frame_type; @@ -46,7 +46,7 @@ int PackBits(Word16 prms[], /* i: analysis parameters */ unsigned short* dataOut = st->outputStream; if (coding_mode == MRDTX) - { + { st->sid_update_counter--; if (st->prev_ft == TX_SPEECH) @@ -92,7 +92,7 @@ int PackBits(Word16 prms[], /* i: analysis parameters */ } else { if (bitstreamformat == 1) /* ITU file format */ - { + { *(dataOut) = 0x6b21; if(frame_type != TX_NO_DATA && frame_type != TX_SID_FIRST) { @@ -100,17 +100,17 @@ int PackBits(Word16 prms[], /* i: analysis parameters */ for (i = 0; i < nb_of_bits[coding_mode]; i++) { if(prms[i] == BIT_0){ - *(dataOut + 2 + i) = BIT_0_ITU; + *(dataOut + 2 + i) = BIT_0_ITU; } else{ *(dataOut + 2 + i) = BIT_1_ITU; } } - return (2 + nb_of_bits[coding_mode])<<1; + return (2 + nb_of_bits[coding_mode])<<1; } else { *(dataOut + 1) = 0; - return 2<<1; + return 2<<1; } } else /* MIME/storage file format */ { @@ -191,7 +191,7 @@ void Parm_serial( ) { Word16 i, bit; - *prms += no_of_bits; + *prms += no_of_bits; for (i = 0; i < no_of_bits; i++) { bit = (Word16) (value & 0x0001); /* get lsb */ @@ -199,9 +199,9 @@ void Parm_serial( *--(*prms) = BIT_0; else *--(*prms) = BIT_1; - value >>= 1; + value >>= 1; } - *prms += no_of_bits; + *prms += no_of_bits; return; } diff --git a/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c b/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c index 80990d9abe4b..18698e223e90 100644 --- a/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c +++ b/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c @@ -79,7 +79,7 @@ void ACELP_2t64_fx( #endif Isqrt_n(&s, &exp); - s = L_shl(s, add1(exp, 5)); + s = L_shl(s, add1(exp, 5)); k_cn = vo_round(s); /* set k_dn = 32..512 (ener_dn = 2^30..2^22) */ @@ -107,22 +107,22 @@ void ACELP_2t64_fx( s = (k_cn* (*p0++))+(k_dn * (*p1++)); *p2++ = s >> 7; s = (k_cn* (*p0++))+(k_dn * (*p1++)); - *p2++ = s >> 7; + *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]; + val = dn[i]; + ps = dn2[i]; if (ps >= 0) { sign[i] = 32767; /* sign = +1 (Q12) */ - vec[i] = -32768; + vec[i] = -32768; } else { sign[i] = -32768; /* sign = -1 (Q12) */ - vec[i] = 32767; + vec[i] = 32767; dn[i] = -val; } } @@ -130,13 +130,13 @@ void ACELP_2t64_fx( * Compute h_inv[i]. * *------------------------------------------------------------*/ /* impulse response buffer for fast computation */ - h = h_buf + L_SUBFR; - h_inv = h + (L_SUBFR<<1); + 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]); + h[i] = H[i]; + h_inv[i] = vo_negate(h[i]); } /*------------------------------------------------------------* @@ -144,46 +144,46 @@ void ACELP_2t64_fx( * 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]; + p0 = &rrixix[0][NB_POS - 1]; + p1 = &rrixix[1][NB_POS - 1]; - ptr_h1 = h; + 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); + *p1-- = (extract_h(cor) >> 1); cor += ((*ptr_h1) * (*ptr_h1) << 1); ptr_h1++; - *p0-- = (extract_h(cor) >> 1); + *p0-- = (extract_h(cor) >> 1); } /*------------------------------------------------------------* * Compute rrixiy[][] needed for the codebook search. * *------------------------------------------------------------*/ - pos = MSIZE - 1; - pos2 = MSIZE - 2; - ptr_hf = h + 1; + pos = MSIZE - 1; + pos2 = MSIZE - 2; + ptr_hf = h + 1; for (k = 0; k < NB_POS; k++) { - p1 = &rrixiy[pos]; - p0 = &rrixiy[pos2]; + p1 = &rrixiy[pos]; + p0 = &rrixiy[pos2]; cor = 0x00008000L; /* for rounding */ - ptr_h1 = h; - ptr_h2 = ptr_hf; + 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); + *p1 = extract_h(cor); cor += ((*ptr_h1) * (*ptr_h2))<<1; ptr_h1++; ptr_h2++; - *p0 = extract_h(cor); + *p0 = extract_h(cor); p1 -= (NB_POS + 1); p0 -= (NB_POS + 1); @@ -191,7 +191,7 @@ void ACELP_2t64_fx( cor += ((*ptr_h1) * (*ptr_h2))<<1; ptr_h1++; ptr_h2++; - *p1 = extract_h(cor); + *p1 = extract_h(cor); pos -= NB_POS; pos2--; @@ -201,17 +201,17 @@ void ACELP_2t64_fx( /*------------------------------------------------------------* * Modification of rrixiy[][] to take signs into account. * *------------------------------------------------------------*/ - p0 = rrixiy; + p0 = rrixiy; for (i = 0; i < L_SUBFR; i += STEP) { - psign = sign; + psign = sign; if (psign[i] < 0) { - psign = vec; + psign = vec; } for (j = 1; j < L_SUBFR; j += STEP) { - *p0 = vo_mult(*p0, psign[j]); + *p0 = vo_mult(*p0, psign[j]); p0++; } } @@ -220,20 +220,20 @@ void ACELP_2t64_fx( * ~@~~~~~~~~~~~~~~ * * 32 pos x 32 pos = 1024 tests (all combinaisons is tested) * *-------------------------------------------------------------------*/ - p0 = rrixix[0]; - p1 = rrixix[1]; - p2 = rrixiy; + p0 = rrixix[0]; + p1 = rrixix[1]; + p2 = rrixiy; - psk = -1; - alpk = 1; - ix = 0; - iy = 1; + psk = -1; + alpk = 1; + ix = 0; + iy = 1; for (i0 = 0; i0 < L_SUBFR; i0 += STEP) { - ps1 = dn[i0]; - alp1 = (*p0++); - pos = -1; + ps1 = dn[i0]; + alp1 = (*p0++); + pos = -1; for (i1 = 1; i1 < L_SUBFR; i1 += STEP) { ps2 = add1(ps1, dn[i1]); @@ -242,16 +242,16 @@ void ACELP_2t64_fx( s = vo_L_mult(alpk, sq) - ((psk * alp2)<<1); if (s > 0) { - psk = sq; - alpk = alp2; - pos = i1; + psk = sq; + alpk = alp2; + pos = i1; } } p1 -= NB_POS; if (pos >= 0) { - ix = i0; - iy = pos; + ix = i0; + iy = pos; } } /*-------------------------------------------------------------------* @@ -260,7 +260,7 @@ void ACELP_2t64_fx( for (i = 0; i < L_SUBFR; i++) { - code[i] = 0; + code[i] = 0; } i0 = (ix >> 1); /* pos of pulse 1 (0..31) */ @@ -268,24 +268,24 @@ void ACELP_2t64_fx( if (sign[ix] > 0) { code[ix] = 512; /* codeword in Q9 format */ - p0 = h - ix; + p0 = h - ix; } else { - code[ix] = -512; - i0 += NB_POS; - p0 = h_inv - ix; + code[ix] = -512; + i0 += NB_POS; + p0 = h_inv - ix; } if (sign[iy] > 0) { - code[iy] = 512; - p1 = h - iy; + code[iy] = 512; + p1 = h - iy; } else { - code[iy] = -512; - i1 += NB_POS; - p1 = h_inv - iy; + code[iy] = -512; + i1 += NB_POS; + p1 = h_inv - iy; } - *index = add1((i0 << 6), i1); + *index = add1((i0 << 6), i1); for (i = 0; i < L_SUBFR; i++) { y[i] = vo_shr_r(add1((*p0++), (*p1++)), 3); diff --git a/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c b/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c index 17f3d47823f0..1ecc11f536f1 100644 --- a/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c +++ b/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c @@ -151,58 +151,58 @@ void ACELP_4t64_fx( 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; + 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; + 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; + 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; + 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; + 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; + 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) @@ -211,17 +211,17 @@ void ACELP_4t64_fx( 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; + 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; @@ -231,7 +231,7 @@ void ACELP_4t64_fx( for (i = 0; i < nb_pulse; i++) { - codvec[i] = i; + codvec[i] = i; } /*----------------------------------------------------------------* @@ -246,7 +246,7 @@ void ACELP_4t64_fx( #endif Isqrt_n(&s, &exp); - s = L_shl(s, (exp + 5)); + 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) */ @@ -274,22 +274,22 @@ void ACELP_4t64_fx( s = (k_cn* (*p0++))+(k_dn * (*p1++)); *p2++ = s >> 7; s = (k_cn* (*p0++))+(k_dn * (*p1++)); - *p2++ = s >> 7; + *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]; + val = dn[i]; + ps = dn2[i]; if (ps >= 0) { sign[i] = 32767; /* sign = +1 (Q12) */ - vec[i] = -32768; + vec[i] = -32768; } else { sign[i] = -32768; /* sign = -1 (Q12) */ - vec[i] = 32767; + vec[i] = 32767; dn[i] = -val; dn2[i] = -ps; } @@ -302,19 +302,19 @@ void ACELP_4t64_fx( { for (k = 0; k < NB_MAX; k++) { - ps = -1; + ps = -1; for (j = i; j < L_SUBFR; j += STEP) { if(dn2[j] > ps) { - ps = dn2[j]; - pos = j; + ps = dn2[j]; + pos = j; } } dn2[pos] = (k - NB_MAX); /* dn2 < 0 when position is selected */ if (k == 0) { - pos_max[i] = pos; + pos_max[i] = pos; } } } @@ -335,22 +335,22 @@ void ACELP_4t64_fx( /* impulse response buffer for fast computation */ - h = h_buf; - h_inv = h_buf + (2 * L_SUBFR); + 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; + *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; + h_shift = 0; if ((nb_pulse >= 12) && (val > 1024)) { - h_shift = 1; + h_shift = 1; } p0 = H; p1 = h; @@ -358,14 +358,14 @@ void ACELP_4t64_fx( 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++); + *p1 = *p0++ >> h_shift; + *p2++ = -(*p1++); + *p1 = *p0++ >> h_shift; + *p2++ = -(*p1++); + *p1 = *p0++ >> h_shift; + *p2++ = -(*p1++); + *p1 = *p0++ >> h_shift; + *p2++ = -(*p1++); } /*------------------------------------------------------------* @@ -377,27 +377,27 @@ void ACELP_4t64_fx( /* 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]; + 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; + 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); + *p3-- = extract_h(cor); cor += vo_L_mult((*ptr_h1), (*ptr_h1)); ptr_h1++; - *p2-- = extract_h(cor); + *p2-- = extract_h(cor); cor += vo_L_mult((*ptr_h1), (*ptr_h1)); ptr_h1++; - *p1-- = extract_h(cor); + *p1-- = extract_h(cor); cor += vo_L_mult((*ptr_h1), (*ptr_h1)); ptr_h1++; - *p0-- = extract_h(cor); + *p0-- = extract_h(cor); } /*------------------------------------------------------------* @@ -409,38 +409,38 @@ void ACELP_4t64_fx( /* storage order --> i2i3, i1i2, i0i1, i3i0 */ - pos = MSIZE - 1; - ptr_hf = h + 1; + 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]; + 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; + 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); + *p3 = extract_h(cor); cor += vo_L_mult((*ptr_h1), (*ptr_h2)); ptr_h1++; ptr_h2++; - *p2 = extract_h(cor); + *p2 = extract_h(cor); cor += vo_L_mult((*ptr_h1), (*ptr_h2)); ptr_h1++; ptr_h2++; - *p1 = extract_h(cor); + *p1 = extract_h(cor); cor += vo_L_mult((*ptr_h1), (*ptr_h2)); ptr_h1++; ptr_h2++; - *p0 = extract_h(cor); + *p0 = extract_h(cor); p3 -= (NB_POS + 1); p2 -= (NB_POS + 1); @@ -450,15 +450,15 @@ void ACELP_4t64_fx( cor += vo_L_mult((*ptr_h1), (*ptr_h2)); ptr_h1++; ptr_h2++; - *p3 = extract_h(cor); + *p3 = extract_h(cor); cor += vo_L_mult((*ptr_h1), (*ptr_h2)); ptr_h1++; ptr_h2++; - *p2 = extract_h(cor); + *p2 = extract_h(cor); cor += vo_L_mult((*ptr_h1), (*ptr_h2)); ptr_h1++; ptr_h2++; - *p1 = extract_h(cor); + *p1 = extract_h(cor); pos -= NB_POS; ptr_hf += STEP; @@ -466,38 +466,38 @@ void ACELP_4t64_fx( /* storage order --> i3i0, i2i3, i1i2, i0i1 */ - pos = MSIZE - 1; - ptr_hf = h + 3; + 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]; + 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; + 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); + *p3 = extract_h(cor); cor += vo_L_mult((*ptr_h1), (*ptr_h2)); ptr_h1++; ptr_h2++; - *p2 = extract_h(cor); + *p2 = extract_h(cor); cor += vo_L_mult((*ptr_h1), (*ptr_h2)); ptr_h1++; ptr_h2++; - *p1 = extract_h(cor); + *p1 = extract_h(cor); cor += vo_L_mult((*ptr_h1), (*ptr_h2)); ptr_h1++; ptr_h2++; - *p0 = extract_h(cor); + *p0 = extract_h(cor); p3 -= (NB_POS + 1); p2 -= (NB_POS + 1); @@ -507,7 +507,7 @@ void ACELP_4t64_fx( cor += vo_L_mult((*ptr_h1), (*ptr_h2)); ptr_h1++; ptr_h2++; - *p3 = extract_h(cor); + *p3 = extract_h(cor); pos--; ptr_hf += STEP; @@ -517,22 +517,22 @@ void ACELP_4t64_fx( * Modification of rrixiy[][] to take signs into account. * *------------------------------------------------------------*/ - p0 = &rrixiy[0][0]; + 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; + psign = sign; if (psign[i] < 0) { - psign = vec; + psign = vec; } j = j_temp; for (; j < L_SUBFR; j += STEP) { - *p0 = vo_mult(*p0, psign[j]); + *p0 = vo_mult(*p0, psign[j]); p0++; } } @@ -542,8 +542,8 @@ void ACELP_4t64_fx( * Deep first search * *-------------------------------------------------------------------*/ - psk = -1; - alpk = 1; + psk = -1; + alpk = 1; for (k = 0; k < nbiter; k++) { @@ -553,12 +553,12 @@ void ACELP_4t64_fx( if(nbbits == 20) { - pos = 0; - ps = 0; - alp = 0; + pos = 0; + ps = 0; + alp = 0; for (i = 0; i < L_SUBFR; i++) { - vec[i] = 0; + vec[i] = 0; } } else if ((nbbits == 36) || (nbbits == 44)) { @@ -591,18 +591,18 @@ void ACELP_4t64_fx( if(nbbits == 44) { - ipos[8] = 0; - ipos[9] = 1; + 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]]; + 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) @@ -636,8 +636,8 @@ void ACELP_4t64_fx( if(nbbits == 72) { - ipos[16] = 0; - ipos[17] = 1; + ipos[16] = 0; + ipos[17] = 1; } } @@ -668,8 +668,8 @@ void ACELP_4t64_fx( 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; + ind[j] = ix; + ind[j + 1] = iy; if (sign[ix] < 0) p0 = h_inv - ix; @@ -682,10 +682,10 @@ void ACELP_4t64_fx( 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++)); + 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 */ @@ -693,15 +693,15 @@ void ACELP_4t64_fx( s = vo_L_msu(vo_L_mult(alpk, ps), psk, alp); if (s > 0) { - psk = ps; - alpk = alp; + psk = ps; + alpk = alp; for (i = 0; i < nb_pulse; i++) { - codvec[i] = ind[i]; + codvec[i] = ind[i]; } for (i = 0; i < L_SUBFR; i++) { - y[i] = vec[i]; + y[i] = vec[i]; } } } @@ -710,11 +710,11 @@ void ACELP_4t64_fx( *-------------------------------------------------------------------*/ for (i = 0; i < NPMAXPT * NB_TRACK; i++) { - ind[i] = -1; + ind[i] = -1; } for (i = 0; i < L_SUBFR; i++) { - code[i] = 0; + code[i] = 0; y[i] = vo_shr_r(y[i], 3); /* Q12 to Q9 */ } val = (512 >> h_shift); /* codeword in Q9 format */ @@ -727,12 +727,12 @@ void ACELP_4t64_fx( if (j > 0) { - code[i] += val; - codvec[k] += 128; + code[i] += val; + codvec[k] += 128; } else { - code[i] -= val; - index += NB_POS; + code[i] -= val; + index += NB_POS; } i = (Word16)((vo_L_mult(track, NPMAXPT) >> 1)); @@ -741,10 +741,10 @@ void ACELP_4t64_fx( { i += 1; } - ind[i] = index; + ind[i] = index; } - k = 0; + k = 0; /* Build index of codevector */ if(nbbits == 20) { @@ -849,20 +849,20 @@ void cor_h_vec_30( p2 = &vec[pos]; for (j=pos;j < L_SUBFR; j++) { - L_sum1 += *p1 * *p2; + L_sum1 += *p1 * *p2; p2-=3; - L_sum2 += *p1++ * *p2; + L_sum2 += *p1++ * *p2; p2+=4; } p2-=3; - L_sum2 += *p1++ * *p2++; - L_sum2 += *p1++ * *p2++; - L_sum2 += *p1++ * *p2++; + 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); + 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++); @@ -873,20 +873,20 @@ void cor_h_vec_30( p2 = &vec[pos]; for (j=pos;j < L_SUBFR; j++) { - L_sum1 += *p1 * *p2; + L_sum1 += *p1 * *p2; p2-=3; - L_sum2 += *p1++ * *p2; + L_sum2 += *p1++ * *p2; p2+=4; } p2-=3; - L_sum2 += *p1++ * *p2++; - L_sum2 += *p1++ * *p2++; - L_sum2 += *p1++ * *p2++; + 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); + 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++); @@ -982,17 +982,17 @@ void search_ixiy( Word16 *p0, *p1, *p2; Word32 s, alp0, alp1, alp2; - p0 = cor_x; - p1 = cor_y; - p2 = rrixiy[track_x]; + 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; + sqk = -1; + alpk = 1; for (x = track_x; x < L_SUBFR; x += STEP) { @@ -1014,17 +1014,17 @@ void search_ixiy( if (s > 0) { - sqk = sq; - alpk = alp_16; - pos = y; + sqk = sq; + alpk = alp_16; + pos = y; } } p1 -= NB_POS; if (pos >= 0) { - *ix = x; - *iy = pos; + *ix = x; + *iy = pos; } } else { @@ -1032,8 +1032,8 @@ void search_ixiy( } } - *ps = add1(*ps, add1(dn[*ix], dn[*iy])); - *alp = alpk; + *ps = add1(*ps, add1(dn[*ix], dn[*iy])); + *alp = alpk; return; } diff --git a/media/libstagefright/codecs/amrwbenc/src/convolve.c b/media/libstagefright/codecs/amrwbenc/src/convolve.c index 4f7fd8ac9354..acba532a507f 100644 --- a/media/libstagefright/codecs/amrwbenc/src/convolve.c +++ b/media/libstagefright/codecs/amrwbenc/src/convolve.c @@ -49,7 +49,7 @@ void Convolve ( s += vo_mult32((*tmpX++), (*tmpH--)); i -= 4; } - y[n] = ((s<<1) + 0x8000)>>16; + y[n] = ((s<<1) + 0x8000)>>16; n++; tmpH = h+n; @@ -66,7 +66,7 @@ void Convolve ( s += vo_mult32((*tmpX++), (*tmpH--)); i -= 4; } - y[n] = ((s<<1) + 0x8000)>>16; + y[n] = ((s<<1) + 0x8000)>>16; n++; tmpH = h+n; @@ -84,7 +84,7 @@ void Convolve ( s += vo_mult32((*tmpX++), (*tmpH--)); i -= 4; } - y[n] = ((s<<1) + 0x8000)>>16; + y[n] = ((s<<1) + 0x8000)>>16; n++; s = 0; @@ -99,8 +99,8 @@ void Convolve ( s += vo_mult32((*tmpX++), (*tmpH--)); i -= 4; } - y[n] = ((s<<1) + 0x8000)>>16; - n++; + 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 b645fa3d06fb..d9245ed60ca8 100644 --- a/media/libstagefright/codecs/amrwbenc/src/cor_h_x.c +++ b/media/libstagefright/codecs/amrwbenc/src/cor_h_x.c @@ -18,7 +18,7 @@ * File: cor_h_x.c * * * * Description:Compute correlation between target "x[]" and "h[]" * -* Designed for codebook search (24 pulses, 4 tracks, * +* Designed for codebook search (24 pulses, 4 tracks, * * 4 pulses per track, 16 positions in each track) to * * avoid saturation. * * * @@ -44,8 +44,8 @@ void cor_h_x( 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_tot = 1; + L_max = 0; L_max1 = 0; L_max2 = 0; L_max3 = 0; @@ -57,11 +57,11 @@ void cor_h_x( for (j = i; j < L_SUBFR; j++) L_tmp += vo_L_mult(*p1++, *p2++); - y32[i] = L_tmp; + y32[i] = L_tmp; L_tmp = (L_tmp > 0)? L_tmp:-L_tmp; if(L_tmp > L_max) { - L_max = L_tmp; + L_max = L_tmp; } L_tmp = 1L; @@ -70,11 +70,11 @@ void cor_h_x( for (j = i+1; j < L_SUBFR; j++) L_tmp += vo_L_mult(*p1++, *p2++); - y32[i+1] = L_tmp; + y32[i+1] = L_tmp; L_tmp = (L_tmp > 0)? L_tmp:-L_tmp; if(L_tmp > L_max1) { - L_max1 = L_tmp; + L_max1 = L_tmp; } L_tmp = 1; @@ -83,11 +83,11 @@ void cor_h_x( for (j = i+2; j < L_SUBFR; j++) L_tmp += vo_L_mult(*p1++, *p2++); - y32[i+2] = L_tmp; + y32[i+2] = L_tmp; L_tmp = (L_tmp > 0)? L_tmp:-L_tmp; if(L_tmp > L_max2) { - L_max2 = L_tmp; + L_max2 = L_tmp; } L_tmp = 1; @@ -96,11 +96,11 @@ void cor_h_x( for (j = i+3; j < L_SUBFR; j++) L_tmp += vo_L_mult(*p1++, *p2++); - y32[i+3] = L_tmp; + y32[i+3] = L_tmp; L_tmp = (L_tmp > 0)? L_tmp:-L_tmp; if(L_tmp > L_max3) { - L_max3 = L_tmp; + L_max3 = L_tmp; } } /* tot += 3*max / 8 */ diff --git a/media/libstagefright/codecs/amrwbenc/src/decim54.c b/media/libstagefright/codecs/amrwbenc/src/decim54.c index 7bc55762a827..3b88514ac51b 100644 --- a/media/libstagefright/codecs/amrwbenc/src/decim54.c +++ b/media/libstagefright/codecs/amrwbenc/src/decim54.c @@ -136,8 +136,8 @@ static void Down_samp( 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)); + 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 4ee14490c82f..0c49d6be0b9d 100644 --- a/media/libstagefright/codecs/amrwbenc/src/deemph.c +++ b/media/libstagefright/codecs/amrwbenc/src/deemph.c @@ -39,16 +39,16 @@ void Deemph( L_tmp = L_deposit_h(x[0]); L_tmp = L_mac(L_tmp, *mem, mu); - x[0] = vo_round(L_tmp); + 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); + x[i] = voround(L_tmp); } - *mem = x[L - 1]; + *mem = x[L - 1]; return; } @@ -65,14 +65,14 @@ void Deemph2( Word32 L_tmp; L_tmp = x[0] << 15; L_tmp += ((*mem) * mu)<<1; - x[0] = (L_tmp + 0x8000)>>16; + 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; + x[i] = (L_tmp + 0x8000)>>16; } - *mem = x[L - 1]; + *mem = x[L - 1]; return; } @@ -95,8 +95,8 @@ void Deemph_32( 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; + L_tmp = (L_tmp << 1); + y[0] = (L_tmp + 0x8000)>>16; for (i = 1; i < L; i++) { @@ -104,11 +104,11 @@ void Deemph_32( 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; + L_tmp = (L_tmp << 1); + y[i] = (L_tmp + 0x8000)>>16; } - *mem = y[L - 1]; + *mem = y[L - 1]; return; } diff --git a/media/libstagefright/codecs/amrwbenc/src/dtx.c b/media/libstagefright/codecs/amrwbenc/src/dtx.c index df53131ec463..2cfaced0f148 100644 --- a/media/libstagefright/codecs/amrwbenc/src/dtx.c +++ b/media/libstagefright/codecs/amrwbenc/src/dtx.c @@ -105,30 +105,30 @@ Word16 dtx_enc_reset(dtx_encState * st, Word16 isf_init[]) fprintf(stderr, "dtx_enc_reset: invalid parameter\n"); return -1; } - st->hist_ptr = 0; - st->log_en_index = 0; + 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; + 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; + st->dtxHangoverCount = DTX_HANG_CONST; + st->decAnaElapsedCount = 32767; for (i = 0; i < 28; i++) { - st->D[i] = 0; + st->D[i] = 0; } for (i = 0; i < DTX_HIST_SIZE - 1; i++) { - st->sumD[i] = 0; + st->sumD[i] = 0; } return 1; @@ -279,7 +279,7 @@ Word16 dtx_enc( for (i = 0; i < L_FRAME; i++) { tmp = mult(exc2[i], gain); /* Q0 * Q15 */ - exc2[i] = shl(tmp, exp); + exc2[i] = shl(tmp, exp); } return 0; @@ -301,7 +301,7 @@ Word16 dtx_buffer( Word16 log_en_e; Word16 log_en_m; - st->hist_ptr = add(st->hist_ptr, 1); + st->hist_ptr = add(st->hist_ptr, 1); if(st->hist_ptr == DTX_HIST_SIZE) { st->hist_ptr = 0; @@ -345,7 +345,7 @@ void tx_dtx_handler(dtx_encState * st, /* i/o : State struct */ { /* this state machine is in synch with the GSMEFR txDtx machine */ - st->decAnaElapsedCount = add(st->decAnaElapsedCount, 1); + st->decAnaElapsedCount = add(st->decAnaElapsedCount, 1); if (vad_flag != 0) { @@ -354,8 +354,8 @@ void tx_dtx_handler(dtx_encState * st, /* i/o : State struct */ { /* non-speech */ if (st->dtxHangoverCount == 0) { /* out of decoder analysis hangover */ - st->decAnaElapsedCount = 0; - *usedMode = MRDTX; + st->decAnaElapsedCount = 0; + *usedMode = MRDTX; } else { /* in possible analysis hangover */ st->dtxHangoverCount = sub(st->dtxHangoverCount, 1); @@ -394,8 +394,8 @@ static void aver_isf_history( { 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]; + isf_tmp[k * M + i] = isf_old[indices[k] * M + i]; + isf_old[indices[k] * M + i] = isf_old[indices[2] * M + i]; } } } @@ -403,13 +403,13 @@ static void aver_isf_history( /* Perform the ISF averaging */ for (j = 0; j < M; j++) { - L_tmp = 0; + 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; + isf_aver[j] = L_tmp; } /* Retrieve from isf_tmp[][] the ISF vectors saved prior to averaging */ @@ -441,12 +441,12 @@ static void find_frame_indices( /* 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; + 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]); + st->sumD[i] = L_sub(st->sumD[i], st->D[j]); tmp = sub(tmp, 1); } @@ -458,86 +458,86 @@ static void find_frame_indices( for (i = DTX_HIST_SIZE_MIN_ONE; i > 0; i--) { - st->sumD[i] = st->sumD[i - 1]; + st->sumD[i] = st->sumD[i - 1]; } - st->sumD[0] = 0; + 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; + 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]; + 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; + 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; + ptr = DTX_HIST_SIZE_MIN_ONE; } - L_tmp = 0; + 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; + 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]); + 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; + 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]; + indices[0] = i; + summax = st->sumD[i]; } if (L_sub(st->sumD[i], summin) < 0) { - indices[2] = i; - summin = st->sumD[i]; + indices[2] = i; + summin = st->sumD[i]; } } /* Find the second largest distance */ - summax2nd = -2147483647L; - indices[1] = -1; + 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]; + indices[1] = i; + summax2nd = st->sumD[i]; } } for (i = 0; i < 3; i++) { - indices[i] = sub(st->hist_ptr, indices[i]); + indices[i] = sub(st->hist_ptr, indices[i]); if (indices[i] < 0) { - indices[i] = add(indices[i], DTX_HIST_SIZE); + indices[i] = add(indices[i], DTX_HIST_SIZE); } } @@ -549,7 +549,7 @@ static void find_frame_indices( L_tmp = L_mult(voround(summax), INV_MED_THRESH); if(L_tmp <= summin) { - indices[0] = -1; + indices[0] = -1; } /* If second largest distance/MED_THRESH is smaller than */ /* minimum distance then the median ISF vector replacement is */ @@ -558,7 +558,7 @@ static void find_frame_indices( L_tmp = L_mult(voround(summax2nd), INV_MED_THRESH); if(L_tmp <= summin) { - indices[1] = -1; + indices[1] = -1; } return; } diff --git a/media/libstagefright/codecs/amrwbenc/src/g_pitch.c b/media/libstagefright/codecs/amrwbenc/src/g_pitch.c index f5112c5a0bb2..d681f2e34dc2 100644 --- a/media/libstagefright/codecs/amrwbenc/src/g_pitch.c +++ b/media/libstagefright/codecs/amrwbenc/src/g_pitch.c @@ -48,10 +48,10 @@ Word16 G_pitch( /* (o) Q14 : Gain of pitch lag satura #endif - g_coeff[0] = yy; - g_coeff[1] = exp_yy; - g_coeff[2] = xy; - g_coeff[3] = exp_xy; + 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) @@ -65,12 +65,12 @@ Word16 G_pitch( /* (o) Q14 : Gain of pitch lag satura i = exp_xy; i -= exp_yy; - gain = shl(gain, i); + gain = shl(gain, i); /* if (gain > 1.2) gain = 1.2 in Q14 */ if(gain > 19661) { - 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 24158e3a6858..800b3f991613 100644 --- a/media/libstagefright/codecs/amrwbenc/src/gpclip.c +++ b/media/libstagefright/codecs/amrwbenc/src/gpclip.c @@ -22,7 +22,7 @@ * 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" @@ -38,8 +38,8 @@ void Init_gp_clip( Word16 mem[] /* (o) : memory of gain of pitch clipping algorithm */ ) { - mem[0] = DIST_ISF_MAX; - mem[1] = GAIN_PIT_MIN; + mem[0] = DIST_ISF_MAX; + mem[1] = GAIN_PIT_MIN; } @@ -49,7 +49,7 @@ Word16 Gp_clip( { Word16 clip = 0; if ((mem[0] < DIST_ISF_THRES) && (mem[1] > GAIN_PIT_THRES)) - clip = 1; + clip = 1; return (clip); } @@ -70,7 +70,7 @@ void Gp_clip_test_isf( dist = vo_sub(isf[i], isf[i - 1]); if(dist < dist_min) { - dist_min = dist; + dist_min = dist; } } @@ -78,9 +78,9 @@ void Gp_clip_test_isf( if (dist > DIST_ISF_MAX) { - dist = DIST_ISF_MAX; + dist = DIST_ISF_MAX; } - mem[0] = dist; + mem[0] = dist; return; } @@ -100,9 +100,9 @@ void Gp_clip_test_gain_pit( if(gain < GAIN_PIT_MIN) { - gain = GAIN_PIT_MIN; + gain = GAIN_PIT_MIN; } - mem[1] = gain; + mem[1] = gain; return; } diff --git a/media/libstagefright/codecs/amrwbenc/src/hp400.c b/media/libstagefright/codecs/amrwbenc/src/hp400.c index fa66f1a66e73..a6f970168a89 100644 --- a/media/libstagefright/codecs/amrwbenc/src/hp400.c +++ b/media/libstagefright/codecs/amrwbenc/src/hp400.c @@ -68,8 +68,8 @@ void HP400_12k8( y2_lo = *mem++; y1_hi = *mem++; y1_lo = *mem++; - x0 = *mem++; - x1 = *mem; + x0 = *mem++; + x1 = *mem; num = (Word32)lg; do { @@ -98,7 +98,7 @@ void HP400_12k8( *mem-- = y1_lo; *mem-- = y1_hi; *mem-- = y2_lo; - *mem = y2_hi; + *mem = y2_hi; return; } diff --git a/media/libstagefright/codecs/amrwbenc/src/hp50.c b/media/libstagefright/codecs/amrwbenc/src/hp50.c index 36dd1f1d2950..c1c7b83b4af9 100644 --- a/media/libstagefright/codecs/amrwbenc/src/hp50.c +++ b/media/libstagefright/codecs/amrwbenc/src/hp50.c @@ -70,7 +70,7 @@ void HP50_12k8( y2_lo = *mem++; y1_hi = *mem++; y1_lo = *mem++; - x0 = *mem++; + x0 = *mem++; x1 = *mem; num = (Word32)lg; do @@ -98,7 +98,7 @@ void HP50_12k8( *mem-- = y1_lo; *mem-- = y1_hi; *mem-- = y2_lo; - *mem-- = y2_hi; + *mem-- = y2_hi; return; } diff --git a/media/libstagefright/codecs/amrwbenc/src/hp6k.c b/media/libstagefright/codecs/amrwbenc/src/hp6k.c index 578633a52ee8..8e66eb0c82fb 100644 --- a/media/libstagefright/codecs/amrwbenc/src/hp6k.c +++ b/media/libstagefright/codecs/amrwbenc/src/hp6k.c @@ -20,7 +20,7 @@ * 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" @@ -63,7 +63,7 @@ void Filt_6k_7k( 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]; diff --git a/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c b/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c index 3510272fdfa8..bc1ec49e2e5b 100644 --- a/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c +++ b/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c @@ -88,22 +88,22 @@ void Hp_wsp( 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]; + 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]; + 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] */ @@ -122,25 +122,25 @@ void Hp_wsp( L_tmp = L_tmp << 2; - y3_hi = y2_hi; - y3_lo = y2_lo; - y2_hi = y1_hi; - y2_lo = y1_lo; + 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; + 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; + 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 88285e8ee73c..1119bc707863 100644 --- a/media/libstagefright/codecs/amrwbenc/src/int_lpc.c +++ b/media/libstagefright/codecs/amrwbenc/src/int_lpc.c @@ -36,21 +36,21 @@ void Int_isp( Word16 Az[] /* output: LP coefficients in 4 subframes */ ) { - Word32 i, k; + 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_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[i] = (L_tmp + 0x8000)>>16; } Isp_Az(isp, Az, M, 0); Az += MP1; diff --git a/media/libstagefright/codecs/amrwbenc/src/isp_az.c b/media/libstagefright/codecs/amrwbenc/src/isp_az.c index c235c5d1d363..30a8bbdcc424 100644 --- a/media/libstagefright/codecs/amrwbenc/src/isp_az.c +++ b/media/libstagefright/codecs/amrwbenc/src/isp_az.c @@ -42,7 +42,7 @@ void Isp_Az( /* 1 : adaptive scaling enabled */ ) { - Word32 i, j; + Word32 i, j; Word16 hi, lo; Word32 f1[NC16k + 1], f2[NC16k]; Word16 nc; @@ -92,14 +92,14 @@ void Isp_Az( lo = (f1[i] & 0xffff)>>1; t0 = Mpy_32_16(hi, lo, isp[m - 1]); - f1[i] = vo_L_add(f1[i], t0); + 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); + f2[i] = vo_L_sub(f2[i], t0); } /*-----------------------------------------------------* @@ -108,20 +108,20 @@ void Isp_Az( *-----------------------------------------------------*/ /* a[0] = 1.0; */ - a[0] = 4096; - tmax = 1; + 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); + 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); + tmax |= L_abs(t0); a[j] = (Word16)(vo_L_shr_r(t0, 12)); /* from Q23 to Q12 and * 0.5 */ } @@ -144,12 +144,12 @@ void Isp_Az( 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); + a[0] = shr(a[0], q); } else { - q_sug = 12; - q = 0; + q_sug = 12; + q = 0; } /* a[NC] = 0.5*f1[NC]*(1.0 + isp[M-1]); */ hi = f1[nc] >> 16; @@ -196,7 +196,7 @@ static void Get_isp_pol(Word16 * isp, Word32 * f, Word16 n) isp += 2; /* Advance isp pointer */ for (i = 2; i <= n; i++) { - *f = f[-2]; + *f = f[-2]; for (j = 1; j < i; j++, f--) { hi = f[-1]>>16; @@ -228,7 +228,7 @@ static void Get_isp_pol_16kHz(Word16 * isp, Word32 * f, Word16 n) for (i = 2; i <= n; i++) { - *f = f[-2]; + *f = f[-2]; for (j = 1; j < i; j++, f--) { VO_L_Extract(f[-1], &hi, &lo); diff --git a/media/libstagefright/codecs/amrwbenc/src/isp_isf.c b/media/libstagefright/codecs/amrwbenc/src/isp_isf.c index fbe80eb5a16e..b4ba408c3175 100644 --- a/media/libstagefright/codecs/amrwbenc/src/isp_isf.c +++ b/media/libstagefright/codecs/amrwbenc/src/isp_isf.c @@ -51,9 +51,9 @@ void Isp_isf( /* 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[i] = add1(isf[i], (ind << 7)); } - isf[m - 1] = (isf[m - 1] >> 1); + isf[m - 1] = (isf[m - 1] >> 1); return; } @@ -69,7 +69,7 @@ void Isf_isp( for (i = 0; i < m - 1; i++) { - isp[i] = isf[i]; + isp[i] = isf[i]; } isp[m - 1] = (isf[m - 1] << 1); @@ -80,7 +80,7 @@ void Isf_isp( /* 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))); + isp[i] = add1(table[ind], (Word16)((L_tmp >> 8))); } return; diff --git a/media/libstagefright/codecs/amrwbenc/src/levinson.c b/media/libstagefright/codecs/amrwbenc/src/levinson.c index a68845f24cd3..4b2f8ed90063 100644 --- a/media/libstagefright/codecs/amrwbenc/src/levinson.c +++ b/media/libstagefright/codecs/amrwbenc/src/levinson.c @@ -122,8 +122,8 @@ void Levinson( Word16 *old_A, *old_rc; /* Last A(z) for case of unstable filter */ - old_A = mem; - old_rc = mem + M; + old_A = mem; + old_rc = mem + M; /* K = A[1] = -R[1] / R[0] */ @@ -135,7 +135,7 @@ void Levinson( Kh = t0 >> 16; Kl = (t0 & 0xffff)>>1; - rc[0] = Kh; + rc[0] = Kh; t0 = (t0 >> 4); /* A[1] in Q27 */ Ah[1] = t0 >> 16; @@ -163,7 +163,7 @@ void Levinson( for (i = 2; i <= M; i++) { /* t0 = SUM ( R[j]*A[i-j] ,j=1,i-1 ) + R[i] */ - t0 = 0; + 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])); @@ -182,14 +182,14 @@ void Levinson( Kh = t2 >> 16; Kl = (t2 & 0xffff)>>1; - rc[i - 1] = Kh; + 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]; + A[j + 1] = old_A[j]; } rc[0] = old_rc[0]; /* only two rc coefficients are needed */ rc[1] = old_rc[1]; @@ -229,19 +229,19 @@ void Levinson( /* A[j] = An[j] */ for (j = 1; j <= i; j++) { - Ah[j] = Anh[j]; - Al[j] = Anl[j]; + Ah[j] = Anh[j]; + Al[j] = Anl[j]; } } /* Truncate A[i] in Q27 to Q12 with rounding */ - A[0] = 4096; + 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_A[i - 1] = A[i] = vo_round((t0 << 1)); } - old_rc[0] = rc[0]; - old_rc[1] = rc[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 646d6afd4369..0f655416c866 100644 --- a/media/libstagefright/codecs/amrwbenc/src/log2.c +++ b/media/libstagefright/codecs/amrwbenc/src/log2.c @@ -64,11 +64,11 @@ void Log2_norm ( Word32 L_y; if (L_x <= (Word32) 0) { - *exponent = 0; - *fraction = 0; + *exponent = 0; + *fraction = 0; return; } - *exponent = (30 - exp); + *exponent = (30 - exp); L_x = (L_x >> 9); i = extract_h (L_x); /* Extract b25-b31 */ L_x = (L_x >> 1); @@ -78,7 +78,7 @@ void Log2_norm ( 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); + *fraction = extract_h (L_y); return; } diff --git a/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c b/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c index 29bd46b2b27a..1d5d07641e77 100644 --- a/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c +++ b/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c @@ -42,25 +42,25 @@ void LP_Decim2( Word32 i, j; Word32 L_tmp; /* copy initial filter states into buffer */ - p_x = x_buf; + p_x = x_buf; for (i = 0; i < L_MEM; i++) { - *p_x++ = mem[i]; - mem[i] = x[l - L_MEM + i]; + *p_x++ = mem[i]; + mem[i] = x[l - L_MEM + i]; } for (i = 0; i < l; i++) { - *p_x++ = x[i]; + *p_x++ = x[i]; } for (i = 0, j = 0; i < l; i += 2, j++) { - p_x = &x_buf[i]; + 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; + 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 1a7b513724bd..7affbb20d81f 100644 --- a/media/libstagefright/codecs/amrwbenc/src/math_op.c +++ b/media/libstagefright/codecs/amrwbenc/src/math_op.c @@ -106,21 +106,21 @@ void Isqrt_n( if (*frac <= (Word32) 0) { - *exp = 0; - *frac = 0x7fffffffL; + *exp = 0; + *frac = 0x7fffffffL; return; } if((*exp & 1) == 1) /*If exponant odd -> shift right */ *frac = (*frac) >> 1; - *exp = negate((*exp - 1) >> 1); + *exp = negate((*exp - 1) >> 1); - *frac = (*frac >> 9); + *frac = (*frac >> 9); i = extract_h(*frac); /* Extract b25-b31 */ - *frac = (*frac >> 1); + *frac = (*frac >> 1); a = (Word16)(*frac); /* Extract b10-b24 */ - a = (Word16) (a & (Word16) 0x7fff); + 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]) */ @@ -167,7 +167,7 @@ Word32 Pow2( /* (o) Q0 : result (range: 0<= 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); + 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] */ diff --git a/media/libstagefright/codecs/amrwbenc/src/mem_align.c b/media/libstagefright/codecs/amrwbenc/src/mem_align.c index e58915a0a0f8..a29baf3830b3 100644 --- a/media/libstagefright/codecs/amrwbenc/src/mem_align.c +++ b/media/libstagefright/codecs/amrwbenc/src/mem_align.c @@ -27,7 +27,7 @@ /***************************************************************************** * * function name: mem_malloc -* description: malloc the alignments memory +* description: malloc the alignments memory * returns: the point of the memory * **********************************************************************************/ diff --git a/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c b/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c index 08f430f70718..b8174b91b4ea 100644 --- a/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c +++ b/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c @@ -18,7 +18,7 @@ * File: p_med_ol.c * * * * Description: Compute the open loop pitch lag * -* output: open loop pitch lag * +* output: open loop pitch lag * ************************************************************************/ #include "typedef.h" @@ -29,7 +29,7 @@ #include "p_med_ol.tab" Word16 Pitch_med_ol( - Word16 wsp[], /* i: signal used to compute the open loop pitch*/ + 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 */ @@ -52,8 +52,8 @@ Word16 Pitch_med_ol( ww = &corrweight[198]; we = &corrweight[98 + L_max - L_0]; - max = MIN_32; - Tm = 0; + max = MIN_32; + Tm = 0; for (i = L_max; i > L_min; i--) { /* Compute the correlation */ @@ -65,7 +65,7 @@ Word16 Pitch_med_ol( R0 += vo_L_mult((*p1++), (*p2++)); 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; @@ -90,13 +90,13 @@ Word16 Pitch_med_ol( } /* Hypass the wsp[] vector */ - hp_wsp = old_hp_wsp + L_max; + 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; + R0 = 0; + R1 = 0; + R2 = 0; p1 = hp_wsp; p2 = hp_wsp - Tm; for (j = 0; j < L_frame; j+=4) @@ -174,57 +174,57 @@ 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]; + x1 = x[-2]; + x2 = x[-1]; + x3 = x[0]; + x4 = x[1]; + x5 = x[2]; if (x2 < x1) { tmp = x1; x1 = x2; - x2 = tmp; + x2 = tmp; } if (x3 < x1) { tmp = x1; x1 = x3; - x3 = tmp; + x3 = tmp; } if (x4 < x1) { tmp = x1; x1 = x4; - x4 = tmp; + x4 = tmp; } if (x5 < x1) { - x5 = x1; + x5 = x1; } if (x3 < x2) { tmp = x2; x2 = x3; - x3 = tmp; + x3 = tmp; } if (x4 < x2) { tmp = x2; x2 = x4; - x4 = tmp; + x4 = tmp; } if (x5 < x2) { - x5 = x2; + x5 = x2; } if (x4 < x3) { - x3 = x4; + x3 = x4; } if (x5 < x3) { - x3 = x5; + x3 = x5; } return (x3); } @@ -241,10 +241,10 @@ Word16 Med_olag( /* output : median of 5 previous ope for (i = 4; i > 0; i--) { - old_ol_lag[i] = old_ol_lag[i - 1]; + old_ol_lag[i] = old_ol_lag[i - 1]; } - old_ol_lag[0] = prev_ol_lag; + old_ol_lag[0] = prev_ol_lag; i = median5(&old_ol_lag[2]); diff --git a/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c b/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c index 41d7413fd45f..0d66c3158c5f 100644 --- a/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c +++ b/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c @@ -90,7 +90,7 @@ Word16 Pitch_fr4( /* (o) : pitch period. 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 +#endif /* Find integer pitch */ @@ -100,8 +100,8 @@ Word16 Pitch_fr4( /* (o) : pitch period. { if (corr[i] >= max) { - max = corr[i]; - t0 = i; + max = corr[i]; + t0 = i; } } /* If first subframe and t0 >= t0_fr1, do not search fractionnal pitch */ @@ -182,7 +182,7 @@ static void Norm_Corr( #endif /* Compute rounded down 1/sqrt(energy of xn[]) */ - L_tmp = 0; + L_tmp = 0; for (i = 0; i < 64; i+=4) { L_tmp += (xn[i] * xn[i]); @@ -202,7 +202,7 @@ static void Norm_Corr( for (t = t_min; t <= t_max; t++) { /* Compute correlation between xn[] and excf[] */ - L_tmp = 0; + L_tmp = 0; L_tmp1 = 0; for (i = 0; i < 64; i+=4) { @@ -246,7 +246,7 @@ static void Norm_Corr( L_tmp = L_tmp << L_tmp2; } - corr_norm[t] = vo_round(L_tmp); + corr_norm[t] = vo_round(L_tmp); /* modify the filtered excitation excf[] for the next iteration */ if(t != t_max) @@ -310,10 +310,10 @@ static Word16 Interpol_4( /* (o) : interpolated value */ 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[4], (*ptr++)); L_sum += vo_mult32(x[5], (*ptr++)); L_sum += vo_mult32(x[6], (*ptr++)); - L_sum += vo_mult32(x[7], (*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 b35965143fea..8404cf9d4d5c 100644 --- a/media/libstagefright/codecs/amrwbenc/src/pred_lt4.c +++ b/media/libstagefright/codecs/amrwbenc/src/pred_lt4.c @@ -60,13 +60,13 @@ void Pred_lt4( Word16 *ptr, *ptr1; Word16 *ptr2; - x = exc - T0; + 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 */ diff --git a/media/libstagefright/codecs/amrwbenc/src/preemph.c b/media/libstagefright/codecs/amrwbenc/src/preemph.c index 54086174fb8c..c867bf7598bc 100644 --- a/media/libstagefright/codecs/amrwbenc/src/preemph.c +++ b/media/libstagefright/codecs/amrwbenc/src/preemph.c @@ -35,20 +35,20 @@ void Preemph( Word16 temp; Word32 i, L_tmp; - temp = x[lg - 1]; + 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; + x[i] = (L_tmp + 0x8000)>>16; } L_tmp = L_deposit_h(x[0]); L_tmp -= ((*mem) * mu)<<1; - x[0] = (L_tmp + 0x8000)>>16; + x[0] = (L_tmp + 0x8000)>>16; - *mem = temp; + *mem = temp; return; } @@ -64,22 +64,22 @@ void Preemph2( Word16 temp; Word32 i, L_tmp; - temp = x[lg - 1]; + 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; + 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; + x[0] = (L_tmp + 0x8000)>>16; - *mem = temp; + *mem = temp; return; } diff --git a/media/libstagefright/codecs/amrwbenc/src/q_gain2.c b/media/libstagefright/codecs/amrwbenc/src/q_gain2.c index 7bc299f887fd..e8ca043ec5ed 100644 --- a/media/libstagefright/codecs/amrwbenc/src/q_gain2.c +++ b/media/libstagefright/codecs/amrwbenc/src/q_gain2.c @@ -83,7 +83,7 @@ Word16 Q_gain2( /* Return index of quantization. Word32 i, j, L_tmp, dist_min; Word16 *past_qua_en, *t_qua_gain; - past_qua_en = mem; + past_qua_en = mem; /*-----------------------------------------------------------------* * - Find the initial quantization pitch index * @@ -91,9 +91,9 @@ Word16 Q_gain2( /* Return index of quantization. *-----------------------------------------------------------------*/ if (nbits == 6) { - t_qua_gain = t_qua_gain6b; - min_ind = 0; - size = RANGE; + t_qua_gain = t_qua_gain6b; + min_ind = 0; + size = RANGE; if(gp_clip == 1) { @@ -101,18 +101,18 @@ Word16 Q_gain2( /* Return index of quantization. } } else { - t_qua_gain = t_qua_gain7b; + t_qua_gain = t_qua_gain7b; p = t_qua_gain7b + RANGE; /* pt at 1/4th of table */ - j = nb_qua_gain7b - RANGE; + 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; + min_ind = 0; + g_pitch = *gain_pit; for (i = 0; i < j; i++, p += 2) { @@ -121,7 +121,7 @@ Word16 Q_gain2( /* Return index of quantization. min_ind = min_ind + 1; } } - size = RANGE; + size = RANGE; } /*------------------------------------------------------------------* @@ -137,10 +137,10 @@ Word16 Q_gain2( /* Return index of quantization. * are in vector g_coeff[]. * *------------------------------------------------------------------*/ - coeff[0] = g_coeff[0]; - exp_coeff[0] = g_coeff[1]; + 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; + exp_coeff[1] = g_coeff[3] + 1; /* Compute scalar product <y2[],y2[]> */ #ifdef ASM_OPT /* asm optimization branch */ @@ -242,20 +242,20 @@ Word16 Q_gain2( /* Return index of quantization. *-------------------------------------------------------------------------*/ 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)); + 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]; + e_max = exp_max[0]; for (i = 1; i < 5; i++) { if(exp_max[i] > e_max) { - e_max = exp_max[i]; + e_max = exp_max[i]; } } @@ -271,14 +271,14 @@ Word16 Q_gain2( /* Return index of quantization. } /* Codebook search */ - dist_min = MAX_32; - p = &t_qua_gain[min_ind << 1]; + dist_min = MAX_32; + p = &t_qua_gain[min_ind << 1]; - index = 0; + index = 0; for (i = 0; i < size; i++) { - g_pitch = *p++; - g_code = *p++; + g_pitch = *p++; + g_code = *p++; g_code = ((g_code * gcode0) + 0x4000)>>15; g2_pitch = ((g_pitch * g_pitch) + 0x4000)>>15; @@ -302,14 +302,14 @@ Word16 Q_gain2( /* Return index of quantization. if(L_tmp < dist_min) { - dist_min = L_tmp; - index = i; + dist_min = L_tmp; + index = i; } } /* Read the quantized gains */ index = index + min_ind; - p = &t_qua_gain[(index + index)]; + p = &t_qua_gain[(index + index)]; *gain_pit = *p++; /* selected pitch gain in Q14 */ g_code = *p++; /* selected code gain in Q11 */ @@ -333,10 +333,10 @@ Word16 Q_gain2( /* Return index of quantization. /* 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; + 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 496ca8076b6a..80a0b738bbdd 100644 --- a/media/libstagefright/codecs/amrwbenc/src/q_pulse.c +++ b/media/libstagefright/codecs/amrwbenc/src/q_pulse.c @@ -82,7 +82,7 @@ Word32 quant_2p_2N1( /* (o) return (2*N)+1 bits */ 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)))); + index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask)))); if ((pos2 & NB_POS) != 0) { tmp = (N << 1); /* index += 1 << (2*N); */ @@ -91,7 +91,7 @@ Word32 quant_2p_2N1( /* (o) return (2*N)+1 bits */ } else { /* index = ((pos1 & mask) << N) + (pos2 & mask); */ - index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask)))); + index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask)))); if ((pos1 & NB_POS) != 0) { tmp = (N << 1); @@ -120,14 +120,14 @@ Word32 quant_3p_3N1( /* (o) return (3*N)+1 bits */ { 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 = 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 = 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) << @@ -136,7 +136,7 @@ Word32 quant_3p_3N1( /* (o) return (3*N)+1 bits */ { 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 = 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))); } @@ -162,21 +162,21 @@ Word32 quant_4p_4N1( /* (o) return (4*N)+1 bits */ { 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 = 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 = 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 = 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))); } @@ -192,20 +192,20 @@ Word32 quant_4p_4N( /* (o) return 4*N bits */ Word16 posA[4], posB[4]; Word32 i, j, k, index; - n_1 = (Word16) (N - 1); + 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; + i = 0; + j = 0; for (k = 0; k < 4; k++) { if ((pos[k] & nb_pos) == 0) { - posA[i++] = pos[k]; + posA[i++] = pos[k]; } else { - posB[j++] = pos[k]; + posB[j++] = pos[k]; } } @@ -258,19 +258,19 @@ Word32 quant_5p_5N( /* (o) return 5*N bits */ Word16 posA[5], posB[5]; Word32 i, j, k, index, tmp2; - n_1 = (Word16) (N - 1); + n_1 = (Word16) (N - 1); nb_pos = (1 << n_1); /* nb_pos = (1<<n_1); */ - i = 0; - j = 0; + i = 0; + j = 0; for (k = 0; k < 5; k++) { if ((pos[k] & nb_pos) == 0) { - posA[i++] = pos[k]; + posA[i++] = pos[k]; } else { - posB[j++] = pos[k]; + posB[j++] = pos[k]; } } @@ -333,19 +333,19 @@ Word32 quant_6p_6N_2( /* (o) return (6*N)-2 bits */ 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); + n_1 = (Word16) (N - 1); nb_pos = (1 << n_1); /* nb_pos = (1<<n_1); */ - i = 0; - j = 0; + i = 0; + j = 0; for (k = 0; k < 6; k++) { if ((pos[k] & nb_pos) == 0) { - posA[i++] = pos[k]; + posA[i++] = pos[k]; } else { - posB[j++] = pos[k]; + posB[j++] = pos[k]; } } @@ -368,23 +368,23 @@ Word32 quant_6p_6N_2( /* (o) return (6*N)-2 bits */ 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) << (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 =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; + 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; + 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; + 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; diff --git a/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c b/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c index f6d53dec49ca..fc2f00d5fdfe 100644 --- a/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c +++ b/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c @@ -43,14 +43,14 @@ void Qisf_ns( for (i = 0; i < ORDER; i++) { - isf_q[i] = sub(isf1[i], mean_isf_noise[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); + 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 */ @@ -78,28 +78,28 @@ void Disf_ns( for (i = 0; i < 2; i++) { - isf_q[i] = dico1_isf_noise[indice[0] * 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]; + 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]; + 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]; + 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]; + 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]); + isf_q[i] = add(isf_q[i], mean_isf_noise[i]); } Reorder_isf(isf_q, ISF_GAP, ORDER); diff --git a/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c b/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c index ac13a679530a..c711cd041f88 100644 --- a/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c +++ b/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c @@ -70,30 +70,30 @@ void Qpisf_2s_46b( 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])); + 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; + 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]); + 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); + 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); + 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); + 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]; + distance = temp; + indice[0] = surv1[k]; for (i = 0; i < 3; i++) { indice[i + 2] = tmp_ind[i]; @@ -104,24 +104,24 @@ void Qpisf_2s_46b( VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv); - distance = MAX_32; + 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]); + 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; + 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]; + distance = temp; + indice[1] = surv1[k]; for (i = 0; i < 2; i++) { indice[i + 5] = tmp_ind[i]; @@ -165,24 +165,24 @@ void Qpisf_2s_36b( VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv); - distance = MAX_32; + 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]); + 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); + 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]; + distance = temp; + indice[0] = surv1[k]; for (i = 0; i < 2; i++) { indice[i + 2] = tmp_ind[i]; @@ -191,23 +191,23 @@ void Qpisf_2s_36b( } VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv); - distance = MAX_32; + 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]); + 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; + 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]; + distance = temp; + indice[1] = surv1[k]; + indice[4] = tmp_ind[0]; } } @@ -239,32 +239,32 @@ void Dpisf_2s_46b( { for (i = 0; i < 9; i++) { - isf_q[i] = dico1_isf[indice[0] * 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]; + 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]); + 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]); + 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]); + 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; + past_isfq[i] = tmp; } if (enc_dec) @@ -273,9 +273,9 @@ void Dpisf_2s_46b( { for (j = (L_MEANBUF - 1); j > 0; j--) { - isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; + isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; } - isf_buf[i] = isf_q[i]; + isf_buf[i] = isf_q[i]; } } } else @@ -293,14 +293,14 @@ void Dpisf_2s_46b( /* 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])); + 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] = vo_sub(isf_q[i], tmp); past_isfq[i] = (past_isfq[i] >> 1); /* past_isfq[i] *= 0.5 */ } } @@ -332,32 +332,32 @@ void Dpisf_2s_36b( { for (i = 0; i < 9; i++) { - isf_q[i] = dico1_isf[indice[0] * 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]; + 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]); + 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]); + 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]); + 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; + 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; } @@ -367,9 +367,9 @@ void Dpisf_2s_36b( { for (j = (L_MEANBUF - 1); j > 0; j--) { - isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; + isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; } - isf_buf[i] = isf_q[i]; + isf_buf[i] = isf_q[i]; } } } else @@ -381,20 +381,20 @@ void Dpisf_2s_36b( { L_tmp += (isf_buf[j * M + i] << 14); } - ref_isf[i] = vo_round(L_tmp); + 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])); + 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] = vo_sub(isf_q[i], tmp); past_isfq[i] = past_isfq[i] >> 1; /* past_isfq[i] *= 0.5 */ } } @@ -424,15 +424,15 @@ void Reorder_isf( Word16 n /* (i) : number of ISF */ ) { - Word32 i; + Word32 i; Word16 isf_min; - isf_min = min_dist; + isf_min = min_dist; for (i = 0; i < n - 1; i++) { if(isf[i] < isf_min) { - isf[i] = isf_min; + isf[i] = isf_min; } isf_min = (isf[i] + min_dist); } @@ -452,13 +452,13 @@ Word16 Sub_VQ( /* output: return quantization index Word32 i, j, index; Word32 dist_min, dist; - dist_min = MAX_32; - p_dico = dico; + dist_min = MAX_32; + p_dico = dico; - index = 0; + index = 0; for (i = 0; i < dico_size; i++) { - dist = 0; + dist = 0; for (j = 0; j < dim; j++) { @@ -468,18 +468,18 @@ Word16 Sub_VQ( /* output: return quantization index if(dist < dist_min) { - dist_min = dist; - index = i; + dist_min = dist; + index = i; } } - *distance = dist_min; + *distance = dist_min; /* Reading the selected vector */ - p_dico = &dico[index * dim]; + p_dico = &dico[index * dim]; for (j = 0; j < dim; j++) { - x[j] = *p_dico++; + x[j] = *p_dico++; } return index; @@ -508,11 +508,11 @@ static void VQ_stage1( index[2] = 2; index[3] = 3; - p_dico = dico; + p_dico = dico; for (i = 0; i < dico_size; i++) { - dist = 0; + dist = 0; for (j = 0; j < dim; j++) { temp = x[j] - (*p_dico++); @@ -525,11 +525,11 @@ static void VQ_stage1( { for (l = surv - 1; l > k; l--) { - dist_min[l] = dist_min[l - 1]; - index[l] = index[l - 1]; + dist_min[l] = dist_min[l - 1]; + index[l] = index[l - 1]; } - dist_min[k] = dist; - index[k] = i; + dist_min[k] = dist; + index[k] = i; break; } } diff --git a/media/libstagefright/codecs/amrwbenc/src/residu.c b/media/libstagefright/codecs/amrwbenc/src/residu.c index 328aed24c19e..b0c04b521d27 100644 --- a/media/libstagefright/codecs/amrwbenc/src/residu.c +++ b/media/libstagefright/codecs/amrwbenc/src/residu.c @@ -56,7 +56,7 @@ void Residu( s += vo_mult32((*p1++), (*p2--)); s += vo_mult32((*p1), (*p2)); - s = L_shl2(s, 5); + s = L_shl2(s, 5); y[i] = extract_h(L_add(s, 0x8000)); } diff --git a/media/libstagefright/codecs/amrwbenc/src/scale.c b/media/libstagefright/codecs/amrwbenc/src/scale.c index b203bec3586c..418cc064b2f3 100644 --- a/media/libstagefright/codecs/amrwbenc/src/scale.c +++ b/media/libstagefright/codecs/amrwbenc/src/scale.c @@ -36,8 +36,8 @@ void Scale_sig( { for (i = lg - 1 ; i >= 0; i--) { - L_tmp = L_shl2(x[i], 16 + exp); - x[i] = extract_h(L_add(L_tmp, 0x8000)); + L_tmp = L_shl2(x[i], 16 + exp); + x[i] = extract_h(L_add(L_tmp, 0x8000)); } } else @@ -46,8 +46,8 @@ void Scale_sig( for (i = lg - 1; i >= 0; i--) { L_tmp = x[i] << 16; - L_tmp >>= exp; - x[i] = (L_tmp + 0x8000)>>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 bdf0d467be49..780f0090b152 100644 --- a/media/libstagefright/codecs/amrwbenc/src/stream.c +++ b/media/libstagefright/codecs/amrwbenc/src/stream.c @@ -29,11 +29,11 @@ void voAWB_InitFrameBuffer(FrameStream *stream) stream->frame_ptr_bk = stream->frame_ptr; stream->set_len = 0; stream->framebuffer_len = 0; - stream->frame_storelen = 0; + stream->frame_storelen = 0; } void voAWB_UpdateFrameBuffer( - FrameStream *stream, + FrameStream *stream, VO_MEM_OPERATOR *pMemOP ) { @@ -53,6 +53,6 @@ void voAWB_FlushFrameBuffer(FrameStream *stream) stream->frame_ptr_bk = stream->frame_ptr; stream->set_len = 0; stream->framebuffer_len = 0; - stream->frame_storelen = 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 90fafb032739..1bda05a0f8ff 100644 --- a/media/libstagefright/codecs/amrwbenc/src/syn_filt.c +++ b/media/libstagefright/codecs/amrwbenc/src/syn_filt.c @@ -39,11 +39,11 @@ void Syn_filt( Word16 y_buf[L_SUBFR16k + M16k]; Word32 L_tmp; Word16 *yy, *p1, *p2; - yy = &y_buf[0]; + yy = &y_buf[0]; /* copy initial filter states into synthesis buffer */ for (i = 0; i < 16; i++) { - *yy++ = mem[i]; + *yy++ = mem[i]; } a0 = (a[0] >> 1); /* input / 2 */ /* Do the filtering. */ @@ -70,7 +70,7 @@ void Syn_filt( L_tmp -= vo_mult32((*p1), (*p2)); L_tmp = L_shl2(L_tmp, 4); - y[i] = yy[i] = extract_h(L_add(L_tmp, 0x8000)); + y[i] = yy[i] = extract_h(L_add(L_tmp, 0x8000)); } /* Update memory if required */ if (update) @@ -99,7 +99,7 @@ void Syn_filt_32( /* Do the filtering. */ for (i = 0; i < lg; i++) { - L_tmp = 0; + L_tmp = 0; L_tmp1 = 0; p1 = a; p2 = &sig_lo[i - 1]; @@ -138,18 +138,18 @@ void Syn_filt_32( L_tmp -= vo_mult32((*p2--), (*p1)); L_tmp1 -= vo_mult32((*p3--), (*p1++)); - L_tmp = L_tmp >> 11; + 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_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))); + 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 eda2b1c4af15..96779fd3774e 100644 --- a/media/libstagefright/codecs/amrwbenc/src/updt_tar.c +++ b/media/libstagefright/codecs/amrwbenc/src/updt_tar.c @@ -39,7 +39,7 @@ void Updt_tar( { L_tmp = x[i] << 15; L_tmp -= (y[i] * gain)<<1; - x2[i] = extract_h(L_shl2(L_tmp, 1)); + x2[i] = extract_h(L_shl2(L_tmp, 1)); } return; diff --git a/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c b/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c index bac00dd6ccc1..0f4d689aaa79 100644 --- a/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c +++ b/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c @@ -84,11 +84,11 @@ void Reset_encoder(void *st, Word16 reset_all) 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; + 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; + cod_state->L_gc_thres = 0; if (reset_all != 0) { /* Static vectors to zero */ @@ -105,21 +105,21 @@ void Reset_encoder(void *st, Word16 reset_all) 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; + 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; + 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; + 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); @@ -129,10 +129,10 @@ void Reset_encoder(void *st, Word16 reset_all) 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; + cod_state->mem_deemph = 0; + cod_state->seed2 = 21845; Init_Filt_6k_7k(cod_state->mem_hf2); - cod_state->gain_alpha = 32767; + 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); @@ -212,8 +212,8 @@ void coder( st = (Coder_State *) spe_state; - *ser_size = nb_of_bits[*mode]; - codec_mode = *mode; + *ser_size = nb_of_bits[*mode]; + codec_mode = *mode; /*--------------------------------------------------------------------------* * Initialize pointers to speech vector. * @@ -233,10 +233,10 @@ void coder( 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; + p_window = old_speech + L_TOTAL - L_WINDOW; - exc = old_exc + PIT_MAX + L_INTERPOL; - wsp = old_wsp + (PIT_MAX / OPL_DECIM); + 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); @@ -287,7 +287,7 @@ void coder( L_tmp = L_abs(L_tmp); if(L_tmp > L_max) { - L_max = L_tmp; + L_max = L_tmp; } } @@ -297,50 +297,50 @@ void coder( tmp = extract_h(L_max); if (tmp == 0) { - shift = Q_MAX; + shift = Q_MAX; } else { shift = norm_s(tmp) - 1; if (shift < 0) { - shift = 0; + shift = 0; } if (shift > Q_MAX) { - shift = Q_MAX; + shift = Q_MAX; } } - Q_new = shift; + Q_new = shift; if (Q_new > st->Q_max[0]) { - 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]; + 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; + 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]; + 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); + 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); + new_speech[0] = vo_round(L_tmp); - st->mem_preemph = tmp; + st->mem_preemph = tmp; /* scale previous samples and memory */ @@ -364,13 +364,13 @@ void coder( Scale_sig(buf, L_FRAME, 1 - Q_new); #endif - vad_flag = wb_vad(st->vadSt, buf); /* Voice Activity Detection */ + vad_flag = wb_vad(st->vadSt, buf); /* Voice Activity Detection */ if (vad_flag == 0) { - st->vad_hist = (st->vad_hist + 1); + st->vad_hist = (st->vad_hist + 1); } else { - st->vad_hist = 0; + st->vad_hist = 0; } /* DTX processing */ @@ -378,7 +378,7 @@ void coder( { /* Note that mode may change here */ tx_dtx_handler(st->dtx_encSt, vad_flag, mode); - *ser_size = nb_of_bits[*mode]; + *ser_size = nb_of_bits[*mode]; } if(*mode != MRDTX) @@ -423,7 +423,7 @@ void coder( * - scale wsp[] to avoid overflow in pitch estimation * * - Find open loop pitch lag for whole speech frame * *----------------------------------------------------------------------*/ - p_A = A; + p_A = A; for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) { /* Weighting of LPC coefficients */ @@ -435,27 +435,27 @@ void coder( Residu(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR); #endif - p_A += (M + 1); + p_A += (M + 1); } Deemph2(wsp, TILT_FAC, L_FRAME, &(st->mem_wsp)); /* find maximum value on wsp[] for 12 bits scaling */ - max = 0; + max = 0; for (i = 0; i < L_FRAME; i++) { tmp = abs_s(wsp[i]); if(tmp > max) { - max = tmp; + max = tmp; } } - tmp = st->old_wsp_max; + tmp = st->old_wsp_max; if(max > tmp) { tmp = max; /* tmp = max(wsp_max, old_wsp_max) */ } - st->old_wsp_max = max; + st->old_wsp_max = max; shift = norm_s(tmp) - 3; if (shift > 0) @@ -494,8 +494,8 @@ void coder( 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; + 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); @@ -507,7 +507,7 @@ void coder( st->ol_wght_flg = 1; wb_vad_tone_detection(st->vadSt, st->ol_gain); - T_op *= OPL_DECIM; + T_op *= OPL_DECIM; if(*ser_size != NBBITS_7k) { @@ -516,11 +516,11 @@ void coder( 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; + 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); + st->ada_w = mult(st->ada_w, 29491); } if(st->ada_w < 26214) @@ -530,11 +530,11 @@ void coder( wb_vad_tone_detection(st->vadSt, st->ol_gain); - T_op2 *= OPL_DECIM; + T_op2 *= OPL_DECIM; } else { - T_op2 = T_op; + T_op2 = T_op; } /*----------------------------------------------------------------------* * DTX-CNG * @@ -550,10 +550,10 @@ void coder( for (i = 0; i < L_FRAME; i++) { - exc2[i] = shr(exc[i], Q_new); + exc2[i] = shr(exc[i], Q_new); } - L_tmp = 0; + L_tmp = 0; for (i = 0; i < L_FRAME; i++) L_tmp += (exc2[i] * exc2[i])<<1; @@ -617,23 +617,23 @@ void coder( /* Check stability on isf : distance between old isf and current isf */ - L_tmp = 0; + 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 = 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); + stab_fac = shl(tmp, 1); if (stab_fac < 0) { - stab_fac = 0; + stab_fac = 0; } Copy(isf, st->isfold, M); @@ -642,7 +642,7 @@ void coder( if (st->first_frame != 0) { - 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 */ @@ -660,7 +660,7 @@ void coder( #else Residu(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR); #endif - p_Aq += (M + 1); + p_Aq += (M + 1); } /* Buffer isf's and energy for dtx on non-speech frame */ @@ -670,7 +670,7 @@ void coder( { exc2[i] = exc[i] >> Q_new; } - L_tmp = 0; + L_tmp = 0; for (i = 0; i < L_FRAME; i++) L_tmp += (exc2[i] * exc2[i])<<1; L_tmp >>= 1; @@ -682,14 +682,14 @@ void coder( T0_min = T_op - 8; if (T0_min < PIT_MIN) { - 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; + T0_max = PIT_MAX; + T0_min = T0_max - 15; } /*------------------------------------------------------------------------* * Loop for every subframe in the analysis frame * @@ -711,25 +711,25 @@ void coder( * - update states of weighting filter * * - find excitation and synthesis speech * *------------------------------------------------------------------------*/ - p_A = A; - p_Aq = Aq; + p_A = A; + p_Aq = Aq; for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) { - pit_flag = i_subfr; + pit_flag = i_subfr; if ((i_subfr == 2 * L_SUBFR) && (*ser_size > NBBITS_7k)) { - pit_flag = 0; + 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_min = PIT_MIN; } T0_max = (T0_min + 15); if (T0_max > PIT_MAX) { - T0_max = PIT_MAX; + T0_max = PIT_MAX; T0_min = (T0_max - 15); } } @@ -776,7 +776,7 @@ void coder( /* first half: xn[] --> cn[] */ Set_zero(code, M); Copy(xn, code + M, L_SUBFR / 2); - tmp = 0; + 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); @@ -791,7 +791,7 @@ void coder( Copy(&exc[i_subfr + (L_SUBFR / 2)], cn + (L_SUBFR / 2), L_SUBFR / 2); /*---------------------------------------------------------------* - * Compute impulse response, h1[], of weighted synthesis filter * + * Compute impulse response, h1[], of weighted synthesis filter * *---------------------------------------------------------------*/ Set_zero(error, M + L_SUBFR); @@ -814,7 +814,7 @@ void coder( *vo_p3++ = *vo_p0++ = vo_round((L_tmp <<4)); } /* deemph without division by 2 -> Q14 to Q15 */ - tmp = 0; + tmp = 0; Deemph2(h1, TILT_FAC, L_SUBFR, &tmp); /* h1 in Q14 */ /* h2 in Q12 for codebook search */ @@ -917,7 +917,7 @@ void coder( T0_min = (T0 - 8); if (T0_min < PIT_MIN) { - T0_min = PIT_MIN; + T0_min = PIT_MIN; } T0_max = T0_min + 15; @@ -964,18 +964,18 @@ void coder( Convolve_asm(&exc[i_subfr], h1, y1, L_SUBFR); #else Convolve(&exc[i_subfr], h1, y1, L_SUBFR); -#endif +#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; + gain1 = GP_CLIP; } /* find energy of new target xn2[] */ Updt_tar(xn, dn, y1, gain1, L_SUBFR); /* dn used temporary */ } else { - gain1 = 0; + gain1 = 0; } /*-----------------------------------------------------------------* * - find pitch excitation filtered by 1st order LP filter. * @@ -1002,7 +1002,7 @@ void coder( Convolve_asm(code, h1, y2, L_SUBFR); #else Convolve(code, h1, y2, L_SUBFR); -#endif +#endif gain2 = G_pitch(xn, y2, g_coeff2, L_SUBFR); @@ -1016,7 +1016,7 @@ void coder( /*-----------------------------------------------------------------* * use the best prediction (minimise quadratic error). * *-----------------------------------------------------------------*/ - select = 0; + select = 0; if(*ser_size > NBBITS_9k) { L_tmp = 0L; @@ -1036,7 +1036,7 @@ void coder( if (L_tmp <= 0) { - select = 1; + select = 1; } Parm_serial(select, 1, &prms); } @@ -1154,7 +1154,7 @@ void coder( /*-------------------------------------------------------* * - Add the fixed-gain pitch contribution to code[]. * *-------------------------------------------------------*/ - tmp = 0; + tmp = 0; Preemph(code, st->tilt_code, L_SUBFR, &tmp); Pit_shrp(code, T0, PIT_SHARP, L_SUBFR); /*----------------------------------------------------------* @@ -1175,7 +1175,7 @@ void coder( /* 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); + L_tmp = L_shl(L_gain_code, Q_new); gain_code = extract_h(L_add(L_tmp, 0x8000)); /*----------------------------------------------------------* @@ -1218,7 +1218,7 @@ void coder( 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); + L_tmp = L_shl2(L_tmp, 1); exc[i + i_subfr] = extract_h(L_add(L_tmp, 0x8000)); } @@ -1242,7 +1242,7 @@ void coder( *------------------------------------------------------------*/ tmp = (16384 - (voice_fac >> 1)); /* 1=unvoiced, 0=voiced */ fac = vo_mult(stab_fac, tmp); - L_tmp = L_gain_code; + 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)); @@ -1276,19 +1276,19 @@ void coder( L_tmp = L_deposit_h(code[0]); L_tmp -= (code[1] * tmp)<<1; - code2[0] = vo_round(L_tmp); + 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); + 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); + code2[L_SUBFR - 1] = vo_round(L_tmp); /* build excitation */ gain_code = vo_round(L_shl(L_gain_code, Q_new)); @@ -1381,7 +1381,7 @@ static Word16 synthesis( /* Original speech signal as reference for high band gain quantisation */ for (i = 0; i < L_SUBFR16k; i++) { - HF_SP[i] = synth16k[i]; + HF_SP[i] = synth16k[i]; } /*------------------------------------------------------* @@ -1454,7 +1454,7 @@ static Word16 synthesis( fac = div_s(tmp, ener); } else { - fac = 0; + fac = 0; } /* modify energy of white noise according to synthesis tilt */ @@ -1550,7 +1550,7 @@ static Word16 synthesis( /************************************************* * -* Breif: Codec main function +* Breif: Codec main function * **************************************************/ @@ -1622,7 +1622,7 @@ VO_U32 VO_API voAMRWB_Init(VO_HANDLE * phCodec, /* o: the audi else { pMemOP = (VO_MEM_OPERATOR *)pUserData->memData; - } + } /*-------------------------------------------------------------------------* * Memory allocation for coder state. * *-------------------------------------------------------------------------*/ @@ -1631,8 +1631,8 @@ VO_U32 VO_API voAMRWB_Init(VO_HANDLE * phCodec, /* o: the audi return VO_ERR_OUTOF_MEMORY; } - st->vadSt = NULL; - st->dtx_encSt = NULL; + st->vadSt = NULL; + st->dtx_encSt = NULL; st->sid_update_counter = 3; st->sid_handover_debt = 0; st->prev_ft = TX_SPEECH; @@ -1764,7 +1764,7 @@ VO_U32 VO_API voAMRWB_GetOutputData( { pAudioFormat->Format.Channels = 1; pAudioFormat->Format.SampleRate = 8000; - pAudioFormat->Format.SampleBits = 16; + pAudioFormat->Format.SampleBits = 16; pAudioFormat->InputUsed = stream->used_len; } return VO_ERR_NONE; @@ -1792,14 +1792,14 @@ VO_U32 VO_API voAMRWB_SetParam( /* setting AMR-WB frame type*/ case VO_PID_AMRWB_FRAMETYPE: if(*lValue < VOAMRWB_DEFAULT || *lValue > VOAMRWB_RFC3267) - return VO_ERR_WRONG_PARAM_ID; + 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; + return VO_ERR_WRONG_PARAM_ID; gData->mode = *lValue; } break; @@ -1839,7 +1839,7 @@ VO_U32 VO_API voAMRWB_GetParam( int temp; Coder_State* gData = (Coder_State*)hCodec; - if (gData==NULL) + if (gData==NULL) return VO_ERR_INVALID_ARG; switch(uParamID) { diff --git a/media/libstagefright/codecs/amrwbenc/src/voicefac.c b/media/libstagefright/codecs/amrwbenc/src/voicefac.c index 17e4e551b8f4..d8900446e552 100644 --- a/media/libstagefright/codecs/amrwbenc/src/voicefac.c +++ b/media/libstagefright/codecs/amrwbenc/src/voicefac.c @@ -18,7 +18,7 @@ * File: voicefac.c * * * * Description: Find the voicing factors (1 = voice to -1 = unvoiced) * -* * +* * ************************************************************************/ #include "typedef.h" diff --git a/media/libstagefright/codecs/amrwbenc/src/wb_vad.c b/media/libstagefright/codecs/amrwbenc/src/wb_vad.c index 7e1d673c8ad5..13dd2aa06f12 100644 --- a/media/libstagefright/codecs/amrwbenc/src/wb_vad.c +++ b/media/libstagefright/codecs/amrwbenc/src/wb_vad.c @@ -52,7 +52,7 @@ static Word16 ilog2( /* return: output value of the log2 * if (mant <= 0) { - mant = 1; + mant = 1; } ex = norm_s(mant); mant = mant << ex; @@ -88,14 +88,14 @@ static void filter5( temp0 = vo_sub(*in0, vo_mult(COEFF5_1, data[0])); temp1 = add1(data[0], vo_mult(COEFF5_1, temp0)); - data[0] = 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; + data[1] = temp0; - *in0 = extract_h((vo_L_add(temp1, temp2) << 15)); - *in1 = extract_h((vo_L_sub(temp1, temp2) << 15)); + *in0 = extract_h((vo_L_add(temp1, temp2) << 15)); + *in1 = extract_h((vo_L_sub(temp1, temp2) << 15)); } /****************************************************************************** @@ -116,10 +116,10 @@ static void filter3( temp1 = vo_sub(*in1, vo_mult(COEFF3, *data)); temp2 = add1(*data, vo_mult(COEFF3, temp1)); - *data = temp1; + *data = temp1; - *in1 = extract_h((vo_L_sub(*in0, temp2) << 15)); - *in0 = extract_h((vo_L_add(*in0, temp2) << 15)); + *in1 = extract_h((vo_L_sub(*in0, temp2) << 15)); + *in0 = extract_h((vo_L_add(*in0, temp2) << 15)); } /****************************************************************************** @@ -149,14 +149,14 @@ static Word16 level_calculation( /* return: signal level */ Word32 i, l_temp1, l_temp2; Word16 level; - l_temp1 = 0L; + 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)); + *sub_level = extract_h(L_shl(l_temp1, scale)); for (i = 0; i < count1; i++) { @@ -187,7 +187,7 @@ static void filter_bank( /* shift input 1 bit down for safe scaling */ for (i = 0; i < FRAME_LEN; i++) { - tmp_buf[i] = in[i] >> 1; + tmp_buf[i] = in[i] >> 1; } /* run the filter bank */ @@ -222,29 +222,29 @@ static void filter_bank( /* calculate levels in each frequency band */ /* 4800 - 6400 Hz */ - level[11] = level_calculation(tmp_buf, &st->sub_level[11], 16, 64, 4, 1, 14); + 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); + 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); + 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); + 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); + 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); + 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); + 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); + 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); + 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); + 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); + 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); + level[0] = level_calculation(tmp_buf, &st->sub_level[0],2, 8, 32, 0, 17); } /****************************************************************************** @@ -266,31 +266,31 @@ static void update_cntrl( /* 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; + 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; + st->stat_count = STAT_COUNT; } else { - stat_rat = 0; + stat_rat = 0; for (i = 0; i < COMPLEN; i++) { if(level[i] > st->ave_level[i]) { - num = level[i]; - denom = st->ave_level[i]; + num = level[i]; + denom = st->ave_level[i]; } else { num = st->ave_level[i]; - denom = 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; + num = STAT_THR_LEVEL; } if(denom < STAT_THR_LEVEL) { @@ -307,7 +307,7 @@ static void update_cntrl( /* compare stat_rat with a threshold and update stat_count */ if(stat_rat > STAT_THR) { - st->stat_count = STAT_COUNT; + st->stat_count = STAT_COUNT; } else { if ((st->vadreg & 0x4000) != 0) @@ -315,7 +315,7 @@ static void update_cntrl( if (st->stat_count != 0) { - st->stat_count = st->stat_count - 1; + st->stat_count = st->stat_count - 1; } } } @@ -323,17 +323,17 @@ static void update_cntrl( } /* Update average amplitude estimate for stationarity estimation */ - alpha = ALPHA4; + alpha = ALPHA4; if(st->stat_count == STAT_COUNT) { - alpha = 32767; + alpha = 32767; } else if ((st->vadreg & 0x4000) == 0) { - alpha = ALPHA5; + 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]))); + st->ave_level[i] = add1(st->ave_level[i], vo_mult_r(alpha, vo_sub(level[i], st->ave_level[i]))); } } @@ -354,25 +354,25 @@ static Word16 hangover_addition( /* return: VAD_flag indica /* 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; + 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; + st->burst_count = st->burst_count + 1; if(st->burst_count >= burst_len) { - st->hang_count = hang_len; + st->hang_count = hang_len; } return 1; } else { - st->burst_count = 0; + st->burst_count = 0; if (st->hang_count > 0) { - st->hang_count = st->hang_count - 1; + st->hang_count = st->hang_count - 1; return 1; } } @@ -391,7 +391,7 @@ static void noise_estimate_update( Word16 level[] /* i : sub-band levels of the input frame */ ) { - Word32 i; + Word32 i; Word16 alpha_up, alpha_down, bckr_add = 2; /* Control update of bckr_est[] */ @@ -400,19 +400,19 @@ static void noise_estimate_update( /* Choose update speed */ if ((0x7800 & st->vadreg) == 0) { - alpha_up = ALPHA_UP1; - alpha_down = ALPHA_DOWN1; + alpha_up = ALPHA_UP1; + alpha_down = ALPHA_DOWN1; } else { if ((st->stat_count == 0)) { - alpha_up = ALPHA_UP2; - alpha_down = ALPHA_DOWN2; + alpha_up = ALPHA_UP2; + alpha_down = ALPHA_DOWN2; } else { - alpha_up = 0; - alpha_down = ALPHA3; - bckr_add = 0; + alpha_up = 0; + alpha_down = ALPHA3; + bckr_add = 0; } } @@ -424,20 +424,20 @@ static void noise_estimate_update( if (temp < 0) { /* update downwards */ - st->bckr_est[i] = add1(-2, add(st->bckr_est[i],vo_mult_r(alpha_down, temp))); + 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; + 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))); + 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; + st->bckr_est[i] = NOISE_MAX; } } } @@ -445,7 +445,7 @@ static void noise_estimate_update( /* Update signal levels of the previous frame (old_level) */ for (i = 0; i < COMPLEN; i++) { - st->old_level[i] = level[i]; + st->old_level[i] = level[i]; } } @@ -473,7 +473,7 @@ static Word16 vad_decision( /* return value : VAD_flag /* Calculate squared sum of the input levels (level) divided by the background noise components * (bckr_est). */ - L_snr_sum = 0; + L_snr_sum = 0; for (i = 0; i < COMPLEN; i++) { Word16 exp; @@ -486,7 +486,7 @@ static Word16 vad_decision( /* return value : VAD_flag } /* Calculate average level of estimated background noise */ - L_temp = 0; + L_temp = 0; for (i = 1; i < COMPLEN; i++) /* ignore lowest band */ { L_temp = vo_L_add(L_temp, st->bckr_est[i]); @@ -498,7 +498,7 @@ static Word16 vad_decision( /* return value : VAD_flag if(st->speech_level < temp) { - st->speech_level = temp; + st->speech_level = temp; } ilog2_noise_level = ilog2(noise_level); @@ -511,33 +511,33 @@ static Word16 vad_decision( /* return value : VAD_flag temp2 = add1(SP_CH_MIN, vo_mult(SP_SLOPE, (ilog2_speech_level - SP_P1))); if (temp2 < SP_CH_MIN) { - temp2 = SP_CH_MIN; + temp2 = SP_CH_MIN; } if (temp2 > SP_CH_MAX) { - temp2 = SP_CH_MAX; + temp2 = SP_CH_MAX; } vad_thr = temp + temp2; if(vad_thr < THR_MIN) { - vad_thr = THR_MIN; + vad_thr = THR_MIN; } /* Shift VAD decision register */ - st->vadreg = (st->vadreg >> 1); + 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); + 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; + low_power_flag = 1; } else { - low_power_flag = 0; + low_power_flag = 0; } /* Update background noise estimates */ noise_estimate_update(st, level); @@ -546,7 +546,7 @@ static Word16 vad_decision( /* return value : VAD_flag hang_len = add1(vo_mult(HANG_SLOPE, (vad_thr - HANG_P1)), HANG_HIGH); if(hang_len < HANG_LOW) { - hang_len = HANG_LOW; + hang_len = HANG_LOW; } burst_len = add1(vo_mult(BURST_SLOPE, (vad_thr - BURST_P1)), BURST_HIGH); @@ -575,20 +575,20 @@ static void Estimate_Speech( /* 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 = 0; + st->sp_max = 0; + st->sp_max_cnt = 0; } - st->sp_est_cnt += 1; + 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 = in_level; } - st->sp_max_cnt += 1; + st->sp_max_cnt += 1; if(st->sp_max_cnt >= SP_ACTIVITY_COUNT) { @@ -599,19 +599,19 @@ static void Estimate_Speech( /* select update speed */ if(tmp > st->speech_level) { - alpha = ALPHA_SP_UP; + alpha = ALPHA_SP_UP; } else { - alpha = ALPHA_SP_DOWN; + 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))); + 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; + st->sp_max = 0; + st->sp_max_cnt = 0; + st->sp_est_cnt = 0; } } } @@ -767,22 +767,22 @@ Word16 wb_vad( /* Return value : VAD Decision, 1 Word32 L_temp, pow_sum; /* Calculate power of the input frame. */ - L_temp = 0L; + 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); + pow_sum = L_add(L_temp, st->prev_pow_sum); /* save power of current frame for next call */ - st->prev_pow_sum = L_temp; + 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); + 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); @@ -791,7 +791,7 @@ Word16 wb_vad( /* Return value : VAD Decision, 1 VAD_flag = vad_decision(st, level, pow_sum); /* Calculate input level */ - L_temp = 0; + L_temp = 0; for (i = 1; i < COMPLEN; i++) /* ignore lowest band */ { L_temp = vo_L_add(L_temp, level[i]); diff --git a/media/libstagefright/codecs/amrwbenc/src/weight_a.c b/media/libstagefright/codecs/amrwbenc/src/weight_a.c index 8f0fb39dacb1..a02b48d1d071 100644 --- a/media/libstagefright/codecs/amrwbenc/src/weight_a.c +++ b/media/libstagefright/codecs/amrwbenc/src/weight_a.c @@ -19,7 +19,7 @@ * * * Description:Weighting of LPC coefficients * * ap[i] = a[i] * (gamma ** i) * -* * +* * ************************************************************************/ #include "typedef.h" diff --git a/media/libstagefright/codecs/common/Config.mk b/media/libstagefright/codecs/common/Config.mk index 3d754e73eb76..187f25cc1f21 100644 --- a/media/libstagefright/codecs/common/Config.mk +++ b/media/libstagefright/codecs/common/Config.mk @@ -1,8 +1,8 @@ -# +# # This configure file is just for Linux projects against Android # -VOPRJ := +VOPRJ := VONJ := # WARNING: @@ -20,5 +20,5 @@ endif VOTEST := 0 -VO_CFLAGS:=-DLINUX +VO_CFLAGS:=-DLINUX diff --git a/media/libstagefright/codecs/common/include/voAMRWB.h b/media/libstagefright/codecs/common/include/voAMRWB.h index 13290c7e7511..d3eb53744963 100644 --- a/media/libstagefright/codecs/common/include/voAMRWB.h +++ b/media/libstagefright/codecs/common/include/voAMRWB.h @@ -29,20 +29,20 @@ extern "C" { #pragma pack(push, 4) /*!* the bit rate the codec supports*/ -typedef enum { +typedef enum { VOAMRWB_MDNONE = -1, /*!< Invalid mode */ VOAMRWB_MD66 = 0, /*!< 6.60kbps */ - VOAMRWB_MD885 = 1, /*!< 8.85kbps */ + 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_MD2385 = 8, /*!< 23.85kbps> */ VOAMRWB_N_MODES = 9, /*!< Invalid mode */ VOAMRWB_MODE_MAX = VO_MAX_ENUM_VALUE - + }VOAMRWBMODE; /*!* the frame format the codec supports*/ @@ -51,17 +51,17 @@ typedef enum { /*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, + 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 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 + VOAMRWB_RFC3267 = 2, /* see RFC 3267 */ + VOAMRWB_TMAX = VO_MAX_ENUM_VALUE }VOAMRWBFRAMETYPE; -#define VO_PID_AMRWB_Module 0x42261000 +#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) diff --git a/media/libstagefright/codecs/common/include/voAudio.h b/media/libstagefright/codecs/common/include/voAudio.h index 21d0cf6edf13..d8628eeae018 100644 --- a/media/libstagefright/codecs/common/include/voAudio.h +++ b/media/libstagefright/codecs/common/include/voAudio.h @@ -135,7 +135,7 @@ typedef struct VO_AUDIO_CODECAPI * \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 + * 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); diff --git a/media/libstagefright/codecs/common/include/voIndex.h b/media/libstagefright/codecs/common/include/voIndex.h index a409a6ea0345..320a2f82f87f 100644 --- a/media/libstagefright/codecs/common/include/voIndex.h +++ b/media/libstagefright/codecs/common/include/voIndex.h @@ -173,7 +173,7 @@ enum // 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 */ diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h index 0985f479d561..82c647623e5b 100644 --- a/media/libstagefright/include/AwesomePlayer.h +++ b/media/libstagefright/include/AwesomePlayer.h @@ -290,6 +290,7 @@ private: bool isStreamingHTTP() const; void sendCacheStats(); + void checkDrmStatus(const sp<DataSource>& dataSource); enum FlagMode { SET, diff --git a/media/libstagefright/include/ChromiumHTTPDataSource.h b/media/libstagefright/include/ChromiumHTTPDataSource.h index 18f89130c747..82e08fd1ba1e 100644 --- a/media/libstagefright/include/ChromiumHTTPDataSource.h +++ b/media/libstagefright/include/ChromiumHTTPDataSource.h @@ -43,7 +43,7 @@ struct ChromiumHTTPDataSource : public HTTPBase { virtual status_t getSize(off64_t *size); virtual uint32_t flags(); - virtual sp<DecryptHandle> DrmInitialization(); + virtual sp<DecryptHandle> DrmInitialization(const char *mime); virtual void getDrmInfo(sp<DecryptHandle> &handle, DrmManagerClient **client); diff --git a/media/libstagefright/include/NuCachedSource2.h b/media/libstagefright/include/NuCachedSource2.h index 7a03e7e4f976..c27a29b76624 100644 --- a/media/libstagefright/include/NuCachedSource2.h +++ b/media/libstagefright/include/NuCachedSource2.h @@ -40,7 +40,7 @@ struct NuCachedSource2 : public DataSource { virtual status_t getSize(off64_t *size); virtual uint32_t flags(); - virtual sp<DecryptHandle> DrmInitialization(); + virtual sp<DecryptHandle> DrmInitialization(const char* mime); virtual void getDrmInfo(sp<DecryptHandle> &handle, DrmManagerClient **client); virtual String8 getUri(); diff --git a/media/libstagefright/include/WVMExtractor.h b/media/libstagefright/include/WVMExtractor.h index deecd2543a92..9f763f9debef 100644 --- a/media/libstagefright/include/WVMExtractor.h +++ b/media/libstagefright/include/WVMExtractor.h @@ -23,6 +23,8 @@ namespace android { +struct AMessage; +class String8; class DataSource; class WVMLoadableExtractor : public MediaExtractor { @@ -58,6 +60,8 @@ public: // is used. void setAdaptiveStreamingMode(bool adaptive); + static bool getVendorLibHandle(); + protected: virtual ~WVMExtractor(); @@ -69,6 +73,10 @@ private: WVMExtractor &operator=(const WVMExtractor &); }; +bool SniffWVM( + const sp<DataSource> &source, String8 *mimeType, float *confidence, + sp<AMessage> *); + } // namespace android #endif // DRM_EXTRACTOR_H_ diff --git a/media/mtp/Android.mk b/media/mtp/Android.mk index e590babb485e..fc7fc4fcb03b 100644 --- a/media/mtp/Android.mk +++ b/media/mtp/Android.mk @@ -39,6 +39,9 @@ LOCAL_MODULE:= libmtp LOCAL_CFLAGS := -DMTP_DEVICE -DMTP_HOST +# Needed for <bionic_time.h> +LOCAL_C_INCLUDES := bionic/libc/private + LOCAL_SHARED_LIBRARIES := libutils libcutils libusbhost libbinder include $(BUILD_SHARED_LIBRARY) diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 468f0d5b83e0..b440bde8d3ab 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -2403,7 +2403,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (DEBUG_LAYOUT) Slog.i(TAG, "Win " + win + ": isVisibleOrBehindKeyguardLw=" + win.isVisibleOrBehindKeyguardLw()); if (mTopFullscreenOpaqueWindowState == null && - win.isVisibleOrBehindKeyguardLw()) { + win.isVisibleOrBehindKeyguardLw() && !win.isGoneForLayoutLw()) { if ((attrs.flags & FLAG_FORCE_NOT_FULLSCREEN) != 0) { mForceStatusBar = true; } @@ -2458,7 +2458,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // case though. if (topIsFullscreen) { if (mStatusBarCanHide) { - if (DEBUG_LAYOUT) Log.v(TAG, "Hiding status bar"); + if (DEBUG_LAYOUT) Log.v(TAG, "** HIDING status bar"); if (mStatusBar.hideLw(true)) { changes |= FINISH_LAYOUT_REDO_LAYOUT; @@ -2474,7 +2474,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { Log.v(TAG, "Preventing status bar from hiding by policy"); } } else { - if (DEBUG_LAYOUT) Log.v(TAG, "Showing status bar: top is not fullscreen"); + if (DEBUG_LAYOUT) Log.v(TAG, "** SHOWING status bar: top is not fullscreen"); if (mStatusBar.showLw(true)) changes |= FINISH_LAYOUT_REDO_LAYOUT; } } @@ -3456,7 +3456,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { public void systemReady() { // tell the keyguard mKeyguardMediator.onSystemReady(); - android.os.SystemProperties.set("dev.bootcomplete", "1"); synchronized (mLock) { updateOrientationListenerLp(); mSystemReady = true; diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index 9fb666e26614..cf925b039289 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -380,7 +380,7 @@ status_t AudioFlinger::dump(int fd, const Vector<String16>& args) sp<IAudioTrack> AudioFlinger::createTrack( pid_t pid, - int streamType, + audio_stream_type_t streamType, uint32_t sampleRate, uint32_t format, uint32_t channelMask, @@ -398,7 +398,9 @@ sp<IAudioTrack> AudioFlinger::createTrack( status_t lStatus; int lSessionId; - if (streamType >= AUDIO_STREAM_CNT) { + // client AudioTrack::set already implements AUDIO_STREAM_DEFAULT => AUDIO_STREAM_MUSIC, + // but if someone uses binder directly they could bypass that and cause us to crash + if (uint32_t(streamType) >= AUDIO_STREAM_CNT) { ALOGE("createTrack() invalid stream type %d", streamType); lStatus = BAD_VALUE; goto Exit; @@ -646,22 +648,24 @@ status_t AudioFlinger::setMasterMute(bool muted) float AudioFlinger::masterVolume() const { - return mMasterVolume; + Mutex::Autolock _l(mLock); + return masterVolume_l(); } bool AudioFlinger::masterMute() const { - return mMasterMute; + Mutex::Autolock _l(mLock); + return masterMute_l(); } -status_t AudioFlinger::setStreamVolume(int stream, float value, int output) +status_t AudioFlinger::setStreamVolume(audio_stream_type_t stream, float value, int output) { // check calling permissions if (!settingsAllowed()) { return PERMISSION_DENIED; } - if (stream < 0 || uint32_t(stream) >= AUDIO_STREAM_CNT) { + if (uint32_t(stream) >= AUDIO_STREAM_CNT) { ALOGE("setStreamVolume() invalid stream %d", stream); return BAD_VALUE; } @@ -688,14 +692,14 @@ status_t AudioFlinger::setStreamVolume(int stream, float value, int output) return NO_ERROR; } -status_t AudioFlinger::setStreamMute(int stream, bool muted) +status_t AudioFlinger::setStreamMute(audio_stream_type_t stream, bool muted) { // check calling permissions if (!settingsAllowed()) { return PERMISSION_DENIED; } - if (stream < 0 || uint32_t(stream) >= AUDIO_STREAM_CNT || + if (uint32_t(stream) >= AUDIO_STREAM_CNT || uint32_t(stream) == AUDIO_STREAM_ENFORCED_AUDIBLE) { ALOGE("setStreamMute() invalid stream %d", stream); return BAD_VALUE; @@ -709,9 +713,9 @@ status_t AudioFlinger::setStreamMute(int stream, bool muted) return NO_ERROR; } -float AudioFlinger::streamVolume(int stream, int output) const +float AudioFlinger::streamVolume(audio_stream_type_t stream, int output) const { - if (stream < 0 || uint32_t(stream) >= AUDIO_STREAM_CNT) { + if (uint32_t(stream) >= AUDIO_STREAM_CNT) { return 0.0f; } @@ -730,9 +734,9 @@ float AudioFlinger::streamVolume(int stream, int output) const return volume; } -bool AudioFlinger::streamMute(int stream) const +bool AudioFlinger::streamMute(audio_stream_type_t stream) const { - if (stream < 0 || stream >= (int)AUDIO_STREAM_CNT) { + if (uint32_t(stream) >= AUDIO_STREAM_CNT) { return true; } @@ -1118,7 +1122,7 @@ status_t AudioFlinger::ThreadBase::dumpBase(int fd, const Vector<String16>& args result.append(buffer); snprintf(buffer, SIZE, "Format: %d\n", mFormat); result.append(buffer); - snprintf(buffer, SIZE, "Frame size: %d\n", mFrameSize); + snprintf(buffer, SIZE, "Frame size: %u\n", mFrameSize); result.append(buffer); snprintf(buffer, SIZE, "\nPending setParameters commands: \n"); @@ -1379,13 +1383,19 @@ AudioFlinger::PlaybackThread::PlaybackThread(const sp<AudioFlinger>& audioFlinge readOutputParameters(); - mMasterVolume = mAudioFlinger->masterVolume(); - mMasterMute = mAudioFlinger->masterMute(); + // Assumes constructor is called by AudioFlinger with it's mLock held, + // but it would be safer to explicitly pass these as parameters + mMasterVolume = mAudioFlinger->masterVolume_l(); + mMasterMute = mAudioFlinger->masterMute_l(); - for (int stream = 0; stream < AUDIO_STREAM_CNT; stream++) { + // mStreamTypes[AUDIO_STREAM_CNT] is initialized by stream_type_t default constructor + // There is no AUDIO_STREAM_MIN, and ++ operator does not compile + for (audio_stream_type_t stream = (audio_stream_type_t) 0; stream < AUDIO_STREAM_CNT; + stream = (audio_stream_type_t) (stream + 1)) { mStreamTypes[stream].volume = mAudioFlinger->streamVolumeInternal(stream); mStreamTypes[stream].mute = mAudioFlinger->streamMute(stream); - mStreamTypes[stream].valid = true; + // initialized by stream_type_t default constructor + // mStreamTypes[stream].valid = true; } } @@ -1483,7 +1493,7 @@ void AudioFlinger::PlaybackThread::onFirstRef() // PlaybackThread::createTrack_l() must be called with AudioFlinger::mLock held sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrack_l( const sp<AudioFlinger::Client>& client, - int streamType, + audio_stream_type_t streamType, uint32_t sampleRate, uint32_t format, uint32_t channelMask, @@ -1606,24 +1616,24 @@ bool AudioFlinger::PlaybackThread::masterMute() const return mMasterMute; } -status_t AudioFlinger::PlaybackThread::setStreamVolume(int stream, float value) +status_t AudioFlinger::PlaybackThread::setStreamVolume(audio_stream_type_t stream, float value) { mStreamTypes[stream].volume = value; return NO_ERROR; } -status_t AudioFlinger::PlaybackThread::setStreamMute(int stream, bool muted) +status_t AudioFlinger::PlaybackThread::setStreamMute(audio_stream_type_t stream, bool muted) { mStreamTypes[stream].mute = muted; return NO_ERROR; } -float AudioFlinger::PlaybackThread::streamVolume(int stream) const +float AudioFlinger::PlaybackThread::streamVolume(audio_stream_type_t stream) const { return mStreamTypes[stream].volume; } -bool AudioFlinger::PlaybackThread::streamMute(int stream) const +bool AudioFlinger::PlaybackThread::streamMute(audio_stream_type_t stream) const { return mStreamTypes[stream].mute; } @@ -1727,7 +1737,7 @@ void AudioFlinger::PlaybackThread::readOutputParameters() mChannelMask = mOutput->stream->common.get_channels(&mOutput->stream->common); mChannelCount = (uint16_t)popcount(mChannelMask); mFormat = mOutput->stream->common.get_format(&mOutput->stream->common); - mFrameSize = (uint16_t)audio_stream_frame_size(&mOutput->stream->common); + mFrameSize = audio_stream_frame_size(&mOutput->stream->common); mFrameCount = mOutput->stream->common.get_buffer_size(&mOutput->stream->common) / mFrameSize; // FIXME - Current mixer implementation only supports stereo output: Always @@ -2183,7 +2193,13 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track vl = (uint32_t)(v * cblk->volume[0]) << 12; vr = (uint32_t)(v * cblk->volume[1]) << 12; - va = (uint32_t)(v * cblk->sendLevel); + uint16_t sendLevel = cblk->getSendLevel_U4_12(); + // send level comes from shared memory and so may be corrupt + if (sendLevel >= 0x1000) { + ALOGV("Track send level out of range: %04X", sendLevel); + sendLevel = 0x1000; + } + va = (uint32_t)(v * sendLevel); } // Delegate volume control to effect in track effect chain if needed if (chain != 0 && chain->setVolume_l(&vl, &vr)) { @@ -2297,7 +2313,7 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track return mixerStatus; } -void AudioFlinger::MixerThread::invalidateTracks(int streamType) +void AudioFlinger::MixerThread::invalidateTracks(audio_stream_type_t streamType) { ALOGV ("MixerThread::invalidateTracks() mixer %p, streamType %d, mTracks.size %d", this, streamType, mTracks.size()); @@ -2313,7 +2329,7 @@ void AudioFlinger::MixerThread::invalidateTracks(int streamType) } } -void AudioFlinger::PlaybackThread::setStreamValid(int streamType, bool valid) +void AudioFlinger::PlaybackThread::setStreamValid(audio_stream_type_t streamType, bool valid) { ALOGV ("PlaybackThread::setStreamValid() thread %p, streamType %d, valid %d", this, streamType, valid); @@ -3324,12 +3340,13 @@ uint32_t AudioFlinger::ThreadBase::TrackBase::channelMask() const { void* AudioFlinger::ThreadBase::TrackBase::getBuffer(uint32_t offset, uint32_t frames) const { audio_track_cblk_t* cblk = this->cblk(); - int8_t *bufferStart = (int8_t *)mBuffer + (offset-cblk->serverBase)*cblk->frameSize; - int8_t *bufferEnd = bufferStart + frames * cblk->frameSize; + size_t frameSize = cblk->frameSize; + int8_t *bufferStart = (int8_t *)mBuffer + (offset-cblk->serverBase)*frameSize; + int8_t *bufferEnd = bufferStart + frames * frameSize; // Check validity of returned pointer in case the track control block would have been corrupted. if (bufferStart < mBuffer || bufferStart > bufferEnd || bufferEnd > mBufferEnd || - ((unsigned long)bufferStart & (unsigned long)(cblk->frameSize - 1))) { + ((unsigned long)bufferStart & (unsigned long)(frameSize - 1))) { ALOGE("TrackBase::getBuffer buffer out of range:\n start: %p, end %p , mBuffer %p mBufferEnd %p\n \ server %d, serverBase %d, user %d, userBase %d", bufferStart, bufferEnd, mBuffer, mBufferEnd, @@ -3346,7 +3363,7 @@ void* AudioFlinger::ThreadBase::TrackBase::getBuffer(uint32_t offset, uint32_t f AudioFlinger::PlaybackThread::Track::Track( const wp<ThreadBase>& thread, const sp<Client>& client, - int streamType, + audio_stream_type_t streamType, uint32_t sampleRate, uint32_t format, uint32_t channelMask, @@ -4800,7 +4817,7 @@ void AudioFlinger::RecordThread::readInputParameters() mChannelMask = mInput->stream->common.get_channels(&mInput->stream->common); mChannelCount = (uint16_t)popcount(mChannelMask); mFormat = mInput->stream->common.get_format(&mInput->stream->common); - mFrameSize = (uint16_t)audio_stream_frame_size(&mInput->stream->common); + mFrameSize = audio_stream_frame_size(&mInput->stream->common); mInputBytes = mInput->stream->common.get_buffer_size(&mInput->stream->common); mFrameCount = mInputBytes / mFrameSize; mRsmpInBuffer = new int16_t[mFrameCount * mChannelCount]; @@ -5156,7 +5173,7 @@ status_t AudioFlinger::closeInput(int input) return NO_ERROR; } -status_t AudioFlinger::setStreamOutput(uint32_t stream, int output) +status_t AudioFlinger::setStreamOutput(audio_stream_type_t stream, int output) { Mutex::Autolock _l(mLock); MixerThread *dstThread = checkMixerThread_l(output); diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h index f99e7647e50c..9d1d8628f38f 100644 --- a/services/audioflinger/AudioFlinger.h +++ b/services/audioflinger/AudioFlinger.h @@ -70,7 +70,7 @@ public: // IAudioFlinger interface virtual sp<IAudioTrack> createTrack( pid_t pid, - int streamType, + audio_stream_type_t streamType, uint32_t sampleRate, uint32_t format, uint32_t channelMask, @@ -93,11 +93,11 @@ public: virtual float masterVolume() const; virtual bool masterMute() const; - virtual status_t setStreamVolume(int stream, float value, int output); - virtual status_t setStreamMute(int stream, bool muted); + virtual status_t setStreamVolume(audio_stream_type_t stream, float value, int output); + virtual status_t setStreamMute(audio_stream_type_t stream, bool muted); - virtual float streamVolume(int stream, int output) const; - virtual bool streamMute(int stream) const; + virtual float streamVolume(audio_stream_type_t stream, int output) const; + virtual bool streamMute(audio_stream_type_t stream) const; virtual status_t setMode(int mode); @@ -135,7 +135,7 @@ public: virtual status_t closeInput(int input); - virtual status_t setStreamOutput(uint32_t stream, int output); + virtual status_t setStreamOutput(audio_stream_type_t stream, int output); virtual status_t setVoiceVolume(float volume); @@ -536,7 +536,7 @@ private: size_t mFrameCount; uint32_t mChannelMask; uint16_t mChannelCount; - uint16_t mFrameSize; + size_t mFrameSize; uint32_t mFormat; Condition mParamCond; Vector<String8> mNewParameters; @@ -573,7 +573,7 @@ private: public: Track( const wp<ThreadBase>& thread, const sp<Client>& client, - int streamType, + audio_stream_type_t streamType, uint32_t sampleRate, uint32_t format, uint32_t channelMask, @@ -595,7 +595,7 @@ private: return mName; } - int type() const { + audio_stream_type_t type() const { return mStreamType; } status_t attachAuxEffect(int EffectId); @@ -641,7 +641,7 @@ private: int8_t mRetryCount; sp<IMemory> mSharedBuffer; bool mResetDone; - int mStreamType; + audio_stream_type_t mStreamType; int mName; int16_t *mMainBuffer; int32_t *mAuxBuffer; @@ -707,15 +707,15 @@ private: virtual float masterVolume() const; virtual bool masterMute() const; - virtual status_t setStreamVolume(int stream, float value); - virtual status_t setStreamMute(int stream, bool muted); + virtual status_t setStreamVolume(audio_stream_type_t stream, float value); + virtual status_t setStreamMute(audio_stream_type_t stream, bool muted); - virtual float streamVolume(int stream) const; - virtual bool streamMute(int stream) const; + virtual float streamVolume(audio_stream_type_t stream) const; + virtual bool streamMute(audio_stream_type_t stream) const; sp<Track> createTrack_l( const sp<AudioFlinger::Client>& client, - int streamType, + audio_stream_type_t streamType, uint32_t sampleRate, uint32_t format, uint32_t channelMask, @@ -747,7 +747,7 @@ private: virtual uint32_t hasAudioSession(int sessionId); virtual uint32_t getStrategyForSession_l(int sessionId); - void setStreamValid(int streamType, bool valid); + void setStreamValid(audio_stream_type_t streamType, bool valid); struct stream_type_t { stream_type_t() @@ -765,7 +765,9 @@ private: int16_t* mMixBuffer; int mSuspended; int mBytesWritten; + private: bool mMasterMute; + protected: SortedVector< wp<Track> > mActiveTracks; virtual int getTrackName_l() = 0; @@ -797,7 +799,7 @@ private: status_t dumpTracks(int fd, const Vector<String16>& args); SortedVector< sp<Track> > mTracks; - // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread + // mStreamTypes[] uses 1 additional stream type internally for the OutputTrack used by DuplicatingThread stream_type_t mStreamTypes[AUDIO_STREAM_CNT + 1]; AudioStreamOut* mOutput; float mMasterVolume; @@ -818,7 +820,7 @@ private: // Thread virtuals virtual bool threadLoop(); - void invalidateTracks(int streamType); + void invalidateTracks(audio_stream_type_t streamType); virtual bool checkForNewParameters_l(); virtual status_t dumpInternals(int fd, const Vector<String16>& args); @@ -884,7 +886,7 @@ private: PlaybackThread *checkPlaybackThread_l(int output) const; MixerThread *checkMixerThread_l(int output) const; RecordThread *checkRecordThread_l(int input) const; - float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; } + float streamVolumeInternal(audio_stream_type_t stream) const { return mStreamTypes[stream].volume; } void audioConfigChanged_l(int event, int ioHandle, void *param2); uint32_t nextUniqueId(); @@ -1388,6 +1390,8 @@ mutable Mutex mLock; // mutex for process, commands and handl DefaultKeyedVector< int, sp<PlaybackThread> > mPlaybackThreads; PlaybackThread::stream_type_t mStreamTypes[AUDIO_STREAM_CNT]; + + // both are protected by mLock float mMasterVolume; bool mMasterMute; @@ -1399,6 +1403,9 @@ mutable Mutex mLock; // mutex for process, commands and handl bool mBtNrecIsOff; Vector<AudioSessionRef*> mAudioSessionRefs; + + float masterVolume_l() const { return mMasterVolume; } + bool masterMute_l() const { return mMasterMute; } }; diff --git a/services/audioflinger/AudioPolicyService.cpp b/services/audioflinger/AudioPolicyService.cpp index 3f86d58e6929..44311d0cd353 100644 --- a/services/audioflinger/AudioPolicyService.cpp +++ b/services/audioflinger/AudioPolicyService.cpp @@ -400,7 +400,7 @@ status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream, if (!checkPermission()) { return PERMISSION_DENIED; } - if (stream < 0 || stream >= AUDIO_STREAM_CNT) { + if (uint32_t(stream) >= AUDIO_STREAM_CNT) { return BAD_VALUE; } mpAudioPolicy->init_stream_volume(mpAudioPolicy, stream, indexMin, indexMax); @@ -415,7 +415,7 @@ status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream, in if (!checkPermission()) { return PERMISSION_DENIED; } - if (stream < 0 || stream >= AUDIO_STREAM_CNT) { + if (uint32_t(stream) >= AUDIO_STREAM_CNT) { return BAD_VALUE; } @@ -427,7 +427,7 @@ status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream, in if (mpAudioPolicy == NULL) { return NO_INIT; } - if (stream < 0 || stream >= AUDIO_STREAM_CNT) { + if (uint32_t(stream) >= AUDIO_STREAM_CNT) { return BAD_VALUE; } return mpAudioPolicy->get_stream_volume_index(mpAudioPolicy, stream, index); @@ -486,7 +486,7 @@ status_t AudioPolicyService::setEffectEnabled(int id, bool enabled) return mpAudioPolicy->set_effect_enabled(mpAudioPolicy, id, enabled); } -bool AudioPolicyService::isStreamActive(int stream, uint32_t inPastMs) const +bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const { if (mpAudioPolicy == NULL) { return 0; @@ -781,7 +781,7 @@ status_t AudioPolicyService::AudioCommandThread::dump(int fd) return NO_ERROR; } -void AudioPolicyService::AudioCommandThread::startToneCommand(int type, int stream) +void AudioPolicyService::AudioCommandThread::startToneCommand(int type, audio_stream_type_t stream) { AudioCommand *command = new AudioCommand(); command->mCommand = START_TONE; @@ -808,7 +808,7 @@ void AudioPolicyService::AudioCommandThread::stopToneCommand() mWaitWorkCV.signal(); } -status_t AudioPolicyService::AudioCommandThread::volumeCommand(int stream, +status_t AudioPolicyService::AudioCommandThread::volumeCommand(audio_stream_type_t stream, float volume, int output, int delayMs) @@ -1019,7 +1019,7 @@ int AudioPolicyService::setStreamVolume(audio_stream_type_t stream, audio_io_handle_t output, int delayMs) { - return (int)mAudioCommandThread->volumeCommand((int)stream, volume, + return (int)mAudioCommandThread->volumeCommand(stream, volume, (int)output, delayMs); } diff --git a/services/audioflinger/AudioPolicyService.h b/services/audioflinger/AudioPolicyService.h index 88cb1e9c88f2..e98ec68a521a 100644 --- a/services/audioflinger/AudioPolicyService.h +++ b/services/audioflinger/AudioPolicyService.h @@ -102,7 +102,7 @@ public: int id); virtual status_t unregisterEffect(int id); virtual status_t setEffectEnabled(int id, bool enabled); - virtual bool isStreamActive(int stream, uint32_t inPastMs = 0) const; + virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs = 0) const; virtual status_t queryDefaultPreProcessing(int audioSession, effect_descriptor_t *descriptors, @@ -168,9 +168,9 @@ private: virtual bool threadLoop(); void exit(); - void startToneCommand(int type = 0, int stream = 0); + void startToneCommand(int type = 0, audio_stream_type_t stream = AUDIO_STREAM_VOICE_CALL); void stopToneCommand(); - status_t volumeCommand(int stream, float volume, int output, int delayMs = 0); + status_t volumeCommand(audio_stream_type_t stream, float volume, int output, int delayMs = 0); status_t parametersCommand(int ioHandle, const char *keyValuePairs, int delayMs = 0); status_t voiceVolumeCommand(float volume, int delayMs = 0); void insertCommand_l(AudioCommand *command, int delayMs = 0); @@ -196,12 +196,12 @@ private: class ToneData { public: int mType; // tone type (START_TONE only) - int mStream; // stream type (START_TONE only) + audio_stream_type_t mStream; // stream type (START_TONE only) }; class VolumeData { public: - int mStream; + audio_stream_type_t mStream; float mVolume; int mIO; }; diff --git a/services/input/InputDispatcher.cpp b/services/input/InputDispatcher.cpp index a0f372abbd2c..9f0906203f84 100644 --- a/services/input/InputDispatcher.cpp +++ b/services/input/InputDispatcher.cpp @@ -1906,10 +1906,21 @@ void InputDispatcher::prepareDispatchCycleLocked(nsecs_t currentTime, connection->getInputChannelName()); logOutboundMotionDetailsLocked(" ", splitMotionEntry); #endif - eventEntry = splitMotionEntry; + enqueueDispatchEntriesLocked(currentTime, connection, + splitMotionEntry, inputTarget, resumeWithAppendedMotionSample); + splitMotionEntry->release(); + return; } } + // Not splitting. Enqueue dispatch entries for the event as is. + enqueueDispatchEntriesLocked(currentTime, connection, eventEntry, inputTarget, + resumeWithAppendedMotionSample); +} + +void InputDispatcher::enqueueDispatchEntriesLocked(nsecs_t currentTime, + const sp<Connection>& connection, EventEntry* eventEntry, const InputTarget* inputTarget, + bool resumeWithAppendedMotionSample) { // Resume the dispatch cycle with a freshly appended motion sample. // First we check that the last dispatch entry in the outbound queue is for the same // motion event to which we appended the motion sample. If we find such a dispatch @@ -2046,9 +2057,6 @@ void InputDispatcher::enqueueDispatchEntryLocked( DispatchEntry* dispatchEntry = new DispatchEntry(eventEntry, // increments ref inputTargetFlags, inputTarget->xOffset, inputTarget->yOffset, inputTarget->scaleFactor); - if (dispatchEntry->hasForegroundTarget()) { - incrementPendingForegroundDispatchesLocked(eventEntry); - } // Handle the case where we could not stream a new motion sample because the consumer has // already consumed the motion event (otherwise the corresponding dispatch entry would @@ -2077,6 +2085,7 @@ void InputDispatcher::enqueueDispatchEntryLocked( ALOGD("channel '%s' ~ enqueueDispatchEntryLocked: skipping inconsistent key event", connection->getInputChannelName()); #endif + delete dispatchEntry; return; // skip the inconsistent event } break; @@ -2118,12 +2127,18 @@ void InputDispatcher::enqueueDispatchEntryLocked( ALOGD("channel '%s' ~ enqueueDispatchEntryLocked: skipping inconsistent motion event", connection->getInputChannelName()); #endif + delete dispatchEntry; return; // skip the inconsistent event } break; } } + // Remember that we are waiting for this dispatch to complete. + if (dispatchEntry->hasForegroundTarget()) { + incrementPendingForegroundDispatchesLocked(eventEntry); + } + // Enqueue the dispatch entry. connection->outboundQueue.enqueueAtTail(dispatchEntry); } @@ -2462,14 +2477,17 @@ void InputDispatcher::synthesizeCancelationEventsForInputChannelLocked( void InputDispatcher::synthesizeCancelationEventsForConnectionLocked( const sp<Connection>& connection, const CancelationOptions& options) { + if (connection->status == Connection::STATUS_BROKEN) { + return; + } + nsecs_t currentTime = now(); mTempCancelationEvents.clear(); connection->inputState.synthesizeCancelationEvents(currentTime, mTempCancelationEvents, options); - if (! mTempCancelationEvents.isEmpty() - && connection->status != Connection::STATUS_BROKEN) { + if (!mTempCancelationEvents.isEmpty()) { #if DEBUG_OUTBOUND_EVENT_DETAILS ALOGD("channel '%s' ~ Synthesized %d cancelation events to bring channel back in sync " "with reality: %s, mode=%d.", diff --git a/services/input/InputDispatcher.h b/services/input/InputDispatcher.h index 8ae5a56ba837..1478d67f825f 100644 --- a/services/input/InputDispatcher.h +++ b/services/input/InputDispatcher.h @@ -1070,6 +1070,9 @@ private: void prepareDispatchCycleLocked(nsecs_t currentTime, const sp<Connection>& connection, EventEntry* eventEntry, const InputTarget* inputTarget, bool resumeWithAppendedMotionSample); + void enqueueDispatchEntriesLocked(nsecs_t currentTime, const sp<Connection>& connection, + EventEntry* eventEntry, const InputTarget* inputTarget, + bool resumeWithAppendedMotionSample); void enqueueDispatchEntryLocked(const sp<Connection>& connection, EventEntry* eventEntry, const InputTarget* inputTarget, bool resumeWithAppendedMotionSample, int32_t dispatchMode); diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index 4ef883747b0c..4d5e0a648844 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -195,7 +195,7 @@ class BackupManagerService extends IBackupManager.Stub { boolean mProvisioned; boolean mAutoRestore; PowerManager.WakeLock mWakelock; - HandlerThread mHandlerThread = new HandlerThread("backup", Process.THREAD_PRIORITY_BACKGROUND); + HandlerThread mHandlerThread; BackupHandler mBackupHandler; PendingIntent mRunBackupIntent, mRunInitIntent; BroadcastReceiver mRunBackupReceiver, mRunInitReceiver; @@ -1310,14 +1310,10 @@ class BackupManagerService extends IBackupManager.Stub { } if (added) { synchronized (mBackupParticipants) { - for (String pkgName : pkgList) { - if (replacing) { - // The package was just upgraded - updatePackageParticipantsLocked(pkgName); - } else { - // The package was just added - addPackageParticipantsLocked(pkgName); - } + if (replacing) { + updatePackageParticipantsLocked(pkgList); + } else { + addPackageParticipantsLocked(pkgList); } } } else { @@ -1325,9 +1321,7 @@ class BackupManagerService extends IBackupManager.Stub { // The package is being updated. We'll receive a PACKAGE_ADDED shortly. } else { synchronized (mBackupParticipants) { - for (String pkgName : pkgList) { - removePackageParticipantsLocked(pkgName); - } + removePackageParticipantsLocked(pkgList); } } } @@ -1349,26 +1343,26 @@ class BackupManagerService extends IBackupManager.Stub { } }; - // Add the backup agents in the given package to our set of known backup participants. - // If 'packageName' is null, adds all backup agents in the whole system. - void addPackageParticipantsLocked(String packageName) { + // Add the backup agents in the given packages to our set of known backup participants. + // If 'packageNames' is null, adds all backup agents in the whole system. + void addPackageParticipantsLocked(String[] packageNames) { // Look for apps that define the android:backupAgent attribute - if (DEBUG) Slog.v(TAG, "addPackageParticipantsLocked: " + packageName); List<PackageInfo> targetApps = allAgentPackages(); - addPackageParticipantsLockedInner(packageName, targetApps); + if (packageNames != null) { + if (DEBUG) Slog.v(TAG, "addPackageParticipantsLocked: #" + packageNames.length); + for (String packageName : packageNames) { + addPackageParticipantsLockedInner(packageName, targetApps); + } + } else { + if (DEBUG) Slog.v(TAG, "addPackageParticipantsLocked: all"); + addPackageParticipantsLockedInner(null, targetApps); + } } private void addPackageParticipantsLockedInner(String packageName, List<PackageInfo> targetPkgs) { if (MORE_DEBUG) { - Slog.v(TAG, "Adding " + targetPkgs.size() + " backup participants:"); - for (PackageInfo p : targetPkgs) { - Slog.v(TAG, " " + p + " agent=" + p.applicationInfo.backupAgentName - + " uid=" + p.applicationInfo.uid - + " killAfterRestore=" - + (((p.applicationInfo.flags & ApplicationInfo.FLAG_KILL_AFTER_RESTORE) != 0) ? "true" : "false") - ); - } + Slog.v(TAG, "Examining " + packageName + " for backup agent"); } for (PackageInfo pkg : targetPkgs) { @@ -1380,6 +1374,7 @@ class BackupManagerService extends IBackupManager.Stub { mBackupParticipants.put(uid, set); } set.add(pkg.applicationInfo); + if (MORE_DEBUG) Slog.v(TAG, "Agent found; added"); // If we've never seen this app before, schedule a backup for it if (!mEverStoredApps.contains(pkg.packageName)) { @@ -1391,34 +1386,32 @@ class BackupManagerService extends IBackupManager.Stub { } } - // Remove the given package's entry from our known active set. If - // 'packageName' is null, *all* participating apps will be removed. - void removePackageParticipantsLocked(String packageName) { - if (DEBUG) Slog.v(TAG, "removePackageParticipantsLocked: " + packageName); - List<String> allApps = new ArrayList<String>(); - if (packageName != null) { - allApps.add(packageName); - } else { - // all apps with agents - List<PackageInfo> knownPackages = allAgentPackages(); - for (PackageInfo pkg : knownPackages) { - allApps.add(pkg.packageName); - } + // Remove the given packages' entries from our known active set. + void removePackageParticipantsLocked(String[] packageNames) { + if (packageNames == null) { + Slog.w(TAG, "removePackageParticipants with null list"); + return; + } + + if (DEBUG) Slog.v(TAG, "removePackageParticipantsLocked: #" + packageNames.length); + List<PackageInfo> knownPackages = allAgentPackages(); + for (String pkg : packageNames) { + removePackageParticipantsLockedInner(pkg, knownPackages); } - removePackageParticipantsLockedInner(packageName, allApps); } private void removePackageParticipantsLockedInner(String packageName, - List<String> allPackageNames) { + List<PackageInfo> allPackages) { if (MORE_DEBUG) { Slog.v(TAG, "removePackageParticipantsLockedInner (" + packageName - + ") removing " + allPackageNames.size() + " entries"); - for (String p : allPackageNames) { - Slog.v(TAG, " - " + p); + + ") removing from " + allPackages.size() + " entries"); + for (PackageInfo p : allPackages) { + Slog.v(TAG, " - " + p.packageName); } } - for (String pkg : allPackageNames) { - if (packageName == null || pkg.equals(packageName)) { + for (PackageInfo pkg : allPackages) { + if (packageName == null || pkg.packageName.equals(packageName)) { + /* int uid = -1; try { PackageInfo info = mPackageManager.getPackageInfo(packageName, 0); @@ -1427,22 +1420,28 @@ class BackupManagerService extends IBackupManager.Stub { // we don't know this package name, so just skip it for now continue; } + */ + final int uid = pkg.applicationInfo.uid; + if (MORE_DEBUG) Slog.i(TAG, " found pkg " + packageName + " uid=" + uid); HashSet<ApplicationInfo> set = mBackupParticipants.get(uid); if (set != null) { // Find the existing entry with the same package name, and remove it. // We can't just remove(app) because the instances are different. for (ApplicationInfo entry: set) { + if (MORE_DEBUG) Slog.i(TAG, " checking against " + entry.packageName); if (entry.packageName.equals(pkg)) { if (MORE_DEBUG) Slog.v(TAG, " removing participant " + pkg); set.remove(entry); - removeEverBackedUp(pkg); + removeEverBackedUp(pkg.packageName); break; } } if (set.size() == 0) { mBackupParticipants.delete(uid); } + } else { + if (MORE_DEBUG) Slog.i(TAG, " ... not found in uid mapping"); } } } @@ -1477,21 +1476,20 @@ class BackupManagerService extends IBackupManager.Stub { // Reset the given package's known backup participants. Unlike add/remove, the update // action cannot be passed a null package name. - void updatePackageParticipantsLocked(String packageName) { - if (packageName == null) { - Slog.e(TAG, "updatePackageParticipants called with null package name"); + void updatePackageParticipantsLocked(String[] packageNames) { + if (packageNames == null) { + Slog.e(TAG, "updatePackageParticipants called with null package list"); return; } - if (DEBUG) Slog.v(TAG, "updatePackageParticipantsLocked: " + packageName); + if (DEBUG) Slog.v(TAG, "updatePackageParticipantsLocked: #" + packageNames.length); - // brute force but small code size - List<PackageInfo> allApps = allAgentPackages(); - List<String> allAppNames = new ArrayList<String>(); - for (PackageInfo pkg : allApps) { - allAppNames.add(pkg.packageName); + if (packageNames.length > 0) { + List<PackageInfo> allApps = allAgentPackages(); + for (String packageName : packageNames) { + removePackageParticipantsLockedInner(packageName, allApps); + addPackageParticipantsLockedInner(packageName, allApps); + } } - removePackageParticipantsLockedInner(packageName, allAppNames); - addPackageParticipantsLockedInner(packageName, allApps); } // Called from the backup task: record that the given app has been successfully diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index bbb4917fbab2..db0a736dfefa 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -4045,6 +4045,7 @@ public final class ActivityManagerService extends ActivityManagerNative mHandler.sendMessageDelayed(nmsg, POWER_CHECK_DELAY); // Tell anyone interested that we are done booting! SystemProperties.set("sys.boot_completed", "1"); + SystemProperties.set("dev.bootcomplete", "1"); broadcastIntentLocked(null, null, new Intent(Intent.ACTION_BOOT_COMPLETED, null), null, null, 0, null, null, diff --git a/services/java/com/android/server/connectivity/Vpn.java b/services/java/com/android/server/connectivity/Vpn.java index efa05baa365e..c4f9ce10b92c 100644 --- a/services/java/com/android/server/connectivity/Vpn.java +++ b/services/java/com/android/server/connectivity/Vpn.java @@ -322,7 +322,7 @@ public class Vpn extends INetworkManagementEventObserver.Stub { .setContentTitle(title) .setContentText(text) .setContentIntent(VpnConfig.getIntentForStatusPanel(mContext, config)) - .setDefaults(Notification.DEFAULT_ALL) + .setDefaults(0) .setOngoing(true) .getNotification(); nm.notify(R.drawable.vpn_connected, notification); diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 75ace4f3082f..6ff010004280 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -7396,8 +7396,11 @@ public class WindowManagerService extends IWindowManager.Stub final int N = mWindows.size(); int i; - if (DEBUG_LAYOUT) Slog.v(TAG, "performLayout: needed=" - + mLayoutNeeded + " dw=" + dw + " dh=" + dh); + if (DEBUG_LAYOUT) { + Slog.v(TAG, "-------------------------------------"); + Slog.v(TAG, "performLayout: needed=" + + mLayoutNeeded + " dw=" + dw + " dh=" + dh); + } mPolicy.beginLayoutLw(dw, dh, mRotation); @@ -7414,19 +7417,20 @@ public class WindowManagerService extends IWindowManager.Stub // Don't do layout of a window if it is not visible, or // soon won't be visible, to avoid wasting time and funky // changes while a window is animating away. - final AppWindowToken atoken = win.mAppToken; - final boolean gone = win.mViewVisibility == View.GONE - || !win.mRelayoutCalled - || (atoken == null && win.mRootToken.hidden) - || (atoken != null && atoken.hiddenRequested) - || win.mAttachedHidden - || win.mExiting || win.mDestroying; + final boolean gone = win.isGoneForLayoutLw(); if (DEBUG_LAYOUT && !win.mLayoutAttached) { - Slog.v(TAG, "First pass " + win + Slog.v(TAG, "1ST PASS " + win + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame + " mLayoutAttached=" + win.mLayoutAttached); - if (gone) Slog.v(TAG, " (mViewVisibility=" + final AppWindowToken atoken = win.mAppToken; + if (gone) Slog.v(TAG, " GONE: mViewVisibility=" + + win.mViewVisibility + " mRelayoutCalled=" + + win.mRelayoutCalled + " hidden=" + + win.mRootToken.hidden + " hiddenRequested=" + + (atoken != null && atoken.hiddenRequested) + + " mAttachedHidden=" + win.mAttachedHidden); + else Slog.v(TAG, " VIS: mViewVisibility=" + win.mViewVisibility + " mRelayoutCalled=" + win.mRelayoutCalled + " hidden=" + win.mRootToken.hidden + " hiddenRequested=" @@ -7448,7 +7452,7 @@ public class WindowManagerService extends IWindowManager.Stub win.prelayout(); mPolicy.layoutWindowLw(win, win.mAttrs, null); win.mLayoutSeq = seq; - if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame=" + if (DEBUG_LAYOUT) Slog.v(TAG, " LAYOUT: mFrame=" + win.mFrame + " mContainingFrame=" + win.mContainingFrame + " mDisplayFrame=" + win.mDisplayFrame); @@ -7466,7 +7470,7 @@ public class WindowManagerService extends IWindowManager.Stub WindowState win = mWindows.get(i); if (win.mLayoutAttached) { - if (DEBUG_LAYOUT) Slog.v(TAG, "Second pass " + win + if (DEBUG_LAYOUT) Slog.v(TAG, "2ND PASS " + win + " mHaveFrame=" + win.mHaveFrame + " mViewVisibility=" + win.mViewVisibility + " mRelayoutCalled=" + win.mRelayoutCalled); @@ -7484,7 +7488,7 @@ public class WindowManagerService extends IWindowManager.Stub win.prelayout(); mPolicy.layoutWindowLw(win, win.mAttrs, win.mAttachedWindow); win.mLayoutSeq = seq; - if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame=" + if (DEBUG_LAYOUT) Slog.v(TAG, " LAYOUT: mFrame=" + win.mFrame + " mContainingFrame=" + win.mContainingFrame + " mDisplayFrame=" + win.mDisplayFrame); diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java index 75bda4155295..794515b9350a 100644 --- a/services/java/com/android/server/wm/WindowState.java +++ b/services/java/com/android/server/wm/WindowState.java @@ -1444,6 +1444,16 @@ final class WindowState implements WindowManagerPolicy.WindowState { || mAnimating); } + public boolean isGoneForLayoutLw() { + final AppWindowToken atoken = mAppToken; + return mViewVisibility == View.GONE + || !mRelayoutCalled + || (atoken == null && mRootToken.hidden) + || (atoken != null && (atoken.hiddenRequested || atoken.hidden)) + || mAttachedHidden + || mExiting || mDestroying; + } + /** * Returns true if the window has a surface that it has drawn a * complete UI in to. diff --git a/services/surfaceflinger/EventThread.cpp b/services/surfaceflinger/EventThread.cpp index 035836ed2992..80ab5195cec5 100644 --- a/services/surfaceflinger/EventThread.cpp +++ b/services/surfaceflinger/EventThread.cpp @@ -102,7 +102,7 @@ bool EventThread::threadLoop() { nsecs_t timestamp; DisplayEventReceiver::Event vsync; - KeyedVector< wp<DisplayEventConnection>, ConnectionInfo > displayEventConnections; + Vector< wp<DisplayEventConnection> > displayEventConnections; { // scope for the lock Mutex::Autolock _l(mLock); @@ -153,6 +153,9 @@ bool EventThread::threadLoop() { } info.count--; } + if (reportVsync) { + displayEventConnections.add(mDisplayEventConnections.keyAt(i)); + } } if (reportVsync) { @@ -164,15 +167,11 @@ bool EventThread::threadLoop() { vsync.header.type = DisplayEventReceiver::DISPLAY_EVENT_VSYNC; vsync.header.timestamp = timestamp; vsync.vsync.count = mDeliveredEvents; - - // make a copy of our connection list, so we can - // dispatch events without holding mLock - displayEventConnections = mDisplayEventConnections; } const size_t count = displayEventConnections.size(); for (size_t i=0 ; i<count ; i++) { - sp<DisplayEventConnection> conn(displayEventConnections.keyAt(i).promote()); + sp<DisplayEventConnection> conn(displayEventConnections[i].promote()); // make sure the connection didn't die if (conn != NULL) { status_t err = conn->postEvent(vsync); @@ -186,12 +185,12 @@ bool EventThread::threadLoop() { // handle any other error on the pipe as fatal. the only // reasonable thing to do is to clean-up this connection. // The most common error we'll get here is -EPIPE. - removeDisplayEventConnection(displayEventConnections.keyAt(i)); + removeDisplayEventConnection(displayEventConnections[i]); } } else { // somehow the connection is dead, but we still have it in our list // just clean the list. - removeDisplayEventConnection(displayEventConnections.keyAt(i)); + removeDisplayEventConnection(displayEventConnections[i]); } } diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 42ae4088540c..af474022dddf 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -59,15 +59,9 @@ #include "DisplayHardware/DisplayHardware.h" #include "DisplayHardware/HWComposer.h" +#include <private/android_filesystem_config.h> #include <private/surfaceflinger/SharedBufferStack.h> -/* ideally AID_GRAPHICS would be in a semi-public header - * or there would be a way to map a user/group name to its id - */ -#ifndef AID_GRAPHICS -#define AID_GRAPHICS 1003 -#endif - #define EGL_VERSION_HW_ANDROID 0x3143 #define DISPLAY_COUNT 1 diff --git a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java index dab72a93f0e3..664a0917d1a8 100644 --- a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java @@ -1038,8 +1038,10 @@ public abstract class DataConnectionTracker extends Handler { didDisable = true; } } - if (didDisable && enabledCount == 0) { - onCleanUpConnection(true, apnId, Phone.REASON_DATA_DISABLED); + if (didDisable) { + if (enabledCount == 0) { + onCleanUpConnection(true, apnId, Phone.REASON_DATA_DISABLED); + } // send the disconnect msg manually, since the normal route wont send // it (it's not enabled) diff --git a/wifi/java/android/net/wifi/SupplicantStateTracker.java b/wifi/java/android/net/wifi/SupplicantStateTracker.java index cbd284cf361b..104a02d2ee6e 100644 --- a/wifi/java/android/net/wifi/SupplicantStateTracker.java +++ b/wifi/java/android/net/wifi/SupplicantStateTracker.java @@ -39,6 +39,7 @@ class SupplicantStateTracker extends StateMachine { private static final boolean DBG = false; private WifiStateMachine mWifiStateMachine; + private WifiConfigStore mWifiConfigStore; private int mAuthenticationFailuresCount = 0; /* Indicates authentication failure in supplicant broadcast. * TODO: enhance auth failure reporting to include notification @@ -62,11 +63,12 @@ class SupplicantStateTracker extends StateMachine { private State mCompletedState = new CompletedState(); private State mDormantState = new DormantState(); - public SupplicantStateTracker(Context context, WifiStateMachine wsm, Handler target) { - super(TAG, target.getLooper()); + public SupplicantStateTracker(Context c, WifiStateMachine wsm, WifiConfigStore wcs, Handler t) { + super(TAG, t.getLooper()); - mContext = context; + mContext = c; mWifiStateMachine = wsm; + mWifiConfigStore = wcs; addState(mDefaultState); addState(mUninitializedState, mDefaultState); addState(mInactiveState, mDefaultState); @@ -85,11 +87,11 @@ class SupplicantStateTracker extends StateMachine { private void handleNetworkConnectionFailure(int netId) { /* If other networks disabled during connection, enable them */ if (mNetworksDisabledDuringConnect) { - WifiConfigStore.enableAllNetworks(); + mWifiConfigStore.enableAllNetworks(); mNetworksDisabledDuringConnect = false; } /* Disable failed network */ - WifiConfigStore.disableNetwork(netId, WifiConfiguration.DISABLED_AUTH_FAILURE); + mWifiConfigStore.disableNetwork(netId, WifiConfiguration.DISABLED_AUTH_FAILURE); } private void transitionOnSupplicantStateChange(StateChangeResult stateChangeResult) { @@ -285,7 +287,7 @@ class SupplicantStateTracker extends StateMachine { /* Reset authentication failure count */ mAuthenticationFailuresCount = 0; if (mNetworksDisabledDuringConnect) { - WifiConfigStore.enableAllNetworks(); + mWifiConfigStore.enableAllNetworks(); mNetworksDisabledDuringConnect = false; } } diff --git a/wifi/java/android/net/wifi/WifiConfigStore.java b/wifi/java/android/net/wifi/WifiConfigStore.java index cba0fbaa9565..5dffa6057e32 100644 --- a/wifi/java/android/net/wifi/WifiConfigStore.java +++ b/wifi/java/android/net/wifi/WifiConfigStore.java @@ -103,12 +103,12 @@ import java.util.concurrent.atomic.AtomicInteger; */ class WifiConfigStore { - private static Context sContext; + private Context mContext; private static final String TAG = "WifiConfigStore"; private static final boolean DBG = false; /* configured networks with network id as the key */ - private static HashMap<Integer, WifiConfiguration> sConfiguredNetworks = + private HashMap<Integer, WifiConfiguration> mConfiguredNetworks = new HashMap<Integer, WifiConfiguration>(); /* A network id is a unique identifier for a network configured in the @@ -118,11 +118,11 @@ class WifiConfigStore { * that is generated from SSID and security type of the network. A mapping * from the generated unique id to network id of the network is needed to * map supplicant config to IP configuration. */ - private static HashMap<Integer, Integer> sNetworkIds = + private HashMap<Integer, Integer> mNetworkIds = new HashMap<Integer, Integer>(); /* Tracks the highest priority of configured networks */ - private static int sLastPriority = -1; + private int mLastPriority = -1; private static final String ipConfigFile = Environment.getDataDirectory() + "/misc/wifi/ipconfig.txt"; @@ -141,20 +141,19 @@ class WifiConfigStore { private static final String EXCLUSION_LIST_KEY = "exclusionList"; private static final String EOS = "eos"; - private static HandlerThread sDiskWriteHandlerThread; - private static DiskWriteHandler sDiskWriteHandler; - private static Object sDiskWriteHandlerSync = new Object(); - /* Tracks multiple writes on the same thread */ - private static int sWriteSequence = 0; - private static final int WRITE = 1; + private WifiNative mWifiNative; + + WifiConfigStore(Context c, WifiNative wn) { + mContext = c; + mWifiNative = wn; + } /** - * Initialize context, fetch the list of configured networks + * Fetch the list of configured networks * and enable all stored networks in supplicant. */ - static void initialize(Context context) { + void initialize() { if (DBG) log("Loading config and enabling all networks"); - sContext = context; loadConfiguredNetworks(); enableAllNetworks(); } @@ -163,9 +162,9 @@ class WifiConfigStore { * Fetch the list of currently configured networks * @return List of networks */ - static List<WifiConfiguration> getConfiguredNetworks() { + List<WifiConfiguration> getConfiguredNetworks() { List<WifiConfiguration> networks = new ArrayList<WifiConfiguration>(); - for(WifiConfiguration config : sConfiguredNetworks.values()) { + for(WifiConfiguration config : mConfiguredNetworks.values()) { networks.add(new WifiConfiguration(config)); } return networks; @@ -175,11 +174,11 @@ class WifiConfigStore { * enable all networks and save config. This will be a no-op if the list * of configured networks indicates all networks as being enabled */ - static void enableAllNetworks() { + void enableAllNetworks() { boolean networkEnabledStateChanged = false; - for(WifiConfiguration config : sConfiguredNetworks.values()) { + for(WifiConfiguration config : mConfiguredNetworks.values()) { if(config != null && config.status == Status.DISABLED) { - if(WifiNative.enableNetwork(config.networkId, false)) { + if(mWifiNative.enableNetwork(config.networkId, false)) { networkEnabledStateChanged = true; config.status = Status.ENABLED; } else { @@ -189,7 +188,7 @@ class WifiConfigStore { } if (networkEnabledStateChanged) { - WifiNative.saveConfig(); + mWifiNative.saveConfig(); sendConfiguredNetworksChangedBroadcast(); } } @@ -206,7 +205,7 @@ class WifiConfigStore { * @param config The configuration details in WifiConfiguration * @return the networkId now associated with the specified configuration */ - static int selectNetwork(WifiConfiguration config) { + int selectNetwork(WifiConfiguration config) { if (config != null) { NetworkUpdateResult result = addOrUpdateNetworkNative(config); int netId = result.getNetworkId(); @@ -231,25 +230,25 @@ class WifiConfigStore { * * @param netId network to select for connection */ - static void selectNetwork(int netId) { + void selectNetwork(int netId) { // Reset the priority of each network at start or if it goes too high. - if (sLastPriority == -1 || sLastPriority > 1000000) { - for(WifiConfiguration config : sConfiguredNetworks.values()) { + if (mLastPriority == -1 || mLastPriority > 1000000) { + for(WifiConfiguration config : mConfiguredNetworks.values()) { if (config.networkId != INVALID_NETWORK_ID) { config.priority = 0; addOrUpdateNetworkNative(config); } } - sLastPriority = 0; + mLastPriority = 0; } // Set to the highest priority and save the configuration. WifiConfiguration config = new WifiConfiguration(); config.networkId = netId; - config.priority = ++sLastPriority; + config.priority = ++mLastPriority; addOrUpdateNetworkNative(config); - WifiNative.saveConfig(); + mWifiNative.saveConfig(); /* Enable the given network while disabling all other networks */ enableNetworkWithoutBroadcast(netId, true); @@ -263,23 +262,23 @@ class WifiConfigStore { * * @param config WifiConfiguration to be saved */ - static NetworkUpdateResult saveNetwork(WifiConfiguration config) { + NetworkUpdateResult saveNetwork(WifiConfiguration config) { boolean newNetwork = (config.networkId == INVALID_NETWORK_ID); NetworkUpdateResult result = addOrUpdateNetworkNative(config); int netId = result.getNetworkId(); /* enable a new network */ if (newNetwork && netId != INVALID_NETWORK_ID) { - WifiNative.enableNetwork(netId, false); - sConfiguredNetworks.get(netId).status = Status.ENABLED; + mWifiNative.enableNetwork(netId, false); + mConfiguredNetworks.get(netId).status = Status.ENABLED; } - WifiNative.saveConfig(); + mWifiNative.saveConfig(); sendConfiguredNetworksChangedBroadcast(); return result; } - static void updateStatus(int netId, DetailedState state) { + void updateStatus(int netId, DetailedState state) { if (netId != INVALID_NETWORK_ID) { - WifiConfiguration config = sConfiguredNetworks.get(netId); + WifiConfiguration config = mConfiguredNetworks.get(netId); if (config == null) return; switch (state) { case CONNECTED: @@ -300,13 +299,13 @@ class WifiConfigStore { * * @param netId network to forget */ - static void forgetNetwork(int netId) { - if (WifiNative.removeNetwork(netId)) { - WifiNative.saveConfig(); - WifiConfiguration config = sConfiguredNetworks.get(netId); + void forgetNetwork(int netId) { + if (mWifiNative.removeNetwork(netId)) { + mWifiNative.saveConfig(); + WifiConfiguration config = mConfiguredNetworks.get(netId); if (config != null) { - sConfiguredNetworks.remove(netId); - sNetworkIds.remove(configKey(config)); + mConfiguredNetworks.remove(netId); + mNetworkIds.remove(configKey(config)); } writeIpAndProxyConfigurations(); sendConfiguredNetworksChangedBroadcast(); @@ -323,7 +322,7 @@ class WifiConfigStore { * * @param config wifi configuration to add/update */ - static int addOrUpdateNetwork(WifiConfiguration config) { + int addOrUpdateNetwork(WifiConfiguration config) { NetworkUpdateResult result = addOrUpdateNetworkNative(config); sendConfiguredNetworksChangedBroadcast(); return result.getNetworkId(); @@ -337,13 +336,13 @@ class WifiConfigStore { * * @param netId network to be removed */ - static boolean removeNetwork(int netId) { - boolean ret = WifiNative.removeNetwork(netId); + boolean removeNetwork(int netId) { + boolean ret = mWifiNative.removeNetwork(netId); if (ret) { - WifiConfiguration config = sConfiguredNetworks.get(netId); + WifiConfiguration config = mConfiguredNetworks.get(netId); if (config != null) { - sConfiguredNetworks.remove(netId); - sNetworkIds.remove(configKey(config)); + mConfiguredNetworks.remove(netId); + mNetworkIds.remove(configKey(config)); } } sendConfiguredNetworksChangedBroadcast(); @@ -358,16 +357,16 @@ class WifiConfigStore { * * @param netId network to be removed */ - static boolean enableNetwork(int netId, boolean disableOthers) { + boolean enableNetwork(int netId, boolean disableOthers) { boolean ret = enableNetworkWithoutBroadcast(netId, disableOthers); sendConfiguredNetworksChangedBroadcast(); return ret; } - static boolean enableNetworkWithoutBroadcast(int netId, boolean disableOthers) { - boolean ret = WifiNative.enableNetwork(netId, disableOthers); + boolean enableNetworkWithoutBroadcast(int netId, boolean disableOthers) { + boolean ret = mWifiNative.enableNetwork(netId, disableOthers); - WifiConfiguration config = sConfiguredNetworks.get(netId); + WifiConfiguration config = mConfiguredNetworks.get(netId); if (config != null) config.status = Status.ENABLED; if (disableOthers) { @@ -380,7 +379,7 @@ class WifiConfigStore { * Disable a network. Note that there is no saveConfig operation. * @param netId network to be disabled */ - static boolean disableNetwork(int netId) { + boolean disableNetwork(int netId) { return disableNetwork(netId, WifiConfiguration.DISABLED_UNKNOWN_REASON); } @@ -389,9 +388,9 @@ class WifiConfigStore { * @param netId network to be disabled * @param reason reason code network was disabled */ - static boolean disableNetwork(int netId, int reason) { - boolean ret = WifiNative.disableNetwork(netId); - WifiConfiguration config = sConfiguredNetworks.get(netId); + boolean disableNetwork(int netId, int reason) { + boolean ret = mWifiNative.disableNetwork(netId); + WifiConfiguration config = mConfiguredNetworks.get(netId); /* Only change the reason if the network was not previously disabled */ if (config != null && config.status != Status.DISABLED) { config.status = Status.DISABLED; @@ -404,17 +403,17 @@ class WifiConfigStore { /** * Save the configured networks in supplicant to disk */ - static boolean saveConfig() { - return WifiNative.saveConfig(); + boolean saveConfig() { + return mWifiNative.saveConfig(); } /** * Start WPS pin method configuration with pin obtained * from the access point */ - static WpsResult startWpsWithPinFromAccessPoint(WpsInfo config) { + WpsResult startWpsWithPinFromAccessPoint(WpsInfo config) { WpsResult result = new WpsResult(); - if (WifiNative.startWpsRegistrar(config.BSSID, config.pin)) { + if (mWifiNative.startWpsRegistrar(config.BSSID, config.pin)) { /* WPS leaves all networks disabled */ markAllNetworksDisabled(); result.status = WpsResult.Status.SUCCESS; @@ -430,9 +429,9 @@ class WifiConfigStore { * from the device * @return WpsResult indicating status and pin */ - static WpsResult startWpsWithPinFromDevice(WpsInfo config) { + WpsResult startWpsWithPinFromDevice(WpsInfo config) { WpsResult result = new WpsResult(); - result.pin = WifiNative.startWpsPinDisplay(config.BSSID); + result.pin = mWifiNative.startWpsPinDisplay(config.BSSID); /* WPS leaves all networks disabled */ if (!TextUtils.isEmpty(result.pin)) { markAllNetworksDisabled(); @@ -447,9 +446,9 @@ class WifiConfigStore { /** * Start WPS push button configuration */ - static WpsResult startWpsPbc(WpsInfo config) { + WpsResult startWpsPbc(WpsInfo config) { WpsResult result = new WpsResult(); - if (WifiNative.startWpsPbc(config.BSSID)) { + if (mWifiNative.startWpsPbc(config.BSSID)) { /* WPS leaves all networks disabled */ markAllNetworksDisabled(); result.status = WpsResult.Status.SUCCESS; @@ -463,8 +462,8 @@ class WifiConfigStore { /** * Fetch the link properties for a given network id */ - static LinkProperties getLinkProperties(int netId) { - WifiConfiguration config = sConfiguredNetworks.get(netId); + LinkProperties getLinkProperties(int netId) { + WifiConfiguration config = mConfiguredNetworks.get(netId); if (config != null) return new LinkProperties(config.linkProperties); return null; } @@ -476,7 +475,7 @@ class WifiConfigStore { * that, we should remove handling DhcpInfo and move * to using LinkProperties */ - static DhcpInfoInternal getIpConfiguration(int netId) { + DhcpInfoInternal getIpConfiguration(int netId) { DhcpInfoInternal dhcpInfoInternal = new DhcpInfoInternal(); LinkProperties linkProperties = getLinkProperties(netId); @@ -502,10 +501,10 @@ class WifiConfigStore { /** * set IP configuration for a given network id */ - static void setIpConfiguration(int netId, DhcpInfoInternal dhcpInfo) { + void setIpConfiguration(int netId, DhcpInfoInternal dhcpInfo) { LinkProperties linkProperties = dhcpInfo.makeLinkProperties(); - WifiConfiguration config = sConfiguredNetworks.get(netId); + WifiConfiguration config = mConfiguredNetworks.get(netId); if (config != null) { // add old proxy details if(config.linkProperties != null) { @@ -518,8 +517,8 @@ class WifiConfigStore { /** * clear IP configuration for a given network id */ - static void clearIpConfiguration(int netId) { - WifiConfiguration config = sConfiguredNetworks.get(netId); + void clearIpConfiguration(int netId) { + WifiConfiguration config = mConfiguredNetworks.get(netId); if (config != null && config.linkProperties != null) { // Clear everything except proxy ProxyProperties proxy = config.linkProperties.getHttpProxy(); @@ -532,7 +531,7 @@ class WifiConfigStore { /** * Fetch the proxy properties for a given network id */ - static ProxyProperties getProxyProperties(int netId) { + ProxyProperties getProxyProperties(int netId) { LinkProperties linkProperties = getLinkProperties(netId); if (linkProperties != null) { return new ProxyProperties(linkProperties.getHttpProxy()); @@ -543,26 +542,26 @@ class WifiConfigStore { /** * Return if the specified network is using static IP */ - static boolean isUsingStaticIp(int netId) { - WifiConfiguration config = sConfiguredNetworks.get(netId); + boolean isUsingStaticIp(int netId) { + WifiConfiguration config = mConfiguredNetworks.get(netId); if (config != null && config.ipAssignment == IpAssignment.STATIC) { return true; } return false; } - private static void sendConfiguredNetworksChangedBroadcast() { + private void sendConfiguredNetworksChangedBroadcast() { Intent intent = new Intent(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); - sContext.sendBroadcast(intent); + mContext.sendBroadcast(intent); } - static void loadConfiguredNetworks() { - String listStr = WifiNative.listNetworks(); - sLastPriority = 0; + void loadConfiguredNetworks() { + String listStr = mWifiNative.listNetworks(); + mLastPriority = 0; - sConfiguredNetworks.clear(); - sNetworkIds.clear(); + mConfiguredNetworks.clear(); + mNetworkIds.clear(); if (listStr == null) return; @@ -589,19 +588,19 @@ class WifiConfigStore { config.status = WifiConfiguration.Status.ENABLED; } readNetworkVariables(config); - if (config.priority > sLastPriority) { - sLastPriority = config.priority; + if (config.priority > mLastPriority) { + mLastPriority = config.priority; } - sConfiguredNetworks.put(config.networkId, config); - sNetworkIds.put(configKey(config), config.networkId); + mConfiguredNetworks.put(config.networkId, config); + mNetworkIds.put(configKey(config), config.networkId); } readIpAndProxyConfigurations(); sendConfiguredNetworksChangedBroadcast(); } - static void updateIpAndProxyFromWpsConfig(int netId, WpsInfo wpsConfig) { - WifiConfiguration config = sConfiguredNetworks.get(netId); + void updateIpAndProxyFromWpsConfig(int netId, WpsInfo wpsConfig) { + WifiConfiguration config = mConfiguredNetworks.get(netId); if (config != null) { config.ipAssignment = wpsConfig.ipAssignment; config.proxySettings = wpsConfig.proxySettings; @@ -611,8 +610,8 @@ class WifiConfigStore { } /* Mark all networks except specified netId as disabled */ - private static void markAllNetworksDisabledExcept(int netId) { - for(WifiConfiguration config : sConfiguredNetworks.values()) { + private void markAllNetworksDisabledExcept(int netId) { + for(WifiConfiguration config : mConfiguredNetworks.values()) { if(config != null && config.networkId != netId) { if (config.status != Status.DISABLED) { config.status = Status.DISABLED; @@ -622,43 +621,49 @@ class WifiConfigStore { } } - private static void markAllNetworksDisabled() { + private void markAllNetworksDisabled() { markAllNetworksDisabledExcept(INVALID_NETWORK_ID); } - private static void writeIpAndProxyConfigurations() { + private void writeIpAndProxyConfigurations() { /* Make a copy */ List<WifiConfiguration> networks = new ArrayList<WifiConfiguration>(); - for(WifiConfiguration config : sConfiguredNetworks.values()) { + for(WifiConfiguration config : mConfiguredNetworks.values()) { networks.add(new WifiConfiguration(config)); } - /* Do a delayed write to disk on a seperate handler thread */ - synchronized (sDiskWriteHandlerSync) { - if (++sWriteSequence == 1) { - sDiskWriteHandlerThread = new HandlerThread("WifiConfigThread"); - sDiskWriteHandlerThread.start(); - sDiskWriteHandler = new DiskWriteHandler(sDiskWriteHandlerThread.getLooper()); - } - } - - sDiskWriteHandler.sendMessage(Message.obtain(sDiskWriteHandler, WRITE, networks)); + DelayedDiskWrite.write(networks); } - private static class DiskWriteHandler extends Handler { + private static class DelayedDiskWrite { - DiskWriteHandler(android.os.Looper l) { - super(l); - } + private static HandlerThread sDiskWriteHandlerThread; + private static Handler sDiskWriteHandler; + /* Tracks multiple writes on the same thread */ + private static int sWriteSequence = 0; + private static final String TAG = "DelayedDiskWrite"; - public void handleMessage(Message msg) { + static void write (final List<WifiConfiguration> networks) { - if (msg.what != WRITE) { - throw new RuntimeException("Unsupported message in WifiConfigStore: " + msg); + /* Do a delayed write to disk on a seperate handler thread */ + synchronized (DelayedDiskWrite.class) { + if (++sWriteSequence == 1) { + sDiskWriteHandlerThread = new HandlerThread("WifiConfigThread"); + sDiskWriteHandlerThread.start(); + sDiskWriteHandler = new Handler(sDiskWriteHandlerThread.getLooper()); + } } - List<WifiConfiguration> networks = (List<WifiConfiguration>) msg.obj; + sDiskWriteHandler.post(new Runnable() { + @Override + public void run() { + onWriteCalled(networks); + } + }); + } + + private static void onWriteCalled(List<WifiConfiguration> networks) { DataOutputStream out = null; try { @@ -740,7 +745,7 @@ class WifiConfigStore { /* Ignore */ break; default: - loge("Ignore invalid proxy settings while writing"); + loge("Ignthisore invalid proxy settings while writing"); break; } if (writeToFile) { @@ -763,18 +768,22 @@ class WifiConfigStore { } //Quit if no more writes sent - synchronized (sDiskWriteHandlerSync) { + synchronized (DelayedDiskWrite.class) { if (--sWriteSequence == 0) { - getLooper().quit(); + sDiskWriteHandler.getLooper().quit(); + sDiskWriteHandler = null; sDiskWriteHandlerThread = null; - sDiskWriteHandler= null; } } } - } + } + + private static void loge(String s) { + Log.e(TAG, s); + } } - private static void readIpAndProxyConfigurations() { + private void readIpAndProxyConfigurations() { DataInputStream in = null; try { @@ -847,8 +856,8 @@ class WifiConfigStore { } while (true); if (id != -1) { - WifiConfiguration config = sConfiguredNetworks.get( - sNetworkIds.get(id)); + WifiConfiguration config = mConfiguredNetworks.get( + mNetworkIds.get(id)); if (config == null) { loge("configuration found for missing network, ignored"); @@ -901,7 +910,7 @@ class WifiConfigStore { } } - private static NetworkUpdateResult addOrUpdateNetworkNative(WifiConfiguration config) { + private NetworkUpdateResult addOrUpdateNetworkNative(WifiConfiguration config) { /* * If the supplied networkId is INVALID_NETWORK_ID, we create a new empty * network configuration. Otherwise, the networkId should @@ -911,12 +920,12 @@ class WifiConfigStore { boolean newNetwork = false; // networkId of INVALID_NETWORK_ID means we want to create a new network if (netId == INVALID_NETWORK_ID) { - Integer savedNetId = sNetworkIds.get(configKey(config)); + Integer savedNetId = mNetworkIds.get(configKey(config)); if (savedNetId != null) { netId = savedNetId; } else { newNetwork = true; - netId = WifiNative.addNetwork(); + netId = mWifiNative.addNetwork(); if (netId < 0) { loge("Failed to add a network!"); return new NetworkUpdateResult(INVALID_NETWORK_ID); @@ -929,7 +938,7 @@ class WifiConfigStore { setVariables: { if (config.SSID != null && - !WifiNative.setNetworkVariable( + !mWifiNative.setNetworkVariable( netId, WifiConfiguration.ssidVarName, config.SSID)) { @@ -938,7 +947,7 @@ class WifiConfigStore { } if (config.BSSID != null && - !WifiNative.setNetworkVariable( + !mWifiNative.setNetworkVariable( netId, WifiConfiguration.bssidVarName, config.BSSID)) { @@ -949,7 +958,7 @@ class WifiConfigStore { String allowedKeyManagementString = makeString(config.allowedKeyManagement, WifiConfiguration.KeyMgmt.strings); if (config.allowedKeyManagement.cardinality() != 0 && - !WifiNative.setNetworkVariable( + !mWifiNative.setNetworkVariable( netId, WifiConfiguration.KeyMgmt.varName, allowedKeyManagementString)) { @@ -961,7 +970,7 @@ class WifiConfigStore { String allowedProtocolsString = makeString(config.allowedProtocols, WifiConfiguration.Protocol.strings); if (config.allowedProtocols.cardinality() != 0 && - !WifiNative.setNetworkVariable( + !mWifiNative.setNetworkVariable( netId, WifiConfiguration.Protocol.varName, allowedProtocolsString)) { @@ -973,7 +982,7 @@ class WifiConfigStore { String allowedAuthAlgorithmsString = makeString(config.allowedAuthAlgorithms, WifiConfiguration.AuthAlgorithm.strings); if (config.allowedAuthAlgorithms.cardinality() != 0 && - !WifiNative.setNetworkVariable( + !mWifiNative.setNetworkVariable( netId, WifiConfiguration.AuthAlgorithm.varName, allowedAuthAlgorithmsString)) { @@ -986,7 +995,7 @@ class WifiConfigStore { makeString(config.allowedPairwiseCiphers, WifiConfiguration.PairwiseCipher.strings); if (config.allowedPairwiseCiphers.cardinality() != 0 && - !WifiNative.setNetworkVariable( + !mWifiNative.setNetworkVariable( netId, WifiConfiguration.PairwiseCipher.varName, allowedPairwiseCiphersString)) { @@ -998,7 +1007,7 @@ class WifiConfigStore { String allowedGroupCiphersString = makeString(config.allowedGroupCiphers, WifiConfiguration.GroupCipher.strings); if (config.allowedGroupCiphers.cardinality() != 0 && - !WifiNative.setNetworkVariable( + !mWifiNative.setNetworkVariable( netId, WifiConfiguration.GroupCipher.varName, allowedGroupCiphersString)) { @@ -1010,7 +1019,7 @@ class WifiConfigStore { // Prevent client screw-up by passing in a WifiConfiguration we gave it // by preventing "*" as a key. if (config.preSharedKey != null && !config.preSharedKey.equals("*") && - !WifiNative.setNetworkVariable( + !mWifiNative.setNetworkVariable( netId, WifiConfiguration.pskVarName, config.preSharedKey)) { @@ -1024,7 +1033,7 @@ class WifiConfigStore { // Prevent client screw-up by passing in a WifiConfiguration we gave it // by preventing "*" as a key. if (config.wepKeys[i] != null && !config.wepKeys[i].equals("*")) { - if (!WifiNative.setNetworkVariable( + if (!mWifiNative.setNetworkVariable( netId, WifiConfiguration.wepKeyVarNames[i], config.wepKeys[i])) { @@ -1037,7 +1046,7 @@ class WifiConfigStore { } if (hasSetKey) { - if (!WifiNative.setNetworkVariable( + if (!mWifiNative.setNetworkVariable( netId, WifiConfiguration.wepTxKeyIdxVarName, Integer.toString(config.wepTxKeyIndex))) { @@ -1046,7 +1055,7 @@ class WifiConfigStore { } } - if (!WifiNative.setNetworkVariable( + if (!mWifiNative.setNetworkVariable( netId, WifiConfiguration.priorityVarName, Integer.toString(config.priority))) { @@ -1055,7 +1064,7 @@ class WifiConfigStore { break setVariables; } - if (config.hiddenSSID && !WifiNative.setNetworkVariable( + if (config.hiddenSSID && !mWifiNative.setNetworkVariable( netId, WifiConfiguration.hiddenSSIDVarName, Integer.toString(config.hiddenSSID ? 1 : 0))) { @@ -1072,7 +1081,7 @@ class WifiConfigStore { if (field != config.eap) { value = (value.length() == 0) ? "NULL" : convertToQuotedString(value); } - if (!WifiNative.setNetworkVariable( + if (!mWifiNative.setNetworkVariable( netId, varName, value)) { @@ -1087,37 +1096,37 @@ class WifiConfigStore { if (updateFailed) { if (newNetwork) { - WifiNative.removeNetwork(netId); + mWifiNative.removeNetwork(netId); loge("Failed to set a network variable, removed network: " + netId); } return new NetworkUpdateResult(INVALID_NETWORK_ID); } /* An update of the network variables requires reading them - * back from the supplicant to update sConfiguredNetworks. + * back from the supplicant to update mConfiguredNetworks. * This is because some of the variables (SSID, wep keys & * passphrases) reflect different values when read back than * when written. For example, wep key is stored as * irrespective * of the value sent to the supplicant */ - WifiConfiguration sConfig = sConfiguredNetworks.get(netId); - if (sConfig == null) { - sConfig = new WifiConfiguration(); - sConfig.networkId = netId; + WifiConfiguration currentConfig = mConfiguredNetworks.get(netId); + if (currentConfig == null) { + currentConfig = new WifiConfiguration(); + currentConfig.networkId = netId; } - readNetworkVariables(sConfig); + readNetworkVariables(currentConfig); - sConfiguredNetworks.put(netId, sConfig); - sNetworkIds.put(configKey(sConfig), netId); + mConfiguredNetworks.put(netId, currentConfig); + mNetworkIds.put(configKey(currentConfig), netId); - NetworkUpdateResult result = writeIpAndProxyConfigurationsOnChange(sConfig, config); + NetworkUpdateResult result = writeIpAndProxyConfigurationsOnChange(currentConfig, config); result.setNetworkId(netId); return result; } /* Compare current and new configuration and write to file on change */ - private static NetworkUpdateResult writeIpAndProxyConfigurationsOnChange( + private NetworkUpdateResult writeIpAndProxyConfigurationsOnChange( WifiConfiguration currentConfig, WifiConfiguration newConfig) { boolean ipChanged = false; @@ -1216,7 +1225,7 @@ class WifiConfigStore { return new NetworkUpdateResult(ipChanged, proxyChanged); } - private static void addIpSettingsFromConfig(LinkProperties linkProperties, + private void addIpSettingsFromConfig(LinkProperties linkProperties, WifiConfiguration config) { for (LinkAddress linkAddr : config.linkProperties.getLinkAddresses()) { linkProperties.addLinkAddress(linkAddr); @@ -1235,7 +1244,7 @@ class WifiConfigStore { * * @param config the {@link WifiConfiguration} object to be filled in. */ - private static void readNetworkVariables(WifiConfiguration config) { + private void readNetworkVariables(WifiConfiguration config) { int netId = config.networkId; if (netId < 0) @@ -1248,21 +1257,21 @@ class WifiConfigStore { */ String value; - value = WifiNative.getNetworkVariable(netId, WifiConfiguration.ssidVarName); + value = mWifiNative.getNetworkVariable(netId, WifiConfiguration.ssidVarName); if (!TextUtils.isEmpty(value)) { config.SSID = value; } else { config.SSID = null; } - value = WifiNative.getNetworkVariable(netId, WifiConfiguration.bssidVarName); + value = mWifiNative.getNetworkVariable(netId, WifiConfiguration.bssidVarName); if (!TextUtils.isEmpty(value)) { config.BSSID = value; } else { config.BSSID = null; } - value = WifiNative.getNetworkVariable(netId, WifiConfiguration.priorityVarName); + value = mWifiNative.getNetworkVariable(netId, WifiConfiguration.priorityVarName); config.priority = -1; if (!TextUtils.isEmpty(value)) { try { @@ -1271,7 +1280,7 @@ class WifiConfigStore { } } - value = WifiNative.getNetworkVariable(netId, WifiConfiguration.hiddenSSIDVarName); + value = mWifiNative.getNetworkVariable(netId, WifiConfiguration.hiddenSSIDVarName); config.hiddenSSID = false; if (!TextUtils.isEmpty(value)) { try { @@ -1280,7 +1289,7 @@ class WifiConfigStore { } } - value = WifiNative.getNetworkVariable(netId, WifiConfiguration.wepTxKeyIdxVarName); + value = mWifiNative.getNetworkVariable(netId, WifiConfiguration.wepTxKeyIdxVarName); config.wepTxKeyIndex = -1; if (!TextUtils.isEmpty(value)) { try { @@ -1290,7 +1299,7 @@ class WifiConfigStore { } for (int i = 0; i < 4; i++) { - value = WifiNative.getNetworkVariable(netId, + value = mWifiNative.getNetworkVariable(netId, WifiConfiguration.wepKeyVarNames[i]); if (!TextUtils.isEmpty(value)) { config.wepKeys[i] = value; @@ -1299,14 +1308,14 @@ class WifiConfigStore { } } - value = WifiNative.getNetworkVariable(netId, WifiConfiguration.pskVarName); + value = mWifiNative.getNetworkVariable(netId, WifiConfiguration.pskVarName); if (!TextUtils.isEmpty(value)) { config.preSharedKey = value; } else { config.preSharedKey = null; } - value = WifiNative.getNetworkVariable(config.networkId, + value = mWifiNative.getNetworkVariable(config.networkId, WifiConfiguration.Protocol.varName); if (!TextUtils.isEmpty(value)) { String vals[] = value.split(" "); @@ -1319,7 +1328,7 @@ class WifiConfigStore { } } - value = WifiNative.getNetworkVariable(config.networkId, + value = mWifiNative.getNetworkVariable(config.networkId, WifiConfiguration.KeyMgmt.varName); if (!TextUtils.isEmpty(value)) { String vals[] = value.split(" "); @@ -1332,7 +1341,7 @@ class WifiConfigStore { } } - value = WifiNative.getNetworkVariable(config.networkId, + value = mWifiNative.getNetworkVariable(config.networkId, WifiConfiguration.AuthAlgorithm.varName); if (!TextUtils.isEmpty(value)) { String vals[] = value.split(" "); @@ -1345,7 +1354,7 @@ class WifiConfigStore { } } - value = WifiNative.getNetworkVariable(config.networkId, + value = mWifiNative.getNetworkVariable(config.networkId, WifiConfiguration.PairwiseCipher.varName); if (!TextUtils.isEmpty(value)) { String vals[] = value.split(" "); @@ -1358,7 +1367,7 @@ class WifiConfigStore { } } - value = WifiNative.getNetworkVariable(config.networkId, + value = mWifiNative.getNetworkVariable(config.networkId, WifiConfiguration.GroupCipher.varName); if (!TextUtils.isEmpty(value)) { String vals[] = value.split(" "); @@ -1373,7 +1382,7 @@ class WifiConfigStore { for (WifiConfiguration.EnterpriseField field : config.enterpriseFields) { - value = WifiNative.getNetworkVariable(netId, + value = mWifiNative.getNetworkVariable(netId, field.varName()); if (!TextUtils.isEmpty(value)) { if (field != config.eap) value = removeDoubleQuotes(value); @@ -1382,16 +1391,16 @@ class WifiConfigStore { } } - private static String removeDoubleQuotes(String string) { + private String removeDoubleQuotes(String string) { if (string.length() <= 2) return ""; return string.substring(1, string.length() - 1); } - private static String convertToQuotedString(String string) { + private String convertToQuotedString(String string) { return "\"" + string + "\""; } - private static String makeString(BitSet set, String[] strings) { + private String makeString(BitSet set, String[] strings) { StringBuffer buf = new StringBuffer(); int nextSetBit = -1; @@ -1411,7 +1420,7 @@ class WifiConfigStore { return buf.toString(); } - private static int lookupString(String string, String[] strings) { + private int lookupString(String string, String[] strings) { int size = strings.length; string = string.replace('-', '_'); @@ -1446,10 +1455,10 @@ class WifiConfigStore { return key.hashCode(); } - static String dump() { + String dump() { StringBuffer sb = new StringBuffer(); String LS = System.getProperty("line.separator"); - sb.append("sLastPriority ").append(sLastPriority).append(LS); + sb.append("mLastPriority ").append(mLastPriority).append(LS); sb.append("Configured networks ").append(LS); for (WifiConfiguration conf : getConfiguredNetworks()) { sb.append(conf).append(LS); @@ -1457,15 +1466,15 @@ class WifiConfigStore { return sb.toString(); } - public static String getConfigFile() { + public String getConfigFile() { return ipConfigFile; } - private static void loge(String s) { + private void loge(String s) { Log.e(TAG, s); } - private static void log(String s) { + private void log(String s) { Log.d(TAG, s); } } diff --git a/wifi/java/android/net/wifi/WifiMonitor.java b/wifi/java/android/net/wifi/WifiMonitor.java index 05b8fe13bc00..bbb74d1a8090 100644 --- a/wifi/java/android/net/wifi/WifiMonitor.java +++ b/wifi/java/android/net/wifi/WifiMonitor.java @@ -202,6 +202,7 @@ public class WifiMonitor { private static final String AP_STA_DISCONNECTED_STR = "AP-STA-DISCONNECTED"; private final StateMachine mStateMachine; + private final WifiNative mWifiNative; /* Supplicant events reported to a state machine */ private static final int BASE = Protocol.BASE_WIFI_MONITOR; @@ -266,8 +267,9 @@ public class WifiMonitor { */ private static final int MAX_RECV_ERRORS = 10; - public WifiMonitor(StateMachine wifiStateMachine) { + public WifiMonitor(StateMachine wifiStateMachine, WifiNative wifiNative) { mStateMachine = wifiStateMachine; + mWifiNative = wifiNative; } public void startMonitoring() { @@ -292,7 +294,7 @@ public class WifiMonitor { //noinspection InfiniteLoopStatement for (;;) { - String eventStr = WifiNative.waitForEvent(); + String eventStr = mWifiNative.waitForEvent(); // Skip logging the common but mostly uninteresting scan-results event if (false && eventStr.indexOf(SCAN_RESULTS_STR) == -1) { @@ -406,7 +408,7 @@ public class WifiMonitor { int connectTries = 0; while (true) { - if (WifiNative.connectToSupplicant()) { + if (mWifiNative.connectToSupplicant()) { return true; } if (connectTries++ < 5) { diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java index f8eafde18303..48a785c98b28 100644 --- a/wifi/java/android/net/wifi/WifiNative.java +++ b/wifi/java/android/net/wifi/WifiNative.java @@ -39,11 +39,13 @@ import java.util.List; */ public class WifiNative { + private static final int DEFAULT_GROUP_OWNER_INTENT = 7; + static final int BLUETOOTH_COEXISTENCE_MODE_ENABLED = 0; static final int BLUETOOTH_COEXISTENCE_MODE_DISABLED = 1; static final int BLUETOOTH_COEXISTENCE_MODE_SENSE = 2; - static String sDefaultInterface; + String mInterface = ""; public native static boolean loadDriver(); @@ -59,60 +61,60 @@ public class WifiNative { or when the supplicant is hung */ public native static boolean killSupplicant(); - public native static boolean connectToSupplicant(String iface); + private native boolean connectToSupplicant(String iface); - public native static void closeSupplicantConnection(String iface); + private native void closeSupplicantConnection(String iface); /** * Wait for the supplicant to send an event, returning the event string. * @return the event string sent by the supplicant. */ - public native static String waitForEvent(String iface); + private native String waitForEvent(String iface); - private native static boolean doBooleanCommand(String iface, String command); + private native boolean doBooleanCommand(String iface, String command); - private native static int doIntCommand(String iface, String command); + private native int doIntCommand(String iface, String command); - private native static String doStringCommand(String iface, String command); + private native String doStringCommand(String iface, String command); - public static void setDefaultInterface(String iface) { - sDefaultInterface = iface; + public WifiNative(String iface) { + mInterface = iface; } - public static boolean connectToSupplicant() { - return connectToSupplicant(sDefaultInterface); + public boolean connectToSupplicant() { + return connectToSupplicant(mInterface); } - public static void closeSupplicantConnection() { - closeSupplicantConnection(sDefaultInterface); + public void closeSupplicantConnection() { + closeSupplicantConnection(mInterface); } - public static String waitForEvent() { - return waitForEvent(sDefaultInterface); + public String waitForEvent() { + return waitForEvent(mInterface); } - private static boolean doBooleanCommand(String command) { - return doBooleanCommand(sDefaultInterface, command); + private boolean doBooleanCommand(String command) { + return doBooleanCommand(mInterface, command); } - private static int doIntCommand(String command) { - return doIntCommand(sDefaultInterface, command); + private int doIntCommand(String command) { + return doIntCommand(mInterface, command); } - private static String doStringCommand(String command) { - return doStringCommand(sDefaultInterface, command); + private String doStringCommand(String command) { + return doStringCommand(mInterface, command); } - public static boolean ping() { + public boolean ping() { String pong = doStringCommand("PING"); return (pong != null && pong.equals("PONG")); } - public static boolean scan() { + public boolean scan() { return doBooleanCommand("SCAN"); } - public static boolean setScanMode(boolean setActive) { + public boolean setScanMode(boolean setActive) { if (setActive) { return doBooleanCommand("DRIVER SCAN-ACTIVE"); } else { @@ -126,33 +128,33 @@ public class WifiNative { * for a graceful stop and a mild-sounding "stop" interface * to kill the process */ - public static boolean stopSupplicant() { + public boolean stopSupplicant() { return doBooleanCommand("TERMINATE"); } - public static String listNetworks() { + public String listNetworks() { return doStringCommand("LIST_NETWORKS"); } - public static int addNetwork() { + public int addNetwork() { return doIntCommand("ADD_NETWORK"); } - public static boolean setNetworkVariable(int netId, String name, String value) { + public boolean setNetworkVariable(int netId, String name, String value) { if (TextUtils.isEmpty(name) || TextUtils.isEmpty(value)) return false; return doBooleanCommand("SET_NETWORK " + netId + " " + name + " " + value); } - public static String getNetworkVariable(int netId, String name) { + public String getNetworkVariable(int netId, String name) { if (TextUtils.isEmpty(name)) return null; return doStringCommand("GET_NETWORK " + netId + " " + name); } - public static boolean removeNetwork(int netId) { + public boolean removeNetwork(int netId) { return doBooleanCommand("REMOVE_NETWORK " + netId); } - public static boolean enableNetwork(int netId, boolean disableOthers) { + public boolean enableNetwork(int netId, boolean disableOthers) { if (disableOthers) { return doBooleanCommand("SELECT_NETWORK " + netId); } else { @@ -160,27 +162,27 @@ public class WifiNative { } } - public static boolean disableNetwork(int netId) { + public boolean disableNetwork(int netId) { return doBooleanCommand("DISABLE_NETWORK " + netId); } - public static boolean reconnect() { + public boolean reconnect() { return doBooleanCommand("RECONNECT"); } - public static boolean reassociate() { + public boolean reassociate() { return doBooleanCommand("REASSOCIATE"); } - public static boolean disconnect() { + public boolean disconnect() { return doBooleanCommand("DISCONNECT"); } - public static String status() { + public String status() { return doStringCommand("STATUS"); } - public static String getMacAddress() { + public String getMacAddress() { //Macaddr = XX.XX.XX.XX.XX.XX String ret = doStringCommand("DRIVER MACADDR"); if (!TextUtils.isEmpty(ret)) { @@ -190,15 +192,15 @@ public class WifiNative { return null; } - public static String scanResults() { + public String scanResults() { return doStringCommand("SCAN_RESULTS"); } - public static boolean startDriver() { + public boolean startDriver() { return doBooleanCommand("DRIVER START"); } - public static boolean stopDriver() { + public boolean stopDriver() { return doBooleanCommand("DRIVER STOP"); } @@ -227,7 +229,7 @@ public class WifiNative { * * The SETSUSPENDOPT driver command overrides the filtering rules */ - public static boolean startFilteringMulticastV4Packets() { + public boolean startFilteringMulticastV4Packets() { return doBooleanCommand("DRIVER RXFILTER-STOP") && doBooleanCommand("DRIVER RXFILTER-REMOVE 2") && doBooleanCommand("DRIVER RXFILTER-START"); @@ -237,7 +239,7 @@ public class WifiNative { * Stop filtering out Multicast V4 packets. * @return {@code true} if the operation succeeded, {@code false} otherwise */ - public static boolean stopFilteringMulticastV4Packets() { + public boolean stopFilteringMulticastV4Packets() { return doBooleanCommand("DRIVER RXFILTER-STOP") && doBooleanCommand("DRIVER RXFILTER-ADD 2") && doBooleanCommand("DRIVER RXFILTER-START"); @@ -247,7 +249,7 @@ public class WifiNative { * Start filtering out Multicast V6 packets * @return {@code true} if the operation succeeded, {@code false} otherwise */ - public static boolean startFilteringMulticastV6Packets() { + public boolean startFilteringMulticastV6Packets() { return doBooleanCommand("DRIVER RXFILTER-STOP") && doBooleanCommand("DRIVER RXFILTER-REMOVE 3") && doBooleanCommand("DRIVER RXFILTER-START"); @@ -257,13 +259,13 @@ public class WifiNative { * Stop filtering out Multicast V6 packets. * @return {@code true} if the operation succeeded, {@code false} otherwise */ - public static boolean stopFilteringMulticastV6Packets() { + public boolean stopFilteringMulticastV6Packets() { return doBooleanCommand("DRIVER RXFILTER-STOP") && doBooleanCommand("DRIVER RXFILTER-ADD 3") && doBooleanCommand("DRIVER RXFILTER-START"); } - public static int getPowerMode() { + public int getPowerMode() { String ret = doStringCommand("DRIVER GETPOWER"); if (!TextUtils.isEmpty(ret)) { // reply comes back in the form "powermode = XX" where XX is the @@ -278,11 +280,11 @@ public class WifiNative { return -1; } - public static boolean setPowerMode(int mode) { + public boolean setPowerMode(int mode) { return doBooleanCommand("DRIVER POWERMODE " + mode); } - public static int getBand() { + public int getBand() { String ret = doStringCommand("DRIVER GETBAND"); if (!TextUtils.isEmpty(ret)) { //reply is "BAND X" where X is the band @@ -296,7 +298,7 @@ public class WifiNative { return -1; } - public static boolean setBand(int band) { + public boolean setBand(int band) { return doBooleanCommand("DRIVER SETBAND " + band); } @@ -308,7 +310,7 @@ public class WifiNative { * {@link #BLUETOOTH_COEXISTENCE_MODE_SENSE}. * @return Whether the mode was successfully set. */ - public static boolean setBluetoothCoexistenceMode(int mode) { + public boolean setBluetoothCoexistenceMode(int mode) { return doBooleanCommand("DRIVER BTCOEXMODE " + mode); } @@ -320,7 +322,7 @@ public class WifiNative { * @param isSet whether to enable or disable this mode * @return {@code true} if the command succeeded, {@code false} otherwise. */ - public static boolean setBluetoothCoexistenceScanMode(boolean setCoexScanMode) { + public boolean setBluetoothCoexistenceScanMode(boolean setCoexScanMode) { if (setCoexScanMode) { return doBooleanCommand("DRIVER BTCOEXSCAN-START"); } else { @@ -328,25 +330,25 @@ public class WifiNative { } } - public static boolean saveConfig() { + public boolean saveConfig() { // Make sure we never write out a value for AP_SCAN other than 1 return doBooleanCommand("AP_SCAN 1") && doBooleanCommand("SAVE_CONFIG"); } - public static boolean setScanResultHandling(int mode) { + public boolean setScanResultHandling(int mode) { return doBooleanCommand("AP_SCAN " + mode); } - public static boolean addToBlacklist(String bssid) { + public boolean addToBlacklist(String bssid) { if (TextUtils.isEmpty(bssid)) return false; return doBooleanCommand("BLACKLIST " + bssid); } - public static boolean clearBlacklist() { + public boolean clearBlacklist() { return doBooleanCommand("BLACKLIST clear"); } - public static boolean setSuspendOptimizations(boolean enabled) { + public boolean setSuspendOptimizations(boolean enabled) { if (enabled) { return doBooleanCommand("DRIVER SETSUSPENDOPT 0"); } else { @@ -354,11 +356,11 @@ public class WifiNative { } } - public static boolean setCountryCode(String countryCode) { + public boolean setCountryCode(String countryCode) { return doBooleanCommand("DRIVER COUNTRY " + countryCode); } - public static void enableBackgroundScan(boolean enable) { + public void enableBackgroundScan(boolean enable) { //Note: BGSCAN-START and BGSCAN-STOP are documented in core/res/res/values/config.xml //and will need an update if the names are changed if (enable) { @@ -368,7 +370,7 @@ public class WifiNative { } } - public static void setScanInterval(int scanInterval) { + public void setScanInterval(int scanInterval) { doBooleanCommand("SCAN_INTERVAL " + scanInterval); } @@ -378,81 +380,81 @@ public class WifiNative { * NOISE=9999 * FREQUENCY=0 */ - public static String signalPoll() { + public String signalPoll() { return doStringCommand("SIGNAL_POLL"); } - public static boolean startWpsPbc() { + public boolean startWpsPbc() { return doBooleanCommand("WPS_PBC"); } - public static boolean startWpsPbc(String bssid) { + public boolean startWpsPbc(String bssid) { return doBooleanCommand("WPS_PBC " + bssid); } - public static boolean startWpsPinKeypad(String pin) { + public boolean startWpsPinKeypad(String pin) { return doBooleanCommand("WPS_PIN any " + pin); } - public static String startWpsPinDisplay(String bssid) { + public String startWpsPinDisplay(String bssid) { return doStringCommand("WPS_PIN " + bssid); } /* Configures an access point connection */ - public static boolean startWpsRegistrar(String bssid, String pin) { + public boolean startWpsRegistrar(String bssid, String pin) { return doBooleanCommand("WPS_REG " + bssid + " " + pin); } - public static boolean setPersistentReconnect(boolean enabled) { + public boolean setPersistentReconnect(boolean enabled) { int value = (enabled == true) ? 1 : 0; return doBooleanCommand("SET persistent_reconnect " + value); } - public static boolean setDeviceName(String name) { + public boolean setDeviceName(String name) { return doBooleanCommand("SET device_name " + name); } - public static boolean setDeviceType(String type) { + public boolean setDeviceType(String type) { return doBooleanCommand("SET device_type " + type); } - public static boolean setConfigMethods(String cfg) { + public boolean setConfigMethods(String cfg) { return doBooleanCommand("SET config_methods " + cfg); } - public static boolean setP2pSsidPostfix(String postfix) { + public boolean setP2pSsidPostfix(String postfix) { return doBooleanCommand("SET p2p_ssid_postfix " + postfix); } - public static boolean p2pFind() { + public boolean p2pFind() { return doBooleanCommand("P2P_FIND"); } - public static boolean p2pFind(int timeout) { + public boolean p2pFind(int timeout) { if (timeout <= 0) { return p2pFind(); } return doBooleanCommand("P2P_FIND " + timeout); } - public static boolean p2pListen() { + public boolean p2pListen() { return doBooleanCommand("P2P_LISTEN"); } - public static boolean p2pListen(int timeout) { + public boolean p2pListen(int timeout) { if (timeout <= 0) { return p2pListen(); } return doBooleanCommand("P2P_LISTEN " + timeout); } - public static boolean p2pFlush() { + public boolean p2pFlush() { return doBooleanCommand("P2P_FLUSH"); } /* p2p_connect <peer device address> <pbc|pin|PIN#> [label|display|keypad] [persistent] [join|auth] [go_intent=<0..15>] [freq=<in MHz>] */ - public static String p2pConnect(WifiP2pConfig config, boolean joinExistingGroup) { + public String p2pConnect(WifiP2pConfig config, boolean joinExistingGroup) { if (config == null) return null; List<String> args = new ArrayList<String>(); WpsInfo wps = config.wps; @@ -492,7 +494,7 @@ public class WifiNative { //device battery state int groupOwnerIntent = config.groupOwnerIntent; if (groupOwnerIntent < 0 || groupOwnerIntent > 15) { - groupOwnerIntent = 7; //default value + groupOwnerIntent = DEFAULT_GROUP_OWNER_INTENT; } args.add("go_intent=" + groupOwnerIntent); @@ -502,11 +504,11 @@ public class WifiNative { return doStringCommand(command); } - public static boolean p2pCancelConnect() { + public boolean p2pCancelConnect() { return doBooleanCommand("P2P_CANCEL"); } - public static boolean p2pProvisionDiscovery(WifiP2pConfig config) { + public boolean p2pProvisionDiscovery(WifiP2pConfig config) { if (config == null) return false; switch (config.wps.setup) { @@ -524,21 +526,21 @@ public class WifiNative { return false; } - public static boolean p2pGroupAdd() { + public boolean p2pGroupAdd() { return doBooleanCommand("P2P_GROUP_ADD"); } - public static boolean p2pGroupRemove(String iface) { + public boolean p2pGroupRemove(String iface) { if (iface == null) return false; return doBooleanCommand("P2P_GROUP_REMOVE " + iface); } - public static boolean p2pReject(String deviceAddress) { + public boolean p2pReject(String deviceAddress) { return doBooleanCommand("P2P_REJECT " + deviceAddress); } /* Invite a peer to a group */ - public static boolean p2pInvite(WifiP2pGroup group, String deviceAddress) { + public boolean p2pInvite(WifiP2pGroup group, String deviceAddress) { if (deviceAddress == null) return false; if (group == null) { @@ -550,14 +552,14 @@ public class WifiNative { } /* Reinvoke a persistent connection */ - public static boolean p2pReinvoke(int netId, String deviceAddress) { + public boolean p2pReinvoke(int netId, String deviceAddress) { if (deviceAddress == null || netId < 0) return false; return doBooleanCommand("P2P_INVITE persistent=" + netId + " peer=" + deviceAddress); } - public static String p2pGetInterfaceAddress(String deviceAddress) { + public String p2pGetInterfaceAddress(String deviceAddress) { if (deviceAddress == null) return null; // "p2p_peer deviceAddress" returns a multi-line result containing @@ -577,7 +579,7 @@ public class WifiNative { return null; } - public static String p2pGetDeviceAddress() { + public String p2pGetDeviceAddress() { String status = status(); if (status == null) return ""; @@ -592,7 +594,7 @@ public class WifiNative { return ""; } - public static String p2pPeer(String deviceAddress) { + public String p2pPeer(String deviceAddress) { return doStringCommand("P2P_PEER " + deviceAddress); } } diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java index 58e19cfbeca5..8c9e472f74b5 100644 --- a/wifi/java/android/net/wifi/WifiStateMachine.java +++ b/wifi/java/android/net/wifi/WifiStateMachine.java @@ -113,6 +113,8 @@ public class WifiStateMachine extends StateMachine { private static final String SOFTAP_IFACE = "wl0.1"; private WifiMonitor mWifiMonitor; + private WifiNative mWifiNative; + private WifiConfigStore mWifiConfigStore; private INetworkManagementService mNwService; private ConnectivityManager mCm; @@ -554,11 +556,14 @@ public class WifiStateMachine extends StateMachine { IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); mNwService = INetworkManagementService.Stub.asInterface(b); - mWifiMonitor = new WifiMonitor(this); + mWifiNative = new WifiNative(mInterfaceName); + mWifiConfigStore = new WifiConfigStore(context, mWifiNative); + mWifiMonitor = new WifiMonitor(this, mWifiNative); mDhcpInfoInternal = new DhcpInfoInternal(); mWifiInfo = new WifiInfo(); - mSupplicantStateTracker = new SupplicantStateTracker(context, this, getHandler()); - mWpsStateMachine = new WpsStateMachine(context, this, getHandler()); + mSupplicantStateTracker = new SupplicantStateTracker(context, this, mWifiConfigStore, + getHandler()); + mWpsStateMachine = new WpsStateMachine(context, this, mWifiConfigStore, getHandler()); mLinkProperties = new LinkProperties(); WifiApConfigStore wifiApConfigStore = WifiApConfigStore.makeWifiApConfigStore( @@ -572,9 +577,6 @@ public class WifiStateMachine extends StateMachine { mLastNetworkId = WifiConfiguration.INVALID_NETWORK_ID; mLastSignalLevel = -1; - /* Set default interface for all primary socket communication */ - WifiNative.setDefaultInterface(mInterfaceName); - mAlarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE); Intent scanIntent = new Intent(ACTION_START_SCAN, null); mScanIntent = PendingIntent.getBroadcast(mContext, SCAN_REQUEST, scanIntent, 0); @@ -1044,7 +1046,7 @@ public class WifiStateMachine extends StateMachine { * Returns the wifi configuration file */ public String getConfigFile() { - return WifiConfigStore.getConfigFile(); + return mWifiConfigStore.getConfigFile(); } /** @@ -1118,9 +1120,9 @@ public class WifiStateMachine extends StateMachine { sb.append("mReconnectCount ").append(mReconnectCount).append(LS); sb.append("mIsScanMode ").append(mIsScanMode).append(LS); sb.append("Supplicant status").append(LS) - .append(WifiNative.status()).append(LS).append(LS); + .append(mWifiNative.status()).append(LS).append(LS); - sb.append(WifiConfigStore.dump()); + sb.append(mWifiConfigStore.dump()); return sb.toString(); } @@ -1413,7 +1415,7 @@ public class WifiStateMachine extends StateMachine { } private String fetchSSID() { - String status = WifiNative.status(); + String status = mWifiNative.status(); if (status == null) { return null; } @@ -1436,7 +1438,7 @@ public class WifiStateMachine extends StateMachine { int newRssi = -1; int newLinkSpeed = -1; - String signalPoll = WifiNative.signalPoll(); + String signalPoll = mWifiNative.signalPoll(); if (signalPoll != null) { String[] lines = signalPoll.split("\n"); @@ -1486,28 +1488,28 @@ public class WifiStateMachine extends StateMachine { } private void setHighPerfModeEnabledNative(boolean enable) { - if(!WifiNative.setSuspendOptimizations(!enable)) { + if(!mWifiNative.setSuspendOptimizations(!enable)) { loge("set suspend optimizations failed!"); } if (enable) { - if (!WifiNative.setPowerMode(POWER_MODE_ACTIVE)) { + if (!mWifiNative.setPowerMode(POWER_MODE_ACTIVE)) { loge("set power mode active failed!"); } } else { - if (!WifiNative.setPowerMode(POWER_MODE_AUTO)) { + if (!mWifiNative.setPowerMode(POWER_MODE_AUTO)) { loge("set power mode auto failed!"); } } } private void configureLinkProperties() { - if (WifiConfigStore.isUsingStaticIp(mLastNetworkId)) { - mLinkProperties = WifiConfigStore.getLinkProperties(mLastNetworkId); + if (mWifiConfigStore.isUsingStaticIp(mLastNetworkId)) { + mLinkProperties = mWifiConfigStore.getLinkProperties(mLastNetworkId); } else { synchronized (mDhcpInfoInternal) { mLinkProperties = mDhcpInfoInternal.makeLinkProperties(); } - mLinkProperties.setHttpProxy(WifiConfigStore.getProxyProperties(mLastNetworkId)); + mLinkProperties.setHttpProxy(mWifiConfigStore.getProxyProperties(mLastNetworkId)); } mLinkProperties.setInterfaceName(mInterfaceName); if (DBG) { @@ -1648,7 +1650,7 @@ public class WifiStateMachine extends StateMachine { mWifiInfo.setLinkSpeed(-1); setNetworkDetailedState(DetailedState.DISCONNECTED); - WifiConfigStore.updateStatus(mLastNetworkId, DetailedState.DISCONNECTED); + mWifiConfigStore.updateStatus(mLastNetworkId, DetailedState.DISCONNECTED); /* send event to CM & network change broadcast */ sendNetworkStateChangeBroadcast(mLastBssid); @@ -1656,8 +1658,8 @@ public class WifiStateMachine extends StateMachine { /* Clear network properties */ mLinkProperties.clear(); /* Clear IP settings if the network used DHCP */ - if (!WifiConfigStore.isUsingStaticIp(mLastNetworkId)) { - WifiConfigStore.clearIpConfiguration(mLastNetworkId); + if (!mWifiConfigStore.isUsingStaticIp(mLastNetworkId)) { + mWifiConfigStore.clearIpConfiguration(mLastNetworkId); } mLastBssid= null; @@ -1683,29 +1685,29 @@ public class WifiStateMachine extends StateMachine { * coexistence would interrupt that connection. */ // Disable the coexistence mode - WifiNative.setBluetoothCoexistenceMode( - WifiNative.BLUETOOTH_COEXISTENCE_MODE_DISABLED); + mWifiNative.setBluetoothCoexistenceMode( + mWifiNative.BLUETOOTH_COEXISTENCE_MODE_DISABLED); } - mPowerMode = WifiNative.getPowerMode(); + mPowerMode = mWifiNative.getPowerMode(); if (mPowerMode < 0) { // Handle the case where supplicant driver does not support // getPowerModeCommand. mPowerMode = WifiStateMachine.POWER_MODE_AUTO; } if (mPowerMode != WifiStateMachine.POWER_MODE_ACTIVE) { - WifiNative.setPowerMode(WifiStateMachine.POWER_MODE_ACTIVE); + mWifiNative.setPowerMode(WifiStateMachine.POWER_MODE_ACTIVE); } } void handlePostDhcpSetup() { /* restore power mode */ - WifiNative.setPowerMode(mPowerMode); + mWifiNative.setPowerMode(mPowerMode); // Set the coexistence mode back to its default value - WifiNative.setBluetoothCoexistenceMode( - WifiNative.BLUETOOTH_COEXISTENCE_MODE_SENSE); + mWifiNative.setBluetoothCoexistenceMode( + mWifiNative.BLUETOOTH_COEXISTENCE_MODE_SENSE); } private void handleSuccessfulIpConfiguration(DhcpInfoInternal dhcpInfoInternal) { @@ -1714,13 +1716,13 @@ public class WifiStateMachine extends StateMachine { } mLastSignalLevel = -1; // force update of signal strength mReconnectCount = 0; //Reset IP failure tracking - WifiConfigStore.setIpConfiguration(mLastNetworkId, dhcpInfoInternal); + mWifiConfigStore.setIpConfiguration(mLastNetworkId, dhcpInfoInternal); InetAddress addr = NetworkUtils.numericToInetAddress(dhcpInfoInternal.ipAddress); mWifiInfo.setInetAddress(addr); if (getNetworkDetailedState() == DetailedState.CONNECTED) { //DHCP renewal in connected state LinkProperties linkProperties = dhcpInfoInternal.makeLinkProperties(); - linkProperties.setHttpProxy(WifiConfigStore.getProxyProperties(mLastNetworkId)); + linkProperties.setHttpProxy(mWifiConfigStore.getProxyProperties(mLastNetworkId)); linkProperties.setInterfaceName(mInterfaceName); if (!linkProperties.equals(mLinkProperties)) { if (DBG) { @@ -1733,7 +1735,7 @@ public class WifiStateMachine extends StateMachine { } else { configureLinkProperties(); setNetworkDetailedState(DetailedState.CONNECTED); - WifiConfigStore.updateStatus(mLastNetworkId, DetailedState.CONNECTED); + mWifiConfigStore.updateStatus(mLastNetworkId, DetailedState.CONNECTED); sendNetworkStateChangeBroadcast(mLastBssid); } } @@ -1749,7 +1751,7 @@ public class WifiStateMachine extends StateMachine { if (++mReconnectCount > getMaxDhcpRetries()) { loge("Failed " + mReconnectCount + " times, Disabling " + mLastNetworkId); - WifiConfigStore.disableNetwork(mLastNetworkId, + mWifiConfigStore.disableNetwork(mLastNetworkId, WifiConfiguration.DISABLED_DHCP_FAILURE); mReconnectCount = 0; } @@ -1757,8 +1759,8 @@ public class WifiStateMachine extends StateMachine { /* DHCP times out after about 30 seconds, we do a * disconnect and an immediate reconnect to try again */ - WifiNative.disconnect(); - WifiNative.reconnect(); + mWifiNative.disconnect(); + mWifiNative.reconnect(); } /* Current design is to not set the config on a running hostapd but instead @@ -1826,7 +1828,7 @@ public class WifiStateMachine extends StateMachine { break; case CMD_GET_CONFIGURED_NETWORKS: mReplyChannel.replyToMessage(message, message.what, - WifiConfigStore.getConfiguredNetworks()); + mWifiConfigStore.getConfiguredNetworks()); break; case CMD_ENABLE_RSSI_POLL: mEnableRssiPolling = (message.arg1 == 1); @@ -1913,7 +1915,7 @@ public class WifiStateMachine extends StateMachine { // 50021 wifi_state_changed (custom|1|5) EventLog.writeEvent(EVENTLOG_WIFI_STATE_CHANGED, getName()); - if (WifiNative.isDriverLoaded()) { + if (mWifiNative.isDriverLoaded()) { transitionTo(mDriverLoadedState); } else { @@ -1966,7 +1968,7 @@ public class WifiStateMachine extends StateMachine { break; } - if(WifiNative.loadDriver()) { + if(mWifiNative.loadDriver()) { if (DBG) log("Driver load successful"); sendMessage(CMD_LOAD_DRIVER_SUCCESS); } else { @@ -2054,7 +2056,7 @@ public class WifiStateMachine extends StateMachine { loge("Unable to change interface settings: " + ie); } - if(WifiNative.startSupplicant()) { + if(mWifiNative.startSupplicant()) { if (DBG) log("Supplicant start successful"); mWifiMonitor.startMonitoring(); transitionTo(mSupplicantStartingState); @@ -2086,7 +2088,7 @@ public class WifiStateMachine extends StateMachine { public void run() { if (DBG) log(getName() + message.toString() + "\n"); mWakeLock.acquire(); - if(WifiNative.unloadDriver()) { + if(mWifiNative.unloadDriver()) { if (DBG) log("Driver unload successful"); sendMessage(CMD_UNLOAD_DRIVER_SUCCESS); @@ -2217,9 +2219,9 @@ public class WifiStateMachine extends StateMachine { mLastNetworkId = WifiConfiguration.INVALID_NETWORK_ID; mLastSignalLevel = -1; - mWifiInfo.setMacAddress(WifiNative.getMacAddress()); + mWifiInfo.setMacAddress(mWifiNative.getMacAddress()); - WifiConfigStore.initialize(mContext); + mWifiConfigStore.initialize(); sendSupplicantConnectionChangedBroadcast(true); transitionTo(mDriverStartedState); @@ -2227,7 +2229,7 @@ public class WifiStateMachine extends StateMachine { case WifiMonitor.SUP_DISCONNECTION_EVENT: if (++mSupplicantRestartCount <= SUPPLICANT_RESTART_TRIES) { loge("Failed to setup control channel, restart supplicant"); - WifiNative.killSupplicant(); + mWifiNative.killSupplicant(); transitionTo(mDriverLoadedState); sendMessageDelayed(CMD_START_SUPPLICANT, SUPPLICANT_RESTART_INTERVAL_MSECS); } else { @@ -2276,7 +2278,7 @@ public class WifiStateMachine extends StateMachine { long supplicantScanIntervalMs = Settings.Secure.getLong(mContext.getContentResolver(), Settings.Secure.WIFI_SUPPLICANT_SCAN_INTERVAL_MS, mDefaultSupplicantScanIntervalMs); - WifiNative.setScanInterval((int)supplicantScanIntervalMs / 1000); + mWifiNative.setScanInterval((int)supplicantScanIntervalMs / 1000); } @Override public boolean processMessage(Message message) { @@ -2289,8 +2291,8 @@ public class WifiStateMachine extends StateMachine { break; case WifiMonitor.SUP_DISCONNECTION_EVENT: /* Supplicant connection lost */ loge("Connection lost, restart supplicant"); - WifiNative.killSupplicant(); - WifiNative.closeSupplicantConnection(); + mWifiNative.killSupplicant(); + mWifiNative.closeSupplicantConnection(); mNetworkInfo.setIsAvailable(false); handleNetworkDisconnect(); sendSupplicantConnectionChangedBroadcast(false); @@ -2301,46 +2303,46 @@ public class WifiStateMachine extends StateMachine { break; case WifiMonitor.SCAN_RESULTS_EVENT: eventLoggingEnabled = false; - setScanResults(WifiNative.scanResults()); + setScanResults(mWifiNative.scanResults()); sendScanResultsAvailableBroadcast(); mScanResultIsPending = false; break; case CMD_PING_SUPPLICANT: - boolean ok = WifiNative.ping(); + boolean ok = mWifiNative.ping(); mReplyChannel.replyToMessage(message, message.what, ok ? SUCCESS : FAILURE); break; case CMD_ADD_OR_UPDATE_NETWORK: config = (WifiConfiguration) message.obj; mReplyChannel.replyToMessage(message, CMD_ADD_OR_UPDATE_NETWORK, - WifiConfigStore.addOrUpdateNetwork(config)); + mWifiConfigStore.addOrUpdateNetwork(config)); break; case CMD_REMOVE_NETWORK: - ok = WifiConfigStore.removeNetwork(message.arg1); + ok = mWifiConfigStore.removeNetwork(message.arg1); mReplyChannel.replyToMessage(message, message.what, ok ? SUCCESS : FAILURE); break; case CMD_ENABLE_NETWORK: - ok = WifiConfigStore.enableNetwork(message.arg1, message.arg2 == 1); + ok = mWifiConfigStore.enableNetwork(message.arg1, message.arg2 == 1); mReplyChannel.replyToMessage(message, message.what, ok ? SUCCESS : FAILURE); break; case CMD_ENABLE_ALL_NETWORKS: long time = android.os.SystemClock.elapsedRealtime(); if (time - mLastEnableAllNetworksTime > MIN_INTERVAL_ENABLE_ALL_NETWORKS_MS) { - WifiConfigStore.enableAllNetworks(); + mWifiConfigStore.enableAllNetworks(); mLastEnableAllNetworksTime = time; } break; case CMD_DISABLE_NETWORK: - ok = WifiConfigStore.disableNetwork(message.arg1, message.arg2); + ok = mWifiConfigStore.disableNetwork(message.arg1, message.arg2); mReplyChannel.replyToMessage(message, message.what, ok ? SUCCESS : FAILURE); break; case CMD_BLACKLIST_NETWORK: - WifiNative.addToBlacklist((String)message.obj); + mWifiNative.addToBlacklist((String)message.obj); break; case CMD_CLEAR_BLACKLIST: - WifiNative.clearBlacklist(); + mWifiNative.clearBlacklist(); break; case CMD_SAVE_CONFIG: - ok = WifiConfigStore.saveConfig(); + ok = mWifiConfigStore.saveConfig(); mReplyChannel.replyToMessage(message, CMD_SAVE_CONFIG, ok ? SUCCESS : FAILURE); // Inform the backup manager about a data change @@ -2364,10 +2366,10 @@ public class WifiStateMachine extends StateMachine { break; case CMD_SAVE_NETWORK: config = (WifiConfiguration) message.obj; - WifiConfigStore.saveNetwork(config); + mWifiConfigStore.saveNetwork(config); break; case CMD_FORGET_NETWORK: - WifiConfigStore.forgetNetwork(message.arg1); + mWifiConfigStore.forgetNetwork(message.arg1); break; default: return NOT_HANDLED; @@ -2390,7 +2392,7 @@ public class WifiStateMachine extends StateMachine { if (DBG) log(getName() + "\n"); EventLog.writeEvent(EVENTLOG_WIFI_STATE_CHANGED, getName()); if (DBG) log("stopping supplicant"); - if (!WifiNative.stopSupplicant()) { + if (!mWifiNative.stopSupplicant()) { loge("Failed to stop supplicant"); } @@ -2417,15 +2419,15 @@ public class WifiStateMachine extends StateMachine { /* Socket connection can be lost when we do a graceful shutdown * or when the driver is hung. Ensure supplicant is stopped here. */ - WifiNative.killSupplicant(); - WifiNative.closeSupplicantConnection(); + mWifiNative.killSupplicant(); + mWifiNative.closeSupplicantConnection(); transitionTo(mDriverLoadedState); break; case CMD_STOP_SUPPLICANT_FAILED: if (message.arg1 == mSupplicantStopFailureToken) { loge("Timed out on a supplicant stop, kill and proceed"); - WifiNative.killSupplicant(); - WifiNative.closeSupplicantConnection(); + mWifiNative.killSupplicant(); + mWifiNative.closeSupplicantConnection(); transitionTo(mDriverLoadedState); } break; @@ -2516,7 +2518,7 @@ public class WifiStateMachine extends StateMachine { * When this mode is on, some of the low-level scan parameters used by the * driver are changed to reduce interference with bluetooth */ - WifiNative.setBluetoothCoexistenceScanMode(mBluetoothConnectionActive); + mWifiNative.setBluetoothCoexistenceScanMode(mBluetoothConnectionActive); /* set country code */ setCountryCode(); /* set frequency band of operation */ @@ -2525,26 +2527,26 @@ public class WifiStateMachine extends StateMachine { setNetworkDetailedState(DetailedState.DISCONNECTED); /* Remove any filtering on Multicast v6 at start */ - WifiNative.stopFilteringMulticastV6Packets(); + mWifiNative.stopFilteringMulticastV6Packets(); /* Reset Multicast v4 filtering state */ if (mFilteringMulticastV4Packets.get()) { - WifiNative.startFilteringMulticastV4Packets(); + mWifiNative.startFilteringMulticastV4Packets(); } else { - WifiNative.stopFilteringMulticastV4Packets(); + mWifiNative.stopFilteringMulticastV4Packets(); } if (mIsScanMode) { - WifiNative.setScanResultHandling(SCAN_ONLY_MODE); - WifiNative.disconnect(); + mWifiNative.setScanResultHandling(SCAN_ONLY_MODE); + mWifiNative.disconnect(); transitionTo(mScanModeState); } else { - WifiNative.setScanResultHandling(CONNECT_MODE); - WifiNative.reconnect(); + mWifiNative.setScanResultHandling(CONNECT_MODE); + mWifiNative.reconnect(); // Status pulls in the current supplicant state and network connection state // events over the monitor connection. This helps framework sync up with // current supplicant state - WifiNative.status(); + mWifiNative.status(); transitionTo(mDisconnectedState); } } @@ -2555,17 +2557,17 @@ public class WifiStateMachine extends StateMachine { switch(message.what) { case CMD_SET_SCAN_TYPE: mSetScanActive = (message.arg1 == SCAN_ACTIVE); - WifiNative.setScanMode(mSetScanActive); + mWifiNative.setScanMode(mSetScanActive); break; case CMD_START_SCAN: eventLoggingEnabled = false; boolean forceActive = (message.arg1 == SCAN_ACTIVE); if (forceActive && !mSetScanActive) { - WifiNative.setScanMode(forceActive); + mWifiNative.setScanMode(forceActive); } - WifiNative.scan(); + mWifiNative.scan(); if (forceActive && !mSetScanActive) { - WifiNative.setScanMode(mSetScanActive); + mWifiNative.setScanMode(mSetScanActive); } mScanResultIsPending = true; break; @@ -2575,14 +2577,14 @@ public class WifiStateMachine extends StateMachine { case CMD_SET_COUNTRY_CODE: String country = (String) message.obj; if (DBG) log("set country code " + country); - if (!WifiNative.setCountryCode(country.toUpperCase())) { + if (!mWifiNative.setCountryCode(country.toUpperCase())) { loge("Failed to set country code " + country); } break; case CMD_SET_FREQUENCY_BAND: int band = message.arg1; if (DBG) log("set frequency band " + band); - if (WifiNative.setBand(band)) { + if (mWifiNative.setBand(band)) { mFrequencyBand.set(band); //Fetch the latest scan results when frequency band is set startScan(true); @@ -2593,7 +2595,7 @@ public class WifiStateMachine extends StateMachine { case CMD_BLUETOOTH_ADAPTER_STATE_CHANGE: mBluetoothConnectionActive = (message.arg1 != BluetoothAdapter.STATE_DISCONNECTED); - WifiNative.setBluetoothCoexistenceScanMode(mBluetoothConnectionActive); + mWifiNative.setBluetoothCoexistenceScanMode(mBluetoothConnectionActive); break; case CMD_STOP_DRIVER: int mode = message.arg1; @@ -2626,28 +2628,28 @@ public class WifiStateMachine extends StateMachine { case CMD_DELAYED_STOP_DRIVER: if (message.arg1 != mDelayedStopCounter) break; if (getCurrentState() != mDisconnectedState) { - WifiNative.disconnect(); + mWifiNative.disconnect(); handleNetworkDisconnect(); } mWakeLock.acquire(); - WifiNative.stopDriver(); + mWifiNative.stopDriver(); transitionTo(mDriverStoppingState); mWakeLock.release(); break; case CMD_START_PACKET_FILTERING: if (message.arg1 == MULTICAST_V6) { - WifiNative.startFilteringMulticastV6Packets(); + mWifiNative.startFilteringMulticastV6Packets(); } else if (message.arg1 == MULTICAST_V4) { - WifiNative.startFilteringMulticastV4Packets(); + mWifiNative.startFilteringMulticastV4Packets(); } else { loge("Illegal arugments to CMD_START_PACKET_FILTERING"); } break; case CMD_STOP_PACKET_FILTERING: if (message.arg1 == MULTICAST_V6) { - WifiNative.stopFilteringMulticastV6Packets(); + mWifiNative.stopFilteringMulticastV6Packets(); } else if (message.arg1 == MULTICAST_V4) { - WifiNative.stopFilteringMulticastV4Packets(); + mWifiNative.stopFilteringMulticastV4Packets(); } else { loge("Illegal arugments to CMD_STOP_PACKET_FILTERING"); } @@ -2729,7 +2731,7 @@ public class WifiStateMachine extends StateMachine { break; case CMD_START_DRIVER: mWakeLock.acquire(); - WifiNative.startDriver(); + mWifiNative.startDriver(); mWakeLock.release(); transitionTo(mDriverStartingState); break; @@ -2756,8 +2758,8 @@ public class WifiStateMachine extends StateMachine { /* Ignore */ return HANDLED; } else { - WifiNative.setScanResultHandling(message.arg1); - WifiNative.reconnect(); + mWifiNative.setScanResultHandling(message.arg1); + mWifiNative.reconnect(); mIsScanMode = false; transitionTo(mDisconnectedState); } @@ -2824,13 +2826,13 @@ public class WifiStateMachine extends StateMachine { break; /* Do a redundant disconnect without transition */ case CMD_DISCONNECT: - WifiNative.disconnect(); + mWifiNative.disconnect(); break; case CMD_RECONNECT: - WifiNative.reconnect(); + mWifiNative.reconnect(); break; case CMD_REASSOCIATE: - WifiNative.reassociate(); + mWifiNative.reassociate(); break; case CMD_CONNECT_NETWORK: int netId = message.arg1; @@ -2844,15 +2846,15 @@ public class WifiStateMachine extends StateMachine { * a connection to the enabled network. */ if (config != null) { - netId = WifiConfigStore.selectNetwork(config); + netId = mWifiConfigStore.selectNetwork(config); } else { - WifiConfigStore.selectNetwork(netId); + mWifiConfigStore.selectNetwork(netId); } /* The state tracker handles enabling networks upon completion/failure */ mSupplicantStateTracker.sendMessage(CMD_CONNECT_NETWORK); - WifiNative.reconnect(); + mWifiNative.reconnect(); /* Expect a disconnection from the old connection */ transitionTo(mDisconnectingState); break; @@ -2862,7 +2864,7 @@ public class WifiStateMachine extends StateMachine { break; case WifiMonitor.SCAN_RESULTS_EVENT: /* Set the scan setting back to "connect" mode */ - WifiNative.setScanResultHandling(CONNECT_MODE); + mWifiNative.setScanResultHandling(CONNECT_MODE); /* Handle scan results */ return NOT_HANDLED; case WifiMonitor.NETWORK_CONNECTION_EVENT: @@ -2907,14 +2909,14 @@ public class WifiStateMachine extends StateMachine { loge("Failed to enable IPv6: " + e); } - if (!WifiConfigStore.isUsingStaticIp(mLastNetworkId)) { + if (!mWifiConfigStore.isUsingStaticIp(mLastNetworkId)) { //start DHCP mDhcpStateMachine = DhcpStateMachine.makeDhcpStateMachine( mContext, WifiStateMachine.this, mInterfaceName); mDhcpStateMachine.registerForPreDhcpNotification(); mDhcpStateMachine.sendMessage(DhcpStateMachine.CMD_START_DHCP); } else { - DhcpInfoInternal dhcpInfoInternal = WifiConfigStore.getIpConfiguration( + DhcpInfoInternal dhcpInfoInternal = mWifiConfigStore.getIpConfiguration( mLastNetworkId); InterfaceConfiguration ifcg = new InterfaceConfiguration(); ifcg.setLinkAddress(dhcpInfoInternal.makeLinkAddress()); @@ -2960,7 +2962,7 @@ public class WifiStateMachine extends StateMachine { transitionTo(mDisconnectingState); break; case CMD_DISCONNECT: - WifiNative.disconnect(); + mWifiNative.disconnect(); transitionTo(mDisconnectingState); break; /* Ignore connection to same network */ @@ -3027,7 +3029,7 @@ public class WifiStateMachine extends StateMachine { } break; case CMD_DISCONNECT: - WifiNative.disconnect(); + mWifiNative.disconnect(); transitionTo(mDisconnectingState); break; case CMD_SET_SCAN_MODE: @@ -3043,7 +3045,7 @@ public class WifiStateMachine extends StateMachine { * When scan results are received, the mode is switched * back to CONNECT_MODE. */ - WifiNative.setScanResultHandling(SCAN_ONLY_MODE); + mWifiNative.setScanResultHandling(SCAN_ONLY_MODE); /* Have the parent state handle the rest */ return NOT_HANDLED; /* Ignore connection to same network */ @@ -3055,7 +3057,7 @@ public class WifiStateMachine extends StateMachine { return NOT_HANDLED; case CMD_SAVE_NETWORK: WifiConfiguration config = (WifiConfiguration) message.obj; - NetworkUpdateResult result = WifiConfigStore.saveNetwork(config); + NetworkUpdateResult result = mWifiConfigStore.saveNetwork(config); if (mWifiInfo.getNetworkId() == result.getNetworkId()) { if (result.hasIpChanged()) { log("Reconfiguring IP on connection"); @@ -3111,7 +3113,7 @@ public class WifiStateMachine extends StateMachine { * is in SCAN_ONLY_MODE. Restore CONNECT_MODE on exit */ if (mScanResultIsPending) { - WifiNative.setScanResultHandling(CONNECT_MODE); + mWifiNative.setScanResultHandling(CONNECT_MODE); } } } @@ -3192,7 +3194,7 @@ public class WifiStateMachine extends StateMachine { * cleared */ if (!mScanResultIsPending) { - WifiNative.enableBackgroundScan(true); + mWifiNative.enableBackgroundScan(true); } } else { setScanAlarm(true); @@ -3204,9 +3206,9 @@ public class WifiStateMachine extends StateMachine { switch (message.what) { case CMD_SET_SCAN_MODE: if (message.arg1 == SCAN_ONLY_MODE) { - WifiNative.setScanResultHandling(message.arg1); + mWifiNative.setScanResultHandling(message.arg1); //Supplicant disconnect to prevent further connects - WifiNative.disconnect(); + mWifiNative.disconnect(); mIsScanMode = true; transitionTo(mScanModeState); } @@ -3214,10 +3216,10 @@ public class WifiStateMachine extends StateMachine { case CMD_ENABLE_BACKGROUND_SCAN: mEnableBackgroundScan = (message.arg1 == 1); if (mEnableBackgroundScan) { - WifiNative.enableBackgroundScan(true); + mWifiNative.enableBackgroundScan(true); setScanAlarm(false); } else { - WifiNative.enableBackgroundScan(false); + mWifiNative.enableBackgroundScan(false); setScanAlarm(true); } break; @@ -3232,14 +3234,14 @@ public class WifiStateMachine extends StateMachine { case CMD_START_SCAN: /* Disable background scan temporarily during a regular scan */ if (mEnableBackgroundScan) { - WifiNative.enableBackgroundScan(false); + mWifiNative.enableBackgroundScan(false); } /* Handled in parent state */ return NOT_HANDLED; case WifiMonitor.SCAN_RESULTS_EVENT: /* Re-enable background scan when a pending scan result is received */ if (mEnableBackgroundScan && mScanResultIsPending) { - WifiNative.enableBackgroundScan(true); + mWifiNative.enableBackgroundScan(true); } /* Handled in parent state */ return NOT_HANDLED; @@ -3254,7 +3256,7 @@ public class WifiStateMachine extends StateMachine { public void exit() { /* No need for a background scan upon exit from a disconnected state */ if (mEnableBackgroundScan) { - WifiNative.enableBackgroundScan(false); + mWifiNative.enableBackgroundScan(false); } setScanAlarm(false); } diff --git a/wifi/java/android/net/wifi/WpsStateMachine.java b/wifi/java/android/net/wifi/WpsStateMachine.java index c14a8dbf6fbf..441a3b0e1045 100644 --- a/wifi/java/android/net/wifi/WpsStateMachine.java +++ b/wifi/java/android/net/wifi/WpsStateMachine.java @@ -52,6 +52,7 @@ class WpsStateMachine extends StateMachine { private static final boolean DBG = false; private WifiStateMachine mWifiStateMachine; + private WifiConfigStore mWifiConfigStore; private WpsInfo mWpsInfo; @@ -62,11 +63,12 @@ class WpsStateMachine extends StateMachine { private State mInactiveState = new InactiveState(); private State mActiveState = new ActiveState(); - public WpsStateMachine(Context context, WifiStateMachine wsm, Handler target) { - super(TAG, target.getLooper()); + public WpsStateMachine(Context context, WifiStateMachine wsm, WifiConfigStore wcs, Handler t) { + super(TAG, t.getLooper()); mContext = context; mWifiStateMachine = wsm; + mWifiConfigStore = wcs; addState(mDefaultState); addState(mInactiveState, mDefaultState); addState(mActiveState, mDefaultState); @@ -97,13 +99,13 @@ class WpsStateMachine extends StateMachine { WpsResult result; switch (mWpsInfo.setup) { case WpsInfo.PBC: - result = WifiConfigStore.startWpsPbc(mWpsInfo); + result = mWifiConfigStore.startWpsPbc(mWpsInfo); break; case WpsInfo.KEYPAD: - result = WifiConfigStore.startWpsWithPinFromAccessPoint(mWpsInfo); + result = mWifiConfigStore.startWpsWithPinFromAccessPoint(mWpsInfo); break; case WpsInfo.DISPLAY: - result = WifiConfigStore.startWpsWithPinFromDevice(mWpsInfo); + result = mWifiConfigStore.startWpsWithPinFromDevice(mWpsInfo); break; default: result = new WpsResult(Status.FAILURE); @@ -151,9 +153,9 @@ class WpsStateMachine extends StateMachine { * and the configuration list needs to be reloaded from the supplicant. */ Log.d(TAG, "WPS set up successful"); - WifiConfigStore.enableAllNetworks(); - WifiConfigStore.loadConfiguredNetworks(); - WifiConfigStore.updateIpAndProxyFromWpsConfig( + mWifiConfigStore.enableAllNetworks(); + mWifiConfigStore.loadConfiguredNetworks(); + mWifiConfigStore.updateIpAndProxyFromWpsConfig( stateChangeResult.networkId, mWpsInfo); mWifiStateMachine.sendMessage(WifiStateMachine.WPS_COMPLETED_EVENT); transitionTo(mInactiveState); @@ -161,7 +163,7 @@ class WpsStateMachine extends StateMachine { case INACTIVE: /* A failed WPS connection */ Log.d(TAG, "WPS set up failed, enabling other networks"); - WifiConfigStore.enableAllNetworks(); + mWifiConfigStore.enableAllNetworks(); mWifiStateMachine.sendMessage(WifiStateMachine.WPS_COMPLETED_EVENT); transitionTo(mInactiveState); break; diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pService.java b/wifi/java/android/net/wifi/p2p/WifiP2pService.java index 1ad6336c3656..69cbb5c35938 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pService.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pService.java @@ -166,7 +166,8 @@ public class WifiP2pService extends IWifiP2pManager.Stub { public WifiP2pService(Context context) { mContext = context; - mInterface = SystemProperties.get("wifi.interface", "wlan0"); + //STOPSHIP: fix this + mInterface = "p2p0"; mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_WIFI_P2P, 0, NETWORKTYPE, ""); mP2pSupported = mContext.getPackageManager().hasSystemFeature( @@ -278,7 +279,8 @@ public class WifiP2pService extends IWifiP2pManager.Stub { private GroupCreatedState mGroupCreatedState = new GroupCreatedState(); private UserAuthorizingJoinState mUserAuthorizingJoinState = new UserAuthorizingJoinState(); - private WifiMonitor mWifiMonitor = new WifiMonitor(this); + private WifiNative mWifiNative = new WifiNative(mInterface); + private WifiMonitor mWifiMonitor = new WifiMonitor(this, mWifiNative); private WifiP2pDeviceList mPeers = new WifiP2pDeviceList(); private WifiP2pInfo mWifiP2pInfo = new WifiP2pInfo(); @@ -456,9 +458,9 @@ public class WifiP2pService extends IWifiP2pManager.Stub { public void enter() { if (DBG) logd(getName()); logd("stopping supplicant"); - if (!WifiNative.stopSupplicant()) { + if (!mWifiNative.stopSupplicant()) { loge("Failed to stop supplicant, issue kill"); - WifiNative.killSupplicant(); + mWifiNative.killSupplicant(); } } @@ -468,7 +470,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { switch (message.what) { case WifiMonitor.SUP_DISCONNECTION_EVENT: logd("Supplicant connection lost"); - WifiNative.closeSupplicantConnection(); + mWifiNative.closeSupplicantConnection(); transitionTo(mP2pDisabledState); break; case WifiP2pManager.ENABLE_P2P: @@ -594,7 +596,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { if (DBG) Slog.w(TAG, "Unable to bring down wlan interface: " + e); } - if (WifiNative.startP2pSupplicant()) { + if (mWifiNative.startP2pSupplicant()) { mWifiMonitor.startMonitoring(); transitionTo(mP2pEnablingState); } else { @@ -630,7 +632,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { case WifiMonitor.SUP_DISCONNECTION_EVENT: if (++mP2pRestartCount <= P2P_RESTART_TRIES) { loge("Failed to start p2p, retry"); - WifiNative.killSupplicant(); + mWifiNative.killSupplicant(); sendMessageDelayed(WifiP2pManager.ENABLE_P2P, P2P_RESTART_INTERVAL_MSECS); } else { loge("Failed " + mP2pRestartCount + " times to start p2p, quit "); @@ -673,7 +675,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { break; case WifiP2pManager.DISCOVER_PEERS: int timeout = message.arg1; - if (WifiNative.p2pFind(timeout)) { + if (mWifiNative.p2pFind(timeout)) { replyToMessage(message, WifiP2pManager.DISCOVER_PEERS_SUCCEEDED); } else { replyToMessage(message, WifiP2pManager.DISCOVER_PEERS_FAILED, @@ -692,8 +694,8 @@ public class WifiP2pService extends IWifiP2pManager.Stub { break; case WifiMonitor.SUP_DISCONNECTION_EVENT: /* Supplicant died */ loge("Connection lost, restart p2p"); - WifiNative.killSupplicant(); - WifiNative.closeSupplicantConnection(); + mWifiNative.killSupplicant(); + mWifiNative.closeSupplicantConnection(); if (mPeers.clear()) sendP2pPeersChangedBroadcast(); transitionTo(mP2pDisabledState); sendMessageDelayed(WifiP2pManager.ENABLE_P2P, P2P_RESTART_INTERVAL_MSECS); @@ -717,7 +719,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { public void enter() { if (DBG) logd(getName()); //Start listening every time we get inactive - WifiNative.p2pListen(); + mWifiNative.p2pListen(); } @Override @@ -727,13 +729,13 @@ public class WifiP2pService extends IWifiP2pManager.Stub { case WifiP2pManager.CONNECT: if (DBG) logd(getName() + " sending connect"); mSavedPeerConfig = (WifiP2pConfig) message.obj; - String updatedPeerDetails = WifiNative.p2pPeer(mSavedPeerConfig.deviceAddress); + String updatedPeerDetails = mWifiNative.p2pPeer(mSavedPeerConfig.deviceAddress); mPeers.update(new WifiP2pDevice(updatedPeerDetails)); mPersistGroup = false; int netId = configuredNetworkId(mSavedPeerConfig.deviceAddress); if (netId >= 0) { //TODO: if failure, remove config and do a regular p2pConnect() - WifiNative.p2pReinvoke(netId, mSavedPeerConfig.deviceAddress); + mWifiNative.p2pReinvoke(netId, mSavedPeerConfig.deviceAddress); } else { //If peer is a GO, we do not need to send provisional discovery, //the supplicant takes care of it. @@ -798,7 +800,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { break; case WifiP2pManager.CREATE_GROUP: mPersistGroup = true; - if (WifiNative.p2pGroupAdd()) { + if (mWifiNative.p2pGroupAdd()) { replyToMessage(message, WifiP2pManager.CREATE_GROUP_SUCCEEDED); } else { replyToMessage(message, WifiP2pManager.CREATE_GROUP_FAILED, @@ -840,7 +842,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { WifiP2pManager.BUSY); break; case WifiP2pManager.CANCEL_CONNECT: - if (WifiNative.p2pCancelConnect()) { + if (mWifiNative.p2pCancelConnect()) { replyToMessage(message, WifiP2pManager.CANCEL_CONNECT_SUCCEEDED); } else { replyToMessage(message, WifiP2pManager.CANCEL_CONNECT_FAILED, @@ -897,7 +899,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { @Override public void enter() { if (DBG) logd(getName()); - WifiNative.p2pProvisionDiscovery(mSavedPeerConfig); + mWifiNative.p2pProvisionDiscovery(mSavedPeerConfig); } @Override @@ -913,7 +915,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { if (mSavedPeerConfig.wps.setup == WpsInfo.PBC) { if (DBG) logd("Found a match " + mSavedPeerConfig); - WifiNative.p2pConnect(mSavedPeerConfig, FORM_GROUP); + mWifiNative.p2pConnect(mSavedPeerConfig, FORM_GROUP); transitionTo(mGroupNegotiationState); } break; @@ -926,7 +928,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { if (DBG) logd("Found a match " + mSavedPeerConfig); /* we already have the pin */ if (!TextUtils.isEmpty(mSavedPeerConfig.wps.pin)) { - WifiNative.p2pConnect(mSavedPeerConfig, FORM_GROUP); + mWifiNative.p2pConnect(mSavedPeerConfig, FORM_GROUP); transitionTo(mGroupNegotiationState); } else { transitionTo(mUserAuthorizingInvitationState); @@ -941,7 +943,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { if (mSavedPeerConfig.wps.setup == WpsInfo.DISPLAY) { if (DBG) logd("Found a match " + mSavedPeerConfig); mSavedPeerConfig.wps.pin = provDisc.pin; - WifiNative.p2pConnect(mSavedPeerConfig, FORM_GROUP); + mWifiNative.p2pConnect(mSavedPeerConfig, FORM_GROUP); notifyInvitationSent(provDisc.pin, device.deviceAddress); transitionTo(mGroupNegotiationState); } @@ -1045,7 +1047,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { if (DBG) logd("Removed client " + deviceAddress); if (!mPersistGroup && mGroup.isClientListEmpty()) { Slog.d(TAG, "Client list empty, remove non-persistent p2p group"); - WifiNative.p2pGroupRemove(mGroup.getInterface()); + mWifiNative.p2pGroupRemove(mGroup.getInterface()); } } else { if (DBG) logd("Failed to remove client " + deviceAddress); @@ -1067,12 +1069,12 @@ public class WifiP2pService extends IWifiP2pManager.Stub { setWifiP2pInfoOnGroupFormation(dhcpInfo.serverAddress); sendP2pConnectionChangedBroadcast(); } else { - WifiNative.p2pGroupRemove(mGroup.getInterface()); + mWifiNative.p2pGroupRemove(mGroup.getInterface()); } break; case WifiP2pManager.REMOVE_GROUP: if (DBG) loge(getName() + " remove group"); - if (WifiNative.p2pGroupRemove(mGroup.getInterface())) { + if (mWifiNative.p2pGroupRemove(mGroup.getInterface())) { replyToMessage(message, WifiP2pManager.REMOVE_GROUP_SUCCEEDED); } else { replyToMessage(message, WifiP2pManager.REMOVE_GROUP_FAILED, @@ -1119,7 +1121,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { case WifiP2pManager.CONNECT: WifiP2pConfig config = (WifiP2pConfig) message.obj; logd("Inviting device : " + config.deviceAddress); - if (WifiNative.p2pInvite(mGroup, config.deviceAddress)) { + if (mWifiNative.p2pInvite(mGroup, config.deviceAddress)) { updateDeviceStatus(config.deviceAddress, WifiP2pDevice.INVITED); sendP2pPeersChangedBroadcast(); replyToMessage(message, WifiP2pManager.CONNECT_SUCCEEDED); @@ -1180,9 +1182,9 @@ public class WifiP2pService extends IWifiP2pManager.Stub { break; case PEER_CONNECTION_USER_ACCEPT: if (mSavedPeerConfig.wps.setup == WpsInfo.PBC) { - WifiNative.startWpsPbc(); + mWifiNative.startWpsPbc(); } else { - WifiNative.startWpsPinKeypad(mSavedPeerConfig.wps.pin); + mWifiNative.startWpsPinKeypad(mSavedPeerConfig.wps.pin); } mSavedPeerConfig = null; transitionTo(mGroupCreatedState); @@ -1422,7 +1424,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { } private void p2pConnectWithPinDisplay(WifiP2pConfig config, boolean join) { - String pin = WifiNative.p2pConnect(config, join); + String pin = mWifiNative.p2pConnect(config, join); try { Integer.parseInt(pin); notifyInvitationSent(pin, config.deviceAddress); @@ -1432,16 +1434,16 @@ public class WifiP2pService extends IWifiP2pManager.Stub { } private void initializeP2pSettings() { - WifiNative.setPersistentReconnect(true); - WifiNative.setDeviceName(mThisDevice.deviceName); + mWifiNative.setPersistentReconnect(true); + mWifiNative.setDeviceName(mThisDevice.deviceName); //DIRECT-XY-DEVICENAME (XY is randomly generated) - WifiNative.setP2pSsidPostfix("-" + mThisDevice.deviceName); - WifiNative.setDeviceType(mThisDevice.primaryDeviceType); + mWifiNative.setP2pSsidPostfix("-" + mThisDevice.deviceName); + mWifiNative.setDeviceType(mThisDevice.primaryDeviceType); //The supplicant default is to support everything, but a bug necessitates //the framework to specify this explicitly - WifiNative.setConfigMethods("keypad display push_button"); + mWifiNative.setConfigMethods("keypad display push_button"); - mThisDevice.deviceAddress = WifiNative.p2pGetDeviceAddress(); + mThisDevice.deviceAddress = mWifiNative.p2pGetDeviceAddress(); updateThisDevice(WifiP2pDevice.AVAILABLE); if (DBG) Slog.d(TAG, "DeviceAddress: " + mThisDevice.deviceAddress); } |